From bb36336aed322f31ab694ca1913982e16ddbca27 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Fri, 19 May 2023 18:15:56 +0300 Subject: [PATCH] Changed event queue to vector --- client/eventsSDL/InputHandler.cpp | 38 +++++++++++++++---------------- client/eventsSDL/InputHandler.h | 4 ++-- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/client/eventsSDL/InputHandler.cpp b/client/eventsSDL/InputHandler.cpp index f406b3d09..448d322bd 100644 --- a/client/eventsSDL/InputHandler.cpp +++ b/client/eventsSDL/InputHandler.cpp @@ -75,40 +75,29 @@ void InputHandler::handleCurrentEvent(const SDL_Event & current) void InputHandler::processEvents() { - boost::unique_lock lock(eventsM); - while(!SDLEventsQueue.empty()) + boost::unique_lock lock(eventsMutex); + for (auto const & currentEvent : eventsQueue) { GH.events().allowEventHandling(true); - SDL_Event currentEvent = SDLEventsQueue.front(); if (currentEvent.type == SDL_MOUSEMOTION) { cursorPosition = Point(currentEvent.motion.x, currentEvent.motion.y); mouseButtonsMask = currentEvent.motion.state; } - SDLEventsQueue.pop(); - - // In a sequence of mouse motion events, skip all but the last one. - // This prevents freezes when every motion event takes longer to handle than interval at which - // the events arrive (like dragging on the minimap in world view, with redraw at every event) - // so that the events would start piling up faster than they can be processed. - if ((currentEvent.type == SDL_MOUSEMOTION) && !SDLEventsQueue.empty() && (SDLEventsQueue.front().type == SDL_MOUSEMOTION)) - continue; - handleCurrentEvent(currentEvent); } + eventsQueue.clear(); } bool InputHandler::ignoreEventsUntilInput() { bool inputFound = false; - boost::unique_lock lock(eventsM); - while(!SDLEventsQueue.empty()) + boost::unique_lock lock(eventsMutex); + for (auto const & event : eventsQueue) { - SDL_Event ev = SDLEventsQueue.front(); - SDLEventsQueue.pop(); - switch(ev.type) + switch(event.type) { case SDL_MOUSEBUTTONDOWN: case SDL_FINGERDOWN: @@ -116,6 +105,7 @@ bool InputHandler::ignoreEventsUntilInput() inputFound = true; } } + eventsQueue.clear(); return inputFound; } @@ -179,8 +169,18 @@ void InputHandler::preprocessEvent(const SDL_Event & ev) } { - boost::unique_lock lock(eventsM); - SDLEventsQueue.push(ev); + boost::unique_lock lock(eventsMutex); + + if(ev.type == SDL_MOUSEMOTION && !eventsQueue.empty() && eventsQueue.back().type == SDL_MOUSEMOTION) + { + // In a sequence of mouse motion events, skip all but the last one. + // This prevents freezes when every motion event takes longer to handle than interval at which + // the events arrive (like dragging on the minimap in world view, with redraw at every event) + // so that the events would start piling up faster than they can be processed. + eventsQueue.back() = ev; + return; + } + eventsQueue.push_back(ev); } } diff --git a/client/eventsSDL/InputHandler.h b/client/eventsSDL/InputHandler.h index f074d4273..2b91aea13 100644 --- a/client/eventsSDL/InputHandler.h +++ b/client/eventsSDL/InputHandler.h @@ -24,8 +24,8 @@ class UserEventHandler; class InputHandler { - std::queue SDLEventsQueue; - boost::mutex eventsM; + std::vector eventsQueue; + boost::mutex eventsMutex; Point cursorPosition; float pointerSpeedMultiplier;