diff options
author | Jüri Valdmann <juri.valdmann@qt.io> | 2018-07-30 16:36:29 +0200 |
---|---|---|
committer | Jüri Valdmann <juri.valdmann@qt.io> | 2018-08-27 14:30:03 +0000 |
commit | dabf39eb6751725224e2d66e1392a590de0527a4 (patch) | |
tree | ac82c08b6b085dd8ca14e21ce4c7fc4305ee9e0d /src/core/web_event_factory.cpp | |
parent | fd7c75505662340189c785de57cbd7d73593b32b (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.cpp | 26 |
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); |