Dispatch tablet events to widgets
authorLaszlo Agocs <laszlo.p.agocs@nokia.com>
Thu, 31 May 2012 13:33:07 +0000 (16:33 +0300)
committerQt by Nokia <qt-info@nokia.com>
Fri, 1 Jun 2012 16:26:18 +0000 (18:26 +0200)
Plus remove some platform-specific tablet leftovers from Qt4.

Change-Id: I376abc38d1fe4c253d8803cf0ce007e2d6c298bf
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
src/widgets/kernel/qapplication_p.h
src/widgets/kernel/qwidgetwindow_qpa.cpp
src/widgets/kernel/qwidgetwindow_qpa_p.h

index 891d71a..f700851 100644 (file)
@@ -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<QTabletDeviceData> QTabletDeviceDataList;
-QTabletDeviceDataList *qt_tablet_devices();
-# if defined(Q_WS_MAC)
-typedef QHash<int, QTabletDeviceData> QMacTabletHash;
-QMacTabletHash *qt_mac_tablet_hash();
-# endif
-#endif
-
 typedef QHash<QByteArray, QFont> 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<QWSManager> last_manager;
     QWSServerCleaner qwsServerCleaner;
index 2e1e685..3b1d69e 100644 (file)
@@ -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<QTabletEvent *>(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();
index 515cb4d..d4fd37c 100644 (file)
@@ -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();