From 6f87926df55edb119e5eeb53c3beac135fdf72e2 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Thu, 26 Jul 2018 11:33:33 +0200 Subject: xcb: partly revert 3bc0f1724ae49c2fd7e6d7bcb650350d20d12246 After trying to fix (work around) system resize/move issues in various ways from within the platform plugin, it has been concluded that it is a bug at widget layer and should be fixed there instead: QTBUG-69716. This patch reverts parts of 3bc0f1724a and disables system move / resize on XCB plugin. Meaning, QSizeGrip will use its own implementation for resizing a window. Task-number: QTBUG-68501 Task-number: QTBUG-69628 Change-Id: Ib4744a93fb3e3c20f690a8f43713103856cb7d1a Reviewed-by: Allan Sandfeld Jensen --- src/plugins/platforms/xcb/qxcbconnection.cpp | 3 +- src/plugins/platforms/xcb/qxcbconnection.h | 1 - src/plugins/platforms/xcb/qxcbconnection_xi2.cpp | 89 +----------------------- src/plugins/platforms/xcb/qxcbwindow.cpp | 11 +-- 4 files changed, 3 insertions(+), 101 deletions(-) (limited to 'src/plugins/platforms/xcb') diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp index dbc53abeca..aca2c347ea 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp @@ -1718,8 +1718,7 @@ bool QXcbConnection::compressEvent(xcb_generic_event_t *event, int currentIndex, continue; if (isXIType(next, m_xiOpCode, XI_TouchUpdate)) { xXIDeviceEvent *xiDeviceNextEvent = reinterpret_cast(next); - if (id == xiDeviceNextEvent->detail % INT_MAX && - xiDeviceNextEvent->deviceid == xiDeviceEvent->deviceid) + if (id == xiDeviceNextEvent->detail % INT_MAX) return true; } } diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h index 98f08e6b2c..9966e06c7b 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.h +++ b/src/plugins/platforms/xcb/qxcbconnection.h @@ -582,7 +582,6 @@ private: bool m_xi2Enabled = false; #if QT_CONFIG(xinput2) - QVector m_floatingSlaveDevices; int m_xi2Minor = -1; void initializeXInput2(); void xi2SetupDevice(void *info, bool removeExisting = true); diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp index 9a250b875f..6a5248b8f1 100644 --- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp @@ -127,7 +127,7 @@ void QXcbConnection::xi2SelectDeviceEvents(xcb_window_t window) XIEventMask mask; mask.mask_len = sizeof(bitMask); mask.mask = xiBitMask; - mask.deviceid = XIAllDevices; + mask.deviceid = XIAllMasterDevices; Display *dpy = static_cast(m_xlib_display); Status result = XISelectEvents(dpy, window, &mask, 1); if (result == Success) @@ -315,7 +315,6 @@ void QXcbConnection::xi2SetupDevices() #endif m_scrollingDevices.clear(); m_touchDevices.clear(); - m_floatingSlaveDevices.clear(); Display *xDisplay = static_cast(m_xlib_display); int deviceCount = 0; @@ -323,10 +322,6 @@ void QXcbConnection::xi2SetupDevices() m_xiMasterPointerIds.clear(); for (int i = 0; i < deviceCount; ++i) { XIDeviceInfo deviceInfo = devices[i]; - if (deviceInfo.use == XIFloatingSlave) { - m_floatingSlaveDevices.append(deviceInfo.deviceid); - continue; - } if (deviceInfo.use == XIMasterPointer) { m_xiMasterPointerIds.append(deviceInfo.deviceid); continue; @@ -555,72 +550,6 @@ static inline qreal fixed1616ToReal(FP1616 val) } #endif // defined(XCB_USE_XINPUT21) || QT_CONFIG(tabletevent) -namespace { - -/*! \internal - - Qt listens for XIAllDevices to avoid losing mouse events. This function - ensures that we don't process the same event twice: from a slave device and - then again from a master device. - - In a normal use case (e.g. mouse press and release inside a window), we will - drop events from master devices as duplicates. Other advantage of processing - events from slave devices is that they don't share button state. All buttons - on a master device share the state. - - Examples of special cases: - - - During system move/resize, window manager (_NET_WM_MOVERESIZE) grabs the - master pointer, in this case we process the matching release from the slave - device. A master device event is not sent by the server, hence no duplicate - event to drop. If we listened for XIAllMasterDevices instead, we would never - see a release event in this case. - - - If we dismiss a context menu by clicking somewhere outside a Qt application, - we will process the mouse press from the master pointer as that is the - device we are grabbing. We are not grabbing slave devices (grabbing on the - slave device is buggy according to 19d289ab1b5bde3e136765e5432b5c7d004df3a4). - And since the event occurs outside our window, the slave device event is - not sent to us by the server, hence no duplicate event to drop. -*/ -bool isDuplicateEvent(xcb_ge_event_t *event) -{ - struct qXIEvent { - bool isValid = false; - uint16_t sourceid; - uint8_t evtype; - uint32_t detail; - int32_t root_x; - int32_t root_y; - }; - static qXIEvent lastSeenEvent; - - bool isDuplicate = false; - auto xiDeviceEvent = reinterpret_cast(event); - if (lastSeenEvent.isValid) { - isDuplicate = lastSeenEvent.sourceid == xiDeviceEvent->sourceid && - lastSeenEvent.evtype == xiDeviceEvent->evtype && - lastSeenEvent.detail == xiDeviceEvent->detail && - lastSeenEvent.root_x == xiDeviceEvent->root_x && - lastSeenEvent.root_y == xiDeviceEvent->root_y; - } else { - lastSeenEvent.isValid = true; - } - lastSeenEvent.sourceid = xiDeviceEvent->sourceid; - lastSeenEvent.evtype = xiDeviceEvent->evtype; - lastSeenEvent.detail = xiDeviceEvent->detail; - lastSeenEvent.root_x = xiDeviceEvent->root_x; - lastSeenEvent.root_y = xiDeviceEvent->root_y; - - if (isDuplicate) - // This sanity check ensures that special cases like QTBUG-59277 keep working. - lastSeenEvent.isValid = false; // An event can be a duplicate only once. - - return isDuplicate; -} - -} // namespace - void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event) { xi2PrepareXIGenericDeviceEvent(event); @@ -630,14 +559,10 @@ void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event) xXIEnterEvent *xiEnterEvent = 0; QXcbWindowEventListener *eventListener = 0; - bool isTouchEvent = true; switch (xiEvent->evtype) { case XI_ButtonPress: case XI_ButtonRelease: case XI_Motion: - isTouchEvent = false; - if (!xi2MouseEventsDisabled() && isDuplicateEvent(event)) - return; #ifdef XCB_USE_XINPUT22 case XI_TouchBegin: case XI_TouchUpdate: @@ -645,18 +570,6 @@ void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event) #endif { xiDeviceEvent = reinterpret_cast(event); - - if (m_floatingSlaveDevices.contains(xiDeviceEvent->sourceid)) - return; // Not interested in floating slave device events, only in attached slaves. - - bool isSlaveEvent = xiDeviceEvent->deviceid == xiDeviceEvent->sourceid; - if (!xi2MouseEventsDisabled() && isTouchEvent && isSlaveEvent) { - // For touch events we want events only from master devices, at least - // currently there is no apparent reason why we would need to consider - // events from slave devices. - return; - } - eventListener = windowEventListenerFromId(xiDeviceEvent->event); sourceDeviceId = xiDeviceEvent->sourceid; // use the actual device id instead of the master break; diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 9b6376f39e..59b06d543e 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -2632,7 +2632,7 @@ bool QXcbWindow::startSystemMove(const QPoint &pos) bool QXcbWindow::startSystemMoveResize(const QPoint &pos, int corner) { -#if QT_CONFIG(xinput2) + return false; // ### FIXME QTBUG-69716 const xcb_atom_t moveResize = connection()->atom(QXcbAtom::_NET_WM_MOVERESIZE); if (!connection()->wmSupport()->isSupportedByWM(moveResize)) return false; @@ -2651,10 +2651,6 @@ bool QXcbWindow::startSystemMoveResize(const QPoint &pos, int corner) } else #endif { // Started by mouse press. - if (!connection()->hasXInput2() || connection()->xi2MouseEventsDisabled()) { - // Without XI2 we can't get button press/move/release events. - return false; - } if (connection()->isUnity()) return false; // _NET_WM_MOVERESIZE on this WM is bouncy (WM bug?). @@ -2662,11 +2658,6 @@ bool QXcbWindow::startSystemMoveResize(const QPoint &pos, int corner) } return true; -#else - Q_UNUSED(pos); - Q_UNUSED(corner); - return false; -#endif } void QXcbWindow::doStartSystemMoveResize(const QPoint &globalPos, int corner) { -- cgit v1.2.3