From f59d2329c904e8cb5f6509050444bf2aee4b8f65 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sun, 29 Nov 2015 09:32:52 +0100 Subject: Move event skip optimization fromNativeWindowXYZ to EventHandler --- plugingui/eventhandler.cc | 60 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'plugingui/eventhandler.cc') diff --git a/plugingui/eventhandler.cc b/plugingui/eventhandler.cc index 98e4cef..68f7f46 100644 --- a/plugingui/eventhandler.cc +++ b/plugingui/eventhandler.cc @@ -48,6 +48,11 @@ Event *EventHandler::getNextEvent() return nativeWindow.getNextEvent(); } +Event *EventHandler::peekNextEvent() +{ + return nativeWindow.peekNextEvent(); +} + void EventHandler::processEvents() { while(hasEvent()) @@ -68,6 +73,22 @@ void EventHandler::processEvents() case EventType::resize: { + while(true) + { + if(!hasEvent()) + { + break; + } + + auto peekEvent = peekNextEvent(); + if(!peekEvent || (peekEvent->type() != EventType::resize)) + { + break; + } + + event = getNextEvent(); + } + auto resizeEvent = static_cast(event); if((resizeEvent->width != window.width()) || (resizeEvent->height != window.height())) @@ -79,6 +100,22 @@ void EventHandler::processEvents() case EventType::mouseMove: { + while(true) + { + if(!hasEvent()) + { + break; + } + + auto peekEvent = peekNextEvent(); + if(!peekEvent || (peekEvent->type() != EventType::mouseMove)) + { + break; + } + + event = getNextEvent(); + } + auto moveEvent = static_cast(event); auto widget = window.find(moveEvent->x, moveEvent->y); @@ -173,7 +210,27 @@ void EventHandler::processEvents() case EventType::scroll: { + int delta = 0; + while(true) + { + if(!hasEvent()) + { + break; + } + + auto peekEvent = peekNextEvent(); + if(!peekEvent || (peekEvent->type() != EventType::scroll)) + { + break; + } + + auto scrollEvent = static_cast(event); + delta += scrollEvent->delta; + event = getNextEvent(); + } + auto scrollEvent = static_cast(event); + scrollEvent->delta += delta; auto widget = window.find(scrollEvent->x, scrollEvent->y); if(widget) @@ -188,6 +245,9 @@ void EventHandler::processEvents() case EventType::key: { + + // TODO: Filter out multiple arrow events. + auto keyEvent = static_cast(event); if(window.keyboardFocus()) { -- cgit v1.2.3