From 024aef49ee324bf45c29e85c9a637b1495292503 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCri=20Valdmann?= Date: Tue, 18 Dec 2018 14:37:43 +0100 Subject: Fix key and keyCode of KeyboardEvents for dead keys 1. Extend Qt::Key to ui::DomKey conversion to handle most Qt::Key_Dead_* keys. 2. Supplement Qt::Key to windows key code conversion with a fall back to DomCodeToUsLayoutKeyboardCode. Fixes: QTBUG-72655 Change-Id: I9ab8dc5f931065c4dc381adc5a1690ee288b8244 Reviewed-by: Peter Varga --- src/core/web_event_factory.cpp | 83 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/src/core/web_event_factory.cpp b/src/core/web_event_factory.cpp index 06dbd7ff6..8a72422d4 100644 --- a/src/core/web_event_factory.cpp +++ b/src/core/web_event_factory.cpp @@ -927,6 +927,74 @@ static ui::DomKey domKeyForQtKey(int qtKey) case Qt::Key_Zenkaku_Hankaku: return ui::DomKey::ZENKAKU_HANKAKU; + // Dead keys (ui/events/keycodes/keyboard_code_conversion_xkb.cc) + case Qt::Key_Dead_Grave: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0300); + case Qt::Key_Dead_Acute: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0301); + case Qt::Key_Dead_Circumflex: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0302); + case Qt::Key_Dead_Tilde: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0303); + case Qt::Key_Dead_Macron: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0304); + case Qt::Key_Dead_Breve: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0306); + case Qt::Key_Dead_Abovedot: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0307); + case Qt::Key_Dead_Diaeresis: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0308); + case Qt::Key_Dead_Abovering: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x030A); + case Qt::Key_Dead_Doubleacute: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x030B); + case Qt::Key_Dead_Caron: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x030C); + case Qt::Key_Dead_Cedilla: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0327); + case Qt::Key_Dead_Ogonek: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0328); + case Qt::Key_Dead_Iota: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0345); + case Qt::Key_Dead_Voiced_Sound: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x3099); + case Qt::Key_Dead_Semivoiced_Sound: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x309A); + case Qt::Key_Dead_Belowdot: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0323); + case Qt::Key_Dead_Hook: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0309); + case Qt::Key_Dead_Horn: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x031B); + case Qt::Key_Dead_Stroke: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0338); + case Qt::Key_Dead_Abovecomma: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0313); + case Qt::Key_Dead_Abovereversedcomma: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0314); + case Qt::Key_Dead_Doublegrave: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x030F); + case Qt::Key_Dead_Belowring: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0325); + case Qt::Key_Dead_Belowmacron: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0331); + case Qt::Key_Dead_Belowcircumflex: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x032D); + case Qt::Key_Dead_Belowtilde: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0330); + case Qt::Key_Dead_Belowbreve: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x032E); + case Qt::Key_Dead_Belowdiaeresis: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0324); + case Qt::Key_Dead_Invertedbreve: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0311); + case Qt::Key_Dead_Belowcomma: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x0326); + case Qt::Key_Dead_Currency: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x00A4); + case Qt::Key_Dead_Greek: + return ui::DomKey::DeadKeyFromCombiningCharacter(0x037E); + // General-Purpose Function Keys case Qt::Key_F1: return ui::DomKey::F1; @@ -1502,17 +1570,20 @@ content::NativeWebKeyboardEvent WebEventFactory::toWebKeyboardEvent(QKeyEvent *e // The dom_code field should contain the USB keycode of the *physical* key // that was pressed. Physical meaning independent of layout and modifiers. - // // Since this information is not available from QKeyEvent in portable form, - // we try to compute it from the native key code. If there's no native key - // code available either, then we assume a US layout and convert it from - // windows_key_code. The result will be incorrect on non-US layouts. + // we try to compute it from the native key code. if (webKitEvent.native_key_code) webKitEvent.dom_code = static_cast( ui::KeycodeConverter::NativeKeycodeToDomCode(webKitEvent.native_key_code)); - else + + // The dom_code and windows_key_code can be converted to each other. The + // result will be incorrect on non-US layouts. + if (!webKitEvent.dom_code && webKitEvent.windows_key_code) webKitEvent.dom_code = static_cast( - ui::UsLayoutKeyboardCodeToDomCode(static_cast(webKitEvent.windows_key_code))); + ui::UsLayoutKeyboardCodeToDomCode(static_cast(webKitEvent.windows_key_code))); + else if (webKitEvent.dom_code && !webKitEvent.windows_key_code) + webKitEvent.windows_key_code = + ui::DomCodeToUsLayoutKeyboardCode(static_cast(webKitEvent.dom_code)); const ushort* text = qtText.utf16(); size_t textSize = std::min(sizeof(webKitEvent.text), size_t(qtText.length() * 2)); -- cgit v1.2.3