summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--ChangeLog.pre-2-1012
-rw-r--r--gtk/gtkaction.c81
-rw-r--r--gtk/gtkaction.h6
-rw-r--r--gtk/gtkactiongroup.c12
-rw-r--r--gtk/gtkuimanager.c4
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 <mclasen@redhat.com>
+
+ 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 <mclasen@redhat.com>
* 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 <mclasen@redhat.com>
+
+ 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 <mclasen@redhat.com>
* 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)
{