From 36d81d40858e4a2782b0a887554f3070c3efac46 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 7 Jan 2006 06:08:07 +0000 Subject: [PATCH] Fix actiongroup-action interaction that relied on actions connecting to 2006-01-07 Matthias Clasen Fix actiongroup-action interaction that relied on actions connecting to notify on themselves: * gtk/gtkaction.[hc]: Factor out the code updating the visibility/sensitivity of proxies into _gtk_action_sync_visible() and _gtk_action_sync_sensible(). * gtk/gtkactiongroup.c: Call the new functions when the group visibility/sensitivity changes. --- ChangeLog | 12 +++++++ ChangeLog.pre-2-10 | 12 +++++++ gtk/gtkaction.c | 81 +++++++++++++++++++++++++++----------------- gtk/gtkaction.h | 6 +++- gtk/gtkactiongroup.c | 12 +++---- gtk/gtkuimanager.c | 4 --- 6 files changed, 85 insertions(+), 42 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0f81c6d40..72d821f48 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2006-01-07 Matthias Clasen + + Fix actiongroup-action interaction that relied on + actions connecting to notify on themselves: + + * gtk/gtkaction.[hc]: Factor out the code updating the + visibility/sensitivity of proxies into _gtk_action_sync_visible() + and _gtk_action_sync_sensible(). + + * gtk/gtkactiongroup.c: Call the new functions when the + group visibility/sensitivity changes. + 2006-01-06 Matthias Clasen * gtk/gtkactiongroup.c (gtk_action_group_set_sensitive) diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 0f81c6d40..72d821f48 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,15 @@ +2006-01-07 Matthias Clasen + + Fix actiongroup-action interaction that relied on + actions connecting to notify on themselves: + + * gtk/gtkaction.[hc]: Factor out the code updating the + visibility/sensitivity of proxies into _gtk_action_sync_visible() + and _gtk_action_sync_sensible(). + + * gtk/gtkactiongroup.c: Call the new functions when the + group visibility/sensitivity changes. + 2006-01-06 Matthias Clasen * gtk/gtkactiongroup.c (gtk_action_group_set_sensitive) diff --git a/gtk/gtkaction.c b/gtk/gtkaction.c index 036a05734..a350b9eeb 100644 --- a/gtk/gtkaction.c +++ b/gtk/gtkaction.c @@ -603,7 +603,7 @@ _gtk_action_sync_menu_visible (GtkAction *action, g_return_if_fail (GTK_IS_MENU_ITEM (proxy)); g_return_if_fail (action == NULL || GTK_IS_ACTION (action)); - + if (action == NULL) action = g_object_get_qdata (G_OBJECT (proxy), quark_gtk_action_proxy); @@ -1057,6 +1057,22 @@ gtk_action_get_sensitive (GtkAction *action) return action->private_data->sensitive; } +void +_gtk_action_sync_sensitive (GtkAction *action) +{ + GSList *p; + GtkWidget *proxy; + gboolean sensitive; + + sensitive = gtk_action_is_sensitive (action); + + for (p = action->private_data->proxies; p; p = p->next) + { + proxy = (GtkWidget *)p->data; + gtk_widget_set_sensitive (proxy, sensitive); + } +} + /** * gtk_action_set_sensitive: * @action: the action object @@ -1073,9 +1089,6 @@ void gtk_action_set_sensitive (GtkAction *action, gboolean sensitive) { - GSList *p; - GtkWidget *proxy; - g_return_if_fail (GTK_IS_ACTION (action)); sensitive = sensitive != FALSE; @@ -1084,12 +1097,8 @@ gtk_action_set_sensitive (GtkAction *action, { action->private_data->sensitive = sensitive; - for (p = action->private_data->proxies; p; p = p->next) - { - proxy = (GtkWidget *)p->data; - gtk_widget_set_sensitive (proxy, sensitive); - } - + _gtk_action_sync_sensitive (action); + g_object_notify (G_OBJECT (action), "sensitive"); } } @@ -1137,6 +1146,36 @@ gtk_action_get_visible (GtkAction *action) return action->private_data->visible; } +void +_gtk_action_sync_visible (GtkAction *action) +{ + GSList *p; + GtkWidget *proxy; + GtkWidget *menu; + gboolean visible; + + visible = gtk_action_is_visible (action); + + for (p = action->private_data->proxies; p; p = p->next) + { + proxy = (GtkWidget *)p->data; + + if (GTK_IS_MENU_ITEM (proxy)) + { + menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy)); + + _gtk_action_sync_menu_visible (action, proxy, _gtk_menu_is_empty (menu)); + } + else + { + if (visible) + gtk_widget_show (proxy); + else + gtk_widget_hide (proxy); + } + } +} + /** * gtk_action_set_visible: * @action: the action object @@ -1153,9 +1192,6 @@ void gtk_action_set_visible (GtkAction *action, gboolean visible) { - GSList *p; - GtkWidget *proxy; - g_return_if_fail (GTK_IS_ACTION (action)); visible = visible != FALSE; @@ -1164,25 +1200,8 @@ gtk_action_set_visible (GtkAction *action, { action->private_data->visible = visible; - for (p = action->private_data->proxies; p; p = p->next) - { - proxy = (GtkWidget *)p->data; + _gtk_action_sync_visible (action); - if (GTK_IS_MENU_ITEM (proxy)) - { - GtkWidget *menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy)); - - _gtk_action_sync_menu_visible (action, proxy, _gtk_menu_is_empty (menu)); - } - else - { - if (visible) - gtk_widget_show (proxy); - else - gtk_widget_hide (proxy); - } - } - g_object_notify (G_OBJECT (action), "visible"); } } diff --git a/gtk/gtkaction.h b/gtk/gtkaction.h index c7e9f9d38..f7f4c04bf 100644 --- a/gtk/gtkaction.h +++ b/gtk/gtkaction.h @@ -121,7 +121,11 @@ void gtk_action_set_accel_path (GtkAction *action, const gchar *accel_path); void gtk_action_set_accel_group (GtkAction *action, GtkAccelGroup *accel_group); - +void _gtk_action_sync_sensitive (GtkAction *action); +void _gtk_action_sync_visible (GtkAction *action); +void _gtk_action_sync_menu_visible (GtkAction *action, + GtkWidget *proxy, + gboolean empty); G_END_DECLS diff --git a/gtk/gtkactiongroup.c b/gtk/gtkactiongroup.c index 5b5ba7321..91b2cb35c 100644 --- a/gtk/gtkactiongroup.c +++ b/gtk/gtkactiongroup.c @@ -420,10 +420,10 @@ static void cb_set_action_sensitivity (const gchar *name, GtkAction *action) { - /* Minor optimization, the action_groups state only affects actions that are - * themselves sensitive */ + /* Minor optimization, the action_groups state only affects actions + * that are themselves sensitive */ if (gtk_action_get_sensitive (action)) - g_object_notify (G_OBJECT (action), "sensitive"); + _gtk_action_sync_sensitive (action); } /** @@ -478,10 +478,10 @@ static void cb_set_action_visiblity (const gchar *name, GtkAction *action) { - /* Minor optimization, the action_groups state only affects actions that are - * themselves sensitive */ + /* Minor optimization, the action_groups state only affects actions + * that are themselves visible */ if (gtk_action_get_visible (action)) - g_object_notify (G_OBJECT (action), "visible"); + _gtk_action_sync_visible (action); } /** diff --git a/gtk/gtkuimanager.c b/gtk/gtkuimanager.c index 3c2732025..5d0453005 100644 --- a/gtk/gtkuimanager.c +++ b/gtk/gtkuimanager.c @@ -2008,10 +2008,6 @@ enum { SEPARATOR_MODE_HIDDEN }; -void _gtk_action_sync_menu_visible (GtkAction *action, - GtkWidget *proxy, - gboolean empty); - static void update_smart_separators (GtkWidget *proxy) { -- 2.43.2