src/gui/kernel/qapplication_win.cpp
changeset 33 3e2da88830cd
parent 30 5dc02b23752f
child 37 758a864f9613
--- a/src/gui/kernel/qapplication_win.cpp	Tue Jul 06 15:10:48 2010 +0300
+++ b/src/gui/kernel/qapplication_win.cpp	Wed Aug 18 10:37:55 2010 +0300
@@ -52,9 +52,11 @@
 #include <windowsm.h>
 #include <tpcshell.h>
 #ifdef QT_WINCE_GESTURES
+#ifndef QT_NO_GESTURES
 #include <gesture.h>
 #endif
 #endif
+#endif
 
 #include "qapplication.h"
 #include "qdesktopwidget.h"
@@ -116,8 +118,6 @@
 #  include <winable.h>
 #endif
 
-#include "private/qwinnativepangesturerecognizer_win_p.h"
-
 #ifndef WM_TOUCH
 #  define WM_TOUCH 0x0240
 
@@ -198,6 +198,7 @@
 #define SPI_SETSIPINFO        224
 #endif
 
+#ifndef QT_NO_GESTURES
 typedef DWORD (API *AygRecognizeGesture)(SHRGINFO*);
 static AygRecognizeGesture ptrRecognizeGesture = 0;
 static bool aygResolved = false;
@@ -211,6 +212,7 @@
         ptrRecognizeGesture = (AygRecognizeGesture) ayglib.resolve("SHRecognizeGesture");
     }
 }
+#endif // QT_NO_GESTURES
 
 #endif
 
@@ -463,7 +465,9 @@
     bool        translateConfigEvent(const MSG &msg);
     bool        translateCloseEvent(const MSG &msg);
     bool        translateTabletEvent(const MSG &msg, PACKET *localPacketBuf, int numPackets);
+#ifndef QT_NO_GESTURES
     bool        translateGestureEvent(const MSG &msg, const GESTUREINFO &gi);
+#endif
     void        repolishStyle(QStyle &style);
     inline void showChildren(bool spontaneous) { d_func()->showChildren(spontaneous); }
     inline void hideChildren(bool spontaneous) { d_func()->hideChildren(spontaneous); }
@@ -843,6 +847,7 @@
         ptrSetProcessDPIAware();
 #endif
 
+#ifndef QT_NO_GESTURES
     priv->GetGestureInfo = 0;
     priv->GetGestureExtraArgs = 0;
     priv->CloseGestureInfoHandle = 0;
@@ -883,6 +888,7 @@
         (PtrEndPanningFeedback)QLibrary::resolve(QLatin1String("uxtheme"),
                                                    "EndPanningFeedback");
 #endif
