diff options
author | Christian Persch <chpe@src.gnome.org> | 2023-01-21 10:24:38 +0100 |
---|---|---|
committer | Christian Persch <chpe@src.gnome.org> | 2023-01-21 10:24:38 +0100 |
commit | 1d1896427fb28b0aa32f5dd401f2a86e97452cf1 (patch) | |
tree | cd61c157823cd4bbd2b897eda87fe524a139e747 | |
parent | 015ca4d2fdc57b625add7b23b0afa7193adc45a9 (diff) | |
download | vte-1d1896427fb28b0aa32f5dd401f2a86e97452cf1.tar.gz |
widget: gtk4: Translate control+key events when using multiple layouts
Same as for gtk3.
https://gitlab.gnome.org/GNOME/gtk/-/issues/5384
-rw-r--r-- | src/widget.cc | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/src/widget.cc b/src/widget.cc index b84c0037..49e02049 100644 --- a/src/widget.cc +++ b/src/widget.cc @@ -1245,10 +1245,10 @@ Widget::read_modifiers_from_gdk(GdkEvent* event) const noexcept unsigned Widget::key_event_translate_ctrlkey(KeyEvent const& event) const noexcept { -#if VTE_GTK == 3 if (event.keyval() < 128) return event.keyval(); +#if VTE_GTK == 3 auto display = gdk_window_get_display(gdk_event_get_window(event.platform_event())); auto keymap = gdk_keymap_get_for_display(display); auto keyval = unsigned{event.keyval()}; @@ -1270,10 +1270,35 @@ Widget::key_event_translate_ctrlkey(KeyEvent const& event) const noexcept } return keyval; + #elif VTE_GTK == 4 - // FIXMEgtk4: find a way to do this on gtk4 + auto const display = gdk_event_get_display(event.platform_event()); + + /* Try groups in order to find one mapping the key to ASCII */ + for (auto i = unsigned{0}; i < 4; i++) { + auto keyval = guint{}; + auto consumed_modifiers = GdkModifierType{}; + if (!gdk_display_translate_key(display, + event.keycode(), + GdkModifierType(event.modifiers()), + i, + &keyval, + nullptr, + nullptr, + &consumed_modifiers)) + continue; + + if (keyval >= 128) + continue; + + _vte_debug_print (VTE_DEBUG_EVENTS, + "ctrl+Key, group=%d de-grouped into keyval=0x%x\n", + event.group(), keyval); + return keyval; + } + return event.keyval(); -#endif +#endif /* VTE_GTK */ } KeyEvent |