summaryrefslogtreecommitdiff
path: root/gtk/gtkaction.c
diff options
context:
space:
mode:
authorMatthias Clasen <matthiasc@src.gnome.org>2009-01-23 15:15:28 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2009-01-23 15:15:28 +0000
commitbb72b647f6a40831a46fb731a5929831d95c2b29 (patch)
tree5bd4a577f50fe360a0cd9a06ada7adc65c3c5508 /gtk/gtkaction.c
parentacd40c45f781a84c297be34d5d18f7681e78d46e (diff)
downloadgtk+-bb72b647f6a40831a46fb731a5929831d95c2b29.tar.gz
i Bug 560228 – Add "action-controller" property to GtkWidgetClass
Rework the way actions and proxies interact, to make the interaction less ad hoc, more extensible, and better suited for support in GUI builders like glade. To be used as a proxy, a widget must now implement the GtkActivatable interface, and GtkActivatable implementations are responsible for syncing their appearance with the action and for activating the action. All the widgets that are commonly used as proxies implement GtkActivatable now. Patch by Tristan van Berkom. * gtk/gtkactivatable.[hc]: The GtkActivatable interface. * gtk/gtkbutton.c: * gtk/gtktogglebutton.c: * gtk/gtktoolitem.c: * gtk/gtktoolbutton.c: * gtk/gtktoggletoolbutton.c: * gtk/gtkmenuitem.c: * gtk/gtkcheckmenuitem.c: * gtk/gtkimagemenuitem.c: * gtk/gtkradiomenuitem.c: * gtk/gtkrecentchooserprivate.h: * gtk/gtkrecentchooser.c: * gtk/gtkrecentchooserdefault.c: * gtk/gtkrecentchoosermenu.c: Implement GtkActivatable. * gtk/gtkaction.[hc]: Move appearance synchronization to GtkActivatable implementations. * gtk/gtkradioaction.c: * gtk/gtkrecentaction.c: * gtk/gtktoggleaction.c: * gtk/gtkactiongroup.c: Adapt. * gtk/gtk.h: Include gtkactivatable.h * gtk/gtk.symbols: Add new functions svn path=/trunk/; revision=22195
Diffstat (limited to 'gtk/gtkaction.c')
-rw-r--r--gtk/gtkaction.c712
1 files changed, 154 insertions, 558 deletions
diff --git a/gtk/gtkaction.c b/gtk/gtkaction.c
index 59c52d3552..6d29ca4e34 100644
--- a/gtk/gtkaction.c
+++ b/gtk/gtkaction.c
@@ -47,6 +47,7 @@
#include "gtktoolbar.h"
#include "gtkprivate.h"
#include "gtkbuildable.h"
+#include "gtkactivatable.h"
#include "gtkalias.h"
@@ -71,6 +72,8 @@ struct _GtkActionPrivate
guint is_important : 1;
guint hide_if_empty : 1;
guint visible_overflown : 1;
+ guint recursion_guard : 1;
+ guint activate_blocked : 1;
/* accelerator */
guint accel_count;
@@ -120,10 +123,6 @@ G_DEFINE_TYPE_WITH_CODE (GtkAction, gtk_action, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
gtk_action_buildable_init))
-
-static GQuark quark_gtk_action_proxy = 0;
-static const gchar gtk_action_proxy_key[] = "gtk-action";
-
static void gtk_action_finalize (GObject *object);
static void gtk_action_set_property (GObject *object,
guint prop_id,
@@ -135,8 +134,6 @@ static void gtk_action_get_property (GObject *object,
GParamSpec *pspec);
static void gtk_action_set_action_group (GtkAction *action,
GtkActionGroup *action_group);
-static void gtk_action_sync_tooltip (GtkAction *action,
- GtkWidget *proxy);
static GtkWidget *create_menu_item (GtkAction *action);
static GtkWidget *create_tool_item (GtkAction *action);
@@ -144,7 +141,7 @@ static void connect_proxy (GtkAction *action,
GtkWidget *proxy);
static void disconnect_proxy (GtkAction *action,
GtkWidget *proxy);
-
+
static void closure_accel_activate (GClosure *closure,
GValue *return_value,
guint n_param_values,
@@ -160,8 +157,6 @@ gtk_action_class_init (GtkActionClass *klass)
{
GObjectClass *gobject_class;
- quark_gtk_action_proxy = g_quark_from_static_string (gtk_action_proxy_key);
-
gobject_class = G_OBJECT_CLASS (klass);
gobject_class->finalize = gtk_action_finalize;
@@ -170,14 +165,13 @@ gtk_action_class_init (GtkActionClass *klass)
klass->activate = NULL;
- klass->create_menu_item = create_menu_item;
- klass->create_tool_item = create_tool_item;
- klass->create_menu = NULL;
- klass->connect_proxy = connect_proxy;
- klass->disconnect_proxy = disconnect_proxy;
-
- klass->menu_item_type = GTK_TYPE_IMAGE_MENU_ITEM;
+ klass->create_menu_item = create_menu_item;
+ klass->create_tool_item = create_tool_item;
+ klass->create_menu = NULL;
+ klass->menu_item_type = GTK_TYPE_IMAGE_MENU_ITEM;
klass->toolbar_item_type = GTK_TYPE_TOOL_BUTTON;
+ klass->connect_proxy = connect_proxy;
+ klass->disconnect_proxy = disconnect_proxy;
g_object_class_install_property (gobject_class,
PROP_NAME,
@@ -194,6 +188,9 @@ gtk_action_class_init (GtkActionClass *klass)
* The label used for menu items and buttons that activate
* this action. If the label is %NULL, GTK+ uses the stock
* label specified via the stock-id property.
+ *
+ * This is an appearance property and thus only applies if
+ * #GtkActivatable:use-action-appearance is %TRUE.
*/
g_object_class_install_property (gobject_class,
PROP_LABEL,
@@ -208,6 +205,9 @@ gtk_action_class_init (GtkActionClass *klass)
* GtkAction:short-label:
*
* A shorter label that may be used on toolbar buttons.
+ *
+ * This is an appearance property and thus only applies if
+ * #GtkActivatable:use-action-appearance is %TRUE.
*/
g_object_class_install_property (gobject_class,
PROP_SHORT_LABEL,
@@ -230,6 +230,9 @@ gtk_action_class_init (GtkActionClass *klass)
* GtkAction:stock-id:
*
* The stock icon displayed in widgets representing this action.
+ *
+ * This is an appearance property and thus only applies if
+ * #GtkActivatable:use-action-appearance is %TRUE.
*/
g_object_class_install_property (gobject_class,
PROP_STOCK_ID,
@@ -247,6 +250,9 @@ gtk_action_class_init (GtkActionClass *klass)
* Note that the stock icon is preferred, if the #GtkAction:stock-id
* property holds the id of an existing stock icon.
*
+ * This is an appearance property and thus only applies if
+ * #GtkActivatable:use-action-appearance is %TRUE.
+ *
* Since: 2.16
*/
g_object_class_install_property (gobject_class,
@@ -265,6 +271,9 @@ gtk_action_class_init (GtkActionClass *klass)
* property holds the id of an existing stock icon, and the #GIcon is
* preferred if the #GtkAction:gicon property is set.
*
+ * This is an appearance property and thus only applies if
+ * #GtkActivatable:use-action-appearance is %TRUE.
+ *
* Since: 2.10
*/
g_object_class_install_property (gobject_class,
@@ -381,6 +390,7 @@ gtk_action_init (GtkAction *action)
action->private_data->visible_overflown = TRUE;
action->private_data->is_important = FALSE;
action->private_data->hide_if_empty = TRUE;
+ action->private_data->activate_blocked = FALSE;
action->private_data->sensitive = TRUE;
action->private_data->visible = TRUE;
@@ -634,12 +644,30 @@ static void
remove_proxy (GtkAction *action,
GtkWidget *proxy)
{
- if (GTK_IS_MENU_ITEM (proxy))
- gtk_action_disconnect_accelerator (action);
-
action->private_data->proxies = g_slist_remove (action->private_data->proxies, proxy);
}
+static void
+connect_proxy (GtkAction *action,
+ GtkWidget *proxy)
+{
+ action->private_data->proxies = g_slist_prepend (action->private_data->proxies, proxy);
+
+ if (action->private_data->action_group)
+ _gtk_action_group_emit_connect_proxy (action->private_data->action_group, action, proxy);
+
+}
+
+static void
+disconnect_proxy (GtkAction *action,
+ GtkWidget *proxy)
+{
+ remove_proxy (action, proxy);
+
+ if (action->private_data->action_group)
+ _gtk_action_group_emit_disconnect_proxy (action->private_data->action_group, action, proxy);
+}
+
/**
* _gtk_action_sync_menu_visible:
* @action: a #GtkAction, or %NULL to determine the action from @proxy
@@ -670,7 +698,7 @@ _gtk_action_sync_menu_visible (GtkAction *action,
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);
+ action = gtk_activatable_get_related_action (GTK_ACTIVATABLE (proxy));
if (action)
{
@@ -685,257 +713,6 @@ _gtk_action_sync_menu_visible (GtkAction *action,
gtk_widget_hide (proxy);
}
-gboolean _gtk_menu_is_empty (GtkWidget *menu);
-
-static gboolean
-gtk_action_create_menu_proxy (GtkToolItem *tool_item,
- GtkAction *action)
-{
- GtkWidget *menu_item;
-
- if (action->private_data->visible_overflown)
- {
- menu_item = gtk_action_create_menu_item (action);
-
- g_object_ref_sink (menu_item);
-
- gtk_tool_item_set_proxy_menu_item (tool_item,
- "gtk-action-menu-item", menu_item);
- g_object_unref (menu_item);
- }
- else
- gtk_tool_item_set_proxy_menu_item (tool_item,
- "gtk-action-menu-item", NULL);
-
- return TRUE;
-}
-
-static void
-connect_proxy (GtkAction *action,
- GtkWidget *proxy)
-{
- g_object_ref (action);
- g_object_set_qdata_full (G_OBJECT (proxy), quark_gtk_action_proxy, action,
- g_object_unref);
-
- /* add this widget to the list of proxies */
- action->private_data->proxies = g_slist_prepend (action->private_data->proxies, proxy);
- g_object_weak_ref (G_OBJECT (proxy), (GWeakNotify)remove_proxy, action);
-
- gtk_widget_set_sensitive (proxy, gtk_action_is_sensitive (action));
- if (gtk_action_is_visible (action))
- gtk_widget_show (proxy);
- else
- gtk_widget_hide (proxy);
- gtk_widget_set_no_show_all (proxy, TRUE);
-
- if (GTK_IS_MENU_ITEM (proxy))
- {
- GtkWidget *label;
- /* menu item specific synchronisers ... */
-
- if (action->private_data->accel_quark)
- {
- gtk_action_connect_accelerator (action);
- gtk_menu_item_set_accel_path (GTK_MENU_ITEM (proxy),
- g_quark_to_string (action->private_data->accel_quark));
- }
-
- label = GTK_BIN (proxy)->child;
-
- /* make sure label is a label */
- if (label && !GTK_IS_LABEL (label))
- {
- gtk_container_remove (GTK_CONTAINER (proxy), label);
- label = NULL;
- }
-
- if (!label)
- label = g_object_new (GTK_TYPE_ACCEL_LABEL,
- "use-underline", TRUE,
- "xalign", 0.0,
- "visible", TRUE,
- "parent", proxy,
- NULL);
-
- if (GTK_IS_ACCEL_LABEL (label) && action->private_data->accel_quark)
- g_object_set (label,
- "accel-closure", action->private_data->accel_closure,
- NULL);
-
- gtk_label_set_label (GTK_LABEL (label), action->private_data->label);
-
- if (GTK_IS_IMAGE_MENU_ITEM (proxy))
- {
- GtkWidget *image;
-
- image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (proxy));
- if (image && !GTK_IS_IMAGE (image))
- {
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (proxy), NULL);
- image = NULL;
- }
- if (!image)
- {
- image = gtk_image_new ();
- gtk_widget_show (image);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (proxy),
- image);
- }
-
- if (action->private_data->stock_id &&
- gtk_icon_factory_lookup_default (action->private_data->stock_id))
- gtk_image_set_from_stock (GTK_IMAGE (image),
- action->private_data->stock_id, GTK_ICON_SIZE_MENU);
- else if (action->private_data->gicon)
- gtk_image_set_from_gicon (GTK_IMAGE (image),
- action->private_data->gicon, GTK_ICON_SIZE_MENU);
- else if (action->private_data->icon_name)
- gtk_image_set_from_icon_name (GTK_IMAGE (image),
- action->private_data->icon_name, GTK_ICON_SIZE_MENU);
- else
- gtk_image_clear (GTK_IMAGE (image));
- }
-
- if (gtk_menu_item_get_submenu (GTK_MENU_ITEM (proxy)) == NULL)
- g_signal_connect_object (proxy, "activate",
- G_CALLBACK (gtk_action_activate), action,
- G_CONNECT_SWAPPED);
-
- }
- else if (GTK_IS_TOOL_ITEM (proxy))
- {
- /* toolbar button specific synchronisers ... */
- if (GTK_IS_TOOL_BUTTON (proxy))
- {
- GtkWidget *image;
- GtkIconSize icon_size;
-
- g_object_set (proxy,
- "visible-horizontal", action->private_data->visible_horizontal,
- "visible-vertical", action->private_data->visible_vertical,
- "is-important", action->private_data->is_important,
- "label", action->private_data->short_label,
- "use-underline", TRUE,
- "stock-id", action->private_data->stock_id,
- "icon-name", action->private_data->icon_name,
- NULL);
-
- if (action->private_data->stock_id &&
- gtk_icon_factory_lookup_default (action->private_data->stock_id))
- {
- /* use the stock icon */
- gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (proxy), NULL);
- }
- else if (action->private_data->gicon)
- {
- icon_size = gtk_tool_item_get_icon_size (GTK_TOOL_ITEM (proxy));
- image = gtk_tool_button_get_icon_widget (GTK_TOOL_BUTTON (proxy));
- if (!image)
- {
- image = gtk_image_new ();
- gtk_widget_show (image);
- gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (proxy),
- image);
- }
-
- gtk_image_set_from_gicon (GTK_IMAGE (image),
- action->private_data->gicon,
- icon_size);
- }
-
- g_signal_connect_object (proxy, "clicked",
- G_CALLBACK (gtk_action_activate), action,
- G_CONNECT_SWAPPED);
- }
- else
- {
- g_object_set (proxy,
- "visible-horizontal", action->private_data->visible_horizontal,
- "visible-vertical", action->private_data->visible_vertical,
- "is-important", action->private_data->is_important,
- NULL);
- }
-
- gtk_action_sync_tooltip (action, proxy);
-
- g_signal_connect_object (proxy, "create-menu-proxy",
- G_CALLBACK (gtk_action_create_menu_proxy),
- action, 0);
-
- gtk_tool_item_rebuild_menu (GTK_TOOL_ITEM (proxy));
- }
- else if (GTK_IS_BUTTON (proxy))
- {
- /* button specific synchronisers ... */
- if (gtk_button_get_use_stock (GTK_BUTTON (proxy)))
- {
- /* synchronise stock-id */
- g_object_set (proxy,
- "label", action->private_data->stock_id,
- NULL);
- }
- else
- {
- GtkWidget *image;
-
- image = gtk_button_get_image (GTK_BUTTON (proxy));
-
- if (GTK_IS_IMAGE (image) ||
- GTK_BIN (proxy)->child == NULL ||
- GTK_IS_LABEL (GTK_BIN (proxy)->child))
- {
- /* synchronise the label */
- g_object_set (proxy,
- "label", action->private_data->short_label,
- "use-underline", TRUE,
- NULL);
- }
-
- if (GTK_IS_IMAGE (image) &&
- (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
- gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_GICON))
- gtk_image_set_from_gicon (GTK_IMAGE (image),
- action->private_data->gicon, GTK_ICON_SIZE_MENU);
- else if (GTK_IS_IMAGE (image) &&
- (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
- gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_ICON_NAME))
- gtk_image_set_from_icon_name (GTK_IMAGE (image),
- action->private_data->icon_name, GTK_ICON_SIZE_MENU);
- }
- /* we leave the button alone if there is a custom child */
- g_signal_connect_object (proxy, "clicked",
- G_CALLBACK (gtk_action_activate), action,
- G_CONNECT_SWAPPED);
- }
-
- if (action->private_data->action_group)
- _gtk_action_group_emit_connect_proxy (action->private_data->action_group, action, proxy);
-}
-
-static void
-disconnect_proxy (GtkAction *action,
- GtkWidget *proxy)
-{
- g_object_set_qdata (G_OBJECT (proxy), quark_gtk_action_proxy, NULL);
-
- g_object_weak_unref (G_OBJECT (proxy), (GWeakNotify)remove_proxy, action);
- remove_proxy (action, proxy);
-
- /* disconnect the activate handler */
- g_signal_handlers_disconnect_by_func (proxy,
- G_CALLBACK (gtk_action_activate),
- action);
-
- /* toolbar button specific synchronisers ... */
- g_signal_handlers_disconnect_by_func (proxy,
- G_CALLBACK (gtk_action_create_menu_proxy),
- action);
-
- if (action->private_data->action_group)
- _gtk_action_group_emit_disconnect_proxy (action->private_data->action_group, action, proxy);
-}
-
void
_gtk_action_emit_activate (GtkAction *action)
{
@@ -973,11 +750,43 @@ gtk_action_activate (GtkAction *action)
{
g_return_if_fail (GTK_IS_ACTION (action));
- if (gtk_action_is_sensitive (action))
+ if (action->private_data->activate_blocked == FALSE &&
+ gtk_action_is_sensitive (action))
_gtk_action_emit_activate (action);
}
/**
+ * gtk_action_block_activate:
+ *
+ * Disable activation signals from the action
+ *
+ * This is needed when updating the state of your proxy
+ * #GtkActivatable widget could result in calling gtk_action_activate(),
+ * this is a convenience function to avoid recursing in those
+ * cases (updating toggle state for instance).
+ */
+void
+gtk_action_block_activate (GtkAction *action)
+{
+ g_return_if_fail (GTK_IS_ACTION (action));
+
+ action->private_data->activate_blocked = TRUE;
+}
+
+/**
+ * gtk_action_unblock_activate:
+ *
+ * Reenable activation signals from the action
+ */
+void
+gtk_action_unblock_activate (GtkAction *action)
+{
+ g_return_if_fail (GTK_IS_ACTION (action));
+
+ action->private_data->activate_blocked = FALSE;
+}
+
+/**
* gtk_action_create_icon:
* @action: the action object
* @icon_size: the size of the icon that should be created.
@@ -1024,7 +833,8 @@ gtk_action_create_menu_item (GtkAction *action)
menu_item = GTK_ACTION_GET_CLASS (action)->create_menu_item (action);
- GTK_ACTION_GET_CLASS (action)->connect_proxy (action, menu_item);
+ gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (menu_item), TRUE);
+ gtk_activatable_set_related_action (GTK_ACTIVATABLE (menu_item), action);
return menu_item;
}
@@ -1048,11 +858,32 @@ gtk_action_create_tool_item (GtkAction *action)
button = GTK_ACTION_GET_CLASS (action)->create_tool_item (action);
- GTK_ACTION_GET_CLASS (action)->connect_proxy (action, button);
+ gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (button), TRUE);
+ gtk_activatable_set_related_action (GTK_ACTIVATABLE (button), action);
return button;
}
+void
+_gtk_action_add_to_proxy_list (GtkAction *action,
+ GtkWidget *proxy)
+{
+ g_return_if_fail (GTK_IS_ACTION (action));
+ g_return_if_fail (GTK_IS_WIDGET (proxy));
+
+ GTK_ACTION_GET_CLASS (action)->connect_proxy (action, proxy);
+}
+
+void
+_gtk_action_remove_from_proxy_list (GtkAction *action,
+ GtkWidget *proxy)
+{
+ g_return_if_fail (GTK_IS_ACTION (action));
+ g_return_if_fail (GTK_IS_WIDGET (proxy));
+
+ GTK_ACTION_GET_CLASS (action)->disconnect_proxy (action, proxy);
+}
+
/**
* gtk_action_connect_proxy:
* @action: the action object
@@ -1067,22 +898,20 @@ gtk_action_create_tool_item (GtkAction *action)
* first.
*
* Since: 2.4
+ *
+ * Deprecated 2.16: Use gtk_activatable_set_related_action() instead.
*/
void
gtk_action_connect_proxy (GtkAction *action,
GtkWidget *proxy)
{
- GtkAction *prev_action;
-
g_return_if_fail (GTK_IS_ACTION (action));
g_return_if_fail (GTK_IS_WIDGET (proxy));
+ g_return_if_fail (GTK_IS_ACTIVATABLE (proxy));
- prev_action = g_object_get_qdata (G_OBJECT (proxy), quark_gtk_action_proxy);
+ gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (proxy), TRUE);
- if (prev_action)
- GTK_ACTION_GET_CLASS (action)->disconnect_proxy (prev_action, proxy);
-
- GTK_ACTION_GET_CLASS (action)->connect_proxy (action, proxy);
+ gtk_activatable_set_related_action (GTK_ACTIVATABLE (proxy), action);
}
/**
@@ -1094,6 +923,8 @@ gtk_action_connect_proxy (GtkAction *action,
* Does <emphasis>not</emphasis> destroy the widget, however.
*
* Since: 2.4
+ *
+ * Deprecated 2.16: Use gtk_activatable_set_related_action() instead.
*/
void
gtk_action_disconnect_proxy (GtkAction *action,
@@ -1102,9 +933,7 @@ gtk_action_disconnect_proxy (GtkAction *action,
g_return_if_fail (GTK_IS_ACTION (action));
g_return_if_fail (GTK_IS_WIDGET (proxy));
- g_return_if_fail (g_object_get_qdata (G_OBJECT (proxy), quark_gtk_action_proxy) == action);
-
- GTK_ACTION_GET_CLASS (action)->disconnect_proxy (action, proxy);
+ gtk_activatable_set_related_action (GTK_ACTIVATABLE (proxy), NULL);
}
/**
@@ -1139,15 +968,19 @@ gtk_action_get_proxies (GtkAction *action)
* %NULL, if it is not attached to an action.
*
* Since: 2.10
+ *
+ * Deprecated 2.16: Use gtk_activatable_get_related_action() instead.
*/
GtkAction*
gtk_widget_get_action (GtkWidget *widget)
{
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
-
- return g_object_get_qdata (G_OBJECT (widget), quark_gtk_action_proxy);
-}
+ if (GTK_IS_ACTIVATABLE (widget))
+ return gtk_activatable_get_related_action (GTK_ACTIVATABLE (widget));
+
+ return NULL;
+}
/**
* gtk_action_get_name:
@@ -1211,22 +1044,6 @@ 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
@@ -1251,8 +1068,6 @@ gtk_action_set_sensitive (GtkAction *action,
{
action->private_data->sensitive = sensitive;
- _gtk_action_sync_sensitive (action);
-
g_object_notify (G_OBJECT (action), "sensitive");
}
}
@@ -1300,36 +1115,6 @@ 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
@@ -1354,8 +1139,6 @@ gtk_action_set_visible (GtkAction *action,
{
action->private_data->visible = visible;
- _gtk_action_sync_visible (action);
-
g_object_notify (G_OBJECT (action), "visible");
}
}
@@ -1374,8 +1157,7 @@ void
gtk_action_set_is_important (GtkAction *action,
gboolean is_important)
{
- GSList *p;
- GtkWidget *proxy;
+ g_return_if_fail (GTK_IS_ACTION (action));
g_return_if_fail (GTK_IS_ACTION (action));
@@ -1384,15 +1166,6 @@ gtk_action_set_is_important (GtkAction *action,
if (action->private_data->is_important != is_important)
{
action->private_data->is_important = is_important;
-
- for (p = action->private_data->proxies; p; p = p->next)
- {
- proxy = (GtkWidget *)p->data;
-
- if (GTK_IS_TOOL_ITEM (proxy))
- gtk_tool_item_set_is_important (GTK_TOOL_ITEM (proxy),
- is_important);
- }
g_object_notify (G_OBJECT (action), "is-important");
}
@@ -1403,12 +1176,12 @@ gtk_action_set_is_important (GtkAction *action,
* @action: a #GtkAction
*
* Checks whether @action is important or not
- *
+ *
* Returns: whether @action is important
*
* Since: 2.16
*/
-gboolean
+gboolean
gtk_action_get_is_important (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), FALSE);
@@ -1429,8 +1202,6 @@ void
gtk_action_set_label (GtkAction *action,
const gchar *label)
{
- GSList *p;
- GtkWidget *proxy, *child;
gchar *tmp;
g_return_if_fail (GTK_IS_ACTION (action));
@@ -1447,21 +1218,7 @@ gtk_action_set_label (GtkAction *action,
if (gtk_stock_lookup (action->private_data->stock_id, &stock_item))
action->private_data->label = g_strdup (stock_item.label);
}
-
- for (p = action->private_data->proxies; p; p = p->next)
- {
- proxy = (GtkWidget *)p->data;
-
- if (GTK_IS_MENU_ITEM (proxy))
- {
- child = GTK_BIN (proxy)->child;
-
- if (GTK_IS_LABEL (child))
- gtk_label_set_label (GTK_LABEL (child),
- action->private_data->label);
- }
- }
-
+
g_object_notify (G_OBJECT (action), "label");
/* if short_label is unset, set short_label=label */
@@ -1482,7 +1239,7 @@ gtk_action_set_label (GtkAction *action,
*
* Since: 2.16
*/
-G_CONST_RETURN gchar *
+G_CONST_RETURN gchar *
gtk_action_get_label (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
@@ -1495,16 +1252,14 @@ gtk_action_get_label (GtkAction *action)
* @action: a #GtkAction
* @label: the label text to set
*
- * Sets a shorter label on @action.
+ * Sets a shorter label text on @action.
*
* Since: 2.16
*/
void
-gtk_action_set_short_label (GtkAction *action,
+gtk_action_set_short_label (GtkAction *action,
const gchar *label)
{
- GSList *p;
- GtkWidget *proxy, *child;
gchar *tmp;
g_return_if_fail (GTK_IS_ACTION (action));
@@ -1517,29 +1272,6 @@ gtk_action_set_short_label (GtkAction *action,
if (!action->private_data->short_label_set)
action->private_data->short_label = g_strdup (action->private_data->label);
- for (p = action->private_data->proxies; p; p = p->next)
- {
- proxy = (GtkWidget *)p->data;
-
- if (GTK_IS_TOOL_BUTTON (proxy))
- gtk_tool_button_set_label (GTK_TOOL_BUTTON (proxy),
- action->private_data->short_label);
- else if (GTK_IS_BUTTON (proxy) &&
- !gtk_button_get_use_stock (GTK_BUTTON (proxy)))
- {
- GtkWidget *image;
-
- child = GTK_BIN (proxy)->child;
-
- image = gtk_button_get_image (GTK_BUTTON (proxy));
-
- if (GTK_IS_IMAGE (image) ||
- child == NULL || GTK_IS_LABEL (child))
- gtk_button_set_label (GTK_BUTTON (proxy),
- action->private_data->short_label);
- }
- }
-
g_object_notify (G_OBJECT (action), "short-label");
}
@@ -1548,16 +1280,17 @@ gtk_action_set_short_label (GtkAction *action,
* @action: a #GtkAction
* @label: the label text to set
*
- * Sets a shorter label on @action.
+ * Gets the short label text of @action.
+ *
+ * Returns: the short label text.
*
* Since: 2.16
*/
-G_CONST_RETURN gchar *
+G_CONST_RETURN gchar *
gtk_action_get_short_label (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
- g_object_notify (G_OBJECT (action), "short-label");
return action->private_data->short_label;
}
@@ -1574,8 +1307,7 @@ void
gtk_action_set_visible_horizontal (GtkAction *action,
gboolean visible_horizontal)
{
- GSList *p;
- GtkWidget *proxy;
+ g_return_if_fail (GTK_IS_ACTION (action));
g_return_if_fail (GTK_IS_ACTION (action));
@@ -1584,15 +1316,6 @@ gtk_action_set_visible_horizontal (GtkAction *action,
if (action->private_data->visible_horizontal != visible_horizontal)
{
action->private_data->visible_horizontal = visible_horizontal;
-
- for (p = action->private_data->proxies; p; p = p->next)
- {
- proxy = (GtkWidget *)p->data;
-
- if (GTK_IS_TOOL_ITEM (proxy))
- gtk_tool_item_set_visible_horizontal (GTK_TOOL_ITEM (proxy),
- visible_horizontal);
- }
g_object_notify (G_OBJECT (action), "visible-horizontal");
}
@@ -1603,12 +1326,12 @@ gtk_action_set_visible_horizontal (GtkAction *action,
* @action: a #GtkAction
*
* Checks whether @action is visible when horizontal
- *
+ *
* Returns: whether @action is visible when horizontal
*
* Since: 2.16
*/
-gboolean
+gboolean
gtk_action_get_visible_horizontal (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), FALSE);
@@ -1621,7 +1344,7 @@ gtk_action_get_visible_horizontal (GtkAction *action)
* @action: a #GtkAction
* @visible_vertical: whether the action is visible vertically
*
- * Sets whether @action is visible when vertical
+ * Sets whether @action is visible when vertical
*
* Since: 2.16
*/
@@ -1629,8 +1352,7 @@ void
gtk_action_set_visible_vertical (GtkAction *action,
gboolean visible_vertical)
{
- GSList *p;
- GtkWidget *proxy;
+ g_return_if_fail (GTK_IS_ACTION (action));
g_return_if_fail (GTK_IS_ACTION (action));
@@ -1639,15 +1361,6 @@ gtk_action_set_visible_vertical (GtkAction *action,
if (action->private_data->visible_vertical != visible_vertical)
{
action->private_data->visible_vertical = visible_vertical;
-
- for (p = action->private_data->proxies; p; p = p->next)
- {
- proxy = (GtkWidget *)p->data;
-
- if (GTK_IS_TOOL_ITEM (proxy))
- gtk_tool_item_set_visible_vertical (GTK_TOOL_ITEM (proxy),
- visible_vertical);
- }
g_object_notify (G_OBJECT (action), "visible-vertical");
}
@@ -1658,12 +1371,12 @@ gtk_action_set_visible_vertical (GtkAction *action,
* @action: a #GtkAction
*
* Checks whether @action is visible when horizontal
- *
+ *
* Returns: whether @action is visible when horizontal
*
* Since: 2.16
*/
-gboolean
+gboolean
gtk_action_get_visible_vertical (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), FALSE);
@@ -1671,14 +1384,6 @@ gtk_action_get_visible_vertical (GtkAction *action)
return action->private_data->visible_vertical;
}
-static void
-gtk_action_sync_tooltip (GtkAction *action,
- GtkWidget *proxy)
-{
- gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM (proxy),
- action->private_data->tooltip);
-}
-
/**
* gtk_action_set_tooltip:
* @action: a #GtkAction
@@ -1692,8 +1397,6 @@ void
gtk_action_set_tooltip (GtkAction *action,
const gchar *tooltip)
{
- GSList *p;
- GtkWidget *proxy;
gchar *tmp;
g_return_if_fail (GTK_IS_ACTION (action));
@@ -1702,14 +1405,6 @@ gtk_action_set_tooltip (GtkAction *action,
action->private_data->tooltip = g_strdup (tooltip);
g_free (tmp);
- for (p = action->private_data->proxies; p; p = p->next)
- {
- proxy = (GtkWidget *)p->data;
-
- if (GTK_IS_TOOL_ITEM (proxy))
- gtk_action_sync_tooltip (action, proxy);
- }
-
g_object_notify (G_OBJECT (action), "tooltip");
}
@@ -1719,11 +1414,11 @@ gtk_action_set_tooltip (GtkAction *action,
*
* Gets the tooltip text of @action.
*
-* Returns: the tooltip text
+ * Returns: the tooltip text
*
* Since: 2.16
*/
-G_CONST_RETURN gchar *
+G_CONST_RETURN gchar *
gtk_action_get_tooltip (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
@@ -1744,42 +1439,16 @@ void
gtk_action_set_stock_id (GtkAction *action,
const gchar *stock_id)
{
- GSList *p;
- GtkWidget *proxy, *image;
gchar *tmp;
-
+
+ g_return_if_fail (GTK_IS_ACTION (action));
+
g_return_if_fail (GTK_IS_ACTION (action));
tmp = action->private_data->stock_id;
action->private_data->stock_id = g_strdup (stock_id);
g_free (tmp);
- for (p = action->private_data->proxies; p; p = p->next)
- {
- proxy = (GtkWidget *)p->data;
-
- if (GTK_IS_IMAGE_MENU_ITEM (proxy))
- {
- image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (proxy));
-
- if (GTK_IS_IMAGE (image))
- gtk_image_set_from_stock (GTK_IMAGE (image),
- action->private_data->stock_id, GTK_ICON_SIZE_MENU);
- }
- else if (GTK_IS_TOOL_BUTTON (proxy))
- {
- gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (proxy), NULL);
- gtk_tool_button_set_stock_id (GTK_TOOL_BUTTON (proxy),
- action->private_data->stock_id);
- }
- else if (GTK_IS_BUTTON (proxy) &&
- gtk_button_get_use_stock (GTK_BUTTON (proxy)))
- {
- gtk_button_set_label (GTK_BUTTON (proxy),
- action->private_data->stock_id);
- }
- }
-
g_object_notify (G_OBJECT (action), "stock-id");
/* update label and short_label if appropriate */
@@ -1807,7 +1476,7 @@ gtk_action_set_stock_id (GtkAction *action,
*
* Since: 2.16
*/
-G_CONST_RETURN gchar *
+G_CONST_RETURN gchar *
gtk_action_get_stock_id (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
@@ -1828,48 +1497,16 @@ void
gtk_action_set_icon_name (GtkAction *action,
const gchar *icon_name)
{
- GSList *p;
- GtkWidget *proxy, *image;
gchar *tmp;
-
+
+ g_return_if_fail (GTK_IS_ACTION (action));
+
g_return_if_fail (GTK_IS_ACTION (action));
tmp = action->private_data->icon_name;
action->private_data->icon_name = g_strdup (icon_name);
g_free (tmp);
- for (p = action->private_data->proxies; p; p = p->next)
- {
- proxy = (GtkWidget *)p->data;
-
- if (GTK_IS_IMAGE_MENU_ITEM (proxy))
- {
- image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (proxy));
-
- if (GTK_IS_IMAGE (image) &&
- (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
- gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_ICON_NAME))
- gtk_image_set_from_icon_name (GTK_IMAGE (image),
- action->private_data->icon_name, GTK_ICON_SIZE_MENU);
- }
- else if (GTK_IS_TOOL_BUTTON (proxy))
- {
- gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (proxy),
- action->private_data->icon_name);
- }
- else if (GTK_IS_BUTTON (proxy) &&
- !gtk_button_get_use_stock (GTK_BUTTON (proxy)))
- {
- image = gtk_button_get_image (GTK_BUTTON (proxy));
-
- if (GTK_IS_IMAGE (image) &&
- (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
- gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_ICON_NAME))
- gtk_image_set_from_icon_name (GTK_IMAGE (image),
- action->private_data->icon_name, GTK_ICON_SIZE_MENU);
- }
- }
-
g_object_notify (G_OBJECT (action), "icon-name");
}
@@ -1883,7 +1520,7 @@ gtk_action_set_icon_name (GtkAction *action,
*
* Since: 2.16
*/
-G_CONST_RETURN gchar *
+G_CONST_RETURN gchar *
gtk_action_get_icon_name (GtkAction *action)
{
g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
@@ -1904,11 +1541,6 @@ void
gtk_action_set_gicon (GtkAction *action,
GIcon *icon)
{
- GSList *p;
- GtkWidget *proxy, *image;
- GtkIconSize icon_size;
- gboolean has_stock_icon;
-
g_return_if_fail (GTK_IS_ACTION (action));
if (action->private_data->gicon)
@@ -1919,48 +1551,6 @@ gtk_action_set_gicon (GtkAction *action,
if (action->private_data->gicon)
g_object_ref (action->private_data->gicon);
- if (action->private_data->stock_id &&
- gtk_icon_factory_lookup_default (action->private_data->stock_id))
- has_stock_icon = TRUE;
- else
- has_stock_icon = FALSE;
-
- for (p = action->private_data->proxies; p; p = p->next)
- {
- proxy = (GtkWidget *)p->data;
-
- if (GTK_IS_IMAGE_MENU_ITEM (proxy) && !has_stock_icon)
- {
- image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (proxy));
- gtk_image_set_from_gicon (GTK_IMAGE (image), icon, GTK_ICON_SIZE_MENU);
- }
- else if (GTK_IS_TOOL_BUTTON (proxy))
- {
- if (has_stock_icon || !icon)
- image = NULL;
- else
- {
- image = gtk_tool_button_get_icon_widget (GTK_TOOL_BUTTON (proxy));
- icon_size = gtk_tool_item_get_icon_size (GTK_TOOL_ITEM (proxy));
-
- if (!image)
- image = gtk_image_new ();
- }
-
- gtk_tool_button_set_icon_widget (GTK_TOOL_BUTTON (proxy), image);
- gtk_image_set_from_gicon (GTK_IMAGE (image), icon, icon_size);
- }
- else if (GTK_IS_BUTTON (proxy) &&
- !gtk_button_get_use_stock (GTK_BUTTON (proxy)))
- {
- image = gtk_button_get_image (GTK_BUTTON (proxy));
- if (GTK_IS_IMAGE (image) &&
- (gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_EMPTY ||
- gtk_image_get_storage_type (GTK_IMAGE (image)) == GTK_IMAGE_GICON))
- gtk_image_set_from_gicon (GTK_IMAGE (image), icon, GTK_ICON_SIZE_BUTTON);
- }
- }
-
g_object_notify (G_OBJECT (action), "gicon");
}
@@ -1994,6 +1584,9 @@ gtk_action_get_gicon (GtkAction *action)
* This function is intended for use by action implementations.
*
* Since: 2.4
+ *
+ * Deprecated 2.16: activatables are now responsible for activating the
+ * action directly so this doesnt apply anymore.
*/
void
gtk_action_block_activate_from (GtkAction *action,
@@ -2017,6 +1610,9 @@ gtk_action_block_activate_from (GtkAction *action,
* This function is intended for use by action implementations.
*
* Since: 2.4
+ *
+ * Deprecated 2.16: activatables are now responsible for activating the
+ * action directly so this doesnt apply anymore.
*/
void
gtk_action_unblock_activate_from (GtkAction *action,