+#endif // QT_NO_GESTURES
 }
 
 /*****************************************************************************
@@ -949,6 +955,9 @@
     if (qt_widget_private(w)->isGLWidget) {
         cname = QLatin1String("QGLWidget");
         style = CS_DBLCLKS;
+#ifndef Q_WS_WINCE
+        style |= CS_OWNDC;
+#endif
         icon  = true;
     } else if (flags & Qt::MSWindowsOwnDC) {
         cname = QLatin1String("QWidgetOwnDC");
@@ -1542,7 +1551,7 @@
     case WM_SETTINGCHANGE:
 #ifdef Q_WS_WINCE
         // CE SIP hide/show
-        if (wParam == SPI_SETSIPINFO) {
+        if (qt_desktopWidget && wParam == SPI_SETSIPINFO) {
             QResizeEvent re(QSize(0, 0), QSize(0, 0)); // Calculated by QDesktopWidget
             QApplication::sendEvent(qt_desktopWidget, &re);
             break;
@@ -1667,12 +1676,14 @@
                         shrg.ptDown.y = GET_Y_LPARAM(lParam);
                         shrg.dwFlags = SHRG_RETURNCMD | SHRG_NOANIMATION;
                         resolveAygLibs();
+#ifndef QT_NO_GESTURES
                         if (ptrRecognizeGesture && (ptrRecognizeGesture(&shrg) == GN_CONTEXTMENU)) {
                             if (QApplication::activePopupWidget())
                                 QApplication::activePopupWidget()->close();
                             QContextMenuEvent e(QContextMenuEvent::Mouse, pos, globalPos);
                             result = qt_sendSpontaneousEvent(alienWidget, &e);
                         }
+#endif // QT_NO_GESTURES
                     }
                 }
             }
@@ -2474,7 +2485,7 @@
             if (OkCommand)
                 QApplication::postEvent(widget, new QEvent(QEvent::OkRequest));
             if (CancelCommand)
-                QApplication::postEvent(widget, new QEvent(QEvent::Close));
+                widget->showMinimized();
             else
 #ifndef QT_NO_MENUBAR
                 QMenuBar::wceCommands(LOWORD(wParam));
@@ -2556,6 +2567,7 @@
             }
             result = false;
             break;
+#ifndef QT_NO_GESTURES
 #if !defined(Q_WS_WINCE) || defined(QT_WINCE_GESTURES)
         case WM_GESTURE: {
             GESTUREINFO gi;
@@ -2590,6 +2602,7 @@
             break;
         }
 #endif // !defined(Q_WS_WINCE) || defined(QT_WINCE_GESTURES)
+#endif // QT_NO_GESTURES
 #ifndef QT_NO_CURSOR
         case WM_SETCURSOR: {
             QCursor *ovr = QApplication::overrideCursor();
@@ -3052,6 +3065,11 @@
             break;
         }
     }
+#ifndef Q_OS_WINCE
+    static bool trackMouseEventLookup = false;
+    typedef BOOL (WINAPI *PtrTrackMouseEvent)(LPTRACKMOUSEEVENT);
+    static PtrTrackMouseEvent ptrTrackMouseEvent = 0;
+#endif
     state  = translateButtonState(msg.wParam, type, button); // button state
     const QPoint widgetPos = mapFromGlobal(QPoint(msg.pt.x, msg.pt.y));
     QWidget *alienWidget = !internalWinId() ? this : childAt(widgetPos);
@@ -3116,9 +3134,6 @@
 #ifndef Q_OS_WINCE
 
             if (curWin != 0) {
-                static bool trackMouseEventLookup = false;
-                typedef BOOL (WINAPI *PtrTrackMouseEvent)(LPTRACKMOUSEEVENT);
-                static PtrTrackMouseEvent ptrTrackMouseEvent = 0;
                 if (!trackMouseEventLookup) {
                     trackMouseEventLookup = true;
                     ptrTrackMouseEvent = (PtrTrackMouseEvent)QLibrary::resolve(QLatin1String("comctl32"), "_TrackMouseEvent");
@@ -3232,6 +3247,21 @@
             qt_button_down = 0;
         }
 
+#ifndef Q_OS_WINCE
+        if (type == QEvent::MouseButtonPress
+            && QApplication::activePopupWidget() != activePopupWidget
+            && ptrTrackMouseEvent
+            && curWin) {
+            // Since curWin is already the window we clicked on,
+            // we have to setup the mouse tracking here.
+            TRACKMOUSEEVENT tme;
+            tme.cbSize = sizeof(TRACKMOUSEEVENT);
+            tme.dwFlags = 0x00000002;    // TME_LEAVE
+            tme.hwndTrack = curWin;      // Track on window receiving msgs
+            tme.dwHoverTime = (DWORD)-1; // HOVER_DEFAULT
+            ptrTrackMouseEvent(&tme);
+        }
+#endif
         if (type == QEvent::MouseButtonPress
             && QApplication::activePopupWidget() != activePopupWidget
             && replayPopupMouseEvent) {
@@ -3825,6 +3855,7 @@
     return d_func()->close_helper(QWidgetPrivate::CloseWithSpontaneousEvent);
 }
 
+#ifndef QT_NO_GESTURES
 bool QETWidget::translateGestureEvent(const MSG &, const GESTUREINFO &gi)
 {
     const QPoint widgetPos = QPoint(gi.ptsLocation.x, gi.ptsLocation.y);
@@ -3863,7 +3894,7 @@
         qt_sendSpontaneousEvent(widget, &event);
     return true;
 }
-
+#endif // QT_NO_GESTURES
 
 void  QApplication::setCursorFlashTime(int msecs)
 {
@@ -4053,36 +4084,14 @@
 
 void QApplicationPrivate::initializeMultitouch_sys()
 {
-    static const IID QT_IID_IInkTablets = {0x112086D9, 0x7779, 0x4535, {0xA6, 0x99, 0x86, 0x2B, 0x43, 0xAC, 0x18, 0x63} };
-    static const IID QT_IID_IInkTablet2 = {0x90c91ad2, 0xfa36, 0x49d6, {0x95, 0x16, 0xce, 0x8d, 0x57, 0x0f, 0x6f, 0x85} };
-    static const CLSID QT_CLSID_InkTablets = {0x6E4FCB12, 0x510A, 0x4d40, {0x93, 0x04, 0x1D, 0xA1, 0x0A, 0xE9, 0x14, 0x7C} };
-
-    IInkTablets *iInkTablets = 0;
-    HRESULT hr = CoCreateInstance(QT_CLSID_InkTablets, NULL, CLSCTX_ALL, QT_IID_IInkTablets, (void**)&iInkTablets);
-    if (SUCCEEDED(hr)) {
-        long count = 0;
-        iInkTablets->get_Count(&count);
-        for (long i = 0; i < count; ++i) {
-            IInkTablet *iInkTablet = 0;
-            hr = iInkTablets->Item(i, &iInkTablet);
-            if (FAILED(hr))
-                continue;
-            IInkTablet2 *iInkTablet2 = 0;
-            hr = iInkTablet->QueryInterface(QT_IID_IInkTablet2, (void**)&iInkTablet2);
-            iInkTablet->Release();
-            if (FAILED(hr))
-                continue;
-            TabletDeviceKind kind;
-            hr = iInkTablet2->get_DeviceKind(&kind);
-            iInkTablet2->Release();
-            if (FAILED(hr))
-                continue;
-            if (kind == TDK_Touch) {
-                QApplicationPrivate::HasTouchSupport = true;
-                break;
-            }
-        }
-        iInkTablets->Release();
+    if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS7) {
+        static const int QT_SM_DIGITIZER = 94;
+        int value = GetSystemMetrics(QT_SM_DIGITIZER);
+        static const int QT_NID_INTEGRATED_TOUCH = 0x01;
+        static const int QT_NID_EXTERNAL_TOUCH   = 0x02;
+        static const int QT_NID_MULTI_INPUT      = 0x40;
+        QApplicationPrivate::HasTouchSupport =
+                value & (QT_NID_INTEGRATED_TOUCH | QT_NID_EXTERNAL_TOUCH | QT_NID_MULTI_INPUT);
     }
 
     QLibrary library(QLatin1String("user32"));