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:24:38 +0100
commit1d1896427fb28b0aa32f5dd401f2a86e97452cf1 (patch)
treecd61c157823cd4bbd2b897eda87fe524a139e747
parent015ca4d2fdc57b625add7b23b0afa7193adc45a9 (diff)
downloadvte-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.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