Fabian Vogt
e2edf439a2
regarding ungrab events: * 0001-Don-t-rely-on-QQuickWindow-delivering-QEvent-Ungrab-.patch OBS-URL: https://build.opensuse.org/package/show/KDE:Frameworks5/kdeclarative?expand=0&rev=137
89 lines
3.1 KiB
Diff
89 lines
3.1 KiB
Diff
From 3a832a27fc655ea39c8a2943ad9af41213fea8df Mon Sep 17 00:00:00 2001
|
|
From: Eike Hein <hein@kde.org>
|
|
Date: Sat, 17 Jun 2017 12:19:26 +0200
|
|
Subject: [PATCH] Don't rely on QQuickWindow delivering QEvent::Ungrab as
|
|
mouseUngrabEvent (as it no longer does in Qt 5.8+)
|
|
|
|
Summary:
|
|
QQuickWindow::sendEvent in Qt 5.7 and older had the following code
|
|
to deliver QEvent::UngrabMouse by calling QQuickItem::mouseUngrabEvent:
|
|
|
|
case QEvent::UngrabMouse: {
|
|
QSet<QQuickItem *> hasFiltered;
|
|
if (!d->sendFilteredMouseEvent(item->parentItem(), item, e, &hasFiltered)) {
|
|
e->accept();
|
|
item->mouseUngrabEvent();
|
|
}
|
|
}
|
|
|
|
This is gone from Qt 5.8+. While QEvent::Ungrab is still delivered to
|
|
items, QQuickItem::mouseUngrabEvent is only called under constrained
|
|
circumstances elsewhere, e.g. when ending an actual mouse grab held by
|
|
an item and tracked by Qt.
|
|
|
|
MouseEventListener relied on mouseUngrabEvent being called to implement
|
|
something akin to MouseArea::canceled: Signaling a user it should clean
|
|
up state after a press event, instead of, say, assuming the button is
|
|
still held and waiting around for a release event. While QEvent::Ungrab
|
|
was already being intercepted as well, it was only done for event de-
|
|
duplication, not used for the above.
|
|
|
|
This changes the code so handleUngrab checks first whether we're
|
|
actually in press state (to make it safe to call repeatedly) and then
|
|
call it from both the generic event handler and mouseUngrabEvent. This
|
|
makes it work again with newer Qts.
|
|
|
|
We rely on this particularly in the desktop containment, where we use
|
|
EventGenerator from this same lib to deliver QEvent::Ungrab to applets
|
|
when the containment goes into applet move mode on press-and-hold.
|
|
Without MouseEventListener emiting canceled in response, e.g. moving
|
|
a Folder View applet will e.g. put it into rectangle selection mode
|
|
unwanted.
|
|
BUG:380354
|
|
|
|
Reviewers: #plasma, davidedmundson
|
|
|
|
Reviewed By: #plasma, davidedmundson
|
|
|
|
Subscribers: plasma-devel, #frameworks
|
|
|
|
Tags: #plasma, #frameworks
|
|
|
|
Differential Revision: https://phabricator.kde.org/D6246
|
|
---
|
|
src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp | 11 +++++++----
|
|
1 file changed, 7 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp b/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp
|
|
index af4d76f..0b8d981 100644
|
|
--- a/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp
|
|
+++ b/src/qmlcontrols/kquickcontrolsaddons/mouseeventlistener.cpp
|
|
@@ -325,6 +325,7 @@ bool MouseEventListener::childMouseEventFilter(QQuickItem *item, QEvent *event)
|
|
}
|
|
case QEvent::UngrabMouse: {
|
|
m_lastEvent = event;
|
|
+ handleUngrab();
|
|
break;
|
|
}
|
|
case QEvent::Wheel: {
|
|
@@ -368,10 +369,12 @@ void MouseEventListener::touchUngrabEvent()
|
|
|
|
void MouseEventListener::handleUngrab()
|
|
{
|
|
- m_pressAndHoldTimer->stop();
|
|
+ if (m_pressed) {
|
|
+ m_pressAndHoldTimer->stop();
|
|
|
|
- m_pressed = false;
|
|
- emit pressedChanged();
|
|
+ m_pressed = false;
|
|
+ emit pressedChanged();
|
|
|
|
- emit canceled();
|
|
+ emit canceled();
|
|
+ }
|
|
}
|
|
--
|
|
2.13.0
|
|
|