[vte] widget: Move keymap translation to Widget



commit 58327921370340f4f44afa0c2323c42aa5e33f54
Author: Christian Persch <chpe src gnome org>
Date:   Fri May 1 23:08:42 2020 +0200

    widget: Move keymap translation to Widget
    
    ... making Terminal now entirely free of use of GdkEvent APIs.
    
    Part of https://gitlab.gnome.org/GNOME/vte/issues/12

 src/vte.cc    | 33 ++-------------------------------
 src/widget.cc | 29 +++++++++++++++++++++++++++++
 src/widget.hh |  2 ++
 3 files changed, 33 insertions(+), 31 deletions(-)
---
diff --git a/src/vte.cc b/src/vte.cc
index 90f5adef..55e0aa0c 100644
--- a/src/vte.cc
+++ b/src/vte.cc
@@ -4487,35 +4487,6 @@ Terminal::beep()
                 m_real_widget->beep();
 }
 
-unsigned
-Terminal::translate_ctrlkey(KeyEvent const& event) const noexcept
-{
-       if (event.keyval() < 128)
-               return event.keyval();
-
-        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()};
-
-       /* Try groups in order to find one mapping the key to ASCII */
-       for (auto i = unsigned{0}; i < 4; i++) {
-               auto consumed_modifiers = GdkModifierType{};
-               gdk_keymap_translate_keyboard_state (keymap,
-                                                     event.keycode(),
-                                                     GdkModifierType(event.modifiers()),
-                                                     i,
-                                                     &keyval, NULL, NULL, &consumed_modifiers);
-               if (keyval < 128) {
-                       _vte_debug_print (VTE_DEBUG_EVENTS,
-                                          "ctrl+Key, group=%d de-grouped into keyval=0x%x\n",
-                                          event.group(), keyval);
-                        break;
-               }
-       }
-
-        return keyval;
-}
-
 bool
 Terminal::widget_key_press(KeyEvent const& event)
 {
@@ -4908,8 +4879,8 @@ Terminal::widget_key_press(KeyEvent const& event)
                }
 
                /* Shall we do this here or earlier?  See bug 375112 and bug 589557 */
-               if (m_modifiers & GDK_CONTROL_MASK)
-                       keyval = translate_ctrlkey(event);
+               if (m_modifiers & GDK_CONTROL_MASK && widget())
+                        keyval = widget()->key_event_translate_ctrlkey(event);
 
                /* If we didn't manage to do anything, try to salvage a
                 * printable string. */
diff --git a/src/widget.cc b/src/widget.cc
index a23fe255..bd1b37ee 100644
--- a/src/widget.cc
+++ b/src/widget.cc
@@ -262,6 +262,35 @@ Widget::read_modifiers_from_gdk(GdkEvent* event) const noexcept
         return unsigned(mods);
 }
 
+unsigned
+Widget::key_event_translate_ctrlkey(vte::terminal::KeyEvent const& event) const noexcept
+{
+       if (event.keyval() < 128)
+               return event.keyval();
+
+        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()};
+
+       /* Try groups in order to find one mapping the key to ASCII */
+       for (auto i = unsigned{0}; i < 4; i++) {
+               auto consumed_modifiers = GdkModifierType{};
+               gdk_keymap_translate_keyboard_state (keymap,
+                                                     event.keycode(),
+                                                     GdkModifierType(event.modifiers()),
+                                                     i,
+                                                     &keyval, NULL, NULL, &consumed_modifiers);
+               if (keyval < 128) {
+                       _vte_debug_print (VTE_DEBUG_EVENTS,
+                                          "ctrl+Key, group=%d de-grouped into keyval=0x%x\n",
+                                          event.group(), keyval);
+                        break;
+               }
+       }
+
+        return keyval;
+}
+
 vte::terminal::KeyEvent
 Widget::key_event_from_gdk(GdkEventKey* event) const
 {
diff --git a/src/widget.hh b/src/widget.hh
index cf10c616..d44d4079 100644
--- a/src/widget.hh
+++ b/src/widget.hh
@@ -211,6 +211,8 @@ protected:
 
         void unset_pty() noexcept;
 
+        unsigned key_event_translate_ctrlkey(vte::terminal::KeyEvent const& event) const noexcept;
+
 public: // FIXMEchpe
         void im_preedit_changed() noexcept;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]