[gtk/gbsneto/shortcuts-rebased: 67/99] label: Implement mnemonics using shortcuts



commit 24117b053c081eeaf5e51d0801042f9af1aa24b6
Author: Benjamin Otte <otte redhat com>
Date:   Thu Aug 16 05:43:37 2018 +0200

    label: Implement mnemonics using shortcuts

 gtk/gtklabel.c | 107 ++++++++++++++++++---------------------------------------
 1 file changed, 34 insertions(+), 73 deletions(-)
---
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index 74ab6bf686..ee6ed4ac24 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -41,11 +41,13 @@
 #include "gtkmain.h"
 #include "gtkmarshalers.h"
 #include "gtkmenuitem.h"
-#include "gtkmenushellprivate.h"
 #include "gtknotebook.h"
 #include "gtkpango.h"
 #include "gtkprivate.h"
 #include "gtkseparatormenuitem.h"
+#include "gtkshortcut.h"
+#include "gtkshortcutcontroller.h"
+#include "gtkshortcuttrigger.h"
 #include "gtkshow.h"
 #include "gtksnapshot.h"
 #include "gtkstylecontextprivate.h"
@@ -253,7 +255,7 @@ struct _GtkLabelPrivate
 {
   GtkLabelSelectionInfo *select_info;
   GtkWidget *mnemonic_widget;
-  GtkWindow *mnemonic_window;
+  GtkEventController *mnemonic_controller;
 
   PangoAttrList *attrs;
   PangoAttrList *markup_attrs;
@@ -388,7 +390,6 @@ static GParamSpec *label_props[NUM_PROPERTIES] = { NULL, };
 static guint signals[LAST_SIGNAL] = { 0 };
 
 static GQuark quark_shortcuts_connected;
-static GQuark quark_mnemonic_menu;
 static GQuark quark_mnemonics_visible_connected;
 static GQuark quark_gtk_signal;
 static GQuark quark_link;
@@ -454,7 +455,6 @@ static void gtk_label_set_markup_internal        (GtkLabel      *label,
                                                  gboolean       with_uline);
 static void gtk_label_recalculate                (GtkLabel      *label);
 static void gtk_label_root                       (GtkWidget     *widget);
-static void gtk_label_unroot                     (GtkWidget     *widget);
 static gboolean gtk_label_popup_menu             (GtkWidget     *widget);
 
 static void gtk_label_set_selectable_hint (GtkLabel *label);
@@ -473,9 +473,7 @@ static void gtk_label_update_active_link  (GtkWidget *widget,
 
 static gboolean gtk_label_mnemonic_activate (GtkWidget         *widget,
                                             gboolean           group_cycling);
-static void     gtk_label_setup_mnemonic    (GtkLabel          *label,
-                                             GtkWidget         *toplevel,
-                                            guint              last_key);
+static void     gtk_label_setup_mnemonic    (GtkLabel          *label);
 static void     gtk_label_drag_data_get     (GtkWidget         *widget,
                                             GdkDrag           *drag,
                                             GtkSelectionData  *selection_data);
@@ -602,7 +600,6 @@ gtk_label_class_init (GtkLabelClass *class)
   widget_class->unrealize = gtk_label_unrealize;
   widget_class->unmap = gtk_label_unmap;
   widget_class->root = gtk_label_root;
-  widget_class->unroot = gtk_label_unroot;
   widget_class->mnemonic_activate = gtk_label_mnemonic_activate;
   widget_class->drag_data_get = gtk_label_drag_data_get;
   widget_class->grab_focus = gtk_label_grab_focus;
@@ -1101,7 +1098,6 @@ gtk_label_class_init (GtkLabelClass *class)
   gtk_widget_class_set_css_name (widget_class, I_("label"));
 
   quark_shortcuts_connected = g_quark_from_static_string ("gtk-label-shortcuts-connected");
-  quark_mnemonic_menu = g_quark_from_static_string ("gtk-mnemonic-menu");
   quark_mnemonics_visible_connected = g_quark_from_static_string ("gtk-label-mnemonics-visible-connected");
   quark_gtk_signal = g_quark_from_static_string ("gtk-signal");
   quark_link = g_quark_from_static_string ("link");
@@ -1285,7 +1281,6 @@ gtk_label_init (GtkLabel *label)
   priv->attrs = NULL;
 
   priv->mnemonic_widget = NULL;
-  priv->mnemonic_window = NULL;
 
   priv->mnemonics_visible = TRUE;
 }
@@ -1725,65 +1720,43 @@ gtk_label_mnemonic_activate (GtkWidget *widget,
 }
 
 static void
-gtk_label_setup_mnemonic (GtkLabel  *label,
-                          GtkWidget *toplevel,
-                         guint      last_key)
+gtk_label_setup_mnemonic (GtkLabel *label)
 {
   GtkLabelPrivate *priv = gtk_label_get_instance_private (label);
   GtkWidget *widget = GTK_WIDGET (label);
-  GtkWidget *mnemonic_menu;
+  GtkShortcut *shortcut;
   
-  mnemonic_menu = g_object_get_qdata (G_OBJECT (label), quark_mnemonic_menu);
-  
-  if (last_key != GDK_KEY_VoidSymbol)
+  if (priv->mnemonic_keyval == GDK_KEY_VoidSymbol)
     {
-      if (priv->mnemonic_window)
-       {
-         gtk_window_remove_mnemonic  (priv->mnemonic_window,
-                                      last_key,
-                                      widget);
-         priv->mnemonic_window = NULL;
-       }
-      if (mnemonic_menu)
-       {
-         _gtk_menu_shell_remove_mnemonic (GTK_MENU_SHELL (mnemonic_menu),
-                                          last_key,
-                                          widget);
-         mnemonic_menu = NULL;
-       }
+      if (priv->mnemonic_controller)
+        {
+          gtk_widget_remove_controller (widget, priv->mnemonic_controller);
+          priv->mnemonic_controller = NULL;
+        }
+      return;
     }
-  
-  if (priv->mnemonic_keyval == GDK_KEY_VoidSymbol)
-      goto done;
-
-  connect_mnemonics_visible_notify (GTK_LABEL (widget));
 
-  if (toplevel && gtk_widget_is_toplevel (toplevel))
+  if (priv->mnemonic_controller == NULL)
     {
-      GtkWidget *menu_shell;
-      
-      menu_shell = gtk_widget_get_ancestor (widget,
-                                           GTK_TYPE_MENU_SHELL);
-
-      if (menu_shell)
-       {
-         _gtk_menu_shell_add_mnemonic (GTK_MENU_SHELL (menu_shell),
-                                       priv->mnemonic_keyval,
-                                       widget);
-         mnemonic_menu = menu_shell;
-       }
+      priv->mnemonic_controller = gtk_shortcut_controller_new ();
+      gtk_event_controller_set_propagation_phase (priv->mnemonic_controller, GTK_PHASE_CAPTURE);
+      gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (priv->mnemonic_controller), 
GTK_SHORTCUT_SCOPE_MANAGED);
       
-      if (!GTK_IS_MENU (menu_shell))
-       {
-         gtk_window_add_mnemonic (GTK_WINDOW (toplevel),
-                                  priv->mnemonic_keyval,
-                                  widget);
-         priv->mnemonic_window = GTK_WINDOW (toplevel);
-       }
+      shortcut = gtk_shortcut_new ();
+      gtk_shortcut_set_trigger (shortcut, gtk_mnemonic_trigger_new (priv->mnemonic_keyval));
+      gtk_shortcut_set_mnemonic_activate (shortcut, TRUE);
+      gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (priv->mnemonic_controller), shortcut);
+      gtk_widget_add_controller (GTK_WIDGET (label), priv->mnemonic_controller);
+      g_object_unref (shortcut);
     }
