Foundation classes for a basic GUI implementing simple widgets and events
Dependents: TouchScreenGUIDemo
Events/EventDispatcher.cpp@18:d849f3ada858, 2016-05-28 (annotated)
- Committer:
- duncanFrance
- Date:
- Sat May 28 14:50:14 2016 +0000
- Revision:
- 18:d849f3ada858
- Parent:
- 15:e69fd74d42e4
Moved the event queue into the EventDispatcher; Improved event handling across Window/Widget
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
duncanFrance | 0:0a590815d51c | 1 | #include "EventDispatcher.h" |
duncanFrance | 0:0a590815d51c | 2 | |
duncanFrance | 0:0a590815d51c | 3 | EventDispatcher::EventDispatcher() { |
duncanFrance | 0:0a590815d51c | 4 | } |
duncanFrance | 0:0a590815d51c | 5 | |
duncanFrance | 0:0a590815d51c | 6 | void EventDispatcher::attachListener(EventListener* l) { |
duncanFrance | 15:e69fd74d42e4 | 7 | _listeners.appendOnce(l); |
duncanFrance | 0:0a590815d51c | 8 | } |
duncanFrance | 0:0a590815d51c | 9 | |
duncanFrance | 0:0a590815d51c | 10 | void EventDispatcher::detachListener(EventListener* l) { |
duncanFrance | 12:63db16fea709 | 11 | _listeners.remove(l); |
duncanFrance | 0:0a590815d51c | 12 | } |
duncanFrance | 0:0a590815d51c | 13 | |
duncanFrance | 0:0a590815d51c | 14 | void EventDispatcher::dispatchEvent(Event e) { |
duncanFrance | 12:63db16fea709 | 15 | EventListener* l; |
duncanFrance | 12:63db16fea709 | 16 | _listeners.reset(); |
duncanFrance | 12:63db16fea709 | 17 | while((l=_listeners.next()) != NULL) { |
duncanFrance | 18:d849f3ada858 | 18 | l->handleEvent(e); |
duncanFrance | 0:0a590815d51c | 19 | } |
duncanFrance | 18:d849f3ada858 | 20 | } |
duncanFrance | 18:d849f3ada858 | 21 | |
duncanFrance | 18:d849f3ada858 | 22 | void EventDispatcher::queueEvent(const Event e) |
duncanFrance | 18:d849f3ada858 | 23 | { |
duncanFrance | 18:d849f3ada858 | 24 | Event* qe = _mailbox.alloc(); |
duncanFrance | 18:d849f3ada858 | 25 | qe->type = e.type; |
duncanFrance | 18:d849f3ada858 | 26 | qe->target = e.target; |
duncanFrance | 18:d849f3ada858 | 27 | qe->screenX = e.screenX; |
duncanFrance | 18:d849f3ada858 | 28 | qe->screenY = e.screenY; |
duncanFrance | 18:d849f3ada858 | 29 | _mailbox.put(qe); |
duncanFrance | 18:d849f3ada858 | 30 | } |
duncanFrance | 18:d849f3ada858 | 31 | |
duncanFrance | 18:d849f3ada858 | 32 | void EventDispatcher::pumpEvents() |
duncanFrance | 18:d849f3ada858 | 33 | { |
duncanFrance | 18:d849f3ada858 | 34 | |
duncanFrance | 18:d849f3ada858 | 35 | osEvent oe = _mailbox.get(1); |
duncanFrance | 18:d849f3ada858 | 36 | |
duncanFrance | 18:d849f3ada858 | 37 | if(oe.status == osEventMail) { |
duncanFrance | 18:d849f3ada858 | 38 | |
duncanFrance | 18:d849f3ada858 | 39 | Event* qe = (Event*)oe.value.p; |
duncanFrance | 18:d849f3ada858 | 40 | Event e; |
duncanFrance | 18:d849f3ada858 | 41 | e.target = qe->target; |
duncanFrance | 18:d849f3ada858 | 42 | e.type = qe->type; |
duncanFrance | 18:d849f3ada858 | 43 | e.screenX = qe->screenX; |
duncanFrance | 18:d849f3ada858 | 44 | e.screenY = qe->screenY; |
duncanFrance | 18:d849f3ada858 | 45 | |
duncanFrance | 18:d849f3ada858 | 46 | dispatchEvent(e); |
duncanFrance | 18:d849f3ada858 | 47 | _mailbox.free(qe); |
duncanFrance | 18:d849f3ada858 | 48 | } |
duncanFrance | 18:d849f3ada858 | 49 | } |