diff options
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 56 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication_p.h | 1 | ||||
-rw-r--r-- | src/widgets/kernel/qapplication.cpp | 54 |
3 files changed, 58 insertions, 53 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 89b16a39a7..d6926e7515 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -1876,6 +1876,60 @@ int QGuiApplication::exec() return QCoreApplication::exec(); } +void QGuiApplicationPrivate::captureGlobalModifierState(QEvent *e) +{ + if (e->spontaneous()) { + // Capture the current mouse and keyboard states. Doing so here is + // required in order to support Qt Test synthesized events. Real mouse + // and keyboard state updates from the platform plugin are managed by + // QGuiApplicationPrivate::process(Mouse|Wheel|Key|Touch|Tablet)Event(); + // ### FIXME: Qt Test should not call qapp->notify(), but rather route + // the events through the proper QPA interface. This is required to + // properly generate all other events such as enter/leave etc. + switch (e->type()) { + case QEvent::MouseButtonPress: { + QMouseEvent *me = static_cast<QMouseEvent *>(e); + QGuiApplicationPrivate::modifier_buttons = me->modifiers(); + QGuiApplicationPrivate::mouse_buttons |= me->button(); + break; + } + case QEvent::MouseButtonDblClick: { + QMouseEvent *me = static_cast<QMouseEvent *>(e); + QGuiApplicationPrivate::modifier_buttons = me->modifiers(); + QGuiApplicationPrivate::mouse_buttons |= me->button(); + break; + } + case QEvent::MouseButtonRelease: { + QMouseEvent *me = static_cast<QMouseEvent *>(e); + QGuiApplicationPrivate::modifier_buttons = me->modifiers(); + QGuiApplicationPrivate::mouse_buttons &= ~me->button(); + break; + } + case QEvent::KeyPress: + case QEvent::KeyRelease: + case QEvent::MouseMove: +#if QT_CONFIG(wheelevent) + case QEvent::Wheel: +#endif + case QEvent::TouchBegin: + case QEvent::TouchUpdate: + case QEvent::TouchEnd: +#if QT_CONFIG(tabletevent) + case QEvent::TabletMove: + case QEvent::TabletPress: + case QEvent::TabletRelease: +#endif + { + QInputEvent *ie = static_cast<QInputEvent *>(e); + QGuiApplicationPrivate::modifier_buttons = ie->modifiers(); + break; + } + default: + break; + } + } +} + /*! \reimp */ bool QGuiApplication::notify(QObject *object, QEvent *event) @@ -1885,6 +1939,8 @@ bool QGuiApplication::notify(QObject *object, QEvent *event) return true; // Platform plugin ate the event } + QGuiApplicationPrivate::captureGlobalModifierState(event); + return QCoreApplication::notify(object, event); } diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index 1d68cc560b..48fe62ad98 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -109,6 +109,7 @@ public: bool shouldQuitInternal(const QWindowList &processedWindows); virtual bool tryCloseAllWindows(); + static void captureGlobalModifierState(QEvent *e); static Qt::KeyboardModifiers modifier_buttons; static Qt::MouseButtons mouse_buttons; diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index 3fe3c6951f..55c05e08dd 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -2715,59 +2715,7 @@ bool QApplication::notify(QObject *receiver, QEvent *e) return true; // Platform plugin ate the event } - if(e->spontaneous()) { - // Capture the current mouse and keyboard states. Doing so here is - // required in order to support Qt Test synthesized events. Real mouse - // and keyboard state updates from the platform plugin are managed by - // QGuiApplicationPrivate::process(Mouse|Wheel|Key|Touch|Tablet)Event(); - // ### FIXME: Qt Test should not call qapp->notify(), but rather route - // the events through the proper QPA interface. This is required to - // properly generate all other events such as enter/leave etc. - switch (e->type()) { - case QEvent::MouseButtonPress: - { - QMouseEvent *me = static_cast<QMouseEvent*>(e); - QApplicationPrivate::modifier_buttons = me->modifiers(); - QApplicationPrivate::mouse_buttons |= me->button(); - break; - } - case QEvent::MouseButtonDblClick: - { - QMouseEvent *me = static_cast<QMouseEvent*>(e); - QApplicationPrivate::modifier_buttons = me->modifiers(); - QApplicationPrivate::mouse_buttons |= me->button(); - break; - } - case QEvent::MouseButtonRelease: - { - QMouseEvent *me = static_cast<QMouseEvent*>(e); - QApplicationPrivate::modifier_buttons = me->modifiers(); - QApplicationPrivate::mouse_buttons &= ~me->button(); - break; - } - case QEvent::KeyPress: - case QEvent::KeyRelease: - case QEvent::MouseMove: -#if QT_CONFIG(wheelevent) - case QEvent::Wheel: -#endif - case QEvent::TouchBegin: - case QEvent::TouchUpdate: - case QEvent::TouchEnd: -#if QT_CONFIG(tabletevent) - case QEvent::TabletMove: - case QEvent::TabletPress: - case QEvent::TabletRelease: -#endif - { - QInputEvent *ie = static_cast<QInputEvent*>(e); - QApplicationPrivate::modifier_buttons = ie->modifiers(); - break; - } - default: - break; - } - } + QGuiApplicationPrivate::captureGlobalModifierState(e); #ifndef QT_NO_GESTURES // walk through parents and check for gestures |