[gtk/wip/chergert/fix-action-muxer-part-12: 1/2] widget: create action muxer early with proper g_class
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/chergert/fix-action-muxer-part-12: 1/2] widget: create action muxer early with proper g_class
- Date: Tue, 28 Apr 2020 22:18:57 +0000 (UTC)
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, ¶m_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]