[gtk/wip/chergert/fix-action-muxer-part-12: 1/2] widget: create action muxer early with proper g_class



commit ffda9e3829f83bff2c89cdaead5a365a3c6ffa6c
Author: Christian Hergert <chergert redhat com>
Date:   Tue Apr 28 14:11:56 2020 -0700

    widget: create action muxer early with proper g_class

 gtk/gtkactionhelper.c       |  2 +-
 gtk/gtkmenusectionbox.c     |  2 +-
 gtk/gtkpopovermenubar.c     |  2 +-
 gtk/gtkshortcutaction.c     |  2 +-
 gtk/gtkshortcutcontroller.c |  2 +-
 gtk/gtktext.c               |  2 +-
 gtk/gtktextview.c           |  2 +-
 gtk/gtkwidget.c             | 21 ++++++++++++++-------
 gtk/gtkwidgetprivate.h      |  5 +++--
 gtk/inspector/actions.c     |  2 +-
 gtk/inspector/prop-editor.c |  2 +-
 11 files changed, 26 insertions(+), 18 deletions(-)
---
diff --git a/gtk/gtkactionhelper.c b/gtk/gtkactionhelper.c
index d36e285951..0c8ea51d7c 100644
--- a/gtk/gtkactionhelper.c
+++ b/gtk/gtkactionhelper.c
@@ -398,7 +398,7 @@ gtk_action_helper_new (GtkActionable *widget)
   if (pspec && G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_BOOLEAN)
     g_object_get (G_OBJECT (helper->widget), "active", &helper->active, NULL);
 
-  helper->action_context = _gtk_widget_get_action_muxer (GTK_WIDGET (widget), TRUE);
+  helper->action_context = _gtk_widget_get_action_muxer (GTK_WIDGET (widget), NULL, TRUE);
 
   return helper;
 }
