diff options
| -rw-r--r-- | src/gui/kernel/qevent.cpp | 5 | ||||
| -rw-r--r-- | src/gui/kernel/qwindow.cpp | 30 |
2 files changed, 30 insertions, 5 deletions
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp index 7e5e7ac7032..858a7cba2e2 100644 --- a/src/gui/kernel/qevent.cpp +++ b/src/gui/kernel/qevent.cpp @@ -1934,11 +1934,6 @@ QIconDragEvent::~QIconDragEvent() When this event occurs it is customary to show a QMenu with a context menu, if this is relevant to the context. - - Context menu events contain a special accept flag that indicates - whether the receiver accepted the event. If the event handler does - not accept the event then, if possible, whatever triggered the event will be - handled as a regular input event. */ #ifndef QT_NO_CONTEXTMENU diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 7b0f977458c..bacc49a98eb 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -41,6 +41,9 @@ #include <qpa/qplatformwindow.h> #include <qpa/qplatformintegration.h> +#ifndef QT_NO_CONTEXTMENU +#include <qpa/qplatformtheme.h> +#endif #include "qsurfaceformat.h" #ifndef QT_NO_OPENGL #include <qpa/qplatformopenglcontext.h> @@ -2491,6 +2494,33 @@ bool QWindow::event(QEvent *ev) default: return QObject::event(ev); } + +#ifndef QT_NO_CONTEXTMENU + /* + QGuiApplicationPrivate::processContextMenuEvent blocks mouse-triggered + context menu events that the QPA plugin might generate. In practice that + never happens, as even on Windows WM_CONTEXTMENU is never generated by + the OS (we never call the default window procedure that would do that in + response to unhandled WM_RBUTTONUP). + + So, we always have to syntheize QContextMenuEvent for mouse events anyway. + QWidgetWindow synthesizes QContextMenuEvent similar to this code, and + never calls QWindow::event, so we have to do it here as well. + + This logic could be simplified by always synthesizing events in + QGuiApplicationPrivate, or perhaps even in each QPA plugin. See QTBUG-93486. + */ + static const QEvent::Type contextMenuTrigger = + QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::ContextMenuOnMouseRelease).toBool() ? + QEvent::MouseButtonRelease : QEvent::MouseButtonPress; + if (QMouseEvent *me = static_cast<QMouseEvent *>(ev); + ev->type() == contextMenuTrigger && me->button() == Qt::RightButton) { + QSinglePointEvent *pev = static_cast<QSinglePointEvent*>(ev); + QContextMenuEvent e(QContextMenuEvent::Mouse, me->position().toPoint(), + pev->globalPosition().toPoint(), pev->modifiers()); + QGuiApplication::sendEvent(this, &e); + } +#endif return true; } |
