summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/windows
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-12-13 09:36:26 +0100
committerLiang Qi <liang.qi@qt.io>2016-12-13 09:39:20 +0100
commit6755ec891a1740110c48895afd53d39e8370704a (patch)
tree982606f3bc582262e4b315a63f55ccb141fff97b /src/plugins/platforms/windows
parent449204f8c0d6679ae0e58dbb8a30b8a86fbdb4ec (diff)
parent00c9ec63a552d040e851b561c11428fabf1a2b08 (diff)
Merge remote-tracking branch 'origin/5.8' into dev
Conflicts: configure qmake/Makefile.unix.macos qmake/Makefile.unix.win32 qmake/generators/win32/msvc_vcproj.cpp src/3rdparty/pcre/qt_attribution.json src/corelib/io/qsettings.cpp src/corelib/kernel/qdeadlinetimer.cpp src/platformsupport/kmsconvenience/qkmsdevice.cpp src/platformsupport/kmsconvenience/qkmsdevice_p.h src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldeviceintegration.cpp src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_egldevice/qeglfskmsegldevicescreen.cpp src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsdevice.cpp src/plugins/platforms/eglfs/deviceintegration/eglfs_kms_support/qeglfskmsscreen.h tests/manual/qstorageinfo/printvolumes.cpp tools/configure/configureapp.cpp Change-Id: Ibaabcc8e965c44926f9fb018466e8b132b8df49e
Diffstat (limited to 'src/plugins/platforms/windows')
-rw-r--r--src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp2
-rw-r--r--src/plugins/platforms/windows/qwin10helpers.cpp167
-rw-r--r--src/plugins/platforms/windows/qwin10helpers.h52
-rw-r--r--src/plugins/platforms/windows/qwindowsclipboard.h2
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp7
-rw-r--r--src/plugins/platforms/windows/qwindowskeymapper.cpp3
-rw-r--r--src/plugins/platforms/windows/windows.pri4
7 files changed, 235 insertions, 2 deletions
diff --git a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp
index 06d481b3af..25b1577772 100644
--- a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp
+++ b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp
@@ -890,7 +890,7 @@ HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::get_accName(VARIANT varID, BST
QString shortcut = accessible->text(QAccessible::Accelerator);
if (!shortcut.isEmpty())
- name.append(QLatin1Char(' ') + shortcut);
+ name += QLatin1Char(' ') + shortcut;
if (name.size()) {
*pszName = QStringToBSTR(name);
diff --git a/src/plugins/platforms/windows/qwin10helpers.cpp b/src/plugins/platforms/windows/qwin10helpers.cpp
new file mode 100644
index 0000000000..3ded96b9d6
--- /dev/null
+++ b/src/plugins/platforms/windows/qwin10helpers.cpp
@@ -0,0 +1,167 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 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$
+**
+****************************************************************************/
+
+#include "qwin10helpers.h"
+
+#include <QtCore/QDebug>
+#include <QtCore/private/qsystemlibrary_p.h>
+
+#if defined(Q_CC_MINGW)
+# define HAS_UI_VIEW_SETTINGS_INTEROP
+#elif !defined(Q_CC_MSVC) || _MSC_VER >= 1900 // MSVC2013 is lacking both
+# define HAS_UI_VIEW_SETTINGS_INTEROP
+# define HAS_UI_VIEW_SETTINGS
+#endif
+
+#include <inspectable.h>
+
+#ifdef HAS_UI_VIEW_SETTINGS
+# include <windows.ui.viewmanagement.h>
+#endif
+
+#ifdef HAS_UI_VIEW_SETTINGS_INTEROP
+# include <UIViewSettingsInterop.h>
+#endif
+
+#ifndef HAS_UI_VIEW_SETTINGS_INTEROP
+MIDL_INTERFACE("3694dbf9-8f68-44be-8ff5-195c98ede8a6")
+IUIViewSettingsInterop : public IInspectable
+{
+public:
+ virtual HRESULT STDMETHODCALLTYPE GetForWindow(
+ __RPC__in HWND hwnd,
+ __RPC__in REFIID riid,
+ __RPC__deref_out_opt void **ppv) = 0;
+};
+#endif // !HAS_UI_VIEW_SETTINGS_INTEROP
+
+#ifndef HAS_UI_VIEW_SETTINGS
+namespace ABI {
+namespace Windows {
+namespace UI {
+namespace ViewManagement {
+
+enum UserInteractionMode { Mouse, Touch };
+
+MIDL_INTERFACE("C63657F6-8850-470D-88F8-455E16EA2C26")
+IUIViewSettings : public IInspectable
+{
+public:
+ virtual HRESULT STDMETHODCALLTYPE get_UserInteractionMode(UserInteractionMode *value) = 0;
+};
+
+} // namespace ViewManagement
+} // namespace UI
+} // namespace Windows
+} // namespace ABI
+#endif // HAS_UI_VIEW_SETTINGS
+
+QT_BEGIN_NAMESPACE
+
+// Starting from Windows 10
+struct QWindowsComBaseDLL
+{
+ bool init();
+ bool isValid() const
+ {
+ return roGetActivationFactory != nullptr && windowsCreateStringReference != nullptr;
+ }
+
+ typedef HRESULT (WINAPI *RoGetActivationFactory)(HSTRING, REFIID, void **);
+ typedef HRESULT (WINAPI *WindowsCreateStringReference)(PCWSTR, UINT32, HSTRING_HEADER *, HSTRING *);
+
+ RoGetActivationFactory roGetActivationFactory = nullptr;
+ WindowsCreateStringReference windowsCreateStringReference = nullptr;
+};
+
+static QWindowsComBaseDLL baseComDll;
+
+bool QWindowsComBaseDLL::init()
+{
+ if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS10 && !isValid()) {
+ QSystemLibrary library(QStringLiteral("combase"));
+ roGetActivationFactory =
+ reinterpret_cast<RoGetActivationFactory>(library.resolve("RoGetActivationFactory"));
+ windowsCreateStringReference =
+ reinterpret_cast<WindowsCreateStringReference>(library.resolve("WindowsCreateStringReference"));
+ }
+ return isValid();
+}
+
+// Return tablet mode, note: Does not work for GetDesktopWindow().
+bool qt_windowsIsTabletMode(HWND hwnd)
+{
+ bool result = false;
+
+ if (!baseComDll.init())
+ return false;
+
+ const wchar_t uiViewSettingsId[] = L"Windows.UI.ViewManagement.UIViewSettings";
+ HSTRING_HEADER uiViewSettingsIdRefHeader;
+ HSTRING uiViewSettingsIdHs = nullptr;
+ const UINT32 uiViewSettingsIdLen = UINT32(sizeof(uiViewSettingsId) / sizeof(uiViewSettingsId[0]) - 1);
+ if (FAILED(baseComDll.windowsCreateStringReference(uiViewSettingsId, uiViewSettingsIdLen, &uiViewSettingsIdRefHeader, &uiViewSettingsIdHs)))
+ return false;
+
+ IUIViewSettingsInterop *uiViewSettingsInterop = nullptr;
+ // __uuidof(IUIViewSettingsInterop);
+ const GUID uiViewSettingsInteropRefId = {0x3694dbf9, 0x8f68, 0x44be,{0x8f, 0xf5, 0x19, 0x5c, 0x98, 0xed, 0xe8, 0xa6}};
+
+ HRESULT hr = baseComDll.roGetActivationFactory(uiViewSettingsIdHs, uiViewSettingsInteropRefId,
+ reinterpret_cast<void **>(&uiViewSettingsInterop));
+ if (FAILED(hr))
+ return false;
+
+ // __uuidof(ABI::Windows::UI::ViewManagement::IUIViewSettings);
+ const GUID uiViewSettingsRefId = {0xc63657f6, 0x8850, 0x470d,{0x88, 0xf8, 0x45, 0x5e, 0x16, 0xea, 0x2c, 0x26}};
+ ABI::Windows::UI::ViewManagement::IUIViewSettings *viewSettings = nullptr;
+ hr = uiViewSettingsInterop->GetForWindow(hwnd, uiViewSettingsRefId,
+ reinterpret_cast<void **>(&viewSettings));
+ if (SUCCEEDED(hr)) {
+ ABI::Windows::UI::ViewManagement::UserInteractionMode currentMode;
+ hr = viewSettings->get_UserInteractionMode(&currentMode);
+ if (SUCCEEDED(hr))
+ result = currentMode == 1; // Touch, 1
+ viewSettings->Release();
+ }
+ uiViewSettingsInterop->Release();
+ return result;
+}
+
+QT_END_NAMESPACE
diff --git a/src/plugins/platforms/windows/qwin10helpers.h b/src/plugins/platforms/windows/qwin10helpers.h
new file mode 100644
index 0000000000..e1485003dd
--- /dev/null
+++ b/src/plugins/platforms/windows/qwin10helpers.h
@@ -0,0 +1,52 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 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 QWIN10HELPERS_H
+#define QWIN10HELPERS_H
+
+#include <QtCore/QtGlobal>
+#include <QtCore/qt_windows.h>
+
+QT_BEGIN_NAMESPACE
+
+bool qt_windowsIsTabletMode(HWND hwnd);
+
+QT_END_NAMESPACE
+
+#endif // QWIN10HELPERS_H
diff --git a/src/plugins/platforms/windows/qwindowsclipboard.h b/src/plugins/platforms/windows/qwindowsclipboard.h
index 92a27990fc..4f3e7437f6 100644
--- a/src/plugins/platforms/windows/qwindowsclipboard.h
+++ b/src/plugins/platforms/windows/qwindowsclipboard.h
@@ -73,6 +73,8 @@ public:
static QWindowsClipboard *instance() { return m_instance; }
+ HWND clipboardViewer() const { return m_clipboardViewer; }
+
private:
void clear();
void releaseIData();
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index 168bbd1f49..2f88989b3c 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -41,6 +41,7 @@
#include "qwindowsintegration.h"
#include "qwindowswindow.h"
#include "qwindowscontext.h"
+#include "qwin10helpers.h"
#include "qwindowsopenglcontext.h"
#include "qwindowsscreen.h"
@@ -508,6 +509,12 @@ QVariant QWindowsIntegration::styleHint(QPlatformIntegration::StyleHint hint) co
case KeyboardAutoRepeatRate:
return QVariant(keyBoardAutoRepeatRateMS());
#endif
+ case QPlatformIntegration::ShowIsMaximized:
+#ifndef QT_NO_CLIPBOARD
+ return qt_windowsIsTabletMode(d->m_clipboard.clipboardViewer());
+#else
+ break;
+#endif
case QPlatformIntegration::StartDragTime:
case QPlatformIntegration::StartDragDistance:
case QPlatformIntegration::KeyboardInputInterval:
diff --git a/src/plugins/platforms/windows/qwindowskeymapper.cpp b/src/plugins/platforms/windows/qwindowskeymapper.cpp
index 1ff447b0c0..6375f89531 100644
--- a/src/plugins/platforms/windows/qwindowskeymapper.cpp
+++ b/src/plugins/platforms/windows/qwindowskeymapper.cpp
@@ -835,6 +835,9 @@ bool QWindowsKeyMapper::translateKeyEvent(QWindow *widget, HWND hwnd,
bool QWindowsKeyMapper::translateMultimediaKeyEventInternal(QWindow *window, const MSG &msg)
{
#if defined(WM_APPCOMMAND)
+ // QTBUG-57198, do not send mouse-synthesized commands as key events in addition
+ if (GET_DEVICE_LPARAM(msg.lParam) == FAPPCOMMAND_MOUSE)
+ return false;
const int cmd = GET_APPCOMMAND_LPARAM(msg.lParam);
const int dwKeys = GET_KEYSTATE_LPARAM(msg.lParam);
int state = 0;
diff --git a/src/plugins/platforms/windows/windows.pri b/src/plugins/platforms/windows/windows.pri
index 5071cd8e21..7d3ecc8aa2 100644
--- a/src/plugins/platforms/windows/windows.pri
+++ b/src/plugins/platforms/windows/windows.pri
@@ -25,7 +25,8 @@ SOURCES += \
$$PWD/qwindowsdialoghelpers.cpp \
$$PWD/qwindowsservices.cpp \
$$PWD/qwindowsnativeinterface.cpp \
- $$PWD/qwindowsopengltester.cpp
+ $$PWD/qwindowsopengltester.cpp \
+ $$PWD/qwin10helpers.cpp
HEADERS += \
$$PWD/qwindowswindow.h \
@@ -46,6 +47,7 @@ HEADERS += \
$$PWD/qwindowsnativeinterface.h \
$$PWD/qwindowsopengltester.h \
$$PWD/qwindowsthreadpoolrunner.h
+ $$PWD/qwin10helpers.h
INCLUDEPATH += $$PWD