diff --git a/gtk/gtkmenusectionbox.c b/gtk/gtkmenusectionbox.c
index 6a36ae7510..adff8264e6 100644
--- a/gtk/gtkmenusectionbox.c
+++ b/gtk/gtkmenusectionbox.c
@@ -512,7 +512,7 @@ gtk_menu_section_box_new_toplevel (GtkPopoverMenu      *popover,
 
   gtk_popover_menu_add_submenu (popover, GTK_WIDGET (box), "main");
 
-  box->tracker = gtk_menu_tracker_new (GTK_ACTION_OBSERVABLE (_gtk_widget_get_action_muxer (GTK_WIDGET 
(box), TRUE)),
+  box->tracker = gtk_menu_tracker_new (GTK_ACTION_OBSERVABLE (_gtk_widget_get_action_muxer (GTK_WIDGET 
(box), NULL, TRUE)),
                                        model, TRUE, FALSE, FALSE, NULL,
                                        gtk_menu_section_box_insert_func,
                                        gtk_menu_section_box_remove_func, box);
diff --git a/gtk/gtkpopovermenubar.c b/gtk/gtkpopovermenubar.c
index 5adec80cba..346a6310ef 100644
--- a/gtk/gtkpopovermenubar.c
+++ b/gtk/gtkpopovermenubar.c
@@ -657,7 +657,7 @@ gtk_popover_menu_bar_set_menu_model (GtkPopoverMenuBar *bar,
 
       if (model)
         {
-          muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (bar), TRUE);
+          muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (bar), NULL, TRUE);
           bar->tracker = gtk_menu_tracker_new (GTK_ACTION_OBSERVABLE (muxer),
                                                model,
                                                FALSE,
diff --git a/gtk/gtkshortcutaction.c b/gtk/gtkshortcutaction.c
index a117cf042e..72aa1240c9 100644
--- a/gtk/gtkshortcutaction.c
+++ b/gtk/gtkshortcutaction.c
@@ -1069,7 +1069,7 @@ gtk_named_action_activate (GtkShortcutAction      *action,
   GActionGroup *action_group;
   gboolean enabled;
 
-  action_group = G_ACTION_GROUP (_gtk_widget_get_action_muxer (widget, FALSE));
+  action_group = G_ACTION_GROUP (_gtk_widget_get_action_muxer (widget, NULL, FALSE));
   if (action_group == NULL)
     return FALSE;
 
diff --git a/gtk/gtkshortcutcontroller.c b/gtk/gtkshortcutcontroller.c
index a3c62ead72..6ae5a3dbf7 100644
--- a/gtk/gtkshortcutcontroller.c
+++ b/gtk/gtkshortcutcontroller.c
@@ -431,7 +431,7 @@ update_accel (GtkShortcut *shortcut,
       !GTK_IS_KEYVAL_TRIGGER (trigger))
     return;
 
-  muxer = _gtk_widget_get_action_muxer (widget, set);
+  muxer = _gtk_widget_get_action_muxer (widget, NULL, set);
   if (!muxer)
     return;
 
diff --git a/gtk/gtktext.c b/gtk/gtktext.c
index 397c09b4d7..beb1dcbf91 100644
--- a/gtk/gtktext.c
+++ b/gtk/gtktext.c
@@ -6008,7 +6008,7 @@ append_bubble_item (GtkText    *self,
   action_name = g_variant_get_string (att, NULL);
   g_variant_unref (att);
 
-  muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (self), FALSE);
+  muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (self), NULL, FALSE);
   if (!g_action_group_get_action_enabled (G_ACTION_GROUP (muxer), action_name))
     return;
 
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 8426cbb4ac..7ffa2fa230 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -8795,7 +8795,7 @@ append_bubble_item (GtkTextView *text_view,
   action_name = g_variant_get_string (att, NULL);
   g_variant_unref (att);
 
-  group = G_ACTION_GROUP (_gtk_widget_get_action_muxer (GTK_WIDGET (text_view), FALSE));
+  group = G_ACTION_GROUP (_gtk_widget_get_action_muxer (GTK_WIDGET (text_view), NULL, FALSE));
   if (group)
     {
       g_action_group_query_action (group, action_name, &enabled, &param_type, &state_type, NULL, NULL);
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index e060581b6d..bff01bd016 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -2321,6 +2321,12 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
       break;
     }
 
+  /* Create the action muxer early if it is necessary so that all GtkWidget
+   * subclasses have access to it with the proper actions registered (even
+   * though they don't have the g_class pointer available).
+   */
+  (void)_gtk_widget_get_action_muxer (widget, g_class, FALSE);
+
   /* this will be set to TRUE if the widget gets a child or if the
    * expand flag is set on the widget, but until one of those happen
    * we know the expand is already properly FALSE.
@@ -10685,7 +10691,7 @@ gtk_widget_get_parent_muxer (GtkWidget *widget,
   parent = _gtk_widget_get_parent (widget);
 
   if (parent)
-    return _gtk_widget_get_action_muxer (parent, create);
+    return _gtk_widget_get_action_muxer (parent, NULL, create);
 
   return NULL;
 }
@@ -10704,11 +10710,12 @@ _gtk_widget_update_parent_muxer (GtkWidget *widget)
 }
 
 GtkActionMuxer *
-_gtk_widget_get_action_muxer (GtkWidget *widget,
-                              gboolean   create)
+_gtk_widget_get_action_muxer (GtkWidget      *widget,
+                              GtkWidgetClass *g_class,
+                              gboolean        create)
 {
   GtkActionMuxer *muxer;
-  GtkWidgetClass *widget_class = GTK_WIDGET_GET_CLASS (widget);
+  GtkWidgetClass *widget_class = g_class ? g_class : GTK_WIDGET_GET_CLASS (widget);
   GtkWidgetClassPrivate *priv = widget_class->priv;
 
   muxer = (GtkActionMuxer*)g_object_get_qdata (G_OBJECT (widget), quark_action_muxer);
@@ -10758,7 +10765,7 @@ gtk_widget_insert_action_group (GtkWidget    *widget,
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (name != NULL);
 
-  muxer = _gtk_widget_get_action_muxer (widget, TRUE);
+  muxer = _gtk_widget_get_action_muxer (widget, NULL, TRUE);
 
   if (group)
     gtk_action_muxer_insert (muxer, name, group);
@@ -11242,7 +11249,7 @@ gtk_widget_activate_action_variant (GtkWidget  *widget,
 {
   GtkActionMuxer *muxer;
 
-  muxer = _gtk_widget_get_action_muxer (widget, FALSE);
+  muxer = _gtk_widget_get_action_muxer (widget, NULL, FALSE);
   if (muxer == NULL)
     return FALSE;
 
@@ -12487,7 +12494,7 @@ gtk_widget_action_set_enabled (GtkWidget  *widget,
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  muxer = _gtk_widget_get_action_muxer (widget, TRUE);
+  muxer = _gtk_widget_get_action_muxer (widget, NULL, TRUE);
   gtk_action_muxer_action_enabled_changed (muxer, action_name, enabled);
 }
 
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index 5085353525..f8f6060b60 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -278,8 +278,9 @@ void              gtk_system_setting_changed               (GdkDisplay
                                                             GtkSystemSetting     setting);
 
 void              _gtk_widget_update_parent_muxer          (GtkWidget    *widget);
-GtkActionMuxer *  _gtk_widget_get_action_muxer             (GtkWidget    *widget,
-                                                            gboolean      create);
+GtkActionMuxer *  _gtk_widget_get_action_muxer             (GtkWidget      *widget,
+                                                            GtkWidgetClass *widget_clsas,
+                                                            gboolean        create);
 
 gboolean          _gtk_widget_consumes_motion              (GtkWidget           *widget,
                                                             GdkEventSequence    *sequence);
diff --git a/gtk/inspector/actions.c b/gtk/inspector/actions.c
index 4d2daf0b0c..b66d5df17e 100644
--- a/gtk/inspector/actions.c
+++ b/gtk/inspector/actions.c
@@ -320,7 +320,7 @@ gtk_inspector_actions_set_object (GtkInspectorActions *sl,
     {
       GtkActionMuxer *muxer;
 
-      muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (object), FALSE);
+      muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (object), NULL, FALSE);
       if (muxer)
         add_group (sl, page, G_ACTION_GROUP (muxer));
     }
diff --git a/gtk/inspector/prop-editor.c b/gtk/inspector/prop-editor.c
index 8b881f5f2f..bf77356162 100644
--- a/gtk/inspector/prop-editor.c
+++ b/gtk/inspector/prop-editor.c
@@ -1280,7 +1280,7 @@ find_action_owner (GtkActionable *actionable)
     {
       GtkActionMuxer *muxer;
 
-      muxer = _gtk_widget_get_action_muxer (widget, FALSE);
+      muxer = _gtk_widget_get_action_muxer (widget, NULL, FALSE);
       if (muxer && gtk_action_muxer_find (muxer, full_name, NULL))
         return (GObject *)widget;
 


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