xcb: partly revert 3bc0f1724a
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 <allan.jensen@qt.io>
bb10
parent
0dfdf23d05
commit
6f87926df5
|
|
@ -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<xXIDeviceEvent *>(next);
|
||||
if (id == xiDeviceNextEvent->detail % INT_MAX &&
|
||||
xiDeviceNextEvent->deviceid == xiDeviceEvent->deviceid)
|
||||
if (id == xiDeviceNextEvent->detail % INT_MAX)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -582,7 +582,6 @@ private:
|
|||
|
||||
bool m_xi2Enabled = false;
|
||||
#if QT_CONFIG(xinput2)
|
||||
QVector<int> m_floatingSlaveDevices;
|
||||
int m_xi2Minor = -1;
|
||||
void initializeXInput2();
|
||||
void xi2SetupDevice(void *info, bool removeExisting = true);
|
||||
|
|
|
|||
|
|
@ -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<Display *>(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<Display *>(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<xXIDeviceEvent *>(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<xXIDeviceEvent *>(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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue