From 38aa7f5fe70103b08298fb0c1a3431beb217f950 Mon Sep 17 00:00:00 2001 From: HIDAKA Takahiro Date: Wed, 11 Sep 2024 03:56:49 +0900 Subject: [PATCH] iOS: Add QPointingDevice for Apple Pencil MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For Apple Pencil 1st generation, it supports xTilt and yTilt capabilities. Task-number: QTBUG-128466 Change-Id: I572a303a4d213417004cacadbc7cef9c96334720 Reviewed-by: Tor Arne Vestbø --- src/plugins/platforms/ios/qiosintegration.h | 6 ++++++ src/plugins/platforms/ios/qiosintegration.mm | 13 +++++++++++++ src/plugins/platforms/ios/quiview.mm | 12 +++++++----- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/plugins/platforms/ios/qiosintegration.h b/src/plugins/platforms/ios/qiosintegration.h index 6c2014d048f..47ffbce3701 100644 --- a/src/plugins/platforms/ios/qiosintegration.h +++ b/src/plugins/platforms/ios/qiosintegration.h @@ -72,6 +72,9 @@ public: QPlatformNativeInterface *nativeInterface() const override; QPointingDevice *touchDevice(); +#if QT_CONFIG(tabletevent) + QPointingDevice *pencilDevice(); +#endif #if QT_CONFIG(accessibility) QPlatformAccessibility *accessibility() const override; #endif @@ -109,6 +112,9 @@ private: #endif QPlatformInputContext *m_inputContext; QPointingDevice *m_touchDevice; +#if QT_CONFIG(tabletevent) + QPointingDevice *m_pencilDevice = nullptr; +#endif QIOSServices *m_platformServices; mutable QPlatformAccessibility *m_accessibility; QFactoryLoader *m_optionalPlugins; diff --git a/src/plugins/platforms/ios/qiosintegration.mm b/src/plugins/platforms/ios/qiosintegration.mm index 69b79b111b3..a2a387cdcc5 100644 --- a/src/plugins/platforms/ios/qiosintegration.mm +++ b/src/plugins/platforms/ios/qiosintegration.mm @@ -104,6 +104,12 @@ void QIOSIntegration::initialize() QWindowSystemInterface::registerInputDevice(m_touchDevice); #if QT_CONFIG(tabletevent) QWindowSystemInterfacePrivate::TabletEvent::setPlatformSynthesizesMouse(false); + m_pencilDevice = new QPointingDevice( + "Apple Pencil", 0, QInputDevice::DeviceType::Stylus, QPointingDevice::PointerType::Pen, + QInputDevice::Capability::Position | QInputDevice::Capability::Pressure + | QInputDevice::Capability::XTilt | QInputDevice::Capability::YTilt, + 1, 0); + QWindowSystemInterface::registerInputDevice(m_pencilDevice); #endif QMacMimeRegistry::initializeMimeTypes(); @@ -271,6 +277,13 @@ QPointingDevice *QIOSIntegration::touchDevice() return m_touchDevice; } +#if QT_CONFIG(tabletevent) +QPointingDevice *QIOSIntegration::pencilDevice() +{ + return m_pencilDevice; +} +#endif + #if QT_CONFIG(accessibility) QPlatformAccessibility *QIOSIntegration::accessibility() const { diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm index ae6d98dd7b1..c069296f24a 100644 --- a/src/plugins/platforms/ios/quiview.mm +++ b/src/plugins/platforms/ios/quiview.mm @@ -387,13 +387,15 @@ inline ulong getTimeStamp(UIEvent *event) qCDebug(lcQpaTablet) << i << ":" << timeStamp << localViewPosition << pressure << state << "azimuth" << azimuth.dx << azimuth.dy << "angle" << azimuthAngle << "altitude" << cTouch.altitudeAngle << "xTilt" << qBound(-60.0, altitudeAngle * azimuth.dx, 60.0) << "yTilt" << qBound(-60.0, altitudeAngle * azimuth.dy, 60.0); - QWindowSystemInterface::handleTabletEvent(self.platformWindow->window(), timeStamp, localViewPosition, globalScreenPosition, - // device, pointerType, buttons - int(QInputDevice::DeviceType::Stylus), int(QPointingDevice::PointerType::Pen), state == QEventPoint::State::Released ? Qt::NoButton : Qt::LeftButton, + QWindowSystemInterface::handleTabletEvent(self.platformWindow->window(), timeStamp, + // device, local, global + iosIntegration->pencilDevice(), localViewPosition, globalScreenPosition, + // buttons + state == QEventPoint::State::Released ? Qt::NoButton : Qt::LeftButton, // pressure, xTilt, yTilt pressure, qBound(-60.0, altitudeAngle * azimuth.dx, 60.0), qBound(-60.0, altitudeAngle * azimuth.dy, 60.0), - // tangentialPressure, rotation, z, uid, modifiers - 0, azimuthAngle, 0, 0, Qt::NoModifier); + // tangentialPressure, rotation, z, modifiers + 0, azimuthAngle, 0, Qt::NoModifier); ++i; } }