Update the ungrab mouse hack for Qt5.8

wilder-5.14
David Edmundson 9 years ago
parent c7d21ae2b8
commit 75eeae6b42
  1. 27
      applets/appmenu/lib/appmenuapplet.cpp
  2. 28
      applets/systemtray/systemtray.cpp

@ -30,6 +30,8 @@
#include <QQuickWindow>
#include <QScreen>
#include <QDBusConnection>
#include <QVersionNumber>
#include <QTimer>
AppMenuApplet::AppMenuApplet(QObject *parent, const QVariantList &data)
: Plasma::Applet(parent, data)
@ -159,10 +161,29 @@ void AppMenuApplet::trigger(QQuickItem *ctx, int idx)
QMenu *actionMenu = createMenu(idx);
if (actionMenu) {
if (ctx && ctx->window() && ctx->window()->mouseGrabberItem()) {
// FIXME event forge thing enters press and hold move mode :/
ctx->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 = [ctx]() {
if (ctx && ctx->window() && ctx->window()->mouseGrabberItem()) {
// FIXME event forge thing enters press and hold move mode :/
ctx->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
const auto &geo = ctx->window()->screen()->availableVirtualGeometry();

@ -22,7 +22,8 @@
#include <QDebug>
#include <QProcess>
#include <QVersionNumber>
#include <QTimer>
#include <QDBusConnection>
#include <QDBusConnectionInterface>
@ -163,9 +164,30 @@ void SystemTray::showPlasmoidMenu(QQuickItem *appletInterface, int x, int y)
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 = [appletInterface]() {
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, appletInterface, ungrabMouseHack);
}
else {
ungrabMouseHack();
}
//end workaround
emit applet->contextualActionsAboutToShow();
foreach (QAction *action, applet->contextualActions()) {

Loading…
Cancel
Save