[gnome-taquin] Use EventControllerKey.



commit f3c582abf99654258276f75bbab3569969a88d02
Author: Arnaud Bonatti <arnaud bonatti gmail com>
Date:   Wed Feb 19 18:35:19 2020 +0100

    Use EventControllerKey.

 data/ui/base-window.ui |  1 -
 meson.build            |  2 +-
 src/base-window.vala   | 54 +++++++++++++++++++++++++++++++-------------------
 src/taquin-view.vala   | 23 ++++++++++++++++++---
 4 files changed, 55 insertions(+), 25 deletions(-)
---
diff --git a/data/ui/base-window.ui b/data/ui/base-window.ui
index 4996077..dba8665 100644
--- a/data/ui/base-window.ui
+++ b/data/ui/base-window.ui
@@ -19,7 +19,6 @@
   <requires lib="gtk+" version="3.12"/>
   <template class="BaseWindow" parent="AdaptativeWindow">
     <property name="visible">False</property>
-    <signal name="key-press-event" handler="on_key_press_event"/>
     <child>
       <object class="GtkOverlay" id="main_overlay">
         <property name="visible">True</property>
diff --git a/meson.build b/meson.build
index 2219c33..fd3ef9e 100644
--- a/meson.build
+++ b/meson.build
@@ -16,7 +16,7 @@ valac = meson.get_compiler('vala')
 gio_dependency = dependency('gio-2.0', version: '>= 2.42.0')
 glib_dependency = dependency('glib-2.0', version: '>= 2.42.0')
 gsound_dependency = dependency('gsound', version: '>= 1.0.2')
-gtk_dependency = dependency('gtk+-3.0', version: '>= 3.22.23')
+gtk_dependency = dependency('gtk+-3.0', version: '>= 3.24.0')
 libm_dependency = cc.find_library('m', required: false) # some platforms do not have libm separated from libc
 posix_dependency = valac.find_library('posix')
 rsvg_dependency = dependency('librsvg-2.0', version: '>= 2.32.0')
diff --git a/src/base-window.vala b/src/base-window.vala
index 6ec8613..2c652ab 100644
--- a/src/base-window.vala
+++ b/src/base-window.vala
@@ -61,6 +61,8 @@ private class BaseWindow : AdaptativeWindow, AdaptativeWidget
     {
         headerbar = (BaseHeaderBar) nta_headerbar;
 
+        init_keyboard ();
+
         install_action_entries ();
 
         add_adaptative_child (headerbar);
@@ -306,37 +308,46 @@ private class BaseWindow : AdaptativeWindow, AdaptativeWidget
     }
 
     /*\
-    * * global callbacks
+    * * keyboard user actions
     \*/
 
-    [CCode (notify = false)] public string help_string_or_empty { private get; protected construct; default 
= ""; }
+    private Gtk.EventControllerKey key_controller;    // for keeping in memory
+
+    private void init_keyboard ()  // called on construct
+    {
+        key_controller = new Gtk.EventControllerKey (this);
+        key_controller.key_pressed.connect (on_key_pressed);
+    }
 
-    [GtkCallback]
-    protected virtual bool on_key_press_event (Widget widget, Gdk.EventKey event)
+    protected inline bool on_key_pressed (Gtk.EventControllerKey _key_controller, uint keyval, uint keycode, 
Gdk.ModifierType state)
     {
-        return _on_key_press_event (widget, event, help_string_or_empty);
+        return _on_key_press_event (keyval, state);
     }
-    private static bool _on_key_press_event (Widget widget, Gdk.EventKey event, string help_string_or_empty)
+    private bool _on_key_press_event (uint keyval, Gdk.ModifierType state)
     {
-        string name = (!) (Gdk.keyval_name (event.keyval) ?? "");
+        string name = (!) (Gdk.keyval_name (keyval) ?? "");
 
         if (name == "F1") // TODO fix dance done with the F1 & <Primary>F1 shortcuts that show help overlay
         {
-            BaseWindow _this = (BaseWindow) widget;
-
-            _this.headerbar.close_popovers ();
-            _this.main_view.close_popovers ();
-            if ((event.state & Gdk.ModifierType.CONTROL_MASK) != 0)
+            headerbar.close_popovers ();
+            main_view.close_popovers ();
+            if ((state & Gdk.ModifierType.CONTROL_MASK) != 0)
                 return false;                           // help overlay
-            if ((event.state & Gdk.ModifierType.SHIFT_MASK) == 0)
-                return show_application_help (_this, help_string_or_empty);   // fallback on help overlay 
(TODO test)
-            _this.about ();
+            if ((state & Gdk.ModifierType.SHIFT_MASK) == 0)
+                return show_application_help (this, help_string_or_empty);   // fallback on help overlay 
(TODO test)
+            about ();
             return true;
         }
 
         return false;
     }
 
