]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkaction.c
Disconnect the sync callback for the visibility property. (#321761, Philip
[~andy/gtk] / gtk / gtkaction.c
index 0a37c428d2808ebe22745c416720b9eee7769eb7..45611d34b418cf065e11b6876038738bc3ce4f1c 100644 (file)
@@ -30,7 +30,6 @@
 
 #include <config.h>
 
-#include "gtkalias.h"
 #include "gtkaction.h"
 #include "gtkactiongroup.h"
 #include "gtkaccellabel.h"
@@ -45,6 +44,8 @@
 #include "gtktearoffmenuitem.h"
 #include "gtktoolbutton.h"
 #include "gtktoolbar.h"
+#include "gtkprivate.h"
+#include "gtkalias.h"
 
 
 #define GTK_ACTION_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ACTION, GtkActionPrivate))
@@ -107,7 +108,7 @@ static void gtk_action_init       (GtkAction *action);
 static void gtk_action_class_init (GtkActionClass *class);
 
 static GQuark       accel_path_id  = 0;
-static const gchar *accel_path_key = "GtkAction::accel_path";
+static const gchar accel_path_key[] = "GtkAction::accel_path";
 
 GType
 gtk_action_get_type (void)
@@ -131,7 +132,7 @@ gtk_action_get_type (void)
       };
 
       type = g_type_register_static (G_TYPE_OBJECT,
-                                    "GtkAction",
+                                    I_("GtkAction"),
                                     &type_info, 0);
     }
   return type;
@@ -196,7 +197,7 @@ gtk_action_class_init (GtkActionClass *klass)
                                                        P_("Name"),
                                                        P_("A unique name for the action."),
                                                        NULL,
