From 0e206d4df32bfb4567438fd20c99e712dba5f804 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikko=20Sepp=C3=A4nen?= Date: Wed, 12 Jun 2019 15:50:35 +0300 Subject: Enable virtualkeyboard key events and shiftkey without focus This patch enables creation of virtual keyboard that functions with all X11 applications, including the ones that do not provide focus information from text input fields. The patch introdudes usage of an environment variable. When this variable is set, virtualkeyboard shift key is enabled and virtualkeyboard is able to send key events without a focus object. [ChangeLog] Added QT_VIRTUAL_KEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS environment variable to allow Qt Virtual Keyboard to send key events and enable Shift key without a focused input object. Change-Id: I89b3cff0f019a12daf6c6b0474b39758ffea7c65 Reviewed-by: Mitch Curtis --- src/virtualkeyboard/doc/src/deployment-guide.qdoc | 6 ++++++ src/virtualkeyboard/platforminputcontext.cpp | 12 +++++++++++- src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp | 2 +- src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp | 2 ++ src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h | 7 +++++++ src/virtualkeyboard/qvirtualkeyboardinputengine.cpp | 3 +++ src/virtualkeyboard/shifthandler.cpp | 2 +- 7 files changed, 31 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/virtualkeyboard/doc/src/deployment-guide.qdoc b/src/virtualkeyboard/doc/src/deployment-guide.qdoc index 718068d7..e71017f3 100644 --- a/src/virtualkeyboard/doc/src/deployment-guide.qdoc +++ b/src/virtualkeyboard/doc/src/deployment-guide.qdoc @@ -274,6 +274,12 @@ There are several environment variables defined by the module that are listed be \li \c {LIPI_ROOT + "/lib"} if \c LIPI_ROOT is set. \li \c {QLibraryInfo::location(QLibraryInfo::PluginsPath) + "/lipi_toolkit"} if \c LIPI_ROOT is not set. \endlist + \row + \li QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS + \li Enables Qt Virtual Keyboard to send key events and use Shift key without having any text input in focus. + + This variable needs to be explicitly set in the run environment of an application that wants to benefit + from this. Using qputenv() in the application itself is not sufficient. \endtable */ diff --git a/src/virtualkeyboard/platforminputcontext.cpp b/src/virtualkeyboard/platforminputcontext.cpp index fc229f52..d57a63e4 100644 --- a/src/virtualkeyboard/platforminputcontext.cpp +++ b/src/virtualkeyboard/platforminputcontext.cpp @@ -243,7 +243,17 @@ void PlatformInputContext::sendEvent(QEvent *event) void PlatformInputContext::sendKeyEvent(QKeyEvent *event) { const QGuiApplication *app = qApp; - QWindow *focusWindow = app ? app->focusWindow() : nullptr; + QWindow *focusWindow = nullptr; + if (app) { + if (QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS) { + if (!app->allWindows().isEmpty()) { + focusWindow = app->allWindows().first(); + } + } + else { + focusWindow = app->focusWindow(); + } + } if (focusWindow) { m_filterEvent = event; QGuiApplication::sendEvent(focusWindow, event); diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp b/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp index f1140260..b86492e1 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp @@ -218,7 +218,7 @@ QVirtualKeyboardInputEngine *QVirtualKeyboardInputContext::inputEngine() const void QVirtualKeyboardInputContext::sendKeyClick(int key, const QString &text, int modifiers) { Q_D(QVirtualKeyboardInputContext); - if (d->_focus && d->platformInputContext) { + if ((d->_focus && d->platformInputContext) || QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS) { QKeyEvent pressEvent(QEvent::KeyPress, key, Qt::KeyboardModifiers(modifiers), text); QKeyEvent releaseEvent(QEvent::KeyRelease, key, Qt::KeyboardModifiers(modifiers), text); VIRTUALKEYBOARD_DEBUG().nospace() << "InputContext::sendKeyClick()" diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp index 1233de99..34086ad0 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp @@ -51,6 +51,8 @@ bool operator==(const QInputMethodEvent::Attribute &attribute1, const QInputMeth using namespace QtVirtualKeyboard; +const bool QtVirtualKeyboard::QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS = qEnvironmentVariableIsSet("QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS"); + QVirtualKeyboardInputContextPrivate::QVirtualKeyboardInputContextPrivate(QVirtualKeyboardInputContext *q_ptr) : QObject(nullptr), q_ptr(q_ptr), diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h index 05349d38..4075c95f 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h @@ -50,6 +50,13 @@ QT_BEGIN_NAMESPACE namespace QtVirtualKeyboard { + +// Boolean variable QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS will enable virtual keyboard +// to send key events without having any text input in focus when an environment +// variable QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS is set. This will also enable virtual +// keyboard shift key usage in the same no focus situation. +extern const bool QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS; + class PlatformInputContext; class ShiftHandler; } diff --git a/src/virtualkeyboard/qvirtualkeyboardinputengine.cpp b/src/virtualkeyboard/qvirtualkeyboardinputengine.cpp index db38fb32..6f3a9a43 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputengine.cpp +++ b/src/virtualkeyboard/qvirtualkeyboardinputengine.cpp @@ -76,6 +76,9 @@ public: accept = fallbackInputMethod->keyEvent(key, text, modifiers); } emit q->virtualKeyClicked(key, text, modifiers, isAutoRepeat); + } else if (QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS) { + accept = fallbackInputMethod->keyEvent(key, text, modifiers); + emit q->virtualKeyClicked(key, text, modifiers, isAutoRepeat); } else { qWarning() << "input method is not set"; } diff --git a/src/virtualkeyboard/shifthandler.cpp b/src/virtualkeyboard/shifthandler.cpp index 1f992f4d..876e6229 100644 --- a/src/virtualkeyboard/shifthandler.cpp +++ b/src/virtualkeyboard/shifthandler.cpp @@ -255,7 +255,7 @@ void ShiftHandler::clearToggleShiftTimer() void ShiftHandler::reset() { Q_D(ShiftHandler); - if (d->inputContext->priv()->inputItem()) { + if (d->inputContext->priv()->inputItem() || QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS) { Qt::InputMethodHints inputMethodHints = d->inputContext->inputMethodHints(); QVirtualKeyboardInputEngine::InputMode inputMode = d->inputContext->inputEngine()->inputMode(); bool preferUpperCase = (inputMethodHints & (Qt::ImhPreferUppercase | Qt::ImhUppercaseOnly)); -- cgit v1.2.3