+    /*\
+    * * help
+    \*/
+
+    [CCode (notify = false)] public string help_string_or_empty { private get; protected construct; default 
= ""; }
+
     private void help (/* SimpleAction action, Variant? variant */)
     {
         show_application_help (this, help_string_or_empty);
@@ -422,24 +433,27 @@ private class BaseWindow : AdaptativeWindow, AdaptativeWidget
     \*/
 
     private AboutDialog about_dialog;
+    private Gtk.EventControllerKey about_dialog_key_controller;    // for keeping in memory
+
     private void show_about_dialog ()
     {
         if (should_init_about_dialog)
         {
             create_about_dialog ();
             about_dialog.response.connect ((_about_dialog, response) => _about_dialog.hide ());
-            about_dialog.key_press_event.connect (about_dialog_key_press_event);
+            about_dialog_key_controller = new Gtk.EventControllerKey (about_dialog);
+            about_dialog_key_controller.key_pressed.connect (on_about_dialog_key_pressed);
             about_dialog.set_transient_for (this);
             should_init_about_dialog = false;
         }
         about_dialog.run ();
     }
-    private static bool about_dialog_key_press_event (Widget _about_dialog_widget, Gdk.EventKey event)
+    private inline bool on_about_dialog_key_pressed (Gtk.EventControllerKey _about_dialog_key_controller, 
uint keyval, uint keycode, Gdk.ModifierType state)
     {
-        if (((!) (Gdk.keyval_name (event.keyval) ?? "") == "F1")
-         && ((event.state & Gdk.ModifierType.SHIFT_MASK) != 0))
+        if (((!) (Gdk.keyval_name (keyval) ?? "") == "F1")
+         && ((state & Gdk.ModifierType.SHIFT_MASK) != 0))
         {
-            ((Dialog) _about_dialog_widget).response (ResponseType.CANCEL);
+            about_dialog.response (ResponseType.CANCEL);
             return true;
         }
         return false;
diff --git a/src/taquin-view.vala b/src/taquin-view.vala
index b58408b..77578d1 100644
--- a/src/taquin-view.vala
+++ b/src/taquin-view.vala
@@ -63,6 +63,11 @@ private class TaquinView : Gtk.DrawingArea
     private bool finished = false;
     private double animation_end_offset;
 
+    construct
+    {
+        init_keyboard ();
+    }
+
     internal TaquinView ()
     {
         can_focus = true;
@@ -479,13 +484,25 @@ private class TaquinView : Gtk.DrawingArea
         return true;
     }
 
-    protected override bool key_press_event (Gdk.EventKey event)
+    /*\
+    * * keyboard user actions
+    \*/
+
+    private Gtk.EventControllerKey key_controller;    // for keeping in memory
+
+    private void init_keyboard ()  // called on construct
+    {
+        key_controller = new Gtk.EventControllerKey (this);
+        key_controller.key_pressed.connect (on_key_pressed);
+    }
+
+    private inline bool on_key_pressed (Gtk.EventControllerKey _key_controller, uint keyval, uint keycode, 
Gdk.ModifierType state)
     {
         if (finished)
             return false;
-        string k_name = (!) (Gdk.keyval_name (event.keyval) ?? "");
+        string k_name = (!) (Gdk.keyval_name (keyval) ?? "");
 
-        if (game.game_type == GameType.SIXTEEN && ((event.state & ModifierType.SHIFT_MASK) > 0 || 
(event.state & ModifierType.CONTROL_MASK) > 0))
+        if (game.game_type == GameType.SIXTEEN && ((state & ModifierType.SHIFT_MASK) > 0 || (state & 
ModifierType.CONTROL_MASK) > 0))
         {
             switch (k_name) {
                 case "Left":  game.request_move (- 1,       y_arrow,    /* keyboard */ true); break;


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