From 2ac5249eb0b8081b5397c97a23c41ba59cbc4472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9F=A9=E5=93=81=E9=BE=99?= Date: Wed, 24 May 2023 13:43:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6=E8=A7=A6=E6=91=B8patch1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gui/kernel/qguiapplication.cpp | 1 + .../platforms/xcb/qxcbconnection_xi2.cpp | 25 ++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) 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) {