From 7c5929218d1f79d757cf30b2f5069a1b6cb098e6 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 29 Jul 2016 15:00:39 +0200 Subject: [PATCH] WIP: Experimentally launch tabtip.exe/virtual keyboard TODO: Most likely the wrong approach, ImmAssociateContext(0) has also been observed to launch it. Task-number: QTBUG-43190 Change-Id: Ie99a0046baf2b775ce8344728f76e6b6139662a5 --- .../platforms/windows/qwindowsinputcontext.cpp | 1 + .../platforms/windows/qwindowskeymapper.cpp | 32 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.cpp b/src/plugins/platforms/windows/qwindowsinputcontext.cpp index 4d4be3d..5135857 100644 --- a/src/plugins/platforms/windows/qwindowsinputcontext.cpp +++ b/src/plugins/platforms/windows/qwindowsinputcontext.cpp @@ -228,6 +228,7 @@ void QWindowsInputContext::setFocusObject(QObject *) void QWindowsInputContext::updateEnabled() { + if (!QGuiApplication::focusObject()) return; const QWindow *window = QGuiApplication::focusWindow(); diff --git a/src/plugins/platforms/windows/qwindowskeymapper.cpp b/src/plugins/platforms/windows/qwindowskeymapper.cpp index 1e58b9b..6373e48 100644 --- a/src/plugins/platforms/windows/qwindowskeymapper.cpp +++ b/src/plugins/platforms/windows/qwindowskeymapper.cpp @@ -37,13 +37,17 @@ #include "qwindowswindow.h" #include "qwindowsinputcontext.h" +#include #include #include #include #include #include +#include #include #include +#include +#include #if defined(WM_APPCOMMAND) # ifndef FAPPCOMMAND_MOUSE @@ -89,6 +93,32 @@ QT_BEGIN_NAMESPACE static void clearKeyRecorderOnApplicationInActive(Qt::ApplicationState state); +static QUrl tabTipBinary() +{ + QByteArray programFiles = qgetenv("ProgramFiles"); + if (QSysInfo::WordSize == 32 && programFiles.endsWith(" (x86)")) + programFiles.chop(6); // Lives in 64bit dir. + const QString binary = QDir::cleanPath(QFile::decodeName(programFiles)) + + QStringLiteral("/Common Files/Microsoft Shared/Ink/tabtip.exe"); + return QFileInfo(binary).isFile() ? QUrl::fromLocalFile(binary) : QUrl(); +} + +static void startSoftwareKeyboard(QObject *focusObject) +{ + static const QUrl binary = tabTipBinary(); + if (!focusObject || !binary.isValid() + || !QWindowsIntegration::instance()->inputContext()->inputMethodAccepted()) { + return; + } +qDebug() << focusObject << binary; +// ## Fixme: Check if keyboard present +// ## Fixme: Check if running using PSAPI? + // Launch via QDesktopServices since using QProcess causes an UAC prompt. + static int n = 0; + if (!n++) + qDebug() << QDesktopServices::openUrl(binary); +} + QWindowsKeyMapper::QWindowsKeyMapper() : m_useRTLExtensions(false), m_keyGrabber(0) { @@ -96,6 +126,8 @@ QWindowsKeyMapper::QWindowsKeyMapper() QGuiApplication *app = static_cast(QGuiApplication::instance()); QObject::connect(app, &QGuiApplication::applicationStateChanged, app, clearKeyRecorderOnApplicationInActive); + QObject::connect(app, &QGuiApplication::focusObjectChanged, + app, startSoftwareKeyboard); } QWindowsKeyMapper::~QWindowsKeyMapper() -- 2.8.1.windows.1