diff options
Diffstat (limited to 'src/plugins/platforms/windows')
90 files changed, 1609 insertions, 682 deletions
diff --git a/src/plugins/platforms/windows/main.cpp b/src/plugins/platforms/windows/main.cpp index 980de88e72..8bde87c975 100644 --- a/src/plugins/platforms/windows/main.cpp +++ b/src/plugins/platforms/windows/main.cpp @@ -39,7 +39,7 @@ #include <qpa/qplatformintegrationplugin.h> -#include <QtCore/QStringList> +#include <QtCore/qstringlist.h> #include "qwindowsgdiintegration.h" diff --git a/src/plugins/platforms/windows/qtwindowsglobal.h b/src/plugins/platforms/windows/qtwindowsglobal.h index 6c44541314..ef22a4451a 100644 --- a/src/plugins/platforms/windows/qtwindowsglobal.h +++ b/src/plugins/platforms/windows/qtwindowsglobal.h @@ -60,6 +60,21 @@ # define WM_DPICHANGED 0x02E0 #endif +// WM_POINTER support from Windows 8 onwards (WINVER >= 0x0602) +#ifndef WM_POINTERUPDATE +# define WM_NCPOINTERUPDATE 0x0241 +# define WM_NCPOINTERDOWN 0x0242 +# define WM_NCPOINTERUP 0x0243 +# define WM_POINTERUPDATE 0x0245 +# define WM_POINTERDOWN 0x0246 +# define WM_POINTERUP 0x0247 +# define WM_POINTERENTER 0x0249 +# define WM_POINTERLEAVE 0x024A +# define WM_POINTERACTIVATE 0x024B +# define WM_POINTERWHEEL 0x024E +# define WM_POINTERHWHEEL 0x024F +#endif // WM_POINTERUPDATE + QT_BEGIN_NAMESPACE namespace QtWindows @@ -78,6 +93,7 @@ enum ApplicationEventFlag = 0x1000000, ThemingEventFlag = 0x2000000, GenericEventFlag = 0x4000000, // Misc + PointerEventFlag = 0x8000000, }; enum WindowsEventType // Simplify event types @@ -103,13 +119,16 @@ enum WindowsEventType // Simplify event types DpiChangedEvent = WindowEventFlag + 21, EnterSizeMoveEvent = WindowEventFlag + 22, ExitSizeMoveEvent = WindowEventFlag + 23, + PointerActivateWindowEvent = WindowEventFlag + 24, MouseEvent = MouseEventFlag + 1, MouseWheelEvent = MouseEventFlag + 2, CursorEvent = MouseEventFlag + 3, TouchEvent = TouchEventFlag + 1, + PointerEvent = PointerEventFlag + 1, NonClientMouseEvent = NonClientEventFlag + MouseEventFlag + 1, NonClientHitTest = NonClientEventFlag + 2, NonClientCreate = NonClientEventFlag + 3, + NonClientPointerEvent = NonClientEventFlag + PointerEventFlag + 4, KeyEvent = KeyEventFlag + 1, KeyDownEvent = KeyEventFlag + KeyDownEventFlag + 1, KeyboardLayoutChangeEvent = KeyEventFlag + 2, @@ -167,6 +186,8 @@ inline QtWindows::WindowsEventType windowsEventType(UINT message, WPARAM wParamI QtWindows::ActivateApplicationEvent : QtWindows::DeactivateApplicationEvent; case WM_MOUSEACTIVATE: return QtWindows::MouseActivateWindowEvent; + case WM_POINTERACTIVATE: + return QtWindows::PointerActivateWindowEvent; case WM_ACTIVATE: return LOWORD(wParamIn) == WA_INACTIVE ? QtWindows::DeactivateWindowEvent : QtWindows::ActivateWindowEvent; @@ -297,6 +318,10 @@ inline QtWindows::WindowsEventType windowsEventType(UINT message, WPARAM wParamI if ((message >= WM_MOUSEFIRST && message <= WM_MOUSELAST) || (message >= WM_XBUTTONDOWN && message <= WM_XBUTTONDBLCLK)) return QtWindows::MouseEvent; + if (message >= WM_NCPOINTERUPDATE && message <= WM_NCPOINTERUP) + return QtWindows::NonClientPointerEvent; + if (message >= WM_POINTERUPDATE && message <= WM_POINTERHWHEEL) + return QtWindows::PointerEvent; return QtWindows::UnknownEvent; } diff --git a/src/plugins/platforms/windows/qwin10helpers.cpp b/src/plugins/platforms/windows/qwin10helpers.cpp index 5976fd23c0..cc17d8798f 100644 --- a/src/plugins/platforms/windows/qwin10helpers.cpp +++ b/src/plugins/platforms/windows/qwin10helpers.cpp @@ -39,8 +39,8 @@ #include "qwin10helpers.h" -#include <QtCore/QDebug> -#include <QtCore/QOperatingSystemVersion> +#include <QtCore/qdebug.h> +#include <QtCore/qoperatingsystemversion.h> #include <QtCore/private/qsystemlibrary_p.h> #if defined(Q_CC_MINGW) || defined(Q_CC_CLANG) diff --git a/src/plugins/platforms/windows/qwin10helpers.h b/src/plugins/platforms/windows/qwin10helpers.h index e1485003dd..4f364dfc59 100644 --- a/src/plugins/platforms/windows/qwin10helpers.h +++ b/src/plugins/platforms/windows/qwin10helpers.h @@ -40,7 +40,7 @@ #ifndef QWIN10HELPERS_H #define QWIN10HELPERS_H -#include <QtCore/QtGlobal> +#include <QtCore/qglobal.h> #include <QtCore/qt_windows.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsbackingstore.cpp b/src/plugins/platforms/windows/qwindowsbackingstore.cpp index 80872c3ea3..03b44458ac 100644 --- a/src/plugins/platforms/windows/qwindowsbackingstore.cpp +++ b/src/plugins/platforms/windows/qwindowsbackingstore.cpp @@ -41,13 +41,13 @@ #include "qwindowswindow.h" #include "qwindowscontext.h" -#include <QtGui/QWindow> -#include <QtGui/QPainter> +#include <QtGui/qwindow.h> +#include <QtGui/qpainter.h> #include <QtFontDatabaseSupport/private/qwindowsnativeimage_p.h> #include <private/qhighdpiscaling_p.h> #include <private/qimage_p.h> -#include <QtCore/QDebug> +#include <QtCore/qdebug.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsbackingstore.h b/src/plugins/platforms/windows/qwindowsbackingstore.h index 9e62266697..5692c08b1e 100644 --- a/src/plugins/platforms/windows/qwindowsbackingstore.h +++ b/src/plugins/platforms/windows/qwindowsbackingstore.h @@ -43,7 +43,7 @@ #include <QtCore/qt_windows.h> #include <qpa/qplatformbackingstore.h> -#include <QtCore/QScopedPointer> +#include <QtCore/qscopedpointer.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsclipboard.cpp b/src/plugins/platforms/windows/qwindowsclipboard.cpp index 01191a7dc1..53f329422c 100644 --- a/src/plugins/platforms/windows/qwindowsclipboard.cpp +++ b/src/plugins/platforms/windows/qwindowsclipboard.cpp @@ -42,16 +42,16 @@ #include "qwindowsole.h" #include "qwindowsmime.h" -#include <QtGui/QGuiApplication> -#include <QtGui/QClipboard> -#include <QtGui/QColor> -#include <QtGui/QImage> - -#include <QtCore/QDebug> -#include <QtCore/QMimeData> -#include <QtCore/QStringList> -#include <QtCore/QVariant> -#include <QtCore/QUrl> +#include <QtGui/qguiapplication.h> +#include <QtGui/qclipboard.h> +#include <QtGui/qcolor.h> +#include <QtGui/qimage.h> + +#include <QtCore/qdebug.h> +#include <QtCore/qmimedata.h> +#include <QtCore/qstringlist.h> +#include <QtCore/qvariant.h> +#include <QtCore/qurl.h> #include <QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h> diff --git a/src/plugins/platforms/windows/qwindowscombase.h b/src/plugins/platforms/windows/qwindowscombase.h index 5e51b6b7b7..937a2e69ce 100644 --- a/src/plugins/platforms/windows/qwindowscombase.h +++ b/src/plugins/platforms/windows/qwindowscombase.h @@ -40,7 +40,7 @@ #ifndef QWINDOWSCOMBASE_H #define QWINDOWSCOMBASE_H -#include <QtCore/QtGlobal> +#include <QtCore/qglobal.h> #include <unknwn.h> diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 1da39a0516..8d6a81036b 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -43,6 +43,7 @@ #include "qwindowswindow.h" #include "qwindowskeymapper.h" #include "qwindowsmousehandler.h" +#include "qwindowspointerhandler.h" #include "qtwindowsglobal.h" #include "qwindowsmenu.h" #include "qwindowsmime.h" @@ -52,7 +53,7 @@ #endif #include "qwindowstheme.h" #include <private/qguiapplication_p.h> -#ifndef QT_NO_ACCESSIBILITY +#if QT_CONFIG(accessibility) # include "uiautomation/qwindowsuiaaccessibility.h" #endif #if QT_CONFIG(sessionmanager) @@ -62,20 +63,19 @@ #include "qwindowsscreen.h" #include "qwindowstheme.h" -#include <QtGui/qtguiglobal.h> -#include <QtGui/QWindow> +#include <QtGui/qwindow.h> #include <qpa/qwindowsysteminterface.h> #include <qpa/qplatformnativeinterface.h> -#include <QtGui/QGuiApplication> -#include <QtGui/QOpenGLContext> - -#include <QtCore/QSet> -#include <QtCore/QHash> -#include <QtCore/QStringList> -#include <QtCore/QDebug> -#include <QtCore/QOperatingSystemVersion> -#include <QtCore/QSysInfo> -#include <QtCore/QScopedArrayPointer> +#include <QtGui/qguiapplication.h> +#include <QtGui/qopenglcontext.h> + +#include <QtCore/qset.h> +#include <QtCore/qhash.h> +#include <QtCore/qstringlist.h> +#include <QtCore/qdebug.h> +#include <QtCore/qoperatingsystemversion.h> +#include <QtCore/qsysinfo.h> +#include <QtCore/qscopedpointer.h> #include <QtCore/private/qsystemlibrary_p.h> #include <QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h> @@ -194,6 +194,15 @@ void QWindowsUser32DLL::init() getDisplayAutoRotationPreferences = (GetDisplayAutoRotationPreferences)library.resolve("GetDisplayAutoRotationPreferences"); setDisplayAutoRotationPreferences = (SetDisplayAutoRotationPreferences)library.resolve("SetDisplayAutoRotationPreferences"); + if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows8) { + enableMouseInPointer = (EnableMouseInPointer)library.resolve("EnableMouseInPointer"); + getPointerType = (GetPointerType)library.resolve("GetPointerType"); + getPointerInfo = (GetPointerInfo)library.resolve("GetPointerInfo"); + getPointerTouchInfo = (GetPointerTouchInfo)library.resolve("GetPointerTouchInfo"); + getPointerFrameTouchInfo = (GetPointerFrameTouchInfo)library.resolve("GetPointerFrameTouchInfo"); + getPointerPenInfo = (GetPointerPenInfo)library.resolve("GetPointerPenInfo"); + } + if (QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::Windows, 10, 0, 14393)) { enableNonClientDpiScaling = (EnableNonClientDpiScaling)library.resolve("EnableNonClientDpiScaling"); @@ -202,6 +211,11 @@ void QWindowsUser32DLL::init() } } +bool QWindowsUser32DLL::supportsPointerApi() +{ + return enableMouseInPointer && getPointerType && getPointerInfo && getPointerTouchInfo && getPointerFrameTouchInfo && getPointerPenInfo; +} + void QWindowsShcoreDLL::init() { if (QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows8_1) @@ -239,6 +253,7 @@ struct QWindowsContextPrivate { int m_defaultDPI = 96; QWindowsKeyMapper m_keyMapper; QWindowsMouseHandler m_mouseHandler; + QWindowsPointerHandler m_pointerHandler; QWindowsMimeConverter m_mimeConverter; QWindowsScreenManager m_screenManager; QSharedPointer<QWindowCreationContext> m_creationContext; @@ -256,7 +271,7 @@ QWindowsContextPrivate::QWindowsContextPrivate() QWindowsContext::user32dll.init(); QWindowsContext::shcoredll.init(); - if (m_mouseHandler.touchDevice()) + if (m_pointerHandler.touchDevice() || m_mouseHandler.touchDevice()) m_systemInfo |= QWindowsContext::SI_SupportsTouch; m_displayContext = GetDC(0); m_defaultDPI = GetDeviceCaps(m_displayContext, LOGPIXELSY); @@ -281,10 +296,6 @@ QWindowsContext::QWindowsContext() : const QByteArray bv = qgetenv("QT_QPA_VERBOSE"); if (!bv.isEmpty()) QLoggingCategory::setFilterRules(QString::fromLocal8Bit(bv)); -#if QT_CONFIG(tabletevent) - d->m_tabletSupport.reset(QWindowsTabletSupport::create()); - qCDebug(lcQpaTablet) << "Tablet support: " << (d->m_tabletSupport.isNull() ? QStringLiteral("None") : d->m_tabletSupport->description()); -#endif } QWindowsContext::~QWindowsContext() @@ -310,7 +321,8 @@ bool QWindowsContext::initTouch(unsigned integrationOptions) if (d->m_systemInfo & QWindowsContext::SI_SupportsTouch) return true; - QTouchDevice *touchDevice = d->m_mouseHandler.ensureTouchDevice(); + QTouchDevice *touchDevice = (d->m_systemInfo & QWindowsContext::SI_SupportsPointer) ? + d->m_pointerHandler.ensureTouchDevice() : d->m_mouseHandler.ensureTouchDevice(); if (!touchDevice) return false; @@ -330,6 +342,33 @@ bool QWindowsContext::initTouch(unsigned integrationOptions) return true; } +bool QWindowsContext::initTablet(unsigned integrationOptions) +{ + Q_UNUSED(integrationOptions); +#if QT_CONFIG(tabletevent) + d->m_tabletSupport.reset(QWindowsTabletSupport::create()); + return true; +#else + return false; +#endif +} + +bool QWindowsContext::initPointer(unsigned integrationOptions) +{ + if (integrationOptions & QWindowsIntegration::DontUseWMPointer) + return false; + + if (QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows8) + return false; + + if (!QWindowsContext::user32dll.supportsPointerApi()) + return false; + + QWindowsContext::user32dll.enableMouseInPointer(TRUE); + d->m_systemInfo |= QWindowsContext::SI_SupportsPointer; + return true; +} + void QWindowsContext::setTabletAbsoluteRange(int a) { #if QT_CONFIG(tabletevent) @@ -548,7 +587,7 @@ void QWindowsContext::unregisterWindowClasses() { const HINSTANCE appInstance = static_cast<HINSTANCE>(GetModuleHandle(0)); - foreach (const QString &name, d->m_registeredWindowClassNames) { + for (const QString &name : qAsConst(d->m_registeredWindowClassNames)) { if (!UnregisterClass(reinterpret_cast<LPCWSTR>(name.utf16()), appInstance) && QWindowsContext::verbose) qErrnoWarning("UnregisterClass failed for '%s'", qPrintable(name)); } @@ -632,12 +671,16 @@ QWindow *QWindowsContext::findWindow(HWND hwnd) const QWindow *QWindowsContext::windowUnderMouse() const { - return d->m_mouseHandler.windowUnderMouse(); + return (d->m_systemInfo & QWindowsContext::SI_SupportsPointer) ? + d->m_pointerHandler.windowUnderMouse() : d->m_mouseHandler.windowUnderMouse(); } void QWindowsContext::clearWindowUnderMouse() { - d->m_mouseHandler.clearWindowUnderMouse(); + if (d->m_systemInfo & QWindowsContext::SI_SupportsPointer) + d->m_pointerHandler.clearWindowUnderMouse(); + else + d->m_mouseHandler.clearWindowUnderMouse(); } /*! @@ -958,7 +1001,9 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, switch (et) { case QtWindows::GestureEvent: - return sessionManagerInteractionBlocked() || d->m_mouseHandler.translateGestureEvent(platformWindow->window(), hwnd, et, msg, result); + if (!(d->m_systemInfo & QWindowsContext::SI_SupportsPointer)) + return sessionManagerInteractionBlocked() || d->m_mouseHandler.translateGestureEvent(platformWindow->window(), hwnd, et, msg, result); + break; case QtWindows::InputMethodOpenCandidateWindowEvent: case QtWindows::InputMethodCloseCandidateWindowEvent: // TODO: Release/regrab mouse if a popup has mouse grab. @@ -975,7 +1020,7 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, case QtWindows::UnknownEvent: return false; case QtWindows::AccessibleObjectFromWindowRequest: -#ifndef QT_NO_ACCESSIBILITY +#if QT_CONFIG(accessibility) return QWindowsUiaAccessibility::handleWmGetObject(hwnd, wParam, lParam, result); #else return false; @@ -1084,18 +1129,25 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, case QtWindows::ExposeEvent: return platformWindow->handleWmPaint(hwnd, message, wParam, lParam); case QtWindows::NonClientMouseEvent: - if (platformWindow->frameStrutEventsEnabled()) + if (!(d->m_systemInfo & QWindowsContext::SI_SupportsPointer) && platformWindow->frameStrutEventsEnabled()) return sessionManagerInteractionBlocked() || d->m_mouseHandler.translateMouseEvent(platformWindow->window(), hwnd, et, msg, result); break; + case QtWindows::NonClientPointerEvent: + if ((d->m_systemInfo & QWindowsContext::SI_SupportsPointer) && platformWindow->frameStrutEventsEnabled()) + return sessionManagerInteractionBlocked() || d->m_pointerHandler.translatePointerEvent(platformWindow->window(), hwnd, et, msg, result); + break; case QtWindows::EnterSizeMoveEvent: platformWindow->setFlag(QWindowsWindow::ResizeMoveActive); return true; case QtWindows::ExitSizeMoveEvent: platformWindow->clearFlag(QWindowsWindow::ResizeMoveActive); platformWindow->checkForScreenChanged(); + handleExitSizeMove(platformWindow->window()); return true; case QtWindows::ScrollEvent: - return sessionManagerInteractionBlocked() || d->m_mouseHandler.translateScrollEvent(platformWindow->window(), hwnd, msg, result); + if (!(d->m_systemInfo & QWindowsContext::SI_SupportsPointer)) + return sessionManagerInteractionBlocked() || d->m_mouseHandler.translateScrollEvent(platformWindow->window(), hwnd, msg, result); + break; case QtWindows::MouseWheelEvent: case QtWindows::MouseEvent: case QtWindows::LeaveEvent: @@ -1105,10 +1157,20 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, window = window->parent(); if (!window) return false; - return sessionManagerInteractionBlocked() || d->m_mouseHandler.translateMouseEvent(window, hwnd, et, msg, result); + if (!(d->m_systemInfo & QWindowsContext::SI_SupportsPointer)) + return sessionManagerInteractionBlocked() || d->m_mouseHandler.translateMouseEvent(window, hwnd, et, msg, result); + else + return sessionManagerInteractionBlocked() || d->m_pointerHandler.translateMouseEvent(window, hwnd, et, msg, result); } + break; case QtWindows::TouchEvent: - return sessionManagerInteractionBlocked() || d->m_mouseHandler.translateTouchEvent(platformWindow->window(), hwnd, et, msg, result); + if (!(d->m_systemInfo & QWindowsContext::SI_SupportsPointer)) + return sessionManagerInteractionBlocked() || d->m_mouseHandler.translateTouchEvent(platformWindow->window(), hwnd, et, msg, result); + break; + case QtWindows::PointerEvent: + if (d->m_systemInfo & QWindowsContext::SI_SupportsPointer) + return sessionManagerInteractionBlocked() || d->m_pointerHandler.translatePointerEvent(platformWindow->window(), hwnd, et, msg, result); + break; case QtWindows::FocusInEvent: // see QWindowsWindow::requestActivateWindow(). case QtWindows::FocusOutEvent: handleFocusEvent(et, platformWindow); @@ -1151,6 +1213,7 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, } break; case QtWindows::MouseActivateWindowEvent: + case QtWindows::PointerActivateWindowEvent: if (platformWindow->window()->flags() & Qt::WindowDoesNotAcceptFocus) { *result = LRESULT(MA_NOACTIVATE); return true; @@ -1295,6 +1358,37 @@ bool QWindowsContext::handleContextMenuEvent(QWindow *window, const MSG &msg) } #endif +void QWindowsContext::handleExitSizeMove(QWindow *window) +{ + // Windows can be moved/resized by: + // 1) User moving a window by dragging the title bar: Causes a sequence + // of WM_NCLBUTTONDOWN, WM_NCMOUSEMOVE but no WM_NCLBUTTONUP, + // leaving the left mouse button 'pressed' + // 2) User choosing Resize/Move from System menu and using mouse/cursor keys: + // No mouse events are received + // 3) Programmatically via QSizeGrip calling QPlatformWindow::startSystemResize/Move(): + // Mouse is left in pressed state after press on size grip (inside window), + // no further mouse events are received + // For cases 1,3, intercept WM_EXITSIZEMOVE to sync the buttons. + const Qt::MouseButtons currentButtons = QWindowsMouseHandler::queryMouseButtons(); + const Qt::MouseButtons appButtons = QGuiApplication::mouseButtons(); + if (currentButtons == appButtons) + return; + const Qt::KeyboardModifiers keyboardModifiers = QWindowsKeyMapper::queryKeyboardModifiers(); + const QPoint globalPos = QWindowsCursor::mousePosition(); + const QPlatformWindow *platWin = window->handle(); + const QPoint localPos = platWin->mapFromGlobal(globalPos); + const QEvent::Type type = platWin->geometry().contains(globalPos) + ? QEvent::MouseButtonRelease : QEvent::NonClientAreaMouseButtonRelease; + for (Qt::MouseButton button : {Qt::LeftButton, Qt::RightButton, Qt::MiddleButton}) { + if (appButtons.testFlag(button) && !currentButtons.testFlag(button)) { + QWindowSystemInterface::handleMouseEvent(window, localPos, globalPos, + currentButtons, button, type, + keyboardModifiers); + } + } +} + bool QWindowsContext::asyncExpose() const { return d->m_asyncExpose; @@ -1307,7 +1401,8 @@ void QWindowsContext::setAsyncExpose(bool value) QTouchDevice *QWindowsContext::touchDevice() const { - return d->m_mouseHandler.touchDevice(); + return (d->m_systemInfo & QWindowsContext::SI_SupportsPointer) ? + d->m_pointerHandler.touchDevice() : d->m_mouseHandler.touchDevice(); } static DWORD readDwordRegistrySetting(const wchar_t *regKey, const wchar_t *subKey, DWORD defaultValue) @@ -1400,7 +1495,7 @@ extern "C" LRESULT QT_WIN_CALLBACK qWindowsWndProc(HWND hwnd, UINT message, WPAR marginsFromRects(ncCalcSizeFrame, rectFromNcCalcSize(message, wParam, lParam, 0)); if (margins.left() >= 0) { if (platformWindow) { - platformWindow->setFrameMargins(margins); + platformWindow->setFullFrameMargins(margins); } else { const QSharedPointer<QWindowCreationContext> ctx = QWindowsContext::instance()->windowCreationContext(); if (!ctx.isNull()) diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h index 0a7f20ca83..2c2313c30a 100644 --- a/src/plugins/platforms/windows/qwindowscontext.h +++ b/src/plugins/platforms/windows/qwindowscontext.h @@ -43,9 +43,9 @@ #include "qtwindowsglobal.h" #include <QtCore/qt_windows.h> -#include <QtCore/QScopedPointer> -#include <QtCore/QSharedPointer> -#include <QtCore/QLoggingCategory> +#include <QtCore/qscopedpointer.h> +#include <QtCore/qsharedpointer.h> +#include <QtCore/qloggingcategory.h> #define STRICT_TYPED_ITEMIDS #include <shlobj.h> @@ -85,7 +85,14 @@ class QTouchDevice; struct QWindowsUser32DLL { inline void init(); - + inline bool supportsPointerApi(); + + typedef BOOL (WINAPI *EnableMouseInPointer)(BOOL); + typedef BOOL (WINAPI *GetPointerType)(UINT32, PVOID); + typedef BOOL (WINAPI *GetPointerInfo)(UINT32, PVOID); + typedef BOOL (WINAPI *GetPointerTouchInfo)(UINT32, PVOID); + typedef BOOL (WINAPI *GetPointerFrameTouchInfo)(UINT32, UINT32 *, PVOID); + typedef BOOL (WINAPI *GetPointerPenInfo)(UINT32, PVOID); typedef BOOL (WINAPI *SetProcessDPIAware)(); typedef BOOL (WINAPI *AddClipboardFormatListener)(HWND); typedef BOOL (WINAPI *RemoveClipboardFormatListener)(HWND); @@ -95,6 +102,14 @@ struct QWindowsUser32DLL typedef int (WINAPI *GetWindowDpiAwarenessContext)(HWND); typedef int (WINAPI *GetAwarenessFromDpiAwarenessContext)(int); + // Windows pointer functions (Windows 8 or later). + EnableMouseInPointer enableMouseInPointer = nullptr; + GetPointerType getPointerType = nullptr; + GetPointerInfo getPointerInfo = nullptr; + GetPointerTouchInfo getPointerTouchInfo = nullptr; + GetPointerFrameTouchInfo getPointerFrameTouchInfo = nullptr; + GetPointerPenInfo getPointerPenInfo = nullptr; + // Windows Vista onwards SetProcessDPIAware setProcessDPIAware = nullptr; @@ -134,7 +149,8 @@ public: enum SystemInfoFlags { SI_RTL_Extensions = 0x1, - SI_SupportsTouch = 0x2 + SI_SupportsTouch = 0x2, + SI_SupportsPointer = 0x4, }; // Verbose flag set by environment variable QT_QPA_VERBOSE @@ -145,6 +161,8 @@ public: bool initTouch(); bool initTouch(unsigned integrationOptions); // For calls from QWindowsIntegration::QWindowsIntegration() only. + bool initTablet(unsigned integrationOptions); + bool initPointer(unsigned integrationOptions); int defaultDPI() const; @@ -220,6 +238,7 @@ private: #ifndef QT_NO_CONTEXTMENU bool handleContextMenuEvent(QWindow *window, const MSG &msg); #endif + void handleExitSizeMove(QWindow *window); void unregisterWindowClasses(); QScopedPointer<QWindowsContextPrivate> d; diff --git a/src/plugins/platforms/windows/qwindowscursor.cpp b/src/plugins/platforms/windows/qwindowscursor.cpp index e1a5837201..0924fb822e 100644 --- a/src/plugins/platforms/windows/qwindowscursor.cpp +++ b/src/plugins/platforms/windows/qwindowscursor.cpp @@ -43,16 +43,16 @@ #include "qwindowswindow.h" #include "qwindowsscreen.h" -#include <QtGui/QBitmap> -#include <QtGui/QImage> -#include <QtGui/QBitmap> -#include <QtGui/QGuiApplication> -#include <QtGui/QScreen> +#include <QtGui/qbitmap.h> +#include <QtGui/qimage.h> +#include <QtGui/qbitmap.h> +#include <QtGui/qguiapplication.h> +#include <QtGui/qscreen.h> #include <QtGui/private/qguiapplication_p.h> // getPixmapCursor() #include <QtGui/private/qhighdpiscaling_p.h> -#include <QtCore/QDebug> -#include <QtCore/QScopedArrayPointer> +#include <QtCore/qdebug.h> +#include <QtCore/qscopedpointer.h> static bool initResources() { diff --git a/src/plugins/platforms/windows/qwindowscursor.h b/src/plugins/platforms/windows/qwindowscursor.h index 53f185358b..715533e0af 100644 --- a/src/plugins/platforms/windows/qwindowscursor.h +++ b/src/plugins/platforms/windows/qwindowscursor.h @@ -43,8 +43,8 @@ #include <QtCore/qt_windows.h> #include <qpa/qplatformcursor.h> -#include <QtCore/QSharedPointer> -#include <QtCore/QHash> +#include <QtCore/qsharedpointer.h> +#include <QtCore/qhash.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp index 80ee7b2287..40ab2a4dd2 100644 --- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp +++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp @@ -51,24 +51,23 @@ #include "qwindowsintegration.h" #include "qwindowstheme.h" // Color conversion helpers -#include <QtGui/QGuiApplication> -#include <QtGui/QColor> - -#include <QtCore/QDebug> -#include <QtCore/QRegularExpression> -#include <QtCore/QTimer> -#include <QtCore/QDir> -#include <QtCore/QScopedArrayPointer> -#include <QtCore/QSharedPointer> -#include <QtCore/QObject> -#include <QtCore/QThread> -#include <QtCore/QSysInfo> -#include <QtCore/QSharedData> -#include <QtCore/QExplicitlySharedDataPointer> -#include <QtCore/QMutex> -#include <QtCore/QMutexLocker> -#include <QtCore/QUuid> -#include <QtCore/QTemporaryFile> +#include <QtGui/qguiapplication.h> +#include <QtGui/qcolor.h> + +#include <QtCore/qdebug.h> +#include <QtCore/qregularexpression.h> +#include <QtCore/qtimer.h> +#include <QtCore/qdir.h> +#include <QtCore/qscopedpointer.h> +#include <QtCore/qsharedpointer.h> +#include <QtCore/qobject.h> +#include <QtCore/qthread.h> +#include <QtCore/qsysinfo.h> +#include <QtCore/qshareddata.h> +#include <QtCore/qshareddata.h> +#include <QtCore/qmutex.h> +#include <QtCore/quuid.h> +#include <QtCore/qtemporaryfile.h> #include <QtCore/private/qsystemlibrary_p.h> #include <algorithm> @@ -1027,7 +1026,7 @@ static QList<FilterSpec> filterSpecs(const QStringList &filters, Q_ASSERT(filterSeparatorRE.isValid()); // Split filter specification as 'Texts (*.txt[;] *.doc)', '*.txt[;] *.doc' // into description and filters specification as '*.txt;*.doc' - foreach (const QString &filterString, filters) { + for (const QString &filterString : filters) { const int openingParenPos = filterString.lastIndexOf(QLatin1Char('(')); const int closingParenPos = openingParenPos != -1 ? filterString.indexOf(QLatin1Char(')'), openingParenPos + 1) : -1; @@ -1322,7 +1321,7 @@ void QWindowsNativeSaveFileDialog::setNameFilters(const QStringList &f) // filter only if a default suffix is set (see docs). Set the first available // suffix unless we have a defaultSuffix. if (!hasDefaultSuffix()) { - foreach (const QString &filter, f) { + for (const QString &filter : f) { const QString suffix = suffixFromFilter(filter); if (!suffix.isEmpty()) { setDefaultSuffixSys(suffix); @@ -1781,12 +1780,12 @@ void QWindowsXpNativeFileDialog::populateOpenFileName(OPENFILENAME *ofn, HWND ow // Create a buffer with the filter strings. int totalStringLength = 0; - QList<FilterSpec> specs = + const QList<FilterSpec> specs = filterSpecs(m_options->nameFilters(), m_options->options() & QFileDialogOptions::HideNameFilterDetails, &totalStringLength); const int size = specs.size(); wchar_t *ptr = new wchar_t[totalStringLength + 2 * size + 1]; ofn->lpstrFilter = ptr; - foreach (const FilterSpec &spec, specs) { + for (const FilterSpec &spec : specs) { ptr += spec.description.toWCharArray(ptr); *ptr++ = 0; ptr += spec.filter.toWCharArray(ptr); diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.h b/src/plugins/platforms/windows/qwindowsdialoghelpers.h index 55f112c57a..1cf0982bad 100644 --- a/src/plugins/platforms/windows/qwindowsdialoghelpers.h +++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.h @@ -43,8 +43,8 @@ #include <QtCore/qt_windows.h> #include <qpa/qplatformdialoghelper.h> #include <qpa/qplatformtheme.h> -#include <QtCore/QStringList> -#include <QtCore/QSharedPointer> +#include <QtCore/qstringlist.h> +#include <QtCore/qsharedpointer.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsdrag.cpp b/src/plugins/platforms/windows/qwindowsdrag.cpp index e427ee162a..79aef99552 100644 --- a/src/plugins/platforms/windows/qwindowsdrag.cpp +++ b/src/plugins/platforms/windows/qwindowsdrag.cpp @@ -50,19 +50,19 @@ #include "qwindowsmousehandler.h" #include "qwindowscursor.h" -#include <QtGui/QMouseEvent> -#include <QtGui/QPixmap> -#include <QtGui/QPainter> -#include <QtGui/QRasterWindow> -#include <QtGui/QGuiApplication> +#include <QtGui/qevent.h> +#include <QtGui/qpixmap.h> +#include <QtGui/qpainter.h> +#include <QtGui/qrasterwindow.h> +#include <QtGui/qguiapplication.h> #include <qpa/qwindowsysteminterface_p.h> #include <QtGui/private/qdnd_p.h> #include <QtGui/private/qguiapplication_p.h> #include <QtGui/private/qhighdpiscaling_p.h> -#include <QtCore/QDebug> -#include <QtCore/QBuffer> -#include <QtCore/QPoint> +#include <QtCore/qdebug.h> +#include <QtCore/qbuffer.h> +#include <QtCore/qpoint.h> #include <shlobj.h> @@ -402,20 +402,16 @@ QWindowsOleDropSource::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState) switch (result) { case DRAGDROP_S_DROP: case DRAGDROP_S_CANCEL: - QGuiApplicationPrivate::modifier_buttons = toQtKeyboardModifiers(grfKeyState); - if (buttons != QGuiApplicationPrivate::mouse_buttons) { - if (m_windowUnderMouse.isNull() || m_mode == TouchDrag || fEscapePressed == TRUE) { - QGuiApplicationPrivate::mouse_buttons = buttons; - } else { - // QTBUG 66447: Synthesize a mouse release to the window under mouse at - // start of the DnD operation as Windows does not send any. - const QPoint globalPos = QWindowsCursor::mousePosition(); - const QPoint localPos = m_windowUnderMouse->handle()->mapFromGlobal(globalPos); - QWindowSystemInterface::handleMouseEvent(m_windowUnderMouse.data(), - QPointF(localPos), QPointF(globalPos), - QWindowsMouseHandler::queryMouseButtons(), - Qt::LeftButton, QEvent::MouseButtonRelease); - } + if (!m_windowUnderMouse.isNull() && m_mode != TouchDrag && fEscapePressed == FALSE + && buttons != QGuiApplicationPrivate::mouse_buttons) { + // QTBUG 66447: Synthesize a mouse release to the window under mouse at + // start of the DnD operation as Windows does not send any. + const QPoint globalPos = QWindowsCursor::mousePosition(); + const QPoint localPos = m_windowUnderMouse->handle()->mapFromGlobal(globalPos); + QWindowSystemInterface::handleMouseEvent(m_windowUnderMouse.data(), + QPointF(localPos), QPointF(globalPos), + QWindowsMouseHandler::queryMouseButtons(), + Qt::LeftButton, QEvent::MouseButtonRelease); } m_currentButtons = Qt::NoButton; break; @@ -507,11 +503,13 @@ void QWindowsOleDropTarget::handleDrag(QWindow *window, DWORD grfKeyState, QWindowsDrag *windowsDrag = QWindowsDrag::instance(); const Qt::DropActions actions = translateToQDragDropActions(*pdwEffect); - QGuiApplicationPrivate::modifier_buttons = toQtKeyboardModifiers(grfKeyState); - QGuiApplicationPrivate::mouse_buttons = toQtMouseButtons(grfKeyState); + const Qt::KeyboardModifiers keyboardModifiers = toQtKeyboardModifiers(grfKeyState); + const Qt::MouseButtons mouseButtons = toQtMouseButtons(grfKeyState); const QPlatformDragQtResponse response = - QWindowSystemInterface::handleDrag(window, windowsDrag->dropData(), m_lastPoint, actions); + QWindowSystemInterface::handleDrag(window, windowsDrag->dropData(), + m_lastPoint, actions, + mouseButtons, keyboardModifiers); m_answerRect = response.answerRect(); const Qt::DropAction action = response.acceptedAction(); @@ -523,8 +521,7 @@ void QWindowsOleDropTarget::handleDrag(QWindow *window, DWORD grfKeyState, *pdwEffect = m_chosenEffect; qCDebug(lcQpaMime) << __FUNCTION__ << m_window << windowsDrag->dropData() << " supported actions=" << actions - << " mods=" << QGuiApplicationPrivate::modifier_buttons - << " mouse=" << QGuiApplicationPrivate::mouse_buttons + << " mods=" << keyboardModifiers << " mouse=" << mouseButtons << " accepted: " << response.isAccepted() << action << m_answerRect << " effect" << *pdwEffect; } @@ -575,13 +572,11 @@ QWindowsOleDropTarget::DragLeave() qCDebug(lcQpaMime) << __FUNCTION__ << ' ' << m_window; - QWindowSystemInterface::handleDrag(m_window, 0, QPoint(), Qt::IgnoreAction); + QWindowSystemInterface::handleDrag(m_window, 0, QPoint(), Qt::IgnoreAction, + Qt::NoButton, Qt::NoModifier); - if (!QDragManager::self()->source()) { - QGuiApplicationPrivate::modifier_buttons = Qt::NoModifier; - QGuiApplicationPrivate::mouse_buttons = Qt::NoButton; + if (!QDragManager::self()->source()) m_lastKeyState = 0; - } QWindowsDrag::instance()->releaseDropDataObject(); return NOERROR; @@ -600,18 +595,16 @@ QWindowsOleDropTarget::Drop(LPDATAOBJECT pDataObj, DWORD grfKeyState, << "keys=" << grfKeyState << "pt=" << pt.x << ',' << pt.y; m_lastPoint = QWindowsGeometryHint::mapFromGlobal(m_window, QPoint(pt.x,pt.y)); - // grfKeyState does not all ways contain button state in the drop - QGuiApplicationPrivate::mouse_buttons = toQtMouseButtons(m_lastKeyState); - QGuiApplicationPrivate::modifier_buttons = toQtKeyboardModifiers(grfKeyState); QWindowsDrag *windowsDrag = QWindowsDrag::instance(); const QPlatformDropQtResponse response = QWindowSystemInterface::handleDrop(m_window, windowsDrag->dropData(), m_lastPoint, - translateToQDragDropActions(*pdwEffect)); + translateToQDragDropActions(*pdwEffect), + toQtMouseButtons(grfKeyState), + toQtKeyboardModifiers(grfKeyState)); - QGuiApplicationPrivate::mouse_buttons = toQtMouseButtons(grfKeyState); m_lastKeyState = grfKeyState; if (response.isAccepted()) { diff --git a/src/plugins/platforms/windows/qwindowsdrag.h b/src/plugins/platforms/windows/qwindowsdrag.h index d934679488..94f6e682da 100644 --- a/src/plugins/platforms/windows/qwindowsdrag.h +++ b/src/plugins/platforms/windows/qwindowsdrag.h @@ -44,8 +44,8 @@ #include "qwindowsinternalmimedata.h" #include <qpa/qplatformdrag.h> +#include <QtGui/qpixmap.h> #include <QtGui/qdrag.h> -#include <QtGui/QPixmap> struct IDropTargetHelper; diff --git a/src/plugins/platforms/windows/qwindowsdropdataobject.cpp b/src/plugins/platforms/windows/qwindowsdropdataobject.cpp index bd532ab70e..26d5c04844 100644 --- a/src/plugins/platforms/windows/qwindowsdropdataobject.cpp +++ b/src/plugins/platforms/windows/qwindowsdropdataobject.cpp @@ -39,8 +39,8 @@ #include "qwindowsdropdataobject.h" -#include <QtCore/QUrl> -#include <QtCore/QMimeData> +#include <QtCore/qurl.h> +#include <QtCore/qmimedata.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowseglcontext.cpp b/src/plugins/platforms/windows/qwindowseglcontext.cpp index 4632c9c157..a8d0a42bdb 100644 --- a/src/plugins/platforms/windows/qwindowseglcontext.cpp +++ b/src/plugins/platforms/windows/qwindowseglcontext.cpp @@ -41,8 +41,8 @@ #include "qwindowscontext.h" #include "qwindowswindow.h" -#include <QtCore/QDebug> -#include <QtGui/QOpenGLContext> +#include <QtCore/qdebug.h> +#include <QtGui/qopenglcontext.h> #if defined(QT_OPENGL_ES_2_ANGLE) || defined(QT_OPENGL_DYNAMIC) # include <EGL/eglext.h> diff --git a/src/plugins/platforms/windows/qwindowsgdiintegration.cpp b/src/plugins/platforms/windows/qwindowsgdiintegration.cpp index 51f74518f7..c88f669eb5 100644 --- a/src/plugins/platforms/windows/qwindowsgdiintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsgdiintegration.cpp @@ -42,7 +42,7 @@ #include "qwindowsbackingstore.h" #include "qwindowsgdinativeinterface.h" -#include <QtCore/QDebug> +#include <QtCore/qdebug.h> #include <QtGui/private/qpixmap_raster_p.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsgdinativeinterface.cpp b/src/plugins/platforms/windows/qwindowsgdinativeinterface.cpp index c7796d959e..4ba7108f45 100644 --- a/src/plugins/platforms/windows/qwindowsgdinativeinterface.cpp +++ b/src/plugins/platforms/windows/qwindowsgdinativeinterface.cpp @@ -40,7 +40,7 @@ #include "qwindowsgdinativeinterface.h" #include "qwindowsbackingstore.h" -#include <QtGui/QBackingStore> +#include <QtGui/qbackingstore.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsglcontext.cpp b/src/plugins/platforms/windows/qwindowsglcontext.cpp index cc8174051a..2409d70ec9 100644 --- a/src/plugins/platforms/windows/qwindowsglcontext.cpp +++ b/src/plugins/platforms/windows/qwindowsglcontext.cpp @@ -42,11 +42,11 @@ #include "qwindowswindow.h" #include "qwindowsintegration.h" -#include <QtCore/QDebug> -#include <QtCore/QSysInfo> -#include <QtGui/QGuiApplication> +#include <QtCore/qdebug.h> +#include <QtCore/qsysinfo.h> +#include <QtGui/qguiapplication.h> #include <qpa/qplatformnativeinterface.h> -#include <QtPlatformHeaders/QWGLNativeContext> +#include <QtPlatformHeaders/qwglnativecontext.h> #include <algorithm> diff --git a/src/plugins/platforms/windows/qwindowsglcontext.h b/src/plugins/platforms/windows/qwindowsglcontext.h index 87c3723c26..8c96a8dd0c 100644 --- a/src/plugins/platforms/windows/qwindowsglcontext.h +++ b/src/plugins/platforms/windows/qwindowsglcontext.h @@ -43,7 +43,7 @@ #include <QtCore/qt_windows.h> #include "qwindowsopenglcontext.h" -#include <QtGui/QOpenGLContext> +#include <QtGui/qopenglcontext.h> #include <vector> diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.cpp b/src/plugins/platforms/windows/qwindowsinputcontext.cpp index 261c931f2b..30da0da1de 100644 --- a/src/plugins/platforms/windows/qwindowsinputcontext.cpp +++ b/src/plugins/platforms/windows/qwindowsinputcontext.cpp @@ -43,16 +43,15 @@ #include "qwindowsintegration.h" #include "qwindowsmousehandler.h" -#include <QtCore/QDebug> -#include <QtCore/QObject> -#include <QtCore/QRect> -#include <QtCore/QRectF> -#include <QtCore/QTextBoundaryFinder> - -#include <QtGui/QInputMethodEvent> -#include <QtGui/QTextCharFormat> -#include <QtGui/QPalette> -#include <QtGui/QGuiApplication> +#include <QtCore/qdebug.h> +#include <QtCore/qobject.h> +#include <QtCore/qrect.h> +#include <QtCore/qtextboundaryfinder.h> + +#include <QtGui/qevent.h> +#include <QtGui/qtextformat.h> +#include <QtGui/qpalette.h> +#include <QtGui/qguiapplication.h> #include <private/qhighdpiscaling_p.h> diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.h b/src/plugins/platforms/windows/qwindowsinputcontext.h index d647628ff1..8668efbb15 100644 --- a/src/plugins/platforms/windows/qwindowsinputcontext.h +++ b/src/plugins/platforms/windows/qwindowsinputcontext.h @@ -42,8 +42,8 @@ #include <QtCore/qt_windows.h> -#include <QtCore/QLocale> -#include <QtCore/QPointer> +#include <QtCore/qlocale.h> +#include <QtCore/qpointer.h> #include <qpa/qplatforminputcontext.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index 0a9e8b9d91..7194fa1d1f 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -59,7 +59,7 @@ #endif #include "qwindowsinputcontext.h" #include "qwindowskeymapper.h" -#ifndef QT_NO_ACCESSIBILITY +#if QT_CONFIG(accessibility) # include "uiautomation/qwindowsuiaaccessibility.h" #endif @@ -76,8 +76,8 @@ #include <QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h> -#include <QtCore/QDebug> -#include <QtCore/QVariant> +#include <QtCore/qdebug.h> +#include <QtCore/qvariant.h> #include <limits.h> @@ -150,7 +150,7 @@ struct QWindowsIntegrationPrivate QScopedPointer<QWindowsStaticOpenGLContext> m_staticOpenGLContext; #endif // QT_NO_OPENGL QScopedPointer<QPlatformInputContext> m_inputContext; -#ifndef QT_NO_ACCESSIBILITY +#if QT_CONFIG(accessibility) QWindowsUiaAccessibility m_accessibility; #endif QWindowsServices m_services; @@ -184,7 +184,7 @@ static inline unsigned parseOptions(const QStringList ¶mList, QtWindows::ProcessDpiAwareness *dpiAwareness) { unsigned options = 0; - foreach (const QString ¶m, paramList) { + for (const QString ¶m : paramList) { if (param.startsWith(QLatin1String("fontengine="))) { if (param.endsWith(QLatin1String("freetype"))) { options |= QWindowsIntegration::FontDatabaseFreeType; @@ -212,6 +212,8 @@ static inline unsigned parseOptions(const QStringList ¶mList, options |= QWindowsIntegration::AlwaysUseNativeMenus; } else if (param == QLatin1String("menus=none")) { options |= QWindowsIntegration::NoNativeMenus; + } else if (param == QLatin1String("nowmpointer")) { + options |= QWindowsIntegration::DontUseWMPointer; } else { qWarning() << "Unknown option" << param; } @@ -230,8 +232,13 @@ QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList ¶mL QtWindows::ProcessDpiAwareness dpiAwareness = QtWindows::ProcessPerMonitorDpiAware; m_options = parseOptions(paramList, &tabletAbsoluteRange, &dpiAwareness); QWindowsFontDatabase::setFontOptions(m_options); - if (tabletAbsoluteRange >= 0) - m_context.setTabletAbsoluteRange(tabletAbsoluteRange); + + if (!m_context.initPointer(m_options)) { + m_context.initTablet(m_options); + if (tabletAbsoluteRange >= 0) + m_context.setTabletAbsoluteRange(tabletAbsoluteRange); + } + if (!dpiAwarenessSet) { // Set only once in case of repeated instantiations of QGuiApplication. if (!QCoreApplication::testAttribute(Qt::AA_PluginApplication)) { m_context.setProcessDpiAwareness(dpiAwareness); @@ -332,7 +339,7 @@ QPlatformWindow *QWindowsIntegration::createPlatformWindow(QWindow *window) cons << "\n Requested: " << requested.geometry << " frame incl.=" << QWindowsGeometryHint::positionIncludesFrame(window) << ' ' << requested.flags - << "\n Obtained : " << obtained.geometry << " margins=" << obtained.frame + << "\n Obtained : " << obtained.geometry << " margins=" << obtained.fullFrameMargins << " handle=" << obtained.hwnd << ' ' << obtained.flags << '\n'; if (Q_UNLIKELY(!obtained.hwnd)) @@ -560,7 +567,7 @@ QPlatformInputContext * QWindowsIntegration::inputContext() const return d->m_inputContext.data(); } -#ifndef QT_NO_ACCESSIBILITY +#if QT_CONFIG(accessibility) QPlatformAccessibility *QWindowsIntegration::accessibility() const { return &d->m_accessibility; diff --git a/src/plugins/platforms/windows/qwindowsintegration.h b/src/plugins/platforms/windows/qwindowsintegration.h index 23f3d9ef4e..ef074e309e 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.h +++ b/src/plugins/platforms/windows/qwindowsintegration.h @@ -42,7 +42,7 @@ #define QWINDOWSINTEGRATION_H #include <qpa/qplatformintegration.h> -#include <QtCore/QScopedPointer> +#include <QtCore/qscopedpointer.h> #include <QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h> QT_BEGIN_NAMESPACE @@ -66,7 +66,8 @@ public: DontUseDirectWriteFonts = QWindowsFontDatabase::DontUseDirectWriteFonts, DontUseColorFonts = QWindowsFontDatabase::DontUseColorFonts, AlwaysUseNativeMenus = 0x100, - NoNativeMenus = 0x200 + NoNativeMenus = 0x200, + DontUseWMPointer = 0x400, }; explicit QWindowsIntegration(const QStringList ¶mList); @@ -90,7 +91,7 @@ public: # endif #endif // !QT_NO_CLIPBOARD QPlatformInputContext *inputContext() const override; -#ifndef QT_NO_ACCESSIBILITY +#if QT_CONFIG(accessibility) QPlatformAccessibility *accessibility() const override; #endif QPlatformFontDatabase *fontDatabase() const override; diff --git a/src/plugins/platforms/windows/qwindowsinternalmimedata.cpp b/src/plugins/platforms/windows/qwindowsinternalmimedata.cpp index 21ebee6262..8f1d8f73d9 100644 --- a/src/plugins/platforms/windows/qwindowsinternalmimedata.cpp +++ b/src/plugins/platforms/windows/qwindowsinternalmimedata.cpp @@ -40,7 +40,7 @@ #include "qwindowsinternalmimedata.h" #include "qwindowscontext.h" #include "qwindowsmime.h" -#include <QDebug> +#include <QtCore/qdebug.h> /*! \class QWindowsInternalMimeDataBase \brief Base for implementations of QInternalMimeData using a IDataObject COM object. diff --git a/src/plugins/platforms/windows/qwindowsinternalmimedata.h b/src/plugins/platforms/windows/qwindowsinternalmimedata.h index a44f5b509c..dbc1ea3922 100644 --- a/src/plugins/platforms/windows/qwindowsinternalmimedata.h +++ b/src/plugins/platforms/windows/qwindowsinternalmimedata.h @@ -43,7 +43,7 @@ #include <QtCore/qt_windows.h> #include <QtGui/private/qinternalmimedata_p.h> -#include <QtCore/QVariant> +#include <QtCore/qvariant.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowskeymapper.cpp b/src/plugins/platforms/windows/qwindowskeymapper.cpp index 950d8ecd36..48941d78ca 100644 --- a/src/plugins/platforms/windows/qwindowskeymapper.cpp +++ b/src/plugins/platforms/windows/qwindowskeymapper.cpp @@ -43,13 +43,14 @@ #include "qwindowswindow.h" #include "qwindowsinputcontext.h" -#include <QtGui/QGuiApplication> -#include <QtGui/QWindow> +#include <QtGui/qguiapplication.h> +#include <QtGui/qwindow.h> #include <qpa/qwindowsysteminterface.h> #include <private/qguiapplication_p.h> #include <private/qhighdpiscaling_p.h> -#include <QtGui/QKeyEvent> +#include <QtGui/qevent.h> #include <QtEventDispatcherSupport/private/qwindowsguieventdispatcher_p.h> +#include <QtCore/private/qdebug_p.h> #if defined(WM_APPCOMMAND) # ifndef FAPPCOMMAND_MOUSE @@ -544,6 +545,59 @@ static const Qt::KeyboardModifiers ModsTbl[] = { static const size_t NumMods = sizeof ModsTbl / sizeof *ModsTbl; Q_STATIC_ASSERT((NumMods == KeyboardLayoutItem::NumQtKeys)); +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug d, const KeyboardLayoutItem &k) +{ + QDebugStateSaver saver(d); + d.nospace(); + d << "KeyboardLayoutItem("; + if (k.exists) { + for (size_t i = 0; i < NumMods; ++i) { + if (const quint32 qtKey = k.qtKey[i]) { + d << '[' << i << ' '; + QtDebugUtils::formatQFlags(d, ModsTbl[i]); + d << ' ' << hex << showbase << qtKey << dec << noshowbase << ' '; + QtDebugUtils::formatQEnum(d, Qt::Key(qtKey)); + if (qtKey >= 32 && qtKey < 128) + d << " '" << char(qtKey) << '\''; + if (k.deadkeys & (1<<i)) + d << " deadkey"; + d << "] "; + } + } + } + d << ')'; + return d; +} + +// Helpers to format a list of int as Qt key sequence +class formatKeys +{ +public: + explicit formatKeys(const QList<int> &keys) : m_keys(keys) {} + +private: + friend QDebug operator<<(QDebug d, const formatKeys &keys); + const QList<int> &m_keys; +}; + +QDebug operator<<(QDebug d, const formatKeys &k) +{ + QDebugStateSaver saver(d); + d.nospace(); + d << '('; + for (int i =0, size = k.m_keys.size(); i < size; ++i) { + if (i) + d << ", "; + d << QKeySequence(k.m_keys.at(i)); + } + d << ')'; + return d; +} +#else // !QT_NO_DEBUG_STREAM +static int formatKeys(const QList<int> &) { return 0; } +#endif // QT_NO_DEBUG_STREAM + /** Remap return or action key to select key for windows mobile. */ @@ -722,21 +776,8 @@ void QWindowsKeyMapper::updatePossibleKeyCodes(unsigned char *kbdBuffer, quint32 ::ToAscii(VK_SPACE, 0, emptyBuffer, reinterpret_cast<LPWORD>(&buffer), 0); ::ToAscii(vk_key, scancode, kbdBuffer, reinterpret_cast<LPWORD>(&buffer), 0); } - if (QWindowsContext::verbose > 1 && lcQpaEvents().isDebugEnabled()) { - QString message; - QDebug debug(&message); - debug <<__FUNCTION__ << " for virtual key = 0x" << hex << vk_key << dec<< '\n'; - for (size_t i = 0; i < NumMods; ++i) { - const quint32 qtKey = keyLayout[vk_key].qtKey[i]; - debug << " [" << i << "] (" << qtKey << ',' - << hex << showbase << qtKey << noshowbase << dec - << ",'" << char(qtKey ? qtKey : 0x03) << "')"; - if (keyLayout[vk_key].deadkeys & (1<<i)) - debug << " deadkey"; - debug << '\n'; - } - qCDebug(lcQpaEvents) << message; - } + qCDebug(lcQpaEvents) << __FUNCTION__ << "for virtual key=" + << hex << showbase << vk_key << dec << noshowbase << keyLayout[vk_key]; } static inline QString messageKeyText(const MSG &msg) @@ -1287,7 +1328,9 @@ QList<int> QWindowsKeyMapper::possibleKeys(const QKeyEvent *e) const *it = matchedKey; } } - + qCDebug(lcQpaEvents) << __FUNCTION__ << e << "nativeVirtualKey=" + << showbase << hex << e->nativeVirtualKey() << dec << noshowbase + << e->modifiers() << kbItem << "\n returns" << formatKeys(result); return result; } diff --git a/src/plugins/platforms/windows/qwindowskeymapper.h b/src/plugins/platforms/windows/qwindowskeymapper.h index c6b46b0c30..d569c82437 100644 --- a/src/plugins/platforms/windows/qwindowskeymapper.h +++ b/src/plugins/platforms/windows/qwindowskeymapper.h @@ -42,7 +42,7 @@ #include <QtCore/qt_windows.h> -#include <QtCore/QLocale> +#include <QtCore/qlocale.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsmenu.h b/src/plugins/platforms/windows/qwindowsmenu.h index d51a29676e..6ed8315417 100644 --- a/src/plugins/platforms/windows/qwindowsmenu.h +++ b/src/plugins/platforms/windows/qwindowsmenu.h @@ -44,8 +44,8 @@ #include <qpa/qplatformmenu.h> -#include <QtCore/QVector> -#include <QtCore/QPair> +#include <QtCore/qvector.h> +#include <QtCore/qpair.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsmime.cpp b/src/plugins/platforms/windows/qwindowsmime.cpp index 0439797a7d..0cfd79f451 100644 --- a/src/plugins/platforms/windows/qwindowsmime.cpp +++ b/src/plugins/platforms/windows/qwindowsmime.cpp @@ -41,15 +41,15 @@ #include "qwindowscontext.h" #include <QtGui/private/qinternalmimedata_p.h> -#include <QtCore/QByteArrayMatcher> -#include <QtCore/QTextCodec> -#include <QtCore/QMap> -#include <QtCore/QUrl> -#include <QtCore/QDir> -#include <QtCore/QDebug> -#include <QtCore/QBuffer> -#include <QtGui/QImageReader> -#include <QtGui/QImageWriter> +#include <QtCore/qbytearraymatcher.h> +#include <QtCore/qtextcodec.h> +#include <QtCore/qmap.h> +#include <QtCore/qurl.h> +#include <QtCore/qdir.h> +#include <QtCore/qdebug.h> +#include <QtCore/qbuffer.h> +#include <QtGui/qimagereader.h> +#include <QtGui/qimagewriter.h> #include <shlobj.h> #include <algorithm> @@ -107,7 +107,8 @@ static inline QByteArray msgConversionError(const char *func, const char *format msg += ": Unable to convert DIB image. The image converter plugin for '"; msg += format; msg += "' is not available. Available formats: "; - foreach (const QByteArray &af, QImageReader::supportedImageFormats()) { + const QList<QByteArray> &formats = QImageReader::supportedImageFormats(); + for (const QByteArray &af : formats) { msg += af; msg += ' '; } @@ -1598,7 +1599,7 @@ QVariant QWindowsMimeConverter::convertToMime(const QStringList &mimeTypes, QVariant::Type preferredType, QString *formatIn /* = 0 */) const { - foreach (const QString &format, mimeTypes) { + for (const QString &format : mimeTypes) { if (const QWindowsMime *converter = converterToMime(format, pDataObj)) { if (converter->canConvertToMime(format, pDataObj)) { const QVariant dataV = converter->convertToMime(format, pDataObj, preferredType); diff --git a/src/plugins/platforms/windows/qwindowsmime.h b/src/plugins/platforms/windows/qwindowsmime.h index 1ed2aa933f..6bbbae1a0e 100644 --- a/src/plugins/platforms/windows/qwindowsmime.h +++ b/src/plugins/platforms/windows/qwindowsmime.h @@ -42,9 +42,9 @@ #include <QtCore/qt_windows.h> -#include <QtCore/QVector> -#include <QtCore/QList> -#include <QtCore/QVariant> +#include <QtCore/qvector.h> +#include <QtCore/qlist.h> +#include <QtCore/qvariant.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.cpp b/src/plugins/platforms/windows/qwindowsmousehandler.cpp index 17851618b4..92aaf70e40 100644 --- a/src/plugins/platforms/windows/qwindowsmousehandler.cpp +++ b/src/plugins/platforms/windows/qwindowsmousehandler.cpp @@ -45,14 +45,14 @@ #include "qwindowsscreen.h" #include <qpa/qwindowsysteminterface.h> -#include <QtGui/QGuiApplication> -#include <QtGui/QScreen> -#include <QtGui/QTouchDevice> -#include <QtGui/QWindow> -#include <QtGui/QCursor> +#include <QtGui/qguiapplication.h> +#include <QtGui/qscreen.h> +#include <QtGui/qtouchdevice.h> +#include <QtGui/qwindow.h> +#include <QtGui/qcursor.h> -#include <QtCore/QDebug> -#include <QtCore/QScopedArrayPointer> +#include <QtCore/qdebug.h> +#include <QtCore/qscopedpointer.h> #include <windowsx.h> @@ -119,20 +119,16 @@ static inline void compressMouseMove(MSG *msg) static inline QTouchDevice *createTouchDevice() { - enum { QT_SM_TABLETPC = 86, QT_SM_DIGITIZER = 94, QT_SM_MAXIMUMTOUCHES = 95, - QT_NID_INTEGRATED_TOUCH = 0x1, QT_NID_EXTERNAL_TOUCH = 0x02, - QT_NID_MULTI_INPUT = 0x40, QT_NID_READY = 0x80 }; - - const int digitizers = GetSystemMetrics(QT_SM_DIGITIZER); - if (!(digitizers & (QT_NID_INTEGRATED_TOUCH | QT_NID_EXTERNAL_TOUCH))) + const int digitizers = GetSystemMetrics(SM_DIGITIZER); + if (!(digitizers & (NID_INTEGRATED_TOUCH | NID_EXTERNAL_TOUCH))) return 0; - const int tabletPc = GetSystemMetrics(QT_SM_TABLETPC); - const int maxTouchPoints = GetSystemMetrics(QT_SM_MAXIMUMTOUCHES); - qCDebug(lcQpaEvents) << "Digitizers:" << hex << showbase << (digitizers & ~QT_NID_READY) - << "Ready:" << (digitizers & QT_NID_READY) << dec << noshowbase + const int tabletPc = GetSystemMetrics(SM_TABLETPC); + const int maxTouchPoints = GetSystemMetrics(SM_MAXIMUMTOUCHES); + qCDebug(lcQpaEvents) << "Digitizers:" << hex << showbase << (digitizers & ~NID_READY) + << "Ready:" << (digitizers & NID_READY) << dec << noshowbase << "Tablet PC:" << tabletPc << "Max touch points:" << maxTouchPoints; QTouchDevice *result = new QTouchDevice; - result->setType(digitizers & QT_NID_INTEGRATED_TOUCH + result->setType(digitizers & NID_INTEGRATED_TOUCH ? QTouchDevice::TouchScreen : QTouchDevice::TouchPad); QTouchDevice::Capabilities capabilities = QTouchDevice::Position | QTouchDevice::Area | QTouchDevice::NormalizedPosition; if (result->type() == QTouchDevice::TouchPad) @@ -178,6 +174,85 @@ Qt::MouseButtons QWindowsMouseHandler::queryMouseButtons() return result; } +static QPoint lastMouseMovePos; + +namespace { +struct MouseEvent { + QEvent::Type type; + Qt::MouseButton button; +}; + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug d, const MouseEvent &e) +{ + QDebugStateSaver saver(d); + d.nospace(); + d << "MouseEvent(" << e.type << ", " << e.button << ')'; + return d; +} +#endif // QT_NO_DEBUG_STREAM +} // namespace + +static inline Qt::MouseButton extraButton(WPARAM wParam) // for WM_XBUTTON... +{ + return GET_XBUTTON_WPARAM(wParam) == XBUTTON1 ? Qt::BackButton : Qt::ForwardButton; +} + +static inline MouseEvent eventFromMsg(const MSG &msg) +{ + switch (msg.message) { + case WM_MOUSEMOVE: + return {QEvent::MouseMove, Qt::NoButton}; + case WM_LBUTTONDOWN: + return {QEvent::MouseButtonPress, Qt::LeftButton}; + case WM_LBUTTONUP: + return {QEvent::MouseButtonRelease, Qt::LeftButton}; + case WM_LBUTTONDBLCLK: + return {QEvent::MouseButtonDblClick, Qt::LeftButton}; + case WM_MBUTTONDOWN: + return {QEvent::MouseButtonPress, Qt::MidButton}; + case WM_MBUTTONUP: + return {QEvent::MouseButtonRelease, Qt::MidButton}; + case WM_MBUTTONDBLCLK: + return {QEvent::MouseButtonDblClick, Qt::MidButton}; + case WM_RBUTTONDOWN: + return {QEvent::MouseButtonPress, Qt::RightButton}; + case WM_RBUTTONUP: + return {QEvent::MouseButtonRelease, Qt::RightButton}; + case WM_RBUTTONDBLCLK: + return {QEvent::MouseButtonDblClick, Qt::RightButton}; + case WM_XBUTTONDOWN: + return {QEvent::MouseButtonPress, extraButton(msg.wParam)}; + case WM_XBUTTONUP: + return {QEvent::MouseButtonRelease, extraButton(msg.wParam)}; + case WM_XBUTTONDBLCLK: + return {QEvent::MouseButtonDblClick, extraButton(msg.wParam)}; + case WM_NCMOUSEMOVE: + return {QEvent::NonClientAreaMouseMove, Qt::NoButton}; + case WM_NCLBUTTONDOWN: + return {QEvent::NonClientAreaMouseButtonPress, Qt::LeftButton}; + case WM_NCLBUTTONUP: + return {QEvent::NonClientAreaMouseButtonRelease, Qt::LeftButton}; + case WM_NCLBUTTONDBLCLK: + return {QEvent::NonClientAreaMouseButtonDblClick, Qt::LeftButton}; + case WM_NCMBUTTONDOWN: + return {QEvent::NonClientAreaMouseButtonPress, Qt::MidButton}; + case WM_NCMBUTTONUP: + return {QEvent::NonClientAreaMouseButtonRelease, Qt::MidButton}; + case WM_NCMBUTTONDBLCLK: + return {QEvent::NonClientAreaMouseButtonDblClick, Qt::MidButton}; + case WM_NCRBUTTONDOWN: + return {QEvent::NonClientAreaMouseButtonPress, Qt::RightButton}; + case WM_NCRBUTTONUP: + return {QEvent::NonClientAreaMouseButtonRelease, Qt::RightButton}; + case WM_NCRBUTTONDBLCLK: + return {QEvent::NonClientAreaMouseButtonDblClick, Qt::RightButton}; + default: // WM_MOUSELEAVE + break; + } + return {QEvent::None, Qt::NoButton}; +} + bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, MSG msg, LRESULT *result) @@ -192,8 +267,33 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, if (et == QtWindows::MouseWheelEvent) return translateMouseWheelEvent(window, hwnd, msg, result); + const QPoint winEventPosition(GET_X_LPARAM(msg.lParam), GET_Y_LPARAM(msg.lParam)); + QPoint clientPosition; + QPoint globalPosition; + if (et & QtWindows::NonClientEventFlag) { + globalPosition = winEventPosition; + clientPosition = QWindowsGeometryHint::mapFromGlobal(hwnd, globalPosition); + } else { + clientPosition = winEventPosition; + globalPosition = QWindowsGeometryHint::mapToGlobal(hwnd, winEventPosition); + } + + // Windows sends a mouse move with no buttons pressed to signal "Enter" + // when a window is shown over the cursor. Discard the event and only use + // it for generating QEvent::Enter to be consistent with other platforms - + // X11 and macOS. + bool discardEvent = false; + if (msg.message == WM_MOUSEMOVE) { + const bool samePosition = globalPosition == lastMouseMovePos; + lastMouseMovePos = globalPosition; + if (msg.wParam == 0 && (m_windowUnderMouse.isNull() || samePosition)) + discardEvent = true; + } + Qt::MouseEventSource source = Qt::MouseEventNotSynthesized; + const MouseEvent mouseEvent = eventFromMsg(msg); + // Check for events synthesized from touch. Lower byte is touch index, 0 means pen. static const bool passSynthesizedMouseEvents = !(QWindowsIntegration::instance()->options() & QWindowsIntegration::DontPassOsMouseEventsSynthesizedFromTouch); @@ -210,13 +310,11 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, } } - const QPoint winEventPosition(GET_X_LPARAM(msg.lParam), GET_Y_LPARAM(msg.lParam)); - if (et & QtWindows::NonClientEventFlag) { - const QPoint globalPosition = winEventPosition; - const QPoint clientPosition = QWindowsGeometryHint::mapFromGlobal(hwnd, globalPosition); + if (mouseEvent.type >= QEvent::NonClientAreaMouseMove && mouseEvent.type <= QEvent::NonClientAreaMouseButtonDblClick) { const Qt::MouseButtons buttons = QWindowsMouseHandler::queryMouseButtons(); QWindowSystemInterface::handleFrameStrutMouseEvent(window, clientPosition, globalPosition, buttons, + mouseEvent.button, mouseEvent.type, QWindowsKeyMapper::queryKeyboardModifiers(), source); return false; // Allow further event processing (dragging of windows). @@ -224,7 +322,8 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, *result = 0; if (msg.message == WM_MOUSELEAVE) { - qCDebug(lcQpaEvents) << "WM_MOUSELEAVE for " << window << " previous window under mouse = " << m_windowUnderMouse << " tracked window =" << m_trackedWindow; + qCDebug(lcQpaEvents) << mouseEvent << "for" << window << "previous window under mouse=" + << m_windowUnderMouse << "tracked window=" << m_trackedWindow; // When moving out of a window, WM_MOUSEMOVE within the moved-to window is received first, // so if m_trackedWindow is not the window here, it means the cursor has left the @@ -269,7 +368,6 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, } } - const QPoint globalPosition = QWindowsGeometryHint::mapToGlobal(hwnd, winEventPosition); // In this context, neither an invisible nor a transparent window (transparent regarding mouse // events, "click-through") can be considered as the window under mouse. QWindow *currentWindowUnderMouse = platformWindow->hasMouseCapture() ? @@ -290,10 +388,7 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, // Qt expects the platform plugin to capture the mouse on // any button press until release. if (!platformWindow->hasMouseCapture() - && (msg.message == WM_LBUTTONDOWN || msg.message == WM_MBUTTONDOWN - || msg.message == WM_RBUTTONDOWN || msg.message == WM_XBUTTONDOWN - || msg.message == WM_LBUTTONDBLCLK || msg.message == WM_MBUTTONDBLCLK - || msg.message == WM_RBUTTONDBLCLK || msg.message == WM_XBUTTONDBLCLK)) { + && (mouseEvent.type == QEvent::MouseButtonPress || mouseEvent.type == QEvent::MouseButtonDblClick)) { platformWindow->setMouseGrabEnabled(true); platformWindow->setFlag(QWindowsWindow::AutoMouseCapture); qCDebug(lcQpaEvents) << "Automatic mouse capture " << window; @@ -302,8 +397,7 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, window->requestActivate(); } else if (platformWindow->hasMouseCapture() && platformWindow->testFlag(QWindowsWindow::AutoMouseCapture) - && (msg.message == WM_LBUTTONUP || msg.message == WM_MBUTTONUP - || msg.message == WM_RBUTTONUP || msg.message == WM_XBUTTONUP) + && mouseEvent.type == QEvent::MouseButtonRelease && !buttons) { platformWindow->setMouseGrabEnabled(false); qCDebug(lcQpaEvents) << "Releasing automatic mouse capture " << window; @@ -369,9 +463,12 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd, m_windowUnderMouse = currentWindowUnderMouse; } - QWindowSystemInterface::handleMouseEvent(window, winEventPosition, globalPosition, buttons, - QWindowsKeyMapper::queryKeyboardModifiers(), - source); + if (!discardEvent && mouseEvent.type != QEvent::None) { + QWindowSystemInterface::handleMouseEvent(window, winEventPosition, globalPosition, buttons, + mouseEvent.button, mouseEvent.type, + QWindowsKeyMapper::queryKeyboardModifiers(), + source); + } m_previousCaptureWindow = hasCapture ? window : 0; // QTBUG-48117, force synchronous handling for the extra buttons so that WM_APPCOMMAND // is sent for unhandled WM_XBUTTONDOWN. @@ -411,9 +508,10 @@ static void redirectWheelEvent(QWindow *window, const QPoint &globalPos, int del } if (handleEvent) { + const QPoint point = (orientation == Qt::Vertical) ? QPoint(0, delta) : QPoint(delta, 0); QWindowSystemInterface::handleWheelEvent(receiver, QWindowsGeometryHint::mapFromGlobal(receiver, globalPos), - globalPos, delta, orientation, mods); + globalPos, QPoint(), point, mods); } } diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.h b/src/plugins/platforms/windows/qwindowsmousehandler.h index 86f18a0482..480662c9bf 100644 --- a/src/plugins/platforms/windows/qwindowsmousehandler.h +++ b/src/plugins/platforms/windows/qwindowsmousehandler.h @@ -43,8 +43,8 @@ #include "qtwindowsglobal.h" #include <QtCore/qt_windows.h> -#include <QtCore/QPointer> -#include <QtCore/QHash> +#include <QtCore/qpointer.h> +#include <QtCore/qhash.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp index ffa100f824..da6f13d01a 100644 --- a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp +++ b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp @@ -48,9 +48,9 @@ #include "qwindowsmime.h" #include "qwin10helpers.h" -#include <QtGui/QWindow> -#include <QtGui/QOpenGLContext> -#include <QtGui/QScreen> +#include <QtGui/qwindow.h> +#include <QtGui/qopenglcontext.h> +#include <QtGui/qscreen.h> #include <qpa/qplatformscreen.h> #include <QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h> @@ -111,15 +111,14 @@ void *QWindowsNativeInterface::nativeResourceForWindow(const QByteArray &resourc return 0; } break; - case QWindow::OpenGLSurface: - case QWindow::OpenVGSurface: - break; case QWindow::VulkanSurface: #if QT_CONFIG(vulkan) if (type == VkSurface) return bw->surface(nullptr, nullptr); // returns the address of the VkSurfaceKHR, not the value, as expected #endif break; + default: + break; } qWarning("%s: Invalid key '%s' requested.", __FUNCTION__, resource.constData()); return 0; diff --git a/src/plugins/platforms/windows/qwindowsole.cpp b/src/plugins/platforms/windows/qwindowsole.cpp index 0ceb0d82fa..3e62bbdeca 100644 --- a/src/plugins/platforms/windows/qwindowsole.cpp +++ b/src/plugins/platforms/windows/qwindowsole.cpp @@ -41,14 +41,14 @@ #include "qwindowsmime.h" #include "qwindowscontext.h" \ -#include <QtGui/QMouseEvent> -#include <QtGui/QWindow> -#include <QtGui/QPainter> -#include <QtGui/QCursor> -#include <QtGui/QGuiApplication> - -#include <QtCore/QMimeData> -#include <QtCore/QDebug> +#include <QtGui/qevent.h> +#include <QtGui/qwindow.h> +#include <QtGui/qpainter.h> +#include <QtGui/qcursor.h> +#include <QtGui/qguiapplication.h> + +#include <QtCore/qmimedata.h> +#include <QtCore/qdebug.h> #include <shlobj.h> diff --git a/src/plugins/platforms/windows/qwindowsole.h b/src/plugins/platforms/windows/qwindowsole.h index fc58858f2c..cc971b6464 100644 --- a/src/plugins/platforms/windows/qwindowsole.h +++ b/src/plugins/platforms/windows/qwindowsole.h @@ -43,9 +43,9 @@ #include "qwindowscombase.h" #include <QtCore/qt_windows.h> -#include <QtCore/QMap> -#include <QtCore/QPointer> -#include <QtCore/QVector> +#include <QtCore/qmap.h> +#include <QtCore/qpointer.h> +#include <QtCore/qvector.h> #include <objidl.h> diff --git a/src/plugins/platforms/windows/qwindowsopenglcontext.h b/src/plugins/platforms/windows/qwindowsopenglcontext.h index 85f4f717f5..d162acdde3 100644 --- a/src/plugins/platforms/windows/qwindowsopenglcontext.h +++ b/src/plugins/platforms/windows/qwindowsopenglcontext.h @@ -40,7 +40,7 @@ #ifndef QWINDOWSOPENGLCONTEXT_H #define QWINDOWSOPENGLCONTEXT_H -#include <QtGui/QOpenGLContext> +#include <QtGui/qopenglcontext.h> #include <qpa/qplatformopenglcontext.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsopengltester.cpp b/src/plugins/platforms/windows/qwindowsopengltester.cpp index c52e4e612e..c4ee820211 100644 --- a/src/plugins/platforms/windows/qwindowsopengltester.cpp +++ b/src/plugins/platforms/windows/qwindowsopengltester.cpp @@ -40,15 +40,15 @@ #include "qwindowsopengltester.h" #include "qwindowscontext.h" -#include <QtCore/QVariantMap> -#include <QtCore/QDebug> -#include <QtCore/QTextStream> -#include <QtCore/QCoreApplication> -#include <QtCore/QFile> -#include <QtCore/QFileInfo> -#include <QtCore/QStandardPaths> -#include <QtCore/QLibraryInfo> -#include <QtCore/QHash> +#include <QtCore/qvariant.h> +#include <QtCore/qdebug.h> +#include <QtCore/qtextstream.h> +#include <QtCore/qcoreapplication.h> +#include <QtCore/qfile.h> +#include <QtCore/qfileinfo.h> +#include <QtCore/qstandardpaths.h> +#include <QtCore/qlibraryinfo.h> +#include <QtCore/qhash.h> #ifndef QT_NO_OPENGL #include <private/qopengl_p.h> diff --git a/src/plugins/platforms/windows/qwindowsopengltester.h b/src/plugins/platforms/windows/qwindowsopengltester.h index e3fec59dd5..5ee2508462 100644 --- a/src/plugins/platforms/windows/qwindowsopengltester.h +++ b/src/plugins/platforms/windows/qwindowsopengltester.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSOPENGLTESTER_H #define QWINDOWSOPENGLTESTER_H -#include <QtCore/QByteArray> -#include <QtCore/QFlags> +#include <QtCore/qbytearray.h> +#include <QtCore/qflags.h> #include <QtCore/qversionnumber.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowspointerhandler.cpp b/src/plugins/platforms/windows/qwindowspointerhandler.cpp new file mode 100644 index 0000000000..f25e6d13d8 --- /dev/null +++ b/src/plugins/platforms/windows/qwindowspointerhandler.cpp @@ -0,0 +1,573 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#if defined(WINVER) && WINVER < 0x0603 +# undef WINVER +#endif +#if !defined(WINVER) +# define WINVER 0x0603 // Enable pointer functions for MinGW +#endif + +#include "qwindowspointerhandler.h" +#include "qwindowskeymapper.h" +#include "qwindowscontext.h" +#include "qwindowswindow.h" +#include "qwindowsintegration.h" +#include "qwindowsscreen.h" + +#include <qpa/qwindowsysteminterface.h> +#include <QtGui/qguiapplication.h> +#include <QtGui/qscreen.h> +#include <QtGui/qtouchdevice.h> +#include <QtGui/qwindow.h> +#include <QtGui/private/qguiapplication_p.h> +#include <QtCore/qvarlengtharray.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qoperatingsystemversion.h> + +#include <windowsx.h> + +QT_BEGIN_NAMESPACE + +enum { + QT_PT_POINTER = 1, + QT_PT_TOUCH = 2, + QT_PT_PEN = 3, + QT_PT_MOUSE = 4, + QT_PT_TOUCHPAD = 5, // MinGW is missing PT_TOUCHPAD +}; + +bool QWindowsPointerHandler::translatePointerEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, MSG msg, LRESULT *result) +{ + *result = 0; + const quint32 pointerId = GET_POINTERID_WPARAM(msg.wParam); + + POINTER_INPUT_TYPE pointerType; + if (!QWindowsContext::user32dll.getPointerType(pointerId, &pointerType)) { + qWarning() << "GetPointerType() failed:" << qt_error_string(); + return false; + } + + switch (pointerType) { + case QT_PT_POINTER: + case QT_PT_MOUSE: + case QT_PT_TOUCHPAD: { + POINTER_INFO pointerInfo; + if (!QWindowsContext::user32dll.getPointerInfo(pointerId, &pointerInfo)) { + qWarning() << "GetPointerInfo() failed:" << qt_error_string(); + return false; + } + return translateMouseTouchPadEvent(window, hwnd, et, msg, &pointerInfo); + } + case QT_PT_TOUCH: { + quint32 pointerCount = 0; + if (!QWindowsContext::user32dll.getPointerFrameTouchInfo(pointerId, &pointerCount, nullptr)) { + qWarning() << "GetPointerFrameTouchInfo() failed:" << qt_error_string(); + return false; + } + QVarLengthArray<POINTER_TOUCH_INFO, 10> touchInfo(pointerCount); + if (!QWindowsContext::user32dll.getPointerFrameTouchInfo(pointerId, &pointerCount, touchInfo.data())) { + qWarning() << "GetPointerFrameTouchInfo() failed:" << qt_error_string(); + return false; + } + return translateTouchEvent(window, hwnd, et, msg, touchInfo.data(), pointerCount); + } + case QT_PT_PEN: { + POINTER_PEN_INFO penInfo; + if (!QWindowsContext::user32dll.getPointerPenInfo(pointerId, &penInfo)) { + qWarning() << "GetPointerPenInfo() failed:" << qt_error_string(); + return false; + } + return translatePenEvent(window, hwnd, et, msg, &penInfo); + } + } + return false; +} + +static void getMouseEventInfo(UINT message, POINTER_BUTTON_CHANGE_TYPE changeType, QPoint globalPos, QEvent::Type *eventType, Qt::MouseButton *mouseButton) +{ + static const QHash<POINTER_BUTTON_CHANGE_TYPE, Qt::MouseButton> buttonMapping { + {POINTER_CHANGE_FIRSTBUTTON_DOWN, Qt::LeftButton}, + {POINTER_CHANGE_FIRSTBUTTON_UP, Qt::LeftButton}, + {POINTER_CHANGE_SECONDBUTTON_DOWN, Qt::RightButton}, + {POINTER_CHANGE_SECONDBUTTON_UP, Qt::RightButton}, + {POINTER_CHANGE_THIRDBUTTON_DOWN, Qt::MiddleButton}, + {POINTER_CHANGE_THIRDBUTTON_UP, Qt::MiddleButton}, + {POINTER_CHANGE_FOURTHBUTTON_DOWN, Qt::XButton1}, + {POINTER_CHANGE_FOURTHBUTTON_UP, Qt::XButton1}, + {POINTER_CHANGE_FIFTHBUTTON_DOWN, Qt::XButton2}, + {POINTER_CHANGE_FIFTHBUTTON_UP, Qt::XButton2}, + }; + + static const QHash<UINT, QEvent::Type> eventMapping { + {WM_POINTERUPDATE, QEvent::MouseMove}, + {WM_POINTERDOWN, QEvent::MouseButtonPress}, + {WM_POINTERUP, QEvent::MouseButtonRelease}, + {WM_NCPOINTERUPDATE, QEvent::NonClientAreaMouseMove}, + {WM_NCPOINTERDOWN, QEvent::NonClientAreaMouseButtonPress}, + {WM_NCPOINTERUP, QEvent::NonClientAreaMouseButtonRelease}, + {WM_POINTERWHEEL, QEvent::Wheel}, + {WM_POINTERHWHEEL, QEvent::Wheel}, + }; + + if (!eventType || !mouseButton) + return; + + if (message == WM_POINTERDOWN || message == WM_POINTERUP || message == WM_NCPOINTERDOWN || message == WM_NCPOINTERUP) + *mouseButton = buttonMapping.value(changeType, Qt::NoButton); + else + *mouseButton = Qt::NoButton; + + *eventType = eventMapping.value(message, QEvent::None); + + // Pointer messages lack a double click indicator. Check if this is the case here. + if (message == WM_POINTERDOWN) { + static LONG lastTime = 0; + static Qt::MouseButton lastButton = Qt::NoButton; + static QPoint lastPos; + LONG messageTime = GetMessageTime(); + if (*mouseButton == lastButton + && messageTime - lastTime < (LONG)GetDoubleClickTime() + && qAbs(globalPos.x() - lastPos.x()) < GetSystemMetrics(SM_CXDOUBLECLK) + && qAbs(globalPos.y() - lastPos.y()) < GetSystemMetrics(SM_CYDOUBLECLK)) { + *eventType = QEvent::MouseButtonDblClick; + } + lastTime = messageTime; + lastButton = *mouseButton; + lastPos = globalPos; + } +} + +static QWindow *getWindowUnderPointer(QWindow *window, QPoint globalPos) +{ + QWindow *currentWindowUnderPointer = QWindowsScreen::windowAt(globalPos, CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT); + + while (currentWindowUnderPointer && currentWindowUnderPointer->flags() & Qt::WindowTransparentForInput) + currentWindowUnderPointer = currentWindowUnderPointer->parent(); + + // QTBUG-44332: When Qt is running at low integrity level and + // a Qt Window is parented on a Window of a higher integrity process + // using QWindow::fromWinId() (for example, Qt running in a browser plugin) + // ChildWindowFromPointEx() may not find the Qt window (failing with ERROR_ACCESS_DENIED) + if (!currentWindowUnderPointer) { + const QRect clientRect(QPoint(0, 0), window->size()); + if (clientRect.contains(globalPos)) + currentWindowUnderPointer = window; + } + return currentWindowUnderPointer; +} + +static bool trackLeave(HWND hwnd) +{ + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(TRACKMOUSEEVENT); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = hwnd; + tme.dwHoverTime = HOVER_DEFAULT; + return TrackMouseEvent(&tme); +} + +static bool isValidWheelReceiver(QWindow *candidate) +{ + if (candidate) { + const QWindow *toplevel = QWindowsWindow::topLevelOf(candidate); + if (toplevel->handle() && toplevel->handle()->isForeignWindow()) + return true; + if (const QWindowsWindow *ww = QWindowsWindow::windowsWindowOf(toplevel)) + return !ww->testFlag(QWindowsWindow::BlockedByModal); + } + return false; +} + +static QTouchDevice *createTouchDevice() +{ + const int digitizers = GetSystemMetrics(SM_DIGITIZER); + if (!(digitizers & (NID_INTEGRATED_TOUCH | NID_EXTERNAL_TOUCH))) + return nullptr; + const int tabletPc = GetSystemMetrics(SM_TABLETPC); + const int maxTouchPoints = GetSystemMetrics(SM_MAXIMUMTOUCHES); + qCDebug(lcQpaEvents) << "Digitizers:" << hex << showbase << (digitizers & ~NID_READY) + << "Ready:" << (digitizers & NID_READY) << dec << noshowbase + << "Tablet PC:" << tabletPc << "Max touch points:" << maxTouchPoints; + QTouchDevice *result = new QTouchDevice; + result->setType(digitizers & NID_INTEGRATED_TOUCH + ? QTouchDevice::TouchScreen : QTouchDevice::TouchPad); + QTouchDevice::Capabilities capabilities = QTouchDevice::Position | QTouchDevice::Area | QTouchDevice::NormalizedPosition; + if (result->type() == QTouchDevice::TouchPad) + capabilities |= QTouchDevice::MouseEmulation; + result->setCapabilities(capabilities); + result->setMaximumTouchPoints(maxTouchPoints); + return result; +} + +QTouchDevice *QWindowsPointerHandler::ensureTouchDevice() +{ + if (!m_touchDevice) + m_touchDevice.reset(createTouchDevice()); + return m_touchDevice.data(); +} + +Qt::MouseButtons QWindowsPointerHandler::queryMouseButtons() +{ + Qt::MouseButtons result = 0; + const bool mouseSwapped = GetSystemMetrics(SM_SWAPBUTTON); + if (GetAsyncKeyState(VK_LBUTTON) < 0) + result |= mouseSwapped ? Qt::RightButton: Qt::LeftButton; + if (GetAsyncKeyState(VK_RBUTTON) < 0) + result |= mouseSwapped ? Qt::LeftButton : Qt::RightButton; + if (GetAsyncKeyState(VK_MBUTTON) < 0) + result |= Qt::MidButton; + if (GetAsyncKeyState(VK_XBUTTON1) < 0) + result |= Qt::XButton1; + if (GetAsyncKeyState(VK_XBUTTON2) < 0) + result |= Qt::XButton2; + return result; +} + +bool QWindowsPointerHandler::translateMouseTouchPadEvent(QWindow *window, HWND hwnd, + QtWindows::WindowsEventType et, + MSG msg, PVOID vPointerInfo) +{ + POINTER_INFO *pointerInfo = static_cast<POINTER_INFO *>(vPointerInfo); + const QPoint globalPos = QPoint(pointerInfo->ptPixelLocation.x, pointerInfo->ptPixelLocation.y); + const QPoint localPos = QWindowsGeometryHint::mapFromGlobal(hwnd, globalPos); + const Qt::KeyboardModifiers keyModifiers = QWindowsKeyMapper::queryKeyboardModifiers(); + const Qt::MouseButtons mouseButtons = queryMouseButtons(); + + QWindow *currentWindowUnderPointer = getWindowUnderPointer(window, globalPos); + QWindowsWindow *platformWindow = static_cast<QWindowsWindow *>(window->handle()); + + switch (msg.message) { + case WM_NCPOINTERDOWN: + case WM_NCPOINTERUP: + case WM_NCPOINTERUPDATE: + case WM_POINTERDOWN: + case WM_POINTERUP: + case WM_POINTERUPDATE: { + + QEvent::Type eventType; + Qt::MouseButton button; + getMouseEventInfo(msg.message, pointerInfo->ButtonChangeType, globalPos, &eventType, &button); + + if (et & QtWindows::NonClientEventFlag) { + QWindowSystemInterface::handleFrameStrutMouseEvent(window, localPos, globalPos, mouseButtons, button, eventType, + keyModifiers, Qt::MouseEventNotSynthesized); + return false; // To allow window dragging, etc. + } else { + if (currentWindowUnderPointer != m_windowUnderPointer) { + if (m_windowUnderPointer && m_windowUnderPointer == m_currentWindow) { + QWindowSystemInterface::handleLeaveEvent(m_windowUnderPointer); + m_currentWindow = nullptr; + } + + if (currentWindowUnderPointer) { + if (currentWindowUnderPointer != m_currentWindow) { + QWindowSystemInterface::handleEnterEvent(currentWindowUnderPointer, localPos, globalPos); + m_currentWindow = currentWindowUnderPointer; + if (QWindowsWindow *wumPlatformWindow = QWindowsWindow::windowsWindowOf(currentWindowUnderPointer)) + wumPlatformWindow->applyCursor(); + trackLeave(hwnd); + } + } else { + platformWindow->applyCursor(); + } + m_windowUnderPointer = currentWindowUnderPointer; + } + + QWindowSystemInterface::handleMouseEvent(window, localPos, globalPos, mouseButtons, button, eventType, + keyModifiers, Qt::MouseEventNotSynthesized); + + // The initial down click over the QSizeGrip area, which posts a resize WM_SYSCOMMAND + // has go to through DefWindowProc() for resizing to work, so we return false here, + // unless the mouse is captured, as it would mess with menu processing. + return msg.message != WM_POINTERDOWN || GetCapture(); + } + } + case WM_POINTERHWHEEL: + case WM_POINTERWHEEL: { + + int delta = GET_WHEEL_DELTA_WPARAM(msg.wParam); + + // Qt horizontal wheel rotation orientation is opposite to the one in WM_POINTERHWHEEL + if (msg.message == WM_POINTERHWHEEL) + delta = -delta; + + const QPoint angleDelta = (msg.message == WM_POINTERHWHEEL || (keyModifiers & Qt::AltModifier)) ? + QPoint(delta, 0) : QPoint(0, delta); + + if (isValidWheelReceiver(window)) + QWindowSystemInterface::handleWheelEvent(window, localPos, globalPos, QPoint(), angleDelta, keyModifiers); + return true; + } + case WM_POINTERLEAVE: + return true; + } + return false; +} + +bool QWindowsPointerHandler::translateTouchEvent(QWindow *window, HWND hwnd, + QtWindows::WindowsEventType et, + MSG msg, PVOID vTouchInfo, quint32 count) +{ + Q_UNUSED(hwnd); + Q_UNUSED(et); + + if (et & QtWindows::NonClientEventFlag) + return false; // Let DefWindowProc() handle Non Client messages. + + if (count < 1) + return false; + + const QScreen *screen = window->screen(); + if (!screen) + screen = QGuiApplication::primaryScreen(); + if (!screen) + return false; + + POINTER_TOUCH_INFO *touchInfo = static_cast<POINTER_TOUCH_INFO *>(vTouchInfo); + + const QRect screenGeometry = screen->geometry(); + + QList<QWindowSystemInterface::TouchPoint> touchPoints; + + for (quint32 i = 0; i < count; ++i) { + + QWindowSystemInterface::TouchPoint touchPoint; + touchPoint.id = touchInfo[i].pointerInfo.pointerId; + touchPoint.pressure = (touchInfo[i].touchMask & TOUCH_MASK_PRESSURE) ? + touchInfo[i].pressure / 1024.0 : 1.0; + if (m_lastTouchPositions.contains(touchPoint.id)) + touchPoint.normalPosition = m_lastTouchPositions.value(touchPoint.id); + + const QPointF screenPos = QPointF(touchInfo[i].pointerInfo.ptPixelLocation.x, + touchInfo[i].pointerInfo.ptPixelLocation.y); + + if (touchInfo[i].touchMask & TOUCH_MASK_CONTACTAREA) + touchPoint.area.setSize(QSizeF(touchInfo[i].rcContact.right - touchInfo[i].rcContact.left, + touchInfo[i].rcContact.bottom - touchInfo[i].rcContact.top)); + touchPoint.area.moveCenter(screenPos); + QPointF normalPosition = QPointF(screenPos.x() / screenGeometry.width(), + screenPos.y() / screenGeometry.height()); + const bool stationaryTouchPoint = (normalPosition == touchPoint.normalPosition); + touchPoint.normalPosition = normalPosition; + + if (touchInfo[i].pointerInfo.pointerFlags & POINTER_FLAG_DOWN) { + touchPoint.state = Qt::TouchPointPressed; + m_lastTouchPositions.insert(touchPoint.id, touchPoint.normalPosition); + } else if (touchInfo[i].pointerInfo.pointerFlags & POINTER_FLAG_UP) { + touchPoint.state = Qt::TouchPointReleased; + m_lastTouchPositions.remove(touchPoint.id); + } else { + touchPoint.state = stationaryTouchPoint ? Qt::TouchPointStationary : Qt::TouchPointMoved; + m_lastTouchPositions.insert(touchPoint.id, touchPoint.normalPosition); + } + touchPoints.append(touchPoint); + } + + QWindowSystemInterface::handleTouchEvent(window, m_touchDevice.data(), touchPoints, + QWindowsKeyMapper::queryKeyboardModifiers()); + + if (!(QWindowsIntegration::instance()->options() & QWindowsIntegration::DontPassOsMouseEventsSynthesizedFromTouch)) { + + const QPoint globalPos = QPoint(touchInfo->pointerInfo.ptPixelLocation.x, touchInfo->pointerInfo.ptPixelLocation.y); + const QPoint localPos = QWindowsGeometryHint::mapFromGlobal(hwnd, globalPos); + const Qt::KeyboardModifiers keyModifiers = QWindowsKeyMapper::queryKeyboardModifiers(); + const Qt::MouseButtons mouseButtons = queryMouseButtons(); + + QEvent::Type eventType; + Qt::MouseButton button; + getMouseEventInfo(msg.message, touchInfo->pointerInfo.ButtonChangeType, globalPos, &eventType, &button); + + QWindowSystemInterface::handleMouseEvent(window, localPos, globalPos, mouseButtons, button, eventType, + keyModifiers, Qt::MouseEventSynthesizedByQt); + } + + return true; +} + +bool QWindowsPointerHandler::translatePenEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, + MSG msg, PVOID vPenInfo) +{ + if (et & QtWindows::NonClientEventFlag) + return false; // Let DefWindowProc() handle Non Client messages. + + POINTER_PEN_INFO *penInfo = static_cast<POINTER_PEN_INFO *>(vPenInfo); + const quint32 pointerId = penInfo->pointerInfo.pointerId; + const QPoint globalPos = QPoint(penInfo->pointerInfo.ptPixelLocation.x, penInfo->pointerInfo.ptPixelLocation.y); + const QPoint localPos = QWindowsGeometryHint::mapFromGlobal(hwnd, globalPos); + const qreal pressure = (penInfo->penMask & PEN_MASK_PRESSURE) ? qreal(penInfo->pressure) / 1024.0 : 0.5; + const qreal rotation = (penInfo->penMask & PEN_MASK_ROTATION) ? qreal(penInfo->rotation) : 0.0; + const qreal tangentialPressure = 0.0; + const int xTilt = (penInfo->penMask & PEN_MASK_TILT_X) ? penInfo->tiltX : 0; + const int yTilt = (penInfo->penMask & PEN_MASK_TILT_Y) ? penInfo->tiltY : 0; + const int z = 0; + + const QTabletEvent::TabletDevice device = QTabletEvent::Stylus; + QTabletEvent::PointerType type; + Qt::MouseButtons mouseButtons; + + const bool pointerInContact = IS_POINTER_INCONTACT_WPARAM(msg.wParam); + if (pointerInContact) + mouseButtons = Qt::LeftButton; + + if (penInfo->penFlags & (PEN_FLAG_ERASER | PEN_FLAG_INVERTED)) { + type = QTabletEvent::Eraser; + } else { + type = QTabletEvent::Pen; + if (pointerInContact && penInfo->penFlags & PEN_FLAG_BARREL) + mouseButtons = Qt::RightButton; // Either left or right, not both + } + + switch (msg.message) { + case WM_POINTERENTER: { + QWindowSystemInterface::handleTabletEnterProximityEvent(device, type, pointerId); + m_windowUnderPointer = window; + // The local coordinates may fall outside the window. + // Wait until the next update to send the enter event. + m_needsEnterOnPointerUpdate = true; + break; + } + case WM_POINTERLEAVE: + if (m_windowUnderPointer && m_windowUnderPointer == m_currentWindow) { + QWindowSystemInterface::handleLeaveEvent(m_windowUnderPointer); + m_windowUnderPointer = nullptr; + m_currentWindow = nullptr; + } + QWindowSystemInterface::handleTabletLeaveProximityEvent(device, type, pointerId); + break; + case WM_POINTERDOWN: + case WM_POINTERUP: + case WM_POINTERUPDATE: { + QWindow *target = QGuiApplicationPrivate::tabletDevicePoint(pointerId).target; // Pass to window that grabbed it. + if (!target && m_windowUnderPointer) + target = m_windowUnderPointer; + if (!target) + target = window; + + if (m_needsEnterOnPointerUpdate) { + m_needsEnterOnPointerUpdate = false; + if (window != m_currentWindow) { + QWindowSystemInterface::handleEnterEvent(window, localPos, globalPos); + m_currentWindow = window; + if (QWindowsWindow *wumPlatformWindow = QWindowsWindow::windowsWindowOf(target)) + wumPlatformWindow->applyCursor(); + } + } + const Qt::KeyboardModifiers keyModifiers = QWindowsKeyMapper::queryKeyboardModifiers(); + + QWindowSystemInterface::handleTabletEvent(target, localPos, globalPos, device, type, mouseButtons, + pressure, xTilt, yTilt, tangentialPressure, rotation, z, + pointerId, keyModifiers); + + QEvent::Type eventType; + Qt::MouseButton button; + getMouseEventInfo(msg.message, penInfo->pointerInfo.ButtonChangeType, globalPos, &eventType, &button); + + QWindowSystemInterface::handleMouseEvent(target, localPos, globalPos, mouseButtons, button, eventType, + keyModifiers, Qt::MouseEventSynthesizedByQt); + break; + } + } + return true; +} + +// SetCursorPos()/TrackMouseEvent() will generate old-style WM_MOUSE messages. Handle them here. +bool QWindowsPointerHandler::translateMouseEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, MSG msg, LRESULT *result) +{ + Q_UNUSED(et); + + *result = 0; + if (msg.message != WM_MOUSELEAVE && msg.message != WM_MOUSEMOVE) + return false; + + const QPoint localPos(GET_X_LPARAM(msg.lParam), GET_Y_LPARAM(msg.lParam)); + const QPoint globalPos = QWindowsGeometryHint::mapToGlobal(hwnd, localPos); + + QWindowsWindow *platformWindow = static_cast<QWindowsWindow *>(window->handle()); + + if (msg.message == WM_MOUSELEAVE) { + if (window == m_currentWindow) { + QWindowSystemInterface::handleLeaveEvent(window); + m_windowUnderPointer = nullptr; + m_currentWindow = nullptr; + platformWindow->applyCursor(); + } + return false; + } + + // Windows sends a mouse move with no buttons pressed to signal "Enter" + // when a window is shown over the cursor. Discard the event and only use + // it for generating QEvent::Enter to be consistent with other platforms - + // X11 and macOS. + static QPoint lastMouseMovePos; + const bool discardEvent = msg.wParam == 0 && (m_windowUnderPointer.isNull() || globalPos == lastMouseMovePos); + lastMouseMovePos = globalPos; + + QWindow *currentWindowUnderPointer = getWindowUnderPointer(window, globalPos); + + if (currentWindowUnderPointer != m_windowUnderPointer) { + if (m_windowUnderPointer && m_windowUnderPointer == m_currentWindow) { + QWindowSystemInterface::handleLeaveEvent(m_windowUnderPointer); + m_currentWindow = nullptr; + } + + if (currentWindowUnderPointer) { + if (currentWindowUnderPointer != m_currentWindow) { + QWindowSystemInterface::handleEnterEvent(currentWindowUnderPointer, localPos, globalPos); + m_currentWindow = currentWindowUnderPointer; + if (QWindowsWindow *wumPlatformWindow = QWindowsWindow::windowsWindowOf(currentWindowUnderPointer)) + wumPlatformWindow->applyCursor(); + trackLeave(hwnd); + } + } else { + platformWindow->applyCursor(); + } + m_windowUnderPointer = currentWindowUnderPointer; + } + + const Qt::KeyboardModifiers keyModifiers = QWindowsKeyMapper::queryKeyboardModifiers(); + const Qt::MouseButtons mouseButtons = queryMouseButtons(); + + if (!discardEvent) + QWindowSystemInterface::handleMouseEvent(window, localPos, globalPos, mouseButtons, Qt::NoButton, QEvent::MouseMove, + keyModifiers, Qt::MouseEventNotSynthesized); + return false; +} + +QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowspointerhandler.h b/src/plugins/platforms/windows/qwindowspointerhandler.h new file mode 100644 index 0000000000..11bc9419d7 --- /dev/null +++ b/src/plugins/platforms/windows/qwindowspointerhandler.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QWINDOWSPOINTERHANDLER_H +#define QWINDOWSPOINTERHANDLER_H + +#include "qtwindowsglobal.h" +#include <QtCore/qt_windows.h> + +#include <QtCore/qpointer.h> +#include <QtCore/qscopedpointer.h> +#include <QtCore/qhash.h> + +QT_BEGIN_NAMESPACE + +class QWindow; +class QTouchDevice; + +class QWindowsPointerHandler +{ + Q_DISABLE_COPY(QWindowsPointerHandler) +public: + QWindowsPointerHandler() = default; + bool translatePointerEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, MSG msg, LRESULT *result); + bool translateMouseEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, MSG msg, LRESULT *result); + QTouchDevice *touchDevice() const { return m_touchDevice.data(); } + QTouchDevice *ensureTouchDevice(); + Qt::MouseButtons queryMouseButtons(); + QWindow *windowUnderMouse() const { return m_windowUnderPointer.data(); } + void clearWindowUnderMouse() { m_windowUnderPointer = nullptr; } + +private: + bool translateMouseTouchPadEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, MSG msg, PVOID vPointerInfo); + bool translateTouchEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, MSG msg, PVOID vTouchInfo, unsigned int count); + bool translatePenEvent(QWindow *window, HWND hwnd, QtWindows::WindowsEventType et, MSG msg, PVOID vPenInfo); + + QScopedPointer<QTouchDevice> m_touchDevice; + QHash<int, QPointF> m_lastTouchPositions; + QPointer<QWindow> m_windowUnderPointer; + QPointer<QWindow> m_currentWindow; + bool m_needsEnterOnPointerUpdate = false; +}; + +QT_END_NAMESPACE + +#endif // QWINDOWSPOINTERHANDLER_H diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp index d56dc870ea..bf7f359aac 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.cpp +++ b/src/plugins/platforms/windows/qwindowsscreen.cpp @@ -45,14 +45,14 @@ #include <QtCore/qt_windows.h> -#include <QtCore/QSettings> -#include <QtGui/QPixmap> -#include <QtGui/QGuiApplication> +#include <QtCore/qsettings.h> +#include <QtGui/qpixmap.h> +#include <QtGui/qguiapplication.h> #include <qpa/qwindowsysteminterface.h> #include <private/qhighdpiscaling_p.h> -#include <QtGui/QScreen> +#include <QtGui/qscreen.h> -#include <QtCore/QDebug> +#include <QtCore/qdebug.h> QT_BEGIN_NAMESPACE @@ -274,9 +274,12 @@ QList<QPlatformScreen *> QWindowsScreen::virtualSiblings() const { QList<QPlatformScreen *> result; if (m_data.flags & QWindowsScreenData::VirtualDesktop) { - foreach (QWindowsScreen *screen, QWindowsContext::instance()->screenManager().screens()) + const QWindowsScreenManager::WindowsScreenList screens + = QWindowsContext::instance()->screenManager().screens(); + for (QWindowsScreen *screen : screens) { if (screen->data().flags & QWindowsScreenData::VirtualDesktop) result.push_back(screen); + } } else { result.push_back(const_cast<QWindowsScreen *>(this)); } @@ -505,7 +508,8 @@ void QWindowsScreenManager::removeScreen(int index) // move those manually. if (screen != primaryScreen) { unsigned movedWindowCount = 0; - foreach (QWindow *w, QGuiApplication::topLevelWindows()) { + const QWindowList tlws = QGuiApplication::topLevelWindows(); + for (QWindow *w : tlws) { if (w->screen() == screen && w->handle() && w->type() != Qt::Desktop) { if (w->isVisible() && w->windowState() != Qt::WindowMinimized && (QWindowsWindow::baseWindowOf(w)->exStyle() & WS_EX_TOOLWINDOW)) { @@ -530,9 +534,9 @@ void QWindowsScreenManager::removeScreen(int index) bool QWindowsScreenManager::handleScreenChanges() { // Look for changed monitors, add new ones - WindowsScreenDataList newDataList = monitorData(); + const WindowsScreenDataList newDataList = monitorData(); const bool lockScreen = newDataList.size() == 1 && (newDataList.front().flags & QWindowsScreenData::LockScreen); - foreach (const QWindowsScreenData &newData, newDataList) { + for (const QWindowsScreenData &newData : newDataList) { const int existingIndex = indexOfMonitor(m_screens, newData.name); if (existingIndex != -1) { m_screens.at(existingIndex)->handleChanges(newData); @@ -564,7 +568,7 @@ void QWindowsScreenManager::clearScreens() const QWindowsScreen *QWindowsScreenManager::screenAtDp(const QPoint &p) const { - foreach (QWindowsScreen *scr, m_screens) { + for (QWindowsScreen *scr : m_screens) { if (scr->geometry().contains(p)) return scr; } diff --git a/src/plugins/platforms/windows/qwindowsscreen.h b/src/plugins/platforms/windows/qwindowsscreen.h index 5753e605da..824bcb1ad6 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.h +++ b/src/plugins/platforms/windows/qwindowsscreen.h @@ -42,10 +42,10 @@ #include "qtwindowsglobal.h" -#include <QtCore/QList> -#include <QtCore/QVector> -#include <QtCore/QPair> -#include <QtCore/QScopedPointer> +#include <QtCore/qlist.h> +#include <QtCore/qvector.h> +#include <QtCore/qpair.h> +#include <QtCore/qscopedpointer.h> #include <qpa/qplatformscreen.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsservices.cpp b/src/plugins/platforms/windows/qwindowsservices.cpp index 48332b35f8..b6ed27464e 100644 --- a/src/plugins/platforms/windows/qwindowsservices.cpp +++ b/src/plugins/platforms/windows/qwindowsservices.cpp @@ -41,9 +41,9 @@ #include "qwindowsservices.h" #include <QtCore/qt_windows.h> -#include <QtCore/QUrl> -#include <QtCore/QDebug> -#include <QtCore/QDir> +#include <QtCore/qurl.h> +#include <QtCore/qdebug.h> +#include <QtCore/qdir.h> #include <shlobj.h> #include <intshcut.h> diff --git a/src/plugins/platforms/windows/qwindowstabletsupport.cpp b/src/plugins/platforms/windows/qwindowstabletsupport.cpp index 280519d39d..dad3e9df9f 100644 --- a/src/plugins/platforms/windows/qwindowstabletsupport.cpp +++ b/src/plugins/platforms/windows/qwindowstabletsupport.cpp @@ -46,13 +46,13 @@ #include <qpa/qwindowsysteminterface.h> -#include <QtGui/QTabletEvent> -#include <QtGui/QScreen> -#include <QtGui/QGuiApplication> -#include <QtGui/QWindow> -#include <QtCore/QDebug> -#include <QtCore/QVarLengthArray> -#include <QtCore/QtMath> +#include <QtGui/qevent.h> +#include <QtGui/qscreen.h> +#include <QtGui/qguiapplication.h> +#include <QtGui/qwindow.h> +#include <QtCore/qdebug.h> +#include <QtCore/qvarlengtharray.h> +#include <QtCore/qmath.h> #include <private/qguiapplication_p.h> #include <QtCore/private/qsystemlibrary_p.h> @@ -135,9 +135,9 @@ QDebug operator<<(QDebug d, const QWindowsTabletDeviceData &t) d.nospace(); d << "TabletDevice id:" << t.uniqueId << " pressure: " << t.minPressure << ".." << t.maxPressure << " tan pressure: " << t.minTanPressure << ".." - << t.maxTanPressure << " area:" << t.minX << t.minY <<t.minZ - << ".." << t.maxX << t.maxY << t.maxZ << " device " << t.currentDevice - << " pointer " << t.currentPointerType; + << t.maxTanPressure << " area: (" << t.minX << ',' << t.minY << ',' << t.minZ + << ")..(" << t.maxX << ',' << t.maxY << ',' << t.maxZ << ") device " + << t.currentDevice << " pointer " << t.currentPointerType; return d; } @@ -211,9 +211,6 @@ bool QWindowsWinTab32DLL::init() QWindowsTabletSupport::QWindowsTabletSupport(HWND window, HCTX context) : m_window(window) , m_context(context) - , m_absoluteRange(20) - , m_tiltSupport(false) - , m_currentDevice(-1) { AXIS orientation[3]; // Some tablets don't support tilt, check if it is possible, @@ -230,13 +227,13 @@ QWindowsTabletSupport::~QWindowsTabletSupport() QWindowsTabletSupport *QWindowsTabletSupport::create() { if (!m_winTab32DLL.init()) - return 0; + return nullptr; const HWND window = QWindowsContext::instance()->createDummyWindow(QStringLiteral("TabletDummyWindow"), L"TabletDummyWindow", qWindowsTabletSupportWndProc); if (!window) { qCWarning(lcQpaTablet) << __FUNCTION__ << "Unable to create window for tablet."; - return 0; + return nullptr; } LOGCONTEXT lcMine; // build our context from the default context @@ -255,7 +252,7 @@ QWindowsTabletSupport *QWindowsTabletSupport::create() if (!context) { qCDebug(lcQpaTablet) << __FUNCTION__ << "Unable to open tablet."; DestroyWindow(window); - return 0; + return nullptr; } // Set the size of the Packet Queue to the correct size @@ -266,7 +263,7 @@ QWindowsTabletSupport *QWindowsTabletSupport::create() qWarning("Unable to set queue size on tablet. The tablet will not work."); QWindowsTabletSupport::m_winTab32DLL.wTClose(context); DestroyWindow(window); - return 0; + return nullptr; } // cannot restore old size } // cannot set } // mismatch @@ -285,7 +282,7 @@ unsigned QWindowsTabletSupport::options() const QString QWindowsTabletSupport::description() const { - const unsigned size = m_winTab32DLL.wTInfo(WTI_INTERFACE, IFC_WINTABID, 0); + const unsigned size = m_winTab32DLL.wTInfo(WTI_INTERFACE, IFC_WINTABID, nullptr); if (!size) return QString(); QVarLengthArray<TCHAR> winTabId(size + 1); diff --git a/src/plugins/platforms/windows/qwindowstabletsupport.h b/src/plugins/platforms/windows/qwindowstabletsupport.h index 340818c3f7..d98dbd4de7 100644 --- a/src/plugins/platforms/windows/qwindowstabletsupport.h +++ b/src/plugins/platforms/windows/qwindowstabletsupport.h @@ -43,8 +43,8 @@ #include "qtwindowsglobal.h" #include <QtGui/qtguiglobal.h> -#include <QtCore/QVector> -#include <QtCore/QPointF> +#include <QtCore/qvector.h> +#include <QtCore/qpoint.h> #include <wintab.h> @@ -83,22 +83,23 @@ struct QWindowsWinTab32DLL struct QWindowsTabletDeviceData { - QWindowsTabletDeviceData() : minPressure(0), maxPressure(0), minTanPressure(0), - maxTanPressure(0), minX(0), maxX(0), minY(0), maxY(0), minZ(0), maxZ(0), - uniqueId(0), currentDevice(0), currentPointerType(0) {} - QPointF scaleCoordinates(int coordX, int coordY,const QRect &targetArea) const; qreal scalePressure(qreal p) const { return p / qreal(maxPressure - minPressure); } qreal scaleTangentialPressure(qreal p) const { return p / qreal(maxTanPressure - minTanPressure); } - int minPressure; - int maxPressure; - int minTanPressure; - int maxTanPressure; - int minX, maxX, minY, maxY, minZ, maxZ; - qint64 uniqueId; - int currentDevice; - int currentPointerType; + int minPressure = 0; + int maxPressure = 0; + int minTanPressure = 0; + int maxTanPressure = 0; + int minX = 0; + int maxX = 0; + int minY = 0; + int maxY = 0; + int minZ = 0; + int maxZ = 0; + qint64 uniqueId = 0; + int currentDevice = 0; + int currentPointerType = 0; }; #ifndef QT_NO_DEBUG_STREAM @@ -145,10 +146,10 @@ private: static QWindowsWinTab32DLL m_winTab32DLL; const HWND m_window; const HCTX m_context; - int m_absoluteRange; - bool m_tiltSupport; + int m_absoluteRange = 20; + bool m_tiltSupport = false; QVector<QWindowsTabletDeviceData> m_devices; - int m_currentDevice; + int m_currentDevice = -1; QPointF m_oldGlobalPosF; Mode m_mode = PenMode; State m_state = PenUp; diff --git a/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp index 651c661d6b..9d2d4c28e0 100644 --- a/src/plugins/platforms/windows/qwindowstheme.cpp +++ b/src/plugins/platforms/windows/qwindowstheme.cpp @@ -59,20 +59,20 @@ #endif #include <shellapi.h> -#include <QtCore/QVariant> -#include <QtCore/QCoreApplication> -#include <QtCore/QDebug> -#include <QtCore/QTextStream> -#include <QtCore/QSysInfo> -#include <QtCore/QCache> -#include <QtCore/QThread> -#include <QtCore/QMutex> -#include <QtCore/QWaitCondition> -#include <QtGui/QColor> -#include <QtGui/QPalette> -#include <QtGui/QGuiApplication> -#include <QtGui/QPainter> -#include <QtGui/QPixmapCache> +#include <QtCore/qvariant.h> +#include <QtCore/qcoreapplication.h> +#include <QtCore/qdebug.h> +#include <QtCore/qtextstream.h> +#include <QtCore/qsysinfo.h> +#include <QtCore/qcache.h> +#include <QtCore/qthread.h> +#include <QtCore/qmutex.h> +#include <QtCore/qwaitcondition.h> +#include <QtGui/qcolor.h> +#include <QtGui/qpalette.h> +#include <QtGui/qguiapplication.h> +#include <QtGui/qpainter.h> +#include <QtGui/qpixmapcache.h> #include <qpa/qwindowsysteminterface.h> #include <QtThemeSupport/private/qabstractfileiconengine_p.h> #include <QtFontDatabaseSupport/private/qwindowsfontdatabase_p.h> diff --git a/src/plugins/platforms/windows/qwindowstheme.h b/src/plugins/platforms/windows/qwindowstheme.h index 237e8158fa..f6e60a268b 100644 --- a/src/plugins/platforms/windows/qwindowstheme.h +++ b/src/plugins/platforms/windows/qwindowstheme.h @@ -42,8 +42,8 @@ #include <qpa/qplatformtheme.h> -#include <QtCore/QSharedPointer> -#include <QtCore/QVariant> +#include <QtCore/qsharedpointer.h> +#include <QtCore/qvariant.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsthreadpoolrunner.h b/src/plugins/platforms/windows/qwindowsthreadpoolrunner.h index 5601cc9305..99705927af 100644 --- a/src/plugins/platforms/windows/qwindowsthreadpoolrunner.h +++ b/src/plugins/platforms/windows/qwindowsthreadpoolrunner.h @@ -40,10 +40,10 @@ #ifndef QWINDOWSTHREADPOOLRUNNER_H #define QWINDOWSTHREADPOOLRUNNER_H -#include <QtCore/QMutex> -#include <QtCore/QRunnable> -#include <QtCore/QThreadPool> -#include <QtCore/QWaitCondition> +#include <QtCore/qmutex.h> +#include <QtCore/qrunnable.h> +#include <QtCore/qthreadpool.h> +#include <QtCore/qwaitcondition.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsvulkaninstance.cpp b/src/plugins/platforms/windows/qwindowsvulkaninstance.cpp index d81ee8ba29..5ffb4375ce 100644 --- a/src/plugins/platforms/windows/qwindowsvulkaninstance.cpp +++ b/src/plugins/platforms/windows/qwindowsvulkaninstance.cpp @@ -44,20 +44,9 @@ QT_BEGIN_NAMESPACE QWindowsVulkanInstance::QWindowsVulkanInstance(QVulkanInstance *instance) : m_instance(instance), m_getPhysDevPresSupport(nullptr), - m_createSurface(nullptr), - m_destroySurface(nullptr) + m_createSurface(nullptr) { - if (qEnvironmentVariableIsSet("QT_VULKAN_LIB")) - m_lib.setFileName(QString::fromUtf8(qgetenv("QT_VULKAN_LIB"))); - else - m_lib.setFileName(QStringLiteral("vulkan-1")); - - if (!m_lib.load()) { - qWarning("Failed to load %s: %s", qPrintable(m_lib.fileName()), qPrintable(m_lib.errorString())); - return; - } - - init(&m_lib); + loadVulkanLibrary(QStringLiteral("vulkan-1")); } void QWindowsVulkanInstance::createOrAdoptInstance() @@ -106,14 +95,6 @@ VkSurfaceKHR QWindowsVulkanInstance::createSurface(HWND win) qWarning("Failed to find vkCreateWin32SurfaceKHR"); return surface; } - if (!m_destroySurface) { - m_destroySurface = reinterpret_cast<PFN_vkDestroySurfaceKHR>( - m_vkGetInstanceProcAddr(m_vkInst, "vkDestroySurfaceKHR")); - } - if (!m_destroySurface) { - qWarning("Failed to find vkDestroySurfaceKHR"); - return surface; - } VkWin32SurfaceCreateInfoKHR surfaceInfo; memset(&surfaceInfo, 0, sizeof(surfaceInfo)); @@ -127,10 +108,4 @@ VkSurfaceKHR QWindowsVulkanInstance::createSurface(HWND win) return surface; } -void QWindowsVulkanInstance::destroySurface(VkSurfaceKHR surface) -{ - if (m_destroySurface && surface) - m_destroySurface(m_vkInst, surface, nullptr); -} - QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsvulkaninstance.h b/src/plugins/platforms/windows/qwindowsvulkaninstance.h index ca60ab7627..40442c63d0 100644 --- a/src/plugins/platforms/windows/qwindowsvulkaninstance.h +++ b/src/plugins/platforms/windows/qwindowsvulkaninstance.h @@ -47,7 +47,7 @@ #define VK_USE_PLATFORM_WIN32_KHR #include <QtVulkanSupport/private/qbasicvulkanplatforminstance_p.h> -#include <QLibrary> +#include <QtCore/qlibrary.h> QT_BEGIN_NAMESPACE @@ -61,14 +61,11 @@ public: bool supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window) override; VkSurfaceKHR createSurface(HWND win); - void destroySurface(VkSurfaceKHR surface); private: QVulkanInstance *m_instance; - QLibrary m_lib; PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR m_getPhysDevPresSupport; PFN_vkCreateWin32SurfaceKHR m_createSurface; - PFN_vkDestroySurfaceKHR m_destroySurface; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 3909c64c53..150ab5fc04 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -62,19 +62,20 @@ # include "qwindowscursor.h" #endif -#include <QtGui/QGuiApplication> -#include <QtGui/QScreen> -#include <QtGui/QWindow> -#include <QtGui/QRegion> -#include <QtGui/QOpenGLContext> +#include <QtGui/qguiapplication.h> +#include <QtGui/qscreen.h> +#include <QtGui/qwindow.h> +#include <QtGui/qregion.h> +#include <QtGui/qopenglcontext.h> #include <private/qsystemlibrary_p.h> #include <private/qwindow_p.h> // QWINDOWSIZE_MAX #include <private/qguiapplication_p.h> #include <private/qhighdpiscaling_p.h> #include <qpa/qwindowsysteminterface.h> -#include <QtCore/QDebug> -#include <QtCore/QLibraryInfo> +#include <QtCore/qdebug.h> +#include <QtCore/qlibraryinfo.h> +#include <QtCore/qoperatingsystemversion.h> #include <dwmapi.h> @@ -422,6 +423,31 @@ static inline void updateGLWindowSettings(const QWindow *w, HWND hwnd, Qt::Windo } /*! + Calculates the dimensions of the invisible borders within the + window frames in Windows 10, using an empirical expression that + reproduces the measured values for standard DPI settings. +*/ + +static QMargins invisibleMargins(QPoint screenPoint) +{ + if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows10) { + POINT pt = {screenPoint.x(), screenPoint.y()}; + if (HMONITOR hMonitor = MonitorFromPoint(pt, MONITOR_DEFAULTTONULL)) { + if (QWindowsContext::shcoredll.isValid()) { + UINT dpiX; + UINT dpiY; + if (SUCCEEDED(QWindowsContext::shcoredll.getDpiForMonitor(hMonitor, 0, &dpiX, &dpiY))) { + const qreal sc = (dpiX - 96) / 96.0; + const int gap = 7 + qRound(5*sc) - int(sc); + return QMargins(gap, 0, gap, gap); + } + } + } + } + return QMargins(); +} + +/*! \class WindowCreationData \brief Window creation code. @@ -651,16 +677,20 @@ QWindowsWindowData const QWindowCreationContextPtr context(new QWindowCreationContext(w, data.geometry, rect, data.customMargins, style, exStyle)); QWindowsContext::instance()->setWindowCreationContext(context); + QMargins invMargins = topLevel && !(result.flags & Qt::FramelessWindowHint) && QWindowsGeometryHint::positionIncludesFrame(w) + ? invisibleMargins(QPoint(context->frameX, context->frameY)) : QMargins(); + qCDebug(lcQpaWindows).nospace() << "CreateWindowEx: " << w << " class=" << windowClassName << " title=" << title << '\n' << *this << "\nrequested: " << rect << ": " << context->frameWidth << 'x' << context->frameHeight << '+' << context->frameX << '+' << context->frameY - << " custom margins: " << context->customMargins; + << " custom margins: " << context->customMargins + << " invisible margins: " << invMargins; result.hwnd = CreateWindowEx(exStyle, classNameUtf16, titleUtf16, style, - context->frameX, context->frameY, + context->frameX - invMargins.left(), context->frameY - invMargins.top(), context->frameWidth, context->frameHeight, parentHandle, NULL, appinst, NULL); qCDebug(lcQpaWindows).nospace() @@ -673,7 +703,7 @@ QWindowsWindowData } result.geometry = context->obtainedGeometry; - result.frame = context->margins; + result.fullFrameMargins = context->margins; result.embedded = embedded; result.customMargins = context->customMargins; @@ -887,7 +917,7 @@ QRect QWindowsBaseWindow::frameGeometry_sys() const QRect QWindowsBaseWindow::geometry_sys() const { - return frameGeometry_sys().marginsRemoved(frameMargins()); + return frameGeometry_sys().marginsRemoved(fullFrameMargins()); } QMargins QWindowsBaseWindow::frameMargins_sys() const @@ -1560,7 +1590,7 @@ QRect QWindowsWindow::normalGeometry() const const bool fakeFullScreen = m_savedFrameGeometry.isValid() && (window()->windowStates() & Qt::WindowFullScreen); const QRect frame = fakeFullScreen ? m_savedFrameGeometry : normalFrameGeometry(m_data.hwnd); - const QMargins margins = fakeFullScreen ? QWindowsGeometryHint::frame(m_savedStyle, 0) : frameMargins(); + const QMargins margins = fakeFullScreen ? QWindowsGeometryHint::frame(m_savedStyle, 0) : fullFrameMargins(); return frame.isValid() ? frame.marginsRemoved(margins) : frame; } @@ -1592,8 +1622,8 @@ void QWindowsWindow::setGeometry(const QRect &rectIn) window()->metaObject()->className(), qPrintable(window()->objectName()), m_data.geometry.width(), m_data.geometry.height(), m_data.geometry.x(), m_data.geometry.y(), - m_data.frame.left(), m_data.frame.top(), - m_data.frame.right(), m_data.frame.bottom(), + m_data.fullFrameMargins.left(), m_data.fullFrameMargins.top(), + m_data.fullFrameMargins.right(), m_data.fullFrameMargins.bottom(), m_data.customMargins.left(), m_data.customMargins.top(), m_data.customMargins.right(), m_data.customMargins.bottom(), window()->minimumWidth(), window()->minimumHeight(), @@ -1685,7 +1715,7 @@ void QWindowsWindow::handleGeometryChange() void QWindowsBaseWindow::setGeometry_sys(const QRect &rect) const { - const QMargins margins = frameMargins(); + const QMargins margins = fullFrameMargins(); const QRect frameGeometry = rect + margins; qCDebug(lcQpaWindows) << '>' << __FUNCTION__ << window() @@ -1856,7 +1886,8 @@ void QWindowsWindow::handleWindowStateChange(Qt::WindowStates state) fireExpose(QRegion(0, 0, w->width(), w->height())); exposeEventsSent = true; } - foreach (QWindow *child, QGuiApplication::allWindows()) { + const QWindowList allWindows = QGuiApplication::allWindows(); + for (QWindow *child : allWindows) { if (child != w && child->isVisible() && child->transientParent() == w) { QWindowsWindow *platformWindow = QWindowsWindow::windowsWindowOf(child); if (platformWindow && platformWindow->isLayered()) { @@ -2048,7 +2079,7 @@ void QWindowsWindow::setExStyle(unsigned s) const SetWindowLongPtr(m_data.hwnd, GWL_EXSTYLE, s); } -void QWindowsWindow::windowEvent(QEvent *event) +bool QWindowsWindow::windowEvent(QEvent *event) { switch (event->type()) { case QEvent::WindowBlocked: // Blocked by another modal window. @@ -2064,6 +2095,8 @@ void QWindowsWindow::windowEvent(QEvent *event) default: break; } + + return QPlatformWindow::windowEvent(event); } void QWindowsWindow::propagateSizeHints() @@ -2104,21 +2137,29 @@ bool QWindowsWindow::handleGeometryChangingMessage(MSG *message, const QWindow * bool QWindowsWindow::handleGeometryChanging(MSG *message) const { - const QMargins margins = window()->isTopLevel() ? frameMargins() : QMargins(); + const QMargins margins = window()->isTopLevel() ? fullFrameMargins() : QMargins(); return QWindowsWindow::handleGeometryChangingMessage(message, window(), margins); } -void QWindowsWindow::setFrameMargins(const QMargins &newMargins) +void QWindowsWindow::setFullFrameMargins(const QMargins &newMargins) { - if (m_data.frame != newMargins) { - qCDebug(lcQpaWindows) << __FUNCTION__ << window() << m_data.frame << "->" << newMargins; - m_data.frame = newMargins; + if (m_data.fullFrameMargins != newMargins) { + qCDebug(lcQpaWindows) << __FUNCTION__ << window() << m_data.fullFrameMargins << "->" << newMargins; + m_data.fullFrameMargins = newMargins; } } QMargins QWindowsWindow::frameMargins() const { - return m_data.frame; + QMargins result = fullFrameMargins(); + if (isTopLevel() && !(m_data.flags & Qt::FramelessWindowHint)) + result -= invisibleMargins(geometry().topLeft()); + return result; +} + +QMargins QWindowsWindow::fullFrameMargins() const +{ + return m_data.fullFrameMargins; } void QWindowsWindow::setOpacity(qreal level) @@ -2172,7 +2213,7 @@ void QWindowsWindow::setMask(const QRegion ®ion) // Mask is in client area coordinates, so offset it in case we have a frame if (window()->isTopLevel()) { - const QMargins margins = frameMargins(); + const QMargins margins = fullFrameMargins(); OffsetRgn(winRegion, margins.left(), margins.top()); } diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index 6d439bce1a..5ff25eb474 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -41,7 +41,7 @@ #define QWINDOWSWINDOW_H #include <QtCore/qt_windows.h> -#include <QtCore/QPointer> +#include <QtCore/qpointer.h> #include "qwindowscursor.h" #include <qpa/qplatformwindow.h> @@ -108,8 +108,8 @@ struct QWindowsWindowData { Qt::WindowFlags flags; QRect geometry; - QMargins frame; // Do not use directly for windows, see FrameDirty. - QMargins customMargins; // User-defined, additional frame for NCCALCSIZE + QMargins fullFrameMargins; // Do not use directly for windows, see FrameDirty. + QMargins customMargins; // User-defined, additional frame for NCCALCSIZE HWND hwnd = 0; bool embedded = false; @@ -125,9 +125,10 @@ public: WId winId() const override { return WId(handle()); } QRect geometry() const override { return geometry_sys(); } - QMargins frameMargins() const override { return frameMargins_sys(); } + QMargins frameMargins() const override { return fullFrameMargins(); } QPoint mapToGlobal(const QPoint &pos) const override; QPoint mapFromGlobal(const QPoint &pos) const override; + virtual QMargins fullFrameMargins() const { return frameMargins_sys(); } using QPlatformWindow::screenForGeometry; @@ -251,13 +252,14 @@ public: void raise() override { raise_sys(); } void lower() override { lower_sys(); } - void windowEvent(QEvent *event) override; + bool windowEvent(QEvent *event) override; void propagateSizeHints() override; static bool handleGeometryChangingMessage(MSG *message, const QWindow *qWindow, const QMargins &marginsDp); bool handleGeometryChanging(MSG *message) const; QMargins frameMargins() const override; - void setFrameMargins(const QMargins &newMargins); + QMargins fullFrameMargins() const override; + void setFullFrameMargins(const QMargins &newMargins); void setOpacity(qreal level) override; void setMask(const QRegion ®ion) override; diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.cpp index 907883bf5b..0ae60ad220 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.cpp @@ -37,16 +37,16 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiaaccessibility.h" #include "qwindowsuiamainprovider.h" #include "qwindowsuiautils.h" -#include <QtGui/QAccessible> -#include <QtGui/QWindow> -#include <QtGui/QGuiApplication> +#include <QtGui/qaccessible.h> +#include <QtGui/qwindow.h> +#include <QtGui/qguiapplication.h> #include <QtGui/private/qguiapplication_p.h> #include <QtCore/qt_windows.h> #include <qpa/qplatformintegration.h> @@ -107,19 +107,15 @@ void QWindowsUiaAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event return; switch (event->type()) { - case QAccessible::Focus: QWindowsUiaMainProvider::notifyFocusChange(event); break; - case QAccessible::StateChanged: QWindowsUiaMainProvider::notifyStateChange(static_cast<QAccessibleStateChangeEvent *>(event)); break; - case QAccessible::ValueChanged: QWindowsUiaMainProvider::notifyValueChange(static_cast<QAccessibleValueChangeEvent *>(event)); break; - case QAccessible::TextAttributeChanged: case QAccessible::TextColumnChanged: case QAccessible::TextInserted: @@ -129,7 +125,6 @@ void QWindowsUiaAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event case QAccessible::TextCaretMoved: QWindowsUiaMainProvider::notifyTextChange(event); break; - default: break; } @@ -137,4 +132,4 @@ void QWindowsUiaAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.h index bbb81d596b..48b4f9fa6a 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiaaccessibility.h @@ -40,15 +40,15 @@ #ifndef QWINDOWSUIAACCESSIBILITY_H #define QWINDOWSUIAACCESSIBILITY_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowscontext.h" #include <qpa/qplatformaccessibility.h> QT_BEGIN_NAMESPACE -// Windows plataform accessibility implemented over UI Automation. +// Windows platform accessibility implemented over UI Automation. class QWindowsUiaAccessibility : public QPlatformAccessibility { public: @@ -60,6 +60,6 @@ public: QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIAACCESSIBILITY_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiabaseprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiabaseprovider.cpp index 1e1fc49c0f..53c647512a 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiabaseprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiabaseprovider.cpp @@ -37,17 +37,15 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> +#include <QtGui/qaccessible.h> +#include <QtCore/qstring.h> QT_BEGIN_NAMESPACE @@ -78,4 +76,4 @@ QAccessible::Id QWindowsUiaBaseProvider::id() const QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiabaseprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiabaseprovider.h index 3ae403e8c5..9caa7d6898 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiabaseprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiabaseprovider.h @@ -40,12 +40,11 @@ #ifndef QWINDOWSUIABASEPROVIDER_H #define QWINDOWSUIABASEPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QPointer> +#include <QtGui/qaccessible.h> +#include <QtCore/qpointer.h> #include <qwindowscombase.h> #include <QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h> @@ -53,7 +52,6 @@ QT_BEGIN_NAMESPACE class QAccessibleInterface; -class QDebug; // Base class for UI Automation providers. class QWindowsUiaBaseProvider : public QObject @@ -73,6 +71,6 @@ private: QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIABASEPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiagriditemprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiagriditemprovider.cpp index e0502c00f3..93d360c40b 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiagriditemprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiagriditemprovider.cpp @@ -37,18 +37,17 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiagriditemprovider.h" #include "qwindowsuiamainprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> +#include <QtGui/qaccessible.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qstring.h> QT_BEGIN_NAMESPACE @@ -148,7 +147,7 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaGridItemProvider::get_ColumnSpan(int *pRetV return S_OK; } -// Returns the provider for the cointaining table/tree. +// Returns the provider for the containing table/tree. HRESULT STDMETHODCALLTYPE QWindowsUiaGridItemProvider::get_ContainingGrid(IRawElementProviderSimple **pRetVal) { qCDebug(lcQpaUiAutomation) << __FUNCTION__; @@ -173,4 +172,4 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaGridItemProvider::get_ContainingGrid(IRawEl QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiagriditemprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiagriditemprovider.h index a93b50ef97..3d17056d38 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiagriditemprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiagriditemprovider.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSUIAGRIDITEMPROVIDER_H #define QWINDOWSUIAGRIDITEMPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" @@ -57,15 +57,15 @@ public: virtual ~QWindowsUiaGridItemProvider(); // IGridItemProvider - HRESULT STDMETHODCALLTYPE get_Row(int *pRetVal); - HRESULT STDMETHODCALLTYPE get_Column(int *pRetVal); - HRESULT STDMETHODCALLTYPE get_RowSpan(int *pRetVal); - HRESULT STDMETHODCALLTYPE get_ColumnSpan(int *pRetVal); - HRESULT STDMETHODCALLTYPE get_ContainingGrid(IRawElementProviderSimple **pRetVal); + HRESULT STDMETHODCALLTYPE get_Row(int *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_Column(int *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_RowSpan(int *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_ColumnSpan(int *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_ContainingGrid(IRawElementProviderSimple **pRetVal) override; }; QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIAGRIDITEMPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiagridprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiagridprovider.cpp index 65c2df703b..cce9d8143c 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiagridprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiagridprovider.cpp @@ -37,18 +37,17 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiagridprovider.h" #include "qwindowsuiamainprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> +#include <QtGui/qaccessible.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qstring.h> QT_BEGIN_NAMESPACE @@ -133,4 +132,4 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaGridProvider::get_ColumnCount(int *pRetVal) QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiagridprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiagridprovider.h index 15521f98b3..b96fc1a93c 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiagridprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiagridprovider.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSUIAGRIDPROVIDER_H #define QWINDOWSUIAGRIDPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" @@ -57,13 +57,13 @@ public: virtual ~QWindowsUiaGridProvider(); // IGridProvider - HRESULT STDMETHODCALLTYPE GetItem(int row, int column, IRawElementProviderSimple **pRetVal); - HRESULT STDMETHODCALLTYPE get_RowCount(int *pRetVal); - HRESULT STDMETHODCALLTYPE get_ColumnCount(int *pRetVal); + HRESULT STDMETHODCALLTYPE GetItem(int row, int column, IRawElementProviderSimple **pRetVal) override; + HRESULT STDMETHODCALLTYPE get_RowCount(int *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_ColumnCount(int *pRetVal) override; }; QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIAGRIDPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiainvokeprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiainvokeprovider.cpp index 2af883c4f6..d09770bc81 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiainvokeprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiainvokeprovider.cpp @@ -37,17 +37,16 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiainvokeprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> +#include <QtGui/qaccessible.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qstring.h> QT_BEGIN_NAMESPACE @@ -81,4 +80,4 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaInvokeProvider::Invoke() QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiainvokeprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiainvokeprovider.h index 2b8a646983..5fb509c5f3 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiainvokeprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiainvokeprovider.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSUIAINVOKEPROVIDER_H #define QWINDOWSUIAINVOKEPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" @@ -57,11 +57,11 @@ public: virtual ~QWindowsUiaInvokeProvider(); // IInvokeProvider - HRESULT STDMETHODCALLTYPE Invoke(); + HRESULT STDMETHODCALLTYPE Invoke() override; }; QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIAINVOKEPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp index 46f73f81a0..de06077890 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp @@ -37,8 +37,8 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiamainprovider.h" #include "qwindowsuiavalueprovider.h" @@ -57,10 +57,10 @@ #include "qwindowsuiautils.h" #include "qwindowsuiaprovidercache.h" -#include <QtCore/QDebug> -#include <QtGui/QAccessible> -#include <QtGui/QGuiApplication> -#include <QtGui/QWindow> +#include <QtCore/qloggingcategory.h> +#include <QtGui/qaccessible.h> +#include <QtGui/qguiapplication.h> +#include <QtGui/qwindow.h> #if !defined(Q_CC_BOR) && !defined (Q_CC_GNU) #include <comdef.h> @@ -391,9 +391,8 @@ HRESULT QWindowsUiaMainProvider::GetPropertyValue(PROPERTYID idProp, VARIANT *pR break; case UIA_NamePropertyId: { QString name = accessible->text(QAccessible::Name); - if (name.isEmpty() && clientTopLevel) { + if (name.isEmpty() && clientTopLevel) name = QCoreApplication::applicationName(); - } setVariantString(name, pRetVal); break; } @@ -635,4 +634,4 @@ HRESULT QWindowsUiaMainProvider::GetFocus(IRawElementProviderFragment **pRetVal) QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.h index 893cbf7f8a..11684de721 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.h @@ -40,15 +40,15 @@ #ifndef QWINDOWSUIAMAINPROVIDER_H #define QWINDOWSUIAMAINPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" -#include <QtCore/QPointer> -#include <QtCore/QSharedPointer> +#include <QtCore/qpointer.h> +#include <QtCore/qsharedpointer.h> #include <QtCore/qt_windows.h> -#include <QtGui/QAccessible> +#include <QtGui/qaccessible.h> QT_BEGIN_NAMESPACE @@ -71,27 +71,27 @@ public: static void notifyTextChange(QAccessibleEvent *event); // IUnknown - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID id, LPVOID *iface); - ULONG STDMETHODCALLTYPE AddRef(); - ULONG STDMETHODCALLTYPE Release(); + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID id, LPVOID *iface) override; + ULONG STDMETHODCALLTYPE AddRef() override; + ULONG STDMETHODCALLTYPE Release() override; // IRawElementProviderSimple methods - HRESULT STDMETHODCALLTYPE get_ProviderOptions(ProviderOptions *pRetVal); - HRESULT STDMETHODCALLTYPE GetPatternProvider(PATTERNID idPattern, IUnknown **pRetVal); - HRESULT STDMETHODCALLTYPE GetPropertyValue(PROPERTYID idProp, VARIANT *pRetVal); - HRESULT STDMETHODCALLTYPE get_HostRawElementProvider(IRawElementProviderSimple **pRetVal); + HRESULT STDMETHODCALLTYPE get_ProviderOptions(ProviderOptions *pRetVal) override; + HRESULT STDMETHODCALLTYPE GetPatternProvider(PATTERNID idPattern, IUnknown **pRetVal) override; + HRESULT STDMETHODCALLTYPE GetPropertyValue(PROPERTYID idProp, VARIANT *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_HostRawElementProvider(IRawElementProviderSimple **pRetVal) override; // IRawElementProviderFragment methods - HRESULT STDMETHODCALLTYPE Navigate(NavigateDirection direction, IRawElementProviderFragment **pRetVal); - HRESULT STDMETHODCALLTYPE GetRuntimeId(SAFEARRAY **pRetVal); - HRESULT STDMETHODCALLTYPE get_BoundingRectangle(UiaRect *pRetVal); - HRESULT STDMETHODCALLTYPE GetEmbeddedFragmentRoots(SAFEARRAY **pRetVal); + HRESULT STDMETHODCALLTYPE Navigate(NavigateDirection direction, IRawElementProviderFragment **pRetVal) override; + HRESULT STDMETHODCALLTYPE GetRuntimeId(SAFEARRAY **pRetVal) override; + HRESULT STDMETHODCALLTYPE get_BoundingRectangle(UiaRect *pRetVal) override; + HRESULT STDMETHODCALLTYPE GetEmbeddedFragmentRoots(SAFEARRAY **pRetVal) override; HRESULT STDMETHODCALLTYPE SetFocus(); - HRESULT STDMETHODCALLTYPE get_FragmentRoot(IRawElementProviderFragmentRoot **pRetVal); + HRESULT STDMETHODCALLTYPE get_FragmentRoot(IRawElementProviderFragmentRoot **pRetVal) override; // IRawElementProviderFragmentRoot methods - HRESULT STDMETHODCALLTYPE ElementProviderFromPoint(double x, double y, IRawElementProviderFragment **pRetVal); - HRESULT STDMETHODCALLTYPE GetFocus(IRawElementProviderFragment **pRetVal); + HRESULT STDMETHODCALLTYPE ElementProviderFromPoint(double x, double y, IRawElementProviderFragment **pRetVal) override; + HRESULT STDMETHODCALLTYPE GetFocus(IRawElementProviderFragment **pRetVal) override; private: QString automationIdForAccessible(const QAccessibleInterface *accessible); @@ -100,6 +100,6 @@ private: QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIAMAINPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiaprovidercache.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiaprovidercache.cpp index 9f0a1e126f..c55e827a46 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiaprovidercache.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiaprovidercache.cpp @@ -37,15 +37,13 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiaprovidercache.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtCore/QDebug> - QT_BEGIN_NAMESPACE using namespace QWindowsUiAutomation; @@ -66,7 +64,7 @@ QWindowsUiaProviderCache *QWindowsUiaProviderCache::instance() // Returns the provider instance associated with the ID, or nullptr. QWindowsUiaBaseProvider *QWindowsUiaProviderCache::providerForId(QAccessible::Id id) const { - return providerTable.value(id); + return m_providerTable.value(id); } // Inserts a provider in the cache and associates it with an accessibility ID. @@ -74,8 +72,8 @@ void QWindowsUiaProviderCache::insert(QAccessible::Id id, QWindowsUiaBaseProvide { remove(id); if (provider) { - providerTable[id] = provider; - inverseTable[provider] = id; + m_providerTable[id] = provider; + m_inverseTable[provider] = id; // Connects the destroyed signal to our slot, to remove deleted objects from the cache. QObject::connect(provider, &QObject::destroyed, this, &QWindowsUiaProviderCache::objectDestroyed); } @@ -87,20 +85,20 @@ void QWindowsUiaProviderCache::objectDestroyed(QObject *obj) // We have to use the inverse table to map the object address back to its ID, // since at this point (called from QObject destructor), it has already been // partially destroyed and we cannot treat it as a provider. - auto it = inverseTable.find(obj); - if (it != inverseTable.end()) { - providerTable.remove(*it); - inverseTable.remove(obj); + auto it = m_inverseTable.find(obj); + if (it != m_inverseTable.end()) { + m_providerTable.remove(*it); + m_inverseTable.remove(obj); } } // Removes a provider with a given id from the cache. void QWindowsUiaProviderCache::remove(QAccessible::Id id) { - inverseTable.remove(providerTable.value(id)); - providerTable.remove(id); + m_inverseTable.remove(m_providerTable.value(id)); + m_providerTable.remove(id); } QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiaprovidercache.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiaprovidercache.h index 7ad30ac39c..f66dc2c170 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiaprovidercache.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiaprovidercache.h @@ -40,14 +40,13 @@ #ifndef QWINDOWSUIAPROVIDERCACHE_H #define QWINDOWSUIAPROVIDERCACHE_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" -#include <QtCore/QHash> -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> +#include <QtCore/qhash.h> +#include <QtGui/qaccessible.h> QT_BEGIN_NAMESPACE @@ -66,12 +65,12 @@ private Q_SLOTS: void objectDestroyed(QObject *obj); private: - QHash<QAccessible::Id, QWindowsUiaBaseProvider *> providerTable; - QHash<QObject *, QAccessible::Id> inverseTable; + QHash<QAccessible::Id, QWindowsUiaBaseProvider *> m_providerTable; + QHash<QObject *, QAccessible::Id> m_inverseTable; }; QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIAPROVIDERCACHE_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiarangevalueprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiarangevalueprovider.cpp index 0cd09c3f0a..7c1827387a 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiarangevalueprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiarangevalueprovider.cpp @@ -37,17 +37,16 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiarangevalueprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> +#include <QtGui/qaccessible.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qstring.h> QT_BEGIN_NAMESPACE @@ -187,4 +186,4 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaRangeValueProvider::get_SmallChange(double QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiarangevalueprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiarangevalueprovider.h index f742ef99c2..c5e0a03ee5 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiarangevalueprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiarangevalueprovider.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSUIARANGEVALUEPROVIDER_H #define QWINDOWSUIARANGEVALUEPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" @@ -57,17 +57,17 @@ public: virtual ~QWindowsUiaRangeValueProvider(); // IRangeValueProvider - HRESULT STDMETHODCALLTYPE SetValue(double val); - HRESULT STDMETHODCALLTYPE get_Value(double *pRetVal); - HRESULT STDMETHODCALLTYPE get_IsReadOnly(BOOL *pRetVal); - HRESULT STDMETHODCALLTYPE get_Maximum(double *pRetVal); - HRESULT STDMETHODCALLTYPE get_Minimum(double *pRetVal); - HRESULT STDMETHODCALLTYPE get_LargeChange(double *pRetVal); - HRESULT STDMETHODCALLTYPE get_SmallChange(double *pRetVal); + HRESULT STDMETHODCALLTYPE SetValue(double val) override; + HRESULT STDMETHODCALLTYPE get_Value(double *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_IsReadOnly(BOOL *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_Maximum(double *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_Minimum(double *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_LargeChange(double *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_SmallChange(double *pRetVal) override; }; QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIARANGEVALUEPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionitemprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionitemprovider.cpp index 45216a6d1c..a93a05c7bc 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionitemprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionitemprovider.cpp @@ -37,18 +37,17 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiaselectionitemprovider.h" #include "qwindowsuiamainprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> +#include <QtGui/qaccessible.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qstring.h> QT_BEGIN_NAMESPACE @@ -198,4 +197,4 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaSelectionItemProvider::get_SelectionContain QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionitemprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionitemprovider.h index 6a9b5b1e4b..1f2605188b 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionitemprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionitemprovider.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSUIASELECTIONITEMPROVIDER_H #define QWINDOWSUIASELECTIONITEMPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" @@ -57,15 +57,15 @@ public: virtual ~QWindowsUiaSelectionItemProvider(); // ISelectionItemProvider - HRESULT STDMETHODCALLTYPE Select(); - HRESULT STDMETHODCALLTYPE AddToSelection(); - HRESULT STDMETHODCALLTYPE RemoveFromSelection(); - HRESULT STDMETHODCALLTYPE get_IsSelected(BOOL *pRetVal); - HRESULT STDMETHODCALLTYPE get_SelectionContainer(IRawElementProviderSimple **pRetVal); + HRESULT STDMETHODCALLTYPE Select() override; + HRESULT STDMETHODCALLTYPE AddToSelection() override; + HRESULT STDMETHODCALLTYPE RemoveFromSelection() override; + HRESULT STDMETHODCALLTYPE get_IsSelected(BOOL *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_SelectionContainer(IRawElementProviderSimple **pRetVal) override; }; QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIASELECTIONITEMPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionprovider.cpp index 1c06503bfc..3305e9c5c4 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionprovider.cpp @@ -37,19 +37,18 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiaselectionprovider.h" #include "qwindowsuiamainprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> -#include <QList> +#include <QtGui/qaccessible.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qstring.h> +#include <QtCore/qlist.h> QT_BEGIN_NAMESPACE @@ -144,4 +143,4 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaSelectionProvider::get_IsSelectionRequired( QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionprovider.h index 5a07a82ac8..0376d25804 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiaselectionprovider.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSUIASELECTIONPROVIDER_H #define QWINDOWSUIASELECTIONPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" @@ -57,13 +57,13 @@ public: virtual ~QWindowsUiaSelectionProvider(); // ISelectionProvider - HRESULT STDMETHODCALLTYPE GetSelection(SAFEARRAY **pRetVal); - HRESULT STDMETHODCALLTYPE get_CanSelectMultiple(BOOL *pRetVal); - HRESULT STDMETHODCALLTYPE get_IsSelectionRequired(BOOL *pRetVal); + HRESULT STDMETHODCALLTYPE GetSelection(SAFEARRAY **pRetVal) override; + HRESULT STDMETHODCALLTYPE get_CanSelectMultiple(BOOL *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_IsSelectionRequired(BOOL *pRetVal) override; }; QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIASELECTIONPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiatableitemprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiatableitemprovider.cpp index 3ea29fc86c..2a94012590 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiatableitemprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiatableitemprovider.cpp @@ -37,18 +37,17 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiatableitemprovider.h" #include "qwindowsuiamainprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> +#include <QtGui/qaccessible.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qstring.h> QT_BEGIN_NAMESPACE @@ -126,4 +125,4 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaTableItemProvider::GetColumnHeaderItems(SAF QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiatableitemprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiatableitemprovider.h index 277884c980..bf4b52ee0b 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiatableitemprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiatableitemprovider.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSUIATABLEITEMPROVIDER_H #define QWINDOWSUIATABLEITEMPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" @@ -57,12 +57,12 @@ public: virtual ~QWindowsUiaTableItemProvider(); // ITableItemProvider - HRESULT STDMETHODCALLTYPE GetRowHeaderItems(SAFEARRAY **pRetVal); - HRESULT STDMETHODCALLTYPE GetColumnHeaderItems(SAFEARRAY **pRetVal); + HRESULT STDMETHODCALLTYPE GetRowHeaderItems(SAFEARRAY **pRetVal) override; + HRESULT STDMETHODCALLTYPE GetColumnHeaderItems(SAFEARRAY **pRetVal) override; }; QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIATABLEITEMPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiatableprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiatableprovider.cpp index f79a24536b..80086f1d4f 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiatableprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiatableprovider.cpp @@ -37,18 +37,17 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiatableprovider.h" #include "qwindowsuiamainprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> +#include <QtGui/qaccessible.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qstring.h> QT_BEGIN_NAMESPACE @@ -151,4 +150,4 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaTableProvider::get_RowOrColumnMajor(enum Ro QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiatableprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiatableprovider.h index 8cd0acda03..94c8ab93a7 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiatableprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiatableprovider.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSUIATABLEPROVIDER_H #define QWINDOWSUIATABLEPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" @@ -57,13 +57,13 @@ public: virtual ~QWindowsUiaTableProvider(); // ITableProvider - HRESULT STDMETHODCALLTYPE GetRowHeaders(SAFEARRAY **pRetVal); - HRESULT STDMETHODCALLTYPE GetColumnHeaders(SAFEARRAY **pRetVal); - HRESULT STDMETHODCALLTYPE get_RowOrColumnMajor(enum RowOrColumnMajor *pRetVal); + HRESULT STDMETHODCALLTYPE GetRowHeaders(SAFEARRAY **pRetVal) override; + HRESULT STDMETHODCALLTYPE GetColumnHeaders(SAFEARRAY **pRetVal) override; + HRESULT STDMETHODCALLTYPE get_RowOrColumnMajor(enum RowOrColumnMajor *pRetVal) override; }; QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIATABLEPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiatextprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiatextprovider.cpp index e1622933af..9d1e72fb78 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiatextprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiatextprovider.cpp @@ -37,17 +37,16 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiatextprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> +#include <QtGui/qaccessible.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qstring.h> QT_BEGIN_NAMESPACE @@ -258,4 +257,4 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaTextProvider::GetCaretRange(BOOL *isActive, QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiatextprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiatextprovider.h index a6d10027fa..a9be70fa16 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiatextprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiatextprovider.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSUIATEXTPROVIDER_H #define QWINDOWSUIATEXTPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" #include "qwindowsuiatextrangeprovider.h" @@ -58,23 +58,23 @@ public: ~QWindowsUiaTextProvider(); // IUnknown overrides - HRESULT STDMETHODCALLTYPE QueryInterface(REFIID id, LPVOID *iface); + HRESULT STDMETHODCALLTYPE QueryInterface(REFIID id, LPVOID *iface) override; // ITextProvider - HRESULT STDMETHODCALLTYPE GetSelection(SAFEARRAY **pRetVal); - HRESULT STDMETHODCALLTYPE GetVisibleRanges(SAFEARRAY **pRetVal); - HRESULT STDMETHODCALLTYPE RangeFromChild(IRawElementProviderSimple *childElement, ITextRangeProvider **pRetVal); - HRESULT STDMETHODCALLTYPE RangeFromPoint(UiaPoint point, ITextRangeProvider **pRetVal); - HRESULT STDMETHODCALLTYPE get_DocumentRange(ITextRangeProvider **pRetVal); - HRESULT STDMETHODCALLTYPE get_SupportedTextSelection(SupportedTextSelection *pRetVal); + HRESULT STDMETHODCALLTYPE GetSelection(SAFEARRAY **pRetVal) override; + HRESULT STDMETHODCALLTYPE GetVisibleRanges(SAFEARRAY **pRetVal) override; + HRESULT STDMETHODCALLTYPE RangeFromChild(IRawElementProviderSimple *childElement, ITextRangeProvider **pRetVal) override; + HRESULT STDMETHODCALLTYPE RangeFromPoint(UiaPoint point, ITextRangeProvider **pRetVal) override; + HRESULT STDMETHODCALLTYPE get_DocumentRange(ITextRangeProvider **pRetVal) override; + HRESULT STDMETHODCALLTYPE get_SupportedTextSelection(SupportedTextSelection *pRetVal) override; // ITextProvider2 - HRESULT STDMETHODCALLTYPE RangeFromAnnotation(IRawElementProviderSimple *annotationElement, ITextRangeProvider **pRetVal); - HRESULT STDMETHODCALLTYPE GetCaretRange(BOOL *isActive, ITextRangeProvider **pRetVal); + HRESULT STDMETHODCALLTYPE RangeFromAnnotation(IRawElementProviderSimple *annotationElement, ITextRangeProvider **pRetVal) override; + HRESULT STDMETHODCALLTYPE GetCaretRange(BOOL *isActive, ITextRangeProvider **pRetVal) override; }; QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIATEXTPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiatextrangeprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiatextrangeprovider.cpp index dae7cbdd5f..1be186f6b3 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiatextrangeprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiatextrangeprovider.cpp @@ -37,18 +37,17 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiatextrangeprovider.h" #include "qwindowsuiamainprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> +#include <QtGui/qaccessible.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qstring.h> QT_BEGIN_NAMESPACE @@ -238,12 +237,12 @@ HRESULT QWindowsUiaTextRangeProvider::GetBoundingRectangles(SAFEARRAY **pRetVal) int endRange = qMin(end, m_endOffset); if (startRange < endRange) { // Calculates a bounding rectangle for the line and adds it to the list. - QRect startRect = textInterface->characterRect(startRange); - QRect endRect = textInterface->characterRect(endRange - 1); - QRect lineRect(qMin(startRect.x(), endRect.x()), - qMin(startRect.y(), endRect.y()), - qMax(startRect.x() + startRect.width(), endRect.x() + endRect.width()) - qMin(startRect.x(), endRect.x()), - qMax(startRect.y() + startRect.height(), endRect.y() + endRect.height()) - qMin(startRect.y(), endRect.y())); + const QRect startRect = textInterface->characterRect(startRange); + const QRect endRect = textInterface->characterRect(endRange - 1); + const QRect lineRect(qMin(startRect.x(), endRect.x()), + qMin(startRect.y(), endRect.y()), + qMax(startRect.x() + startRect.width(), endRect.x() + endRect.width()) - qMin(startRect.x(), endRect.x()), + qMax(startRect.y() + startRect.height(), endRect.y() + endRect.height()) - qMin(startRect.y(), endRect.y())); rectList.append(lineRect); } if (end >= len) break; @@ -519,9 +518,9 @@ HRESULT QWindowsUiaTextRangeProvider::Select() } // Not supported. -HRESULT QWindowsUiaTextRangeProvider::FindTextW(BSTR /* text */, BOOL /* backward */, - BOOL /* ignoreCase */, - ITextRangeProvider **pRetVal) +HRESULT QWindowsUiaTextRangeProvider::FindText(BSTR /* text */, BOOL /* backward */, + BOOL /* ignoreCase */, + ITextRangeProvider **pRetVal) { if (!pRetVal) return E_INVALIDARG; @@ -551,4 +550,4 @@ HRESULT QWindowsUiaTextRangeProvider::unselect() QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiatextrangeprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiatextrangeprovider.h index 6fe6502c41..39b9069fc0 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiatextrangeprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiatextrangeprovider.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSUIATEXTRANGEPROVIDER_H #define QWINDOWSUIATEXTRANGEPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" @@ -56,24 +56,25 @@ public: explicit QWindowsUiaTextRangeProvider(QAccessible::Id id, int startOffset, int endOffset); virtual ~QWindowsUiaTextRangeProvider(); - HRESULT STDMETHODCALLTYPE AddToSelection(); - HRESULT STDMETHODCALLTYPE Clone(ITextRangeProvider **pRetVal); - HRESULT STDMETHODCALLTYPE Compare(ITextRangeProvider *range, BOOL *pRetVal); - HRESULT STDMETHODCALLTYPE CompareEndpoints(TextPatternRangeEndpoint endpoint, ITextRangeProvider *targetRange, TextPatternRangeEndpoint targetEndpoint, int *pRetVal); - HRESULT STDMETHODCALLTYPE ExpandToEnclosingUnit(TextUnit unit); - HRESULT STDMETHODCALLTYPE FindAttribute(TEXTATTRIBUTEID attributeId, VARIANT val, BOOL backward, ITextRangeProvider **pRetVal); - HRESULT STDMETHODCALLTYPE FindText(BSTR text, BOOL backward, BOOL ignoreCase, ITextRangeProvider **pRetVal); - HRESULT STDMETHODCALLTYPE GetAttributeValue(TEXTATTRIBUTEID attributeId, VARIANT *pRetVal); - HRESULT STDMETHODCALLTYPE GetBoundingRectangles(SAFEARRAY **pRetVal); - HRESULT STDMETHODCALLTYPE GetChildren(SAFEARRAY **pRetVal); - HRESULT STDMETHODCALLTYPE GetEnclosingElement(IRawElementProviderSimple **pRetVal); - HRESULT STDMETHODCALLTYPE GetText(int maxLength, BSTR *pRetVal); - HRESULT STDMETHODCALLTYPE Move(TextUnit unit, int count, int *pRetVal); - HRESULT STDMETHODCALLTYPE MoveEndpointByRange(TextPatternRangeEndpoint endpoint, ITextRangeProvider *targetRange, TextPatternRangeEndpoint targetEndpoint); - HRESULT STDMETHODCALLTYPE MoveEndpointByUnit(TextPatternRangeEndpoint endpoint, TextUnit unit, int count, int *pRetVal); - HRESULT STDMETHODCALLTYPE RemoveFromSelection(); - HRESULT STDMETHODCALLTYPE ScrollIntoView(BOOL alignToTop); - HRESULT STDMETHODCALLTYPE Select(); + // ITextRangeProvider + HRESULT STDMETHODCALLTYPE AddToSelection() override; + HRESULT STDMETHODCALLTYPE Clone(ITextRangeProvider **pRetVal) override; + HRESULT STDMETHODCALLTYPE Compare(ITextRangeProvider *range, BOOL *pRetVal) override; + HRESULT STDMETHODCALLTYPE CompareEndpoints(TextPatternRangeEndpoint endpoint, ITextRangeProvider *targetRange, TextPatternRangeEndpoint targetEndpoint, int *pRetVal) override; + HRESULT STDMETHODCALLTYPE ExpandToEnclosingUnit(TextUnit unit) override; + HRESULT STDMETHODCALLTYPE FindAttribute(TEXTATTRIBUTEID attributeId, VARIANT val, BOOL backward, ITextRangeProvider **pRetVal) override; + HRESULT STDMETHODCALLTYPE FindText(BSTR text, BOOL backward, BOOL ignoreCase, ITextRangeProvider **pRetVal) override; + HRESULT STDMETHODCALLTYPE GetAttributeValue(TEXTATTRIBUTEID attributeId, VARIANT *pRetVal) override; + HRESULT STDMETHODCALLTYPE GetBoundingRectangles(SAFEARRAY **pRetVal) override; + HRESULT STDMETHODCALLTYPE GetChildren(SAFEARRAY **pRetVal) override; + HRESULT STDMETHODCALLTYPE GetEnclosingElement(IRawElementProviderSimple **pRetVal) override; + HRESULT STDMETHODCALLTYPE GetText(int maxLength, BSTR *pRetVal) override; + HRESULT STDMETHODCALLTYPE Move(TextUnit unit, int count, int *pRetVal) override; + HRESULT STDMETHODCALLTYPE MoveEndpointByRange(TextPatternRangeEndpoint endpoint, ITextRangeProvider *targetRange, TextPatternRangeEndpoint targetEndpoint) override; + HRESULT STDMETHODCALLTYPE MoveEndpointByUnit(TextPatternRangeEndpoint endpoint, TextUnit unit, int count, int *pRetVal) override; + HRESULT STDMETHODCALLTYPE RemoveFromSelection() override; + HRESULT STDMETHODCALLTYPE ScrollIntoView(BOOL alignToTop) override; + HRESULT STDMETHODCALLTYPE Select() override; private: HRESULT unselect(); @@ -83,6 +84,6 @@ private: QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIATEXTRANGEPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiatoggleprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiatoggleprovider.cpp index 01cdfd7e91..32445e4ffb 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiatoggleprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiatoggleprovider.cpp @@ -37,17 +37,16 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiatoggleprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> +#include <QtGui/qaccessible.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qstring.h> QT_BEGIN_NAMESPACE @@ -102,4 +101,4 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaToggleProvider::get_ToggleState(ToggleState QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiatoggleprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiatoggleprovider.h index a0df983e40..2bed6f7e36 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiatoggleprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiatoggleprovider.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSUIATOGGLEPROVIDER_H #define QWINDOWSUIATOGGLEPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" @@ -57,12 +57,12 @@ public: virtual ~QWindowsUiaToggleProvider(); // IToggleProvider - HRESULT STDMETHODCALLTYPE Toggle(); - HRESULT STDMETHODCALLTYPE get_ToggleState(ToggleState *pRetVal); + HRESULT STDMETHODCALLTYPE Toggle() override; + HRESULT STDMETHODCALLTYPE get_ToggleState(ToggleState *pRetVal) override; }; QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIATOGGLEPROVIDER_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiautils.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiautils.cpp index 89e5075dcb..96f557efd3 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiautils.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiautils.cpp @@ -37,14 +37,14 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiautils.h" #include "qwindowscontext.h" #include "qwindowswindow.h" -#include <QtGui/QWindow> +#include <QtGui/qwindow.h> #include <QtGui/private/qhighdpiscaling_p.h> #include <cmath> @@ -218,4 +218,4 @@ bool isTextUnitSeparator(TextUnit unit, const QChar &ch) QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiautils.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiautils.h index 15f4d6e8ba..6a482f6c1c 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiautils.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiautils.h @@ -40,16 +40,14 @@ #ifndef QWINDOWSUIAUTILS_H #define QWINDOWSUIAUTILS_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) -#include <QtCore/QString> +#include <QtCore/qstring.h> #include <QtCore/qt_windows.h> -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtGui/QWindow> -#include <QtCore/QDebug> -#include <QtCore/QRect> +#include <QtGui/qaccessible.h> +#include <QtGui/qwindow.h> +#include <QtCore/qrect.h> #include <QtWindowsUIAutomationSupport/private/qwindowsuiawrapper_p.h> QT_BEGIN_NAMESPACE @@ -84,6 +82,6 @@ void setVariantString(const QString &value, VARIANT *variant); QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIAUTILS_H diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiavalueprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiavalueprovider.cpp index ef7d564e22..8651bcff60 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiavalueprovider.cpp +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiavalueprovider.cpp @@ -37,17 +37,16 @@ ** ****************************************************************************/ -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiavalueprovider.h" #include "qwindowsuiautils.h" #include "qwindowscontext.h" -#include <QtGui/QAccessible> -#include <QtGui/QAccessibleInterface> -#include <QtCore/QDebug> -#include <QtCore/QString> +#include <QtGui/qaccessible.h> +#include <QtCore/qloggingcategory.h> +#include <QtCore/qstring.h> QT_BEGIN_NAMESPACE @@ -129,4 +128,4 @@ HRESULT STDMETHODCALLTYPE QWindowsUiaValueProvider::get_Value(BSTR *pRetVal) QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiavalueprovider.h b/src/plugins/platforms/windows/uiautomation/qwindowsuiavalueprovider.h index db54fc0a46..334a17e51d 100644 --- a/src/plugins/platforms/windows/uiautomation/qwindowsuiavalueprovider.h +++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiavalueprovider.h @@ -40,8 +40,8 @@ #ifndef QWINDOWSUIAVALUEPROVIDER_H #define QWINDOWSUIAVALUEPROVIDER_H -#include <QtCore/QtConfig> -#ifndef QT_NO_ACCESSIBILITY +#include <QtGui/qtguiglobal.h> +#if QT_CONFIG(accessibility) #include "qwindowsuiabaseprovider.h" @@ -58,13 +58,13 @@ public: virtual ~QWindowsUiaValueProvider(); // IValueProvider - HRESULT STDMETHODCALLTYPE SetValue(LPCWSTR val); - HRESULT STDMETHODCALLTYPE get_IsReadOnly(BOOL *pRetVal); - HRESULT STDMETHODCALLTYPE get_Value(BSTR *pRetVal); + HRESULT STDMETHODCALLTYPE SetValue(LPCWSTR val) override; + HRESULT STDMETHODCALLTYPE get_IsReadOnly(BOOL *pRetVal) override; + HRESULT STDMETHODCALLTYPE get_Value(BSTR *pRetVal) override; }; QT_END_NAMESPACE -#endif // QT_NO_ACCESSIBILITY +#endif // QT_CONFIG(accessibility) #endif // QWINDOWSUIAVALUEPROVIDER_H diff --git a/src/plugins/platforms/windows/windows.pri b/src/plugins/platforms/windows/windows.pri index f4c396f7c5..c1d4e907d9 100644 --- a/src/plugins/platforms/windows/windows.pri +++ b/src/plugins/platforms/windows/windows.pri @@ -9,7 +9,7 @@ mingw: LIBS *= -luuid # For the dialog helpers: LIBS += -lshlwapi -lshell32 -ladvapi32 -DEFINES *= QT_NO_CAST_FROM_ASCII +DEFINES *= QT_NO_CAST_FROM_ASCII QT_NO_FOREACH SOURCES += \ $$PWD/qwindowswindow.cpp \ @@ -18,6 +18,7 @@ SOURCES += \ $$PWD/qwindowsscreen.cpp \ $$PWD/qwindowskeymapper.cpp \ $$PWD/qwindowsmousehandler.cpp \ + $$PWD/qwindowspointerhandler.cpp \ $$PWD/qwindowsole.cpp \ $$PWD/qwindowsdropdataobject.cpp \ $$PWD/qwindowsmime.cpp \ @@ -40,6 +41,7 @@ HEADERS += \ $$PWD/qwindowsscreen.h \ $$PWD/qwindowskeymapper.h \ $$PWD/qwindowsmousehandler.h \ + $$PWD/qwindowspointerhandler.h \ $$PWD/qtwindowsglobal.h \ $$PWD/qwindowsole.h \ $$PWD/qwindowsdropdataobject.h \ |