From 4f27960dd85f88c84998be02817e0674c43adbdf Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 31 May 2012 16:33:07 +0300 Subject: Dispatch tablet events to widgets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plus remove some platform-specific tablet leftovers from Qt4. Change-Id: I376abc38d1fe4c253d8803cf0ce007e2d6c298bf Reviewed-by: Friedemann Kleint Reviewed-by: Samuel Rødal --- src/widgets/kernel/qapplication_p.h | 60 -------------------------------- src/widgets/kernel/qwidgetwindow_qpa.cpp | 35 +++++++++++++++++++ src/widgets/kernel/qwidgetwindow_qpa_p.h | 3 ++ 3 files changed, 38 insertions(+), 60 deletions(-) (limited to 'src') diff --git a/src/widgets/kernel/qapplication_p.h b/src/widgets/kernel/qapplication_p.h index 891d71a737..f700851cf3 100644 --- a/src/widgets/kernel/qapplication_p.h +++ b/src/widgets/kernel/qapplication_p.h @@ -94,7 +94,6 @@ extern QClipboard *qt_clipboard; #if defined (Q_OS_WIN32) || defined (Q_OS_CYGWIN) || defined(Q_OS_WINCE) extern QSysInfo::WinVersion qt_winver; -enum { QT_TABLET_NPACKETQSIZE = 128 }; # ifdef Q_OS_WINCE extern DWORD qt_cever; # endif @@ -107,56 +106,6 @@ class QDirectPainter; struct QWSServerCleaner { ~QWSServerCleaner(); }; #endif -#ifndef QT_NO_TABLET -struct QTabletDeviceData -{ -#ifndef Q_WS_MAC - int minPressure; - int maxPressure; - int minTanPressure; - int maxTanPressure; - int minX, maxX, minY, maxY, minZ, maxZ; - inline QPointF scaleCoord(int coordX, int coordY, int outOriginX, int outExtentX, - int outOriginY, int outExtentY) const; -#endif -}; - -static inline int sign(int x) -{ - return x >= 0 ? 1 : -1; -} - -#ifndef Q_WS_MAC -inline QPointF QTabletDeviceData::scaleCoord(int coordX, int coordY, - int outOriginX, int outExtentX, - int outOriginY, int outExtentY) const -{ - QPointF ret; - - if (sign(outExtentX) == sign(maxX)) - ret.setX(((coordX - minX) * qAbs(outExtentX) / qAbs(qreal(maxX - minX))) + outOriginX); - else - ret.setX(((qAbs(maxX) - (coordX - minX)) * qAbs(outExtentX) / qAbs(qreal(maxX - minX))) - + outOriginX); - - if (sign(outExtentY) == sign(maxY)) - ret.setY(((coordY - minY) * qAbs(outExtentY) / qAbs(qreal(maxY - minY))) + outOriginY); - else - ret.setY(((qAbs(maxY) - (coordY - minY)) * qAbs(outExtentY) / qAbs(qreal(maxY - minY))) - + outOriginY); - - return ret; -} -#endif - -typedef QList QTabletDeviceDataList; -QTabletDeviceDataList *qt_tablet_devices(); -# if defined(Q_WS_MAC) -typedef QHash QMacTabletHash; -QMacTabletHash *qt_mac_tablet_hash(); -# endif -#endif - typedef QHash FontHash; FontHash *qt_app_fonts_hash(); @@ -282,15 +231,6 @@ public: static void applyQWSSpecificCommandLineArguments(QWidget *main_widget); #endif -#ifdef Q_WS_MAC - static OSStatus globalEventProcessor(EventHandlerCallRef, EventRef, void *); - static OSStatus globalAppleEventProcessor(const AppleEvent *, AppleEvent *, long); - static OSStatus tabletProximityCallback(EventHandlerCallRef, EventRef, void *); - static void qt_initAfterNSAppStarted(); - static void setupAppleEvents(); - static bool qt_mac_apply_settings(); -#endif - #ifdef Q_WS_QWS QPointer last_manager; QWSServerCleaner qwsServerCleaner; diff --git a/src/widgets/kernel/qwidgetwindow_qpa.cpp b/src/widgets/kernel/qwidgetwindow_qpa.cpp index 2e1e6854ff..3b1d69e46d 100644 --- a/src/widgets/kernel/qwidgetwindow_qpa.cpp +++ b/src/widgets/kernel/qwidgetwindow_qpa.cpp @@ -51,6 +51,7 @@ QT_BEGIN_NAMESPACE QWidget *qt_button_down = 0; // widget got last button-down +static QWidget *qt_tablet_target = 0; // popup control QWidget *qt_popup_down = 0; // popup that contains the pressed widget @@ -178,6 +179,14 @@ bool QWidgetWindow::event(QEvent *event) } return true; +#ifndef QT_NO_TABLETEVENT + case QEvent::TabletPress: + case QEvent::TabletMove: + case QEvent::TabletRelease: + handleTabletEvent(static_cast(event)); + return true; +#endif + default: break; } @@ -527,6 +536,32 @@ bool QWidgetWindow::nativeEvent(const QByteArray &eventType, void *message, long return m_widget->nativeEvent(eventType, message, result); } +#ifndef QT_NO_TABLETEVENT +void QWidgetWindow::handleTabletEvent(QTabletEvent *event) +{ + if (event->type() == QEvent::TabletPress) { + QWidget *widget = m_widget->childAt(event->pos()); + if (!widget) + widget = m_widget; + + qt_tablet_target = widget; + } + + if (qt_tablet_target) { + QPointF delta = event->globalPosF() - event->globalPos(); + QPointF mapped = qt_tablet_target->mapFromGlobal(event->globalPos()) + delta; + QTabletEvent ev(event->type(), mapped, event->globalPosF(), event->device(), event->pointerType(), + event->pressure(), event->xTilt(), event->yTilt(), event->tangentialPressure(), + event->rotation(), event->z(), event->modifiers(), event->uniqueId()); + ev.setTimestamp(event->timestamp()); + QGuiApplication::sendSpontaneousEvent(qt_tablet_target, &ev); + } + + if (event->type() == QEvent::TabletRelease) + qt_tablet_target = 0; +} +#endif // QT_NO_TABLETEVENT + void QWidgetWindow::updateObjectName() { QString name = m_widget->objectName(); diff --git a/src/widgets/kernel/qwidgetwindow_qpa_p.h b/src/widgets/kernel/qwidgetwindow_qpa_p.h index 515cb4d919..d4fd37c456 100644 --- a/src/widgets/kernel/qwidgetwindow_qpa_p.h +++ b/src/widgets/kernel/qwidgetwindow_qpa_p.h @@ -84,6 +84,9 @@ protected: void handleExposeEvent(QExposeEvent *); void handleWindowStateChangedEvent(QWindowStateChangeEvent *event); bool nativeEvent(const QByteArray &eventType, void *message, long *result); +#ifndef QT_NO_TABLETEVENT + void handleTabletEvent(QTabletEvent *); +#endif private slots: void updateObjectName(); -- cgit v1.2.3