summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndre de la Rocha <andre.rocha@qt.io>2020-03-31 07:41:45 +0200
committerAndre de la Rocha <andre.rocha@qt.io>2020-04-10 01:52:35 +0200
commit4c4693cf964e9d7370c27a26e1d263a262aee568 (patch)
tree1f4625268d623a8856a7151959fb619890e796b8
parentae57e4fba5be0b7da5ca721fd672f08a14c9d19e (diff)
Windows: Provide a way to switch between WinTab and Windows Ink at run-time
This change adds the setWinTabEnabled() function to Qt Platform Headers, which allows an application to set at run-time whether the WinTab API will be used for tablet input instead of the native Windows Ink API. [ChangeLog][Windows] The setWinTabEnabled() function added to Qt Platform Headers now allows an application to set at run-time whether the WinTab API will be used for tablet input instead of the native Windows Ink API. Fixes: QTBUG-83218 Change-Id: I51d3c7316baeda136763cf37c2f54295905450ec Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
-rw-r--r--src/platformheaders/windowsfunctions/qwindowswindowfunctions.h8
-rw-r--r--src/platformheaders/windowsfunctions/qwindowswindowfunctions.qdoc27
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp10
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.h1
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp30
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.h2
-rw-r--r--src/plugins/platforms/windows/qwindowsnativeinterface.cpp2
7 files changed, 76 insertions, 4 deletions
diff --git a/src/platformheaders/windowsfunctions/qwindowswindowfunctions.h b/src/platformheaders/windowsfunctions/qwindowswindowfunctions.h
index 032dcafa6e..722f640a13 100644
--- a/src/platformheaders/windowsfunctions/qwindowswindowfunctions.h
+++ b/src/platformheaders/windowsfunctions/qwindowswindowfunctions.h
@@ -108,6 +108,14 @@ public:
IsTabletModeType func = reinterpret_cast<IsTabletModeType>(QGuiApplication::platformFunction(isTabletModeIdentifier()));
return func && func();
}
+
+ typedef bool (*SetWinTabEnabled)(bool enabled);
+ static const QByteArray setWinTabEnabledIdentifier() { return QByteArrayLiteral("WindowsSetWinTabEnabled"); }
+ static bool setWinTabEnabled(bool enabled)
+ {
+ SetWinTabEnabled func = reinterpret_cast<SetWinTabEnabled>(QGuiApplication::platformFunction(setWinTabEnabledIdentifier()));
+ return func && func(enabled);
+ }
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QWindowsWindowFunctions::TouchWindowTouchTypes)
diff --git a/src/platformheaders/windowsfunctions/qwindowswindowfunctions.qdoc b/src/platformheaders/windowsfunctions/qwindowswindowfunctions.qdoc
index 31a8d40abe..e782c30ee6 100644
--- a/src/platformheaders/windowsfunctions/qwindowswindowfunctions.qdoc
+++ b/src/platformheaders/windowsfunctions/qwindowswindowfunctions.qdoc
@@ -210,3 +210,30 @@
\sa QWidget::showMaximized(), QWidget::saveGeometry(), QWidget::restoreGeometry()
\since 5.9
*/
+
+/*!
+ \typedef QWindowsWindowFunctions::SetWinTabEnabled
+ \since 6.0
+
+ This is the typedef for the function returned by QGuiApplication::platformFunction
+ when passed setWinTabEnabledIdentifier().
+*/
+
+/*!
+ \fn QByteArray QWindowsWindowFunctions::setWinTabEnabledIdentifier()
+ \since 6.0
+
+ This function returns the bytearray that can be used to query
+ QGuiApplication::platformFunction to retrieve the SetWinTabEnabled function.
+*/
+
+/*!
+ \fn bool QWindowsWindowFunctions::setWinTabEnabled(bool enabled)
+ \since 6.0
+
+ This is a convenience function that can be used directly instead of resolving
+ the function pointer.
+
+ \a enabled determines whether the WinTab API will be used for tablet input instead
+ of the native API. Returns true if the operation was successful.
+*/
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp
index c7b85187a3..20a9e2da94 100644
--- a/src/plugins/platforms/windows/qwindowscontext.cpp
+++ b/src/plugins/platforms/windows/qwindowscontext.cpp
@@ -380,6 +380,16 @@ bool QWindowsContext::initTablet(unsigned integrationOptions)
#endif
}
+bool QWindowsContext::disposeTablet()
+{
+#if QT_CONFIG(tabletevent)
+ d->m_tabletSupport.reset();
+ return true;
+#else
+ return false;
+#endif
+}
+
bool QWindowsContext::initPointer(unsigned integrationOptions)
{
if (integrationOptions & QWindowsIntegration::DontUseWMPointer)
diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h
index c89b8b91f4..67d23b3c0c 100644
--- a/src/plugins/platforms/windows/qwindowscontext.h
+++ b/src/plugins/platforms/windows/qwindowscontext.h
@@ -175,6 +175,7 @@ public:
bool initTouch(unsigned integrationOptions); // For calls from QWindowsIntegration::QWindowsIntegration() only.
bool initTablet(unsigned integrationOptions);
bool initPointer(unsigned integrationOptions);
+ bool disposeTablet();
bool initPowerNotificationHandler();
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index 977b5903a5..2c87e80ec7 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -140,6 +140,7 @@ struct QWindowsIntegrationPrivate
~QWindowsIntegrationPrivate();
unsigned m_options = 0;
+ int m_tabletAbsoluteRange = -1;
QWindowsContext m_context;
QPlatformFontDatabase *m_fontDatabase = nullptr;
#if QT_CONFIG(clipboard)
@@ -239,19 +240,18 @@ QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList &paramL
initOpenGlBlacklistResources();
static bool dpiAwarenessSet = false;
- int tabletAbsoluteRange = -1;
// Default to per-monitor awareness to avoid being scaled when monitors with different DPI
// are connected to Windows 8.1
QtWindows::ProcessDpiAwareness dpiAwareness = QtWindows::ProcessPerMonitorDpiAware;
- m_options = parseOptions(paramList, &tabletAbsoluteRange, &dpiAwareness);
+ m_options = parseOptions(paramList, &m_tabletAbsoluteRange, &dpiAwareness);
QWindowsFontDatabase::setFontOptions(m_options);
if (m_context.initPointer(m_options)) {
QCoreApplication::setAttribute(Qt::AA_CompressHighFrequencyEvents);
} else {
m_context.initTablet(m_options);
- if (tabletAbsoluteRange >= 0)
- m_context.setTabletAbsoluteRange(tabletAbsoluteRange);
+ if (m_tabletAbsoluteRange >= 0)
+ m_context.setTabletAbsoluteRange(m_tabletAbsoluteRange);
}
if (!dpiAwarenessSet) { // Set only once in case of repeated instantiations of QGuiApplication.
@@ -642,6 +642,28 @@ void QWindowsIntegration::beep() const
MessageBeep(MB_OK); // For QApplication
}
+bool QWindowsIntegration::setWinTabEnabled(bool enabled)
+{
+ bool ret = false;
+ if (QWindowsIntegration *p = QWindowsIntegration::instance()) {
+ if (enabled) {
+ if (p->d->m_context.tabletSupport()) {
+ ret = true;
+ } else {
+ ret = p->d->m_context.initTablet(p->d->m_options);
+ if (ret && p->d->m_tabletAbsoluteRange >= 0)
+ p->d->m_context.setTabletAbsoluteRange(p->d->m_tabletAbsoluteRange);
+ }
+ } else {
+ if (p->d->m_context.tabletSupport())
+ ret = p->d->m_context.disposeTablet();
+ else
+ ret = true;
+ }
+ }
+ return ret;
+}
+
#if QT_CONFIG(vulkan)
QPlatformVulkanInstance *QWindowsIntegration::createPlatformVulkanInstance(QVulkanInstance *instance) const
{
diff --git a/src/plugins/platforms/windows/qwindowsintegration.h b/src/plugins/platforms/windows/qwindowsintegration.h
index 165472ad40..64cbda7c58 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.h
+++ b/src/plugins/platforms/windows/qwindowsintegration.h
@@ -111,6 +111,8 @@ public:
static QWindowsIntegration *instance() { return m_instance; }
+ static bool setWinTabEnabled(bool enabled);
+
unsigned options() const;
void beep() const override;
diff --git a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp
index 1195f15a59..a36da4c780 100644
--- a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp
+++ b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp
@@ -300,6 +300,8 @@ QFunctionPointer QWindowsNativeInterface::platformFunction(const QByteArray &fun
return QFunctionPointer(QWindowsNativeInterface::setWindowActivationBehavior);
if (function == QWindowsWindowFunctions::isTabletModeIdentifier())
return QFunctionPointer(QWindowsNativeInterface::isTabletMode);
+ if (function == QWindowsWindowFunctions::setWinTabEnabledIdentifier())
+ return QFunctionPointer(QWindowsIntegration::setWinTabEnabled);
return nullptr;
}