-                                                       G_PARAM_READWRITE |
+                                                       GTK_PARAM_READWRITE | 
                                                        G_PARAM_CONSTRUCT_ONLY));
   g_object_class_install_property (gobject_class,
                                   PROP_LABEL,
@@ -205,37 +206,37 @@ gtk_action_class_init (GtkActionClass *klass)
                                                        P_("The label used for menu items and buttons "
                                                           "that activate this action."),
                                                        NULL,
-                                                       G_PARAM_READWRITE));
+                                                       GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                   PROP_SHORT_LABEL,
-                                  g_param_spec_string ("short_label",
+                                  g_param_spec_string ("short-label",
                                                        P_("Short label"),
                                                        P_("A shorter label that may be used on toolbar buttons."),
                                                        NULL,
-                                                       G_PARAM_READWRITE));
+                                                       GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                   PROP_TOOLTIP,
                                   g_param_spec_string ("tooltip",
                                                        P_("Tooltip"),
                                                        P_("A tooltip for this action."),
                                                        NULL,
-                                                       G_PARAM_READWRITE));
+                                                       GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                   PROP_STOCK_ID,
-                                  g_param_spec_string ("stock_id",
+                                  g_param_spec_string ("stock-id",
                                                        P_("Stock Icon"),
                                                        P_("The stock icon displayed in widgets representing "
                                                           "this action."),
                                                        NULL,
-                                                       G_PARAM_READWRITE));
+                                                       GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                   PROP_VISIBLE_HORIZONTAL,
-                                  g_param_spec_boolean ("visible_horizontal",
+                                  g_param_spec_boolean ("visible-horizontal",
                                                         P_("Visible when horizontal"),
                                                         P_("Whether the toolbar item is visible when the toolbar "
                                                            "is in a horizontal orientation."),
                                                         TRUE,
-                                                        G_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE));
   /**
    * GtkAction:visible-overflown:
    *
@@ -246,57 +247,57 @@ gtk_action_class_init (GtkActionClass *klass)
    */
   g_object_class_install_property (gobject_class,
                                   PROP_VISIBLE_OVERFLOWN,
-                                  g_param_spec_boolean ("visible_overflown",
+                                  g_param_spec_boolean ("visible-overflown",
                                                         P_("Visible when overflown"),
                                                         P_("When TRUE, toolitem proxies for this action "
                                                            "are represented in the toolbar overflow menu."),
                                                         TRUE,
-                                                        G_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                   PROP_VISIBLE_VERTICAL,
-                                  g_param_spec_boolean ("visible_vertical",
+                                  g_param_spec_boolean ("visible-vertical",
                                                         P_("Visible when vertical"),
                                                         P_("Whether the toolbar item is visible when the toolbar "
                                                            "is in a vertical orientation."),
                                                         TRUE,
-                                                        G_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                   PROP_IS_IMPORTANT,
-                                  g_param_spec_boolean ("is_important",
+                                  g_param_spec_boolean ("is-important",
                                                         P_("Is important"),
                                                         P_("Whether the action is considered important. "
                                                            "When TRUE, toolitem proxies for this action "
                                                            "show text in GTK_TOOLBAR_BOTH_HORIZ mode."),
                                                         FALSE,
-                                                        G_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                   PROP_HIDE_IF_EMPTY,
-                                  g_param_spec_boolean ("hide_if_empty",
+                                  g_param_spec_boolean ("hide-if-empty",
                                                         P_("Hide if empty"),
                                                         P_("When TRUE, empty menu proxies for this action are hidden."),
                                                         TRUE,
-                                                        G_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                   PROP_SENSITIVE,
                                   g_param_spec_boolean ("sensitive",
                                                         P_("Sensitive"),
                                                         P_("Whether the action is enabled."),
                                                         TRUE,
-                                                        G_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                   PROP_VISIBLE,
                                   g_param_spec_boolean ("visible",
                                                         P_("Visible"),
                                                         P_("Whether the action is visible."),
                                                         TRUE,
-                                                        G_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                   PROP_ACTION_GROUP,
-                                  g_param_spec_object ("action_group",
+                                  g_param_spec_object ("action-group",
                                                         P_("Action Group"),
                                                         P_("The GtkActionGroup this GtkAction is associated with, or NULL (for internal use)."),
                                                         GTK_TYPE_ACTION_GROUP,
-                                                        G_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE));
 
   /**
    * GtkAction::activate:
@@ -307,7 +308,7 @@ gtk_action_class_init (GtkActionClass *klass)
    * Since: 2.4
    */
   action_signals[ACTIVATE] =
-    g_signal_new ("activate",
+    g_signal_new (I_("activate"),
                  G_OBJECT_CLASS_TYPE (klass),
                  G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE,
                  G_STRUCT_OFFSET (GtkActionClass, activate),  NULL, NULL,
@@ -365,6 +366,8 @@ gtk_action_init (GtkAction *action)
  * Creates a new #GtkAction object. To add the action to a
  * #GtkActionGroup and set the accelerator for the action,
  * call gtk_action_group_add_action_with_accel().
+ * See <xref linkend="XML-UI"/> for information on allowed action
+ * names.
  *
  * Return value: a new #GtkAction
  *
@@ -444,7 +447,7 @@ gtk_action_set_property (GObject         *object,
          tmp = action->private_data->short_label;
          action->private_data->short_label = g_strdup (action->private_data->label);
          g_free (tmp);
-         g_object_notify (object, "short_label");
+         g_object_notify (object, "short-label");
        }
       break;
     case PROP_SHORT_LABEL:
@@ -484,7 +487,7 @@ gtk_action_set_property (GObject         *object,
          tmp = action->private_data->short_label;
          action->private_data->short_label = g_strdup (action->private_data->label);
          g_free (tmp);
-         g_object_notify (object, "short_label");
+         g_object_notify (object, "short-label");
        }
       break;
     case PROP_VISIBLE_HORIZONTAL:
@@ -663,9 +666,10 @@ _gtk_action_sync_menu_visible (GtkAction *action,
   visible = gtk_action_is_visible (action);
   hide_if_empty = action->private_data->hide_if_empty;
 
-  g_object_set (G_OBJECT (proxy),
-               "visible", visible && !(empty && hide_if_empty),
-               NULL);
+  if (visible && !(empty && hide_if_empty))
+    gtk_widget_show (proxy);
+  else
+    gtk_widget_hide (proxy);
 }
 
 gboolean _gtk_menu_is_empty (GtkWidget *menu);
@@ -712,7 +716,7 @@ gtk_action_sync_short_label (GtkAction  *action,
   GValue value = { 0, };
 
   g_value_init (&value, G_TYPE_STRING);
-  g_object_get_property (G_OBJECT (action), "short_label", &value);
+  g_object_get_property (G_OBJECT (action), "short-label", &value);
 
   g_object_set_property (G_OBJECT (proxy), "label", &value);
   g_value_unset (&value);
@@ -735,6 +739,17 @@ gtk_action_sync_stock_id (GtkAction  *action,
     }
 }
 
+static void
+gtk_action_sync_button_stock_id (GtkAction  *action, 
+                                GParamSpec *pspec,
+                                GtkWidget  *proxy)
+{
+  g_object_set (G_OBJECT (proxy),
+                "stock-id",
+                action->private_data->stock_id,
+                NULL);
+}
+
 static void
 gtk_action_sync_tooltip (GtkAction  *action, 
                         GParamSpec *pspec, 
@@ -782,10 +797,8 @@ static void
 connect_proxy (GtkAction     *action, 
               GtkWidget     *proxy)
 {
-  GtkActionGroup *group = action->private_data->action_group;
-
   g_object_ref (action);
-  g_object_set_data_full (G_OBJECT (proxy), "gtk-action", action,
+  g_object_set_data_full (G_OBJECT (proxy), I_("gtk-action"), action,
                          g_object_unref);
 
   /* add this widget to the list of proxies */
@@ -835,7 +848,7 @@ connect_proxy (GtkAction     *action,
                              NULL);
       
       if (GTK_IS_ACCEL_LABEL (label) && action->private_data->accel_quark)
-       g_object_set (G_OBJECT (label),
+       g_object_set (label,
                      "accel_closure", action->private_data->accel_closure,
                      NULL);
 
@@ -869,23 +882,27 @@ connect_proxy (GtkAction     *action,
        }
 
       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);
+       g_signal_connect_object (proxy, "activate",
+                                G_CALLBACK (gtk_action_activate), action,
+                                G_CONNECT_SWAPPED);
 
     }
   else if (GTK_IS_TOOL_ITEM (proxy))
     {
+      GParamSpec *pspec;
+
       /* toolbar item specific synchronisers ... */
 
-      g_object_set (G_OBJECT (proxy),
+      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);
-      /* FIXME: we should set the tooltip here, but the current api
-       * doesn't allow it before the item is added to a toolbar. 
-       */
+
+      pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (action),
+                                            "tooltip");
+      gtk_action_sync_tooltip (action, pspec, proxy);
+
       g_signal_connect_object (action, "notify::visible-horizontal",
                               G_CALLBACK (gtk_action_sync_property), 
                               proxy, 0);
@@ -903,56 +920,70 @@ connect_proxy (GtkAction     *action,
                               G_CALLBACK (gtk_action_create_menu_proxy),
                               action, 0);
 
+      gtk_tool_item_rebuild_menu (GTK_TOOL_ITEM (proxy));
+
       /* toolbar button specific synchronisers ... */
       if (GTK_IS_TOOL_BUTTON (proxy))
        {
-         g_object_set (G_OBJECT (proxy),
+         g_object_set (proxy,
                        "label", action->private_data->short_label,
                        "use_underline", TRUE,
                        "stock_id", action->private_data->stock_id,
                        NULL);
-         /* FIXME: we should set the tooltip here, but the current api
-          * doesn't allow it before the item is added to a toolbar. 
-          */
+
          g_signal_connect_object (action, "notify::short-label",
                                   G_CALLBACK (gtk_action_sync_short_label),
                                   proxy, 0);      
          g_signal_connect_object (action, "notify::stock-id",
                                   G_CALLBACK (gtk_action_sync_property), 
                                   proxy, 0);
-      g_signal_connect_object (proxy, "clicked",
-                              G_CALLBACK (gtk_action_activate), action,
-                              G_CONNECT_SWAPPED);
-    }
+         g_signal_connect_object (proxy, "clicked",
+                                  G_CALLBACK (gtk_action_activate), action,
+                                  G_CONNECT_SWAPPED);
+       }
     }
   else if (GTK_IS_BUTTON (proxy))
     {
       /* button specific synchronisers ... */
-
-      /* synchronise the label */
-      g_object_set (G_OBJECT (proxy),
-                   "label", action->private_data->short_label,
-                   "use_underline", TRUE,
-                   NULL);
-      g_signal_connect_object (action, "notify::short-label",
-                              G_CALLBACK (gtk_action_sync_short_label),
-                              proxy, 0);
+      if (gtk_button_get_use_stock (GTK_BUTTON (proxy)))
+       {
+         /* synchronise stock-id */
+         g_object_set (proxy,
+                       "stock-id", action->private_data->stock_id,
+                       NULL);
+         g_signal_connect_object (action, "notify::stock-id",
+                                  G_CALLBACK (gtk_action_sync_button_stock_id),
+                                  proxy, 0);
+       }
+      else if (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);
+         g_signal_connect_object (action, "notify::short-label",
+                                  G_CALLBACK (gtk_action_sync_short_label),
+                                  proxy, 0);
+         
+       }
       
+      /* 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);
     }
 
-  _gtk_action_group_emit_connect_proxy (group, action, 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)
 {
-  GtkActionGroup *group = action->private_data->action_group;
-
-  g_object_set_data (G_OBJECT (proxy), "gtk-action", NULL);
+  g_object_set_data (G_OBJECT (proxy), I_("gtk-action"), NULL);
 
   /* remove proxy from list of proxies */
   g_signal_handlers_disconnect_by_func (proxy,
@@ -966,12 +997,15 @@ disconnect_proxy (GtkAction *action,
                                        action);
 
   /* disconnect handlers for notify::* signals */
-  g_signal_handlers_disconnect_by_func (proxy,
+  g_signal_handlers_disconnect_by_func (action,
                                        G_CALLBACK (gtk_action_sync_sensitivity),
-                                       action);
-  g_signal_handlers_disconnect_by_func (proxy,
+                                       proxy);
+  g_signal_handlers_disconnect_by_func (action,
+                                       G_CALLBACK (gtk_action_sync_visible),
+                                       proxy);
+  g_signal_handlers_disconnect_by_func (action,
                                        G_CALLBACK (gtk_action_sync_property),
-                                       action);
+                                       proxy);
 
   g_signal_handlers_disconnect_by_func (action,
                                G_CALLBACK (gtk_action_sync_stock_id), proxy);
@@ -990,7 +1024,8 @@ disconnect_proxy (GtkAction *action,
                                        G_CALLBACK (gtk_action_create_menu_proxy),
                                        action);
 
-  _gtk_action_group_emit_disconnect_proxy (group, action, proxy);
+  if (action->private_data->action_group)
+    _gtk_action_group_emit_disconnect_proxy (action->private_data->action_group, action, proxy);
 }
 
 void
@@ -1190,7 +1225,7 @@ gtk_action_get_proxies (GtkAction *action)
  *
  * Since: 2.4
  **/
-const gchar *
+G_CONST_RETURN gchar *
 gtk_action_get_name (GtkAction *action)
 {
   g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
@@ -1395,10 +1430,12 @@ closure_accel_activate (GClosure     *closure,
                         gpointer      marshal_data)
 {
   if (gtk_action_is_sensitive (GTK_ACTION (closure->data)))
-    _gtk_action_emit_activate (GTK_ACTION (closure->data));
-
-  /* we handled the accelerator */
-  g_value_set_boolean (return_value, TRUE);
+    {
+      _gtk_action_emit_activate (GTK_ACTION (closure->data));
+      
+      /* we handled the accelerator */
+      g_value_set_boolean (return_value, TRUE);
+    }
 }
 
 static void
@@ -1435,6 +1472,49 @@ gtk_action_set_accel_path (GtkAction   *action,
   action->private_data->accel_quark = g_quark_from_string (accel_path);
 }
 
+/**
+ * gtk_action_get_accel_path:
+ * @action: the action object
+ *
+ * Returns the accel path for this action.  
+ *
+ * Since: 2.6
+ *
+ * Returns: the accel path for this action, or %NULL
+ *   if none is set. The returned string is owned by GTK+ 
+ *   and must not be freed or modified.
+ */
+G_CONST_RETURN gchar *
+gtk_action_get_accel_path (GtkAction *action)
+{
+  g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
+
+  if (action->private_data->accel_quark)
+    return g_quark_to_string (action->private_data->accel_quark);
+  else
+    return NULL;
+}
+
+/**
+ * gtk_action_get_accel_closure:
+ * @action: the action object
+ *
+ * Returns the accel closure for this action.
+ *
+ * Since: 2.8
+ *
+ * Returns: the accel closure for this action. The returned closure is
+ *          owned by GTK+ and must not be unreffed or modified.
+ */
+GClosure *
+gtk_action_get_accel_closure (GtkAction *action)
+{
+  g_return_val_if_fail (GTK_IS_ACTION (action), NULL);
+
+  return action->private_data->accel_closure;
+}
+
+
 /**
  * gtk_action_set_accel_group:
  * @action: the action object
@@ -1520,3 +1600,6 @@ gtk_action_disconnect_accelerator (GtkAction *action)
     gtk_accel_group_disconnect (action->private_data->accel_group,
                                action->private_data->accel_closure);
 }
+
+#define __GTK_ACTION_C__
+#include "gtkaliasdef.c"