From 9b49c0561e0b13caeee462d931dc22008e3c4587 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 20 Nov 2012 16:53:27 +0100 Subject: Handle QEventLoop::ExcludeUserInputEvents in QWindowSystemInterface. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a flag indicating user input events to the event type and leave those events in the queue if QEventLoop::ExcludeUserInputEvents is set. Task-number: QTBUG-27595 Change-Id: Ib41b826ef3be19253cd582d9894dd7c87953711f Reviewed-by: Oliver Wolff Reviewed-by: Samuel Rødal --- src/gui/kernel/qwindowsysteminterface.cpp | 23 ++++++------ src/gui/kernel/qwindowsysteminterface_p.h | 58 ++++++++++++++++++------------- 2 files changed, 45 insertions(+), 36 deletions(-) diff --git a/src/gui/kernel/qwindowsysteminterface.cpp b/src/gui/kernel/qwindowsysteminterface.cpp index acc6eace99..7ba4281646 100644 --- a/src/gui/kernel/qwindowsysteminterface.cpp +++ b/src/gui/kernel/qwindowsysteminterface.cpp @@ -344,6 +344,11 @@ QWindowSystemInterfacePrivate::WindowSystemEvent * QWindowSystemInterfacePrivate return windowSystemEventQueue.takeFirstOrReturnNull(); } +QWindowSystemInterfacePrivate::WindowSystemEvent *QWindowSystemInterfacePrivate::getNonUserInputWindowSystemEvent() +{ + return windowSystemEventQueue.takeFirstNonUserInputOrReturnNull(); +} + QWindowSystemInterfacePrivate::WindowSystemEvent *QWindowSystemInterfacePrivate::peekWindowSystemEvent(EventType t) { return windowSystemEventQueue.peekAtFirstOfType(t); @@ -520,20 +525,14 @@ bool QWindowSystemInterface::sendWindowSystemEventsImplementation(QEventLoop::Pr { int nevents = 0; - while (true) { - QWindowSystemInterfacePrivate::WindowSystemEvent *event; - if (!(flags & QEventLoop::ExcludeUserInputEvents) - && QWindowSystemInterfacePrivate::windowSystemEventsQueued() > 0) { - // process a pending user input event - event = QWindowSystemInterfacePrivate::getWindowSystemEvent(); - if (!event) - break; - } else { + while (QWindowSystemInterfacePrivate::windowSystemEventsQueued()) { + QWindowSystemInterfacePrivate::WindowSystemEvent *event = + (flags & QEventLoop::ExcludeUserInputEvents) ? + QWindowSystemInterfacePrivate::getNonUserInputWindowSystemEvent() : + QWindowSystemInterfacePrivate::getWindowSystemEvent(); + if (!event) break; - } - nevents++; - QGuiApplicationPrivate::processWindowSystemEvent(event); delete event; } diff --git a/src/gui/kernel/qwindowsysteminterface_p.h b/src/gui/kernel/qwindowsysteminterface_p.h index b174fd0ca2..e8d2a85dd9 100644 --- a/src/gui/kernel/qwindowsysteminterface_p.h +++ b/src/gui/kernel/qwindowsysteminterface_p.h @@ -66,30 +66,31 @@ QT_BEGIN_NAMESPACE class Q_GUI_EXPORT QWindowSystemInterfacePrivate { public: enum EventType { - Close, - GeometryChange, - Enter, - Leave, - ActivatedWindow, - WindowStateChanged, - Mouse, - FrameStrutMouse, - Wheel, - Key, - Touch, - ScreenOrientation, - ScreenGeometry, - ScreenAvailableGeometry, - ScreenLogicalDotsPerInch, - ScreenRefreshRate, - ThemeChange, - Expose, - FileOpen, - Tablet, - TabletEnterProximity, - TabletLeaveProximity, - PlatformPanel, - ContextMenu + UserInputEvent = 0x100, + Close = UserInputEvent | 0x01, + GeometryChange = 0x02, + Enter = UserInputEvent | 0x03, + Leave = UserInputEvent | 0x04, + ActivatedWindow = 0x05, + WindowStateChanged = 0x06, + Mouse = UserInputEvent | 0x07, + FrameStrutMouse = UserInputEvent | 0x08, + Wheel = UserInputEvent | 0x09, + Key = UserInputEvent | 0x0a, + Touch = UserInputEvent | 0x0b, + ScreenOrientation = 0x0c, + ScreenGeometry = 0x0d, + ScreenAvailableGeometry = 0x0e, + ScreenLogicalDotsPerInch = 0x0f, + ScreenRefreshRate = 0x10, + ThemeChange = 0x11, + Expose = 0x12, + FileOpen = UserInputEvent | 0x13, + Tablet = UserInputEvent | 0x14, + TabletEnterProximity = UserInputEvent | 0x15, + TabletLeaveProximity = UserInputEvent | 0x16, + PlatformPanel = UserInputEvent | 0x17, + ContextMenu = UserInputEvent | 0x18 }; class WindowSystemEvent { @@ -374,6 +375,14 @@ public: { const QMutexLocker locker(&mutex); impl.prepend(e); } WindowSystemEvent *takeFirstOrReturnNull() { const QMutexLocker locker(&mutex); return impl.empty() ? 0 : impl.takeFirst(); } + WindowSystemEvent *takeFirstNonUserInputOrReturnNull() + { + const QMutexLocker locker(&mutex); + for (int i = 0; i < impl.size(); ++i) + if (!(impl.at(i)->type & QWindowSystemInterfacePrivate::UserInputEvent)) + return impl.takeAt(i); + return 0; + } void append(WindowSystemEvent *e) { const QMutexLocker locker(&mutex); impl.append(e); } int count() const @@ -405,6 +414,7 @@ public: static int windowSystemEventsQueued(); static WindowSystemEvent *getWindowSystemEvent(); + static WindowSystemEvent *getNonUserInputWindowSystemEvent(); static WindowSystemEvent *peekWindowSystemEvent(EventType t); static void removeWindowSystemEvent(WindowSystemEvent *event); static void handleWindowSystemEvent(WindowSystemEvent *ev); -- cgit v1.2.3