diff options
Diffstat (limited to 'src')
7 files changed, 31 insertions, 3 deletions
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)); |