summaryrefslogtreecommitdiffstats
path: root/src/core/web_event_factory.cpp
diff options
context:
space:
mode:
authorJüri Valdmann <juri.valdmann@qt.io>2018-07-30 16:36:29 +0200
committerJüri Valdmann <juri.valdmann@qt.io>2018-08-27 14:30:03 +0000
commitdabf39eb6751725224e2d66e1392a590de0527a4 (patch)
treeac82c08b6b085dd8ca14e21ce4c7fc4305ee9e0d /src/core/web_event_factory.cpp
parentfd7c75505662340189c785de57cbd7d73593b32b (diff)
WebEventFactory: Fix WebKeyboardEvent::native_key_code on Windows and Linux
Currently this field is filled from QKeyEvent::nativeVirtualKey, but this is correct only on macOS (cocoa). Other platforms should use nativeScanCode. Task-number: QTBUG-69442 Change-Id: I097ec4c726a9d249c0adfbc620d2585983f6246c Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Diffstat (limited to 'src/core/web_event_factory.cpp')
-rw-r--r--src/core/web_event_factory.cpp26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/core/web_event_factory.cpp b/src/core/web_event_factory.cpp
index bafdaecf1..16953b194 100644
--- a/src/core/web_event_factory.cpp
+++ b/src/core/web_event_factory.cpp
@@ -152,6 +152,30 @@ static Qt::KeyboardModifiers qtModifiersForEvent(const QInputEvent *ev)
return modifiers;
}
+// The 'native key code' in Chromium refers to
+//
+// - On Windows: the Windows OEM scancode.
+// - On macOS: the NSEvent's keyCode.
+// - On Linux: The XKB keycode.
+static quint32 nativeKeyCodeForKeyEvent(const QKeyEvent *ev)
+{
+ // Ifdefs here should match <ui/events/keycodes/dom/keycode_converter.cc>,
+ // since that is where the native key code is eventually used.
+ //
+ // Note that Xkb key codes are only supported under Linux (no BSDs,
+ // Cygwin/X, etc). Also evdev key codes are *not* supported for the same
+ // reason.
+#if defined(Q_OS_WINDOWS)
+ return keyboardDriver() == KeyboardDriver::Windows ? ev->nativeScanCode() : 0;
+#elif defined(Q_OS_MACOS)
+ return keyboardDriver() == KeyboardDriver::Cocoa ? ev->nativeVirtualKey() : 0;
+#elif defined(Q_OS_LINUX)
+ return keyboardDriver() == KeyboardDriver::Xkb ? ev->nativeScanCode() : 0;
+#else
+ return 0; // 0 means unknown, KeyboardEvent.code will be empty string.
+#endif
+}
+
static int windowsKeyCodeForKeyEvent(unsigned int keycode, bool isKeypad)
{
// Determine wheter the event comes from the keypad
@@ -1431,7 +1455,7 @@ content::NativeWebKeyboardEvent WebEventFactory::toWebKeyboardEvent(QKeyEvent *e
webKitEvent.SetModifiers(modifiersForEvent(ev));
webKitEvent.SetType(webEventTypeForEvent(ev));
- webKitEvent.native_key_code = ev->nativeVirtualKey();
+ webKitEvent.native_key_code = nativeKeyCodeForKeyEvent(ev);
webKitEvent.windows_key_code = windowsKeyCodeForKeyEvent(qtKeyForKeyEvent(ev), ev->modifiers() & Qt::KeypadModifier);
webKitEvent.dom_key = getDomKeyFromQKeyEvent(ev);