diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index a217719e..b32f5406 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -3058,6 +3058,7 @@ void QGuiApplicationPrivate::processTouchEvent(QWindowSystemInterfacePrivate::To Qt::MouseButton button = Qt::NoButton; Qt::MouseButtons buttons = Qt::LeftButton; if (eventType == QEvent::TouchBegin && m_fakeMouseSourcePointId < 0) + || (touchPoints.count() == 1 && m_fakeMouseSourcePointId != touchPoints.first().id())) m_fakeMouseSourcePointId = touchPoints.first().id(); for (const auto &touchPoint : touchPoints) { if (touchPoint.id() == m_fakeMouseSourcePointId) { diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp index 5a36cfa0..a9455eca 100644 --- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp @@ -286,9 +286,11 @@ void QXcbConnection::xi2SetupDevices() m_tabletData.clear(); #endif m_scrollingDevices.clear(); - m_touchDevices.clear(); m_xiMasterPointerIds.clear(); + // FIXBUG: #123235 触摸过程中,插拔usb键盘/鼠标导致触摸失效 + QList deviceIds; + auto reply = Q_XCB_REPLY(xcb_input_xi_query_device, xcb_connection(), XCB_INPUT_DEVICE_ALL); if (!reply) { qCDebug(lcQpaXInputDevices) << "failed to query devices"; @@ -303,8 +305,21 @@ void QXcbConnection::xi2SetupDevices() continue; } // only slave pointer devices are relevant here - if (deviceInfo->type == XCB_INPUT_DEVICE_TYPE_SLAVE_POINTER) - xi2SetupDevice(deviceInfo, false); + + // FIXBUG: #123235 触摸过程中,插拔usb键盘/鼠标导致触摸失效 + if (deviceInfo->type == XCB_INPUT_DEVICE_TYPE_SLAVE_POINTER) { + if (!m_touchDevices.contains(deviceInfo->deviceid)) { + xi2SetupDevice(deviceInfo, false); + } + deviceIds.append(deviceInfo->deviceid); + } + } + + // FIXBUG: #123235 触摸过程中,插拔usb键盘/鼠标导致触摸失效的问题 + for (const auto &touchDeviceId : m_touchDevices.keys()) { + if (!deviceIds.contains(touchDeviceId)) { + m_touchDevices.remove(touchDeviceId); + } } if (m_xiMasterPointerIds.size() > 1) @@ -593,6 +608,10 @@ void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event) fixed1616ToReal(xiDeviceEvent->root_x), fixed1616ToReal(xiDeviceEvent->root_y),xiDeviceEvent->event); if (QXcbWindow *platformWindow = platformWindowFromId(xiDeviceEvent->event)) xi2ProcessTouch(xiDeviceEvent, platformWindow); + else { // When the window cannot be matched, delete it from touchPoints + if (TouchDeviceData *dev = touchDeviceForId(xiDeviceEvent->sourceid)) + dev->touchPoints.remove((xiDeviceEvent->detail % INT_MAX)); + } break; } } else if (xiEnterEvent && !xi2MouseEventsDisabled() && eventListener) {