aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMikko Seppänen <mikko.seppanen123@gmail.com>2019-06-12 15:50:35 +0300
committerJarkko Koivikko <jarkko.koivikko@code-q.fi>2019-06-20 12:50:28 +0000
commit0e206d4df32bfb4567438fd20c99e712dba5f804 (patch)
tree04c7cece74b9369390cdb865aee4cbd31bc78405 /src
parent412cf0efe22a3690f5132fc7f877282be757d5a6 (diff)
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 <mitch.curtis@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/virtualkeyboard/doc/src/deployment-guide.qdoc6
-rw-r--r--src/virtualkeyboard/platforminputcontext.cpp12
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp2
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp2
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h7
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputengine.cpp3
-rw-r--r--src/virtualkeyboard/shifthandler.cpp2
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));