summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Persch <chpe@src.gnome.org>2023-01-21 10:24:38 +0100
committerChristian Persch <chpe@src.gnome.org>2023-01-21 10:25:02 +0100
commitffa67ea1c708b21707e41a0193d3bdeee02b88b5 (patch)
tree56db856d8e42cb1baba5ef87a51fc31a7a7e26ac
parentddb2c8ae0baf3b73d77d1f6ce6142e92faa632af (diff)
downloadvte-ffa67ea1c708b21707e41a0193d3bdeee02b88b5.tar.gz
widget: gtk4: Translate control+key events when using multiple layouts
Same as for gtk3. https://gitlab.gnome.org/GNOME/gtk/-/issues/5384 (cherry picked from commit 1d1896427fb28b0aa32f5dd401f2a86e97452cf1)
-rw-r--r--src/widget.cc31
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