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
Gatis Paeglis 2018-07-26 11:33:33 +02:00
parent 0dfdf23d05
commit 6f87926df5
4 changed files with 3 additions and 101 deletions

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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;

View File

@ -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)
{