diff --git a/applets/systemtray/systemtray.cpp b/applets/systemtray/systemtray.cpp --- a/applets/systemtray/systemtray.cpp +++ b/applets/systemtray/systemtray.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include #include @@ -163,9 +165,29 @@ connect(this, &QObject::destroyed, desktopMenu, &QMenu::close); desktopMenu->setAttribute(Qt::WA_DeleteOnClose); - if (appletInterface->window() && appletInterface->window()->mouseGrabberItem()) { - appletInterface->window()->mouseGrabberItem()->ungrabMouse(); + // this is a workaround where Qt will fail to realise a mouse has been released + + // this happens if a window which does not accept focus spawns a new window that takes focus and X grab + // whilst the mouse is depressed + // https://bugreports.qt.io/browse/QTBUG-59044 + // this causes the next click to go missing + + //by releasing manually we avoid that situation + auto ungrabMouseHack = [=]() { + if (appletInterface->window() && appletInterface->window()->mouseGrabberItem()) { + appletInterface->window()->mouseGrabberItem()->ungrabMouse(); + } + }; + + // pre 5.8.0 QQuickWindow code is "item->grabMouse(); sendEvent(item, mouseEvent)" + // post 5.8.0 QQuickWindow code is sendEvent(item, mouseEvent); item->grabMouse() + if (QVersionNumber::fromString(qVersion()) > QVersionNumber(5, 8, 0)) { + QTimer::singleShot(0, this, ungrabMouseHack); + } + else { + ungrabMouseHack(); } + // end workaround emit applet->contextualActionsAboutToShow(); foreach (QAction *action, applet->contextualActions()) {