-  
- done:
-  g_object_set_qdata (G_OBJECT (label), quark_mnemonic_menu, mnemonic_menu);
+  else
+    {
+      shortcut = g_list_model_get_item (G_LIST_MODEL (priv->mnemonic_controller), 0);
+      gtk_shortcut_set_trigger (shortcut, gtk_mnemonic_trigger_new (priv->mnemonic_keyval));
+      g_object_unref (shortcut);
+    }
+
+  connect_mnemonics_visible_notify (GTK_LABEL (widget));
 }
 
 static void
@@ -1826,13 +1799,12 @@ static void
 gtk_label_root (GtkWidget *widget)
 {
   GtkLabel *label = GTK_LABEL (widget);
-  GtkLabelPrivate *priv = gtk_label_get_instance_private (label);
   GtkSettings *settings;
   gboolean shortcuts_connected;
 
   GTK_WIDGET_CLASS (gtk_label_parent_class)->root (widget);
 
-  gtk_label_setup_mnemonic (label, gtk_widget_get_toplevel (widget), priv->mnemonic_keyval);
+  gtk_label_setup_mnemonic (label);
 
   /* The PangoContext is replaced when the display changes, so clear the layouts */
   gtk_label_clear_layout (GTK_LABEL (widget));
@@ -1855,17 +1827,6 @@ gtk_label_root (GtkWidget *widget)
   label_shortcut_setting_apply (GTK_LABEL (widget));
 }
 
-static void
-gtk_label_unroot (GtkWidget *widget)
-{
-  GtkLabel *label = GTK_LABEL (widget);
-  GtkLabelPrivate *priv = gtk_label_get_instance_private (label);
-
-  gtk_label_setup_mnemonic (label, NULL, priv->mnemonic_keyval);
-
-  GTK_WIDGET_CLASS (gtk_label_parent_class)->unroot (widget);
-}
-
 static void
 mnemonics_visible_apply (GtkWidget *widget,
                          gboolean   mnemonics_visible)
@@ -2122,7 +2083,7 @@ gtk_label_recalculate (GtkLabel *label)
 
   if (keyval != priv->mnemonic_keyval)
     {
-      gtk_label_setup_mnemonic (label, gtk_widget_get_toplevel (GTK_WIDGET (label)), keyval);
+      gtk_label_setup_mnemonic (label);
       g_object_notify_by_pspec (G_OBJECT (label), label_props[PROP_MNEMONIC_KEYVAL]);
     }
 


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