]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkactiongroup.c
Do not leak the URI returned by the model; select the row when calling
[~andy/gtk] / gtk / gtkactiongroup.c
index 8af5aaead064e34b4e6d21cfc1b47dfa8197fe60..98327dc6c727ef1301a8bba24ff91be37ed04051 100644 (file)
 #include <config.h>
 
 #include "gtkactiongroup.h"
+#include "gtkiconfactory.h"
+#include "gtkicontheme.h"
 #include "gtkstock.h"
 #include "gtktoggleaction.h"
 #include "gtkradioaction.h"
 #include "gtkaccelmap.h"
 #include "gtkmarshalers.h"
+#include "gtkprivate.h"
 #include "gtkintl.h"
+#include "gtkalias.h"
 
 #define GTK_ACTION_GROUP_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ACTION_GROUP, GtkActionGroupPrivate))
 
@@ -104,7 +108,7 @@ gtk_action_group_get_type (void)
         (GInstanceInitFunc) gtk_action_group_init,
       };
 
-      type = g_type_register_static (G_TYPE_OBJECT, "GtkActionGroup",
+      type = g_type_register_static (G_TYPE_OBJECT, I_("GtkActionGroup"),
                                     &type_info, 0);
     }
 
@@ -133,25 +137,24 @@ gtk_action_group_class_init (GtkActionGroupClass *klass)
                                                        P_("Name"),
                                                        P_("A name for the action group."),
                                                        NULL,
-                                                       G_PARAM_READWRITE |
-                                                       G_PARAM_CONSTRUCT_ONLY));
+                                                       GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
   g_object_class_install_property (gobject_class,
                                   PROP_SENSITIVE,
                                   g_param_spec_boolean ("sensitive",
                                                         P_("Sensitive"),
                                                         P_("Whether the action group 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 group is visible."),
                                                         TRUE,
-                                                        G_PARAM_READWRITE));
+                                                        GTK_PARAM_READWRITE));
 
   /**
-   * GtkGroupAction::connect-proxy:
+   * GtkActionGroup::connect-proxy:
    * @action_group: the group
    * @action: the action
    * @proxy: the proxy
@@ -171,7 +174,7 @@ gtk_action_group_class_init (GtkActionGroupClass *klass)
    * Since: 2.4
    */
   action_group_signals[CONNECT_PROXY] =
-    g_signal_new ("connect_proxy",
+    g_signal_new (I_("connect_proxy"),
                  G_OBJECT_CLASS_TYPE (klass),
                  0, 0, NULL, NULL,
                  _gtk_marshal_VOID__OBJECT_OBJECT,
@@ -179,7 +182,7 @@ gtk_action_group_class_init (GtkActionGroupClass *klass)
                  GTK_TYPE_ACTION, GTK_TYPE_WIDGET);
 
   /**
-   * GtkAction::disconnect-proxy:
+   * GtkActionGroup::disconnect-proxy:
    * @action_group: the group
    * @action: the action
    * @proxy: the proxy
@@ -194,7 +197,7 @@ gtk_action_group_class_init (GtkActionGroupClass *klass)
    * Since: 2.4
    */
   action_group_signals[DISCONNECT_PROXY] =
-    g_signal_new ("disconnect_proxy",
+    g_signal_new (I_("disconnect_proxy"),
                  G_OBJECT_CLASS_TYPE (klass),
                  0, 0, NULL, NULL,
                  _gtk_marshal_VOID__OBJECT_OBJECT,
@@ -202,7 +205,7 @@ gtk_action_group_class_init (GtkActionGroupClass *klass)
                  GTK_TYPE_ACTION, GTK_TYPE_WIDGET);
 
   /**
-   * GtkActionGroup::pre_activate:
+   * GtkActionGroup::pre-activate:
    * @action_group: the group
    * @action: the action
    *
@@ -215,7 +218,7 @@ gtk_action_group_class_init (GtkActionGroupClass *klass)
    * Since: 2.4
    */
   action_group_signals[PRE_ACTIVATE] =
-    g_signal_new ("pre_activate",
+    g_signal_new (I_("pre_activate"),
                  G_OBJECT_CLASS_TYPE (klass),
                  0, 0, NULL, NULL,
                  _gtk_marshal_VOID__OBJECT,
@@ -223,7 +226,7 @@ gtk_action_group_class_init (GtkActionGroupClass *klass)
                  GTK_TYPE_ACTION);
 
   /**
-   * GtkActionGroup::post_activate:
+   * GtkActionGroup::post-activate:
    * @action_group: the group
    * @action: the action
    *
@@ -236,7 +239,7 @@ gtk_action_group_class_init (GtkActionGroupClass *klass)
    * Since: 2.4
    */
   action_group_signals[POST_ACTIVATE] =
-    g_signal_new ("post_activate",
+    g_signal_new (I_("post_activate"),
                  G_OBJECT_CLASS_TYPE (klass),
                  0, 0, NULL, NULL,
                  _gtk_marshal_VOID__OBJECT,
@@ -250,7 +253,7 @@ gtk_action_group_class_init (GtkActionGroupClass *klass)
 static void 
 remove_action (GtkAction *action) 
 {
-  g_object_set (action, "action_group", NULL, NULL);
+  g_object_set (action, I_("action-group"), NULL, NULL);
   g_object_unref (action);
 }
 
@@ -386,7 +389,7 @@ gtk_action_group_real_get_action (GtkActionGroup *self,
  * 
  * Since: 2.4
  */
-const gchar *
+G_CONST_RETURN gchar *
 gtk_action_group_get_name (GtkActionGroup *action_group)
 {
   g_return_val_if_fail (GTK_IS_ACTION_GROUP (action_group), NULL);
@@ -416,12 +419,13 @@ gtk_action_group_get_sensitive (GtkActionGroup *action_group)
 }
 
 static void
-cb_set_action_sensitivity (const gchar *name, GtkAction *action)
+cb_set_action_sensitivity (const gchar *name, 
+                          GtkAction   *action)
 {
-  /* Minor optimization, the action_groups state only effects 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);
 }
 
 /**
@@ -434,15 +438,20 @@ cb_set_action_sensitivity (const gchar *name, GtkAction *action)
  * Since: 2.4
  */
 void
-gtk_action_group_set_sensitive (GtkActionGroup *action_group, gboolean sensitive)
+gtk_action_group_set_sensitive (GtkActionGroup *action_group, 
+                               gboolean        sensitive)
 {
   g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
 
-  if (action_group->private_data->sensitive ^ sensitive)
+  sensitive = sensitive != FALSE;
+
+  if (action_group->private_data->sensitive != sensitive)
     {
       action_group->private_data->sensitive = sensitive;
       g_hash_table_foreach (action_group->private_data->actions, 
                            (GHFunc) cb_set_action_sensitivity, NULL);
+
+      g_object_notify (G_OBJECT (action_group), "sensitive");
     }
 }
 
@@ -455,7 +464,7 @@ gtk_action_group_set_sensitive (GtkActionGroup *action_group, gboolean sensitive
  * they are visible (see gtk_action_get_visible()) and their group
  * is visible.
  * 
- * Return value: %TRUE if the group is sensitive.
+ * Return value: %TRUE if the group is visible.
  * 
  * Since: 2.4
  */
@@ -468,12 +477,13 @@ gtk_action_group_get_visible (GtkActionGroup *action_group)
 }
 
 static void
-cb_set_action_visiblity (const gchar *name, GtkAction *action)
+cb_set_action_visiblity (const gchar *name, 
+                        GtkAction   *action)
 {
-  /* Minor optimization, the action_groups state only effects 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);
 }
 
 /**
@@ -486,15 +496,20 @@ cb_set_action_visiblity (const gchar *name, GtkAction *action)
  * Since: 2.4
  */
 void
-gtk_action_group_set_visible (GtkActionGroup *action_group, gboolean visible)
+gtk_action_group_set_visible (GtkActionGroup *action_group, 
+                             gboolean        visible)
 {
   g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
 
-  if (action_group->private_data->visible ^ visible)
+  visible = visible != FALSE;
+
+  if (action_group->private_data->visible != visible)
     {
       action_group->private_data->visible = visible;
       g_hash_table_foreach (action_group->private_data->actions, 
                            (GHFunc) cb_set_action_visiblity, NULL);
+
+      g_object_notify (G_OBJECT (action_group), "visible");
     }
 }
 
@@ -545,7 +560,7 @@ gtk_action_group_add_action (GtkActionGroup *action_group,
   g_hash_table_insert (action_group->private_data->actions, 
                       g_strdup (gtk_action_get_name (action)),
                        g_object_ref (action));
-  g_object_set (G_OBJECT (action), "action_group", action_group, NULL);
+  g_object_set (action, I_("action-group"), action_group, NULL);
 }
 
 /**
@@ -553,13 +568,13 @@ gtk_action_group_add_action (GtkActionGroup *action_group,
  * @action_group: the action group 
  * @action: the action to add 
  * @accelerator: the accelerator for the action, in
- *   the format understood by gtk_accelerator_parse(), or %NULL to use the
- *   stock accelerator 
+ *   the format understood by gtk_accelerator_parse(), or "" for no accelerator, or 
+ *   %NULL to use the stock accelerator 
  *
  * Adds an action object to the action group and sets up the accelerator.
  *
  * If @accelerator is %NULL, attempts to use the accelerator associated 
- * with the stock_id of the action.
+ * with the stock_id of the action. 
  *
  * Accel paths are set to
  * <literal>&lt;Actions&gt;/<replaceable>group-name</replaceable>/<replaceable>action-name</replaceable></literal>.
@@ -568,8 +583,8 @@ gtk_action_group_add_action (GtkActionGroup *action_group,
  */
 void
 gtk_action_group_add_action_with_accel (GtkActionGroup *action_group,
-                                       GtkAction *action,
-                                       const gchar *accelerator)
+                                       GtkAction      *action,
+                                       const gchar    *accelerator)
 {
   gchar *accel_path;
   guint  accel_key = 0;
@@ -578,17 +593,22 @@ gtk_action_group_add_action_with_accel (GtkActionGroup *action_group,
   gchar *name;
   gchar *stock_id;
   
-  g_object_get (action, "name", &name, "stock_id", &stock_id, NULL);
+  g_object_get (action, "name", &name, "stock-id", &stock_id, NULL);
 
   accel_path = g_strconcat ("<Actions>/",
                            action_group->private_data->name, "/", name, NULL);
 
   if (accelerator)
     {
-    gtk_accelerator_parse (accelerator, &accel_key, &accel_mods);
-      if (accel_key == 0)
-       g_warning ("Unable to parse accelerator '%s' for action '%s'",
-                  accelerator, name);
+      if (accelerator[0] == 0) 
+       accel_key = 0;
+      else
+       {
+         gtk_accelerator_parse (accelerator, &accel_key, &accel_mods);
+         if (accel_key == 0)
+           g_warning ("Unable to parse accelerator '%s' for action '%s'",
+                      accelerator, name);
+       }
     }
   else if (stock_id && gtk_stock_lookup (stock_id, &stock_item))
     {
@@ -679,10 +699,10 @@ gtk_action_group_list_actions (GtkActionGroup *action_group)
  * Since: 2.4
  */
 void
-gtk_action_group_add_actions (GtkActionGroup *action_group,
-                             GtkActionEntry *entries,
-                             guint           n_entries,
-                             gpointer        user_data)
+gtk_action_group_add_actions (GtkActionGroup       *action_group,
+                             const GtkActionEntry *entries,
+                             guint                 n_entries,
+                             gpointer              user_data)
 {
   gtk_action_group_add_actions_full (action_group, 
                                     entries, n_entries, 
@@ -708,7 +728,7 @@ shared_data_unref (gpointer data)
       if (shared_data->destroy) 
        (*shared_data->destroy) (shared_data->data);
       
-      g_free (shared_data);
+      g_slice_free (SharedData, shared_data);
     }
 }
 
@@ -727,11 +747,11 @@ shared_data_unref (gpointer data)
  * Since: 2.4
  */
 void
-gtk_action_group_add_actions_full (GtkActionGroup *action_group,
-                                  GtkActionEntry *entries,
-                                  guint           n_entries,
-                                  gpointer        user_data,
-                                  GDestroyNotify  destroy)
+gtk_action_group_add_actions_full (GtkActionGroup       *action_group,
+                                  const GtkActionEntry *entries,
+                                  guint                 n_entries,
+                                  gpointer              user_data,
+                                  GDestroyNotify        destroy)
 {
 
   /* Keep this in sync with the other 
@@ -742,7 +762,7 @@ gtk_action_group_add_actions_full (GtkActionGroup *action_group,
 
   g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
 
-  shared_data = g_new0 (SharedData, 1);
+  shared_data = g_slice_new0 (SharedData);
   shared_data->ref_count = 1;
   shared_data->data = user_data;
   shared_data->destroy = destroy;
@@ -759,8 +779,16 @@ gtk_action_group_add_actions_full (GtkActionGroup *action_group,
       action = gtk_action_new (entries[i].name,
                               label,
                               tooltip,
-                              entries[i].stock_id);
+                              NULL);
 
+      if (entries[i].stock_id) 
+       {
+         g_object_set (action, "stock-id", entries[i].stock_id, NULL);
+         if (gtk_icon_theme_has_icon (gtk_icon_theme_get_default (), 
+                                      entries[i].stock_id))
+           g_object_set (action, "icon-name", entries[i].stock_id, NULL);
+       }
+         
       if (entries[i].callback)
        {
          GClosure *closure;
@@ -799,10 +827,10 @@ gtk_action_group_add_actions_full (GtkActionGroup *action_group,
  * Since: 2.4
  */
 void
-gtk_action_group_add_toggle_actions (GtkActionGroup       *action_group,
-                                    GtkToggleActionEntry *entries,
-                                    guint                 n_entries,
-                                    gpointer              user_data)
+gtk_action_group_add_toggle_actions (GtkActionGroup             *action_group,
+                                    const GtkToggleActionEntry *entries,
+                                    guint                       n_entries,
+                                    gpointer                    user_data)
 {
   gtk_action_group_add_toggle_actions_full (action_group, 
                                            entries, n_entries, 
@@ -824,11 +852,11 @@ gtk_action_group_add_toggle_actions (GtkActionGroup       *action_group,
  * Since: 2.4
  */
 void
-gtk_action_group_add_toggle_actions_full (GtkActionGroup       *action_group,
-                                         GtkToggleActionEntry *entries,
-                                         guint                 n_entries,
-                                         gpointer              user_data,
-                                         GDestroyNotify        destroy)
+gtk_action_group_add_toggle_actions_full (GtkActionGroup             *action_group,
+                                         const GtkToggleActionEntry *entries,
+                                         guint                       n_entries,
+                                         gpointer                    user_data,
+                                         GDestroyNotify              destroy)
 {
   /* Keep this in sync with the other 
    * gtk_action_group_add_..._actions_full() functions.
@@ -838,7 +866,7 @@ gtk_action_group_add_toggle_actions_full (GtkActionGroup       *action_group,
 
   g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
 
-  shared_data = g_new0 (SharedData, 1);
+  shared_data = g_slice_new0 (SharedData);
   shared_data->ref_count = 1;
   shared_data->data = user_data;
   shared_data->destroy = destroy;
@@ -855,7 +883,15 @@ gtk_action_group_add_toggle_actions_full (GtkActionGroup       *action_group,
       action = gtk_toggle_action_new (entries[i].name,
                                      label,
                                      tooltip,
-                                     entries[i].stock_id);
+                                     NULL);
+
+      if (entries[i].stock_id) 
+       {
+         if (gtk_icon_factory_lookup_default (entries[i].stock_id))
+           g_object_set (action, "stock-id", entries[i].stock_id, NULL);
+         else
+           g_object_set (action, "icon-name", entries[i].stock_id, NULL);
+       }
 
       gtk_toggle_action_set_active (action, entries[i].is_active);
 
@@ -900,12 +936,12 @@ gtk_action_group_add_toggle_actions_full (GtkActionGroup       *action_group,
  * Since: 2.4
  **/
 void            
-gtk_action_group_add_radio_actions (GtkActionGroup      *action_group,
-                                   GtkRadioActionEntry *entries,
-                                   guint                n_entries,
-                                   gint                 value,
-                                   GCallback            on_change,
-                                   gpointer             user_data)
+gtk_action_group_add_radio_actions (GtkActionGroup            *action_group,
+                                   const GtkRadioActionEntry *entries,
+                                   guint                      n_entries,
+                                   gint                       value,
+                                   GCallback                  on_change,
+                                   gpointer                   user_data)
 {
   gtk_action_group_add_radio_actions_full (action_group, 
                                           entries, n_entries, 
@@ -930,13 +966,13 @@ gtk_action_group_add_radio_actions (GtkActionGroup      *action_group,
  * Since: 2.4
  **/
 void            
-gtk_action_group_add_radio_actions_full (GtkActionGroup      *action_group,
-                                        GtkRadioActionEntry *entries,
-                                        guint                n_entries,
-                                        gint                 value,
-                                        GCallback            on_change,
-                                        gpointer             user_data,
-                                        GDestroyNotify       destroy)
+gtk_action_group_add_radio_actions_full (GtkActionGroup            *action_group,
+                                        const GtkRadioActionEntry *entries,
+                                        guint                      n_entries,
+                                        gint                       value,
+                                        GCallback                  on_change,
+                                        gpointer                   user_data,
+                                        GDestroyNotify             destroy)
 {
   /* Keep this in sync with the other 
    * gtk_action_group_add_..._actions_full() functions.
@@ -959,9 +995,17 @@ gtk_action_group_add_radio_actions_full (GtkActionGroup      *action_group,
       action = gtk_radio_action_new (entries[i].name,
                                     label,
                                     tooltip,
-                                    entries[i].stock_id,
+                                    NULL,
                                     entries[i].value);
 
+      if (entries[i].stock_id) 
+       {
+         if (gtk_icon_factory_lookup_default (entries[i].stock_id))
+           g_object_set (action, "stock-id", entries[i].stock_id, NULL);
+         else
+           g_object_set (action, "icon-name", entries[i].stock_id, NULL);
+       }
+
       if (i == 0) 
        first_action = action;
 
@@ -1000,10 +1044,10 @@ gtk_action_group_add_radio_actions_full (GtkActionGroup      *action_group,
  * Since: 2.4 
  **/
 void
-gtk_action_group_set_translate_func (GtkActionGroup      *action_group,
-                                    GtkTranslateFunc     func,
-                                    gpointer             data,
-                                    GtkDestroyNotify     notify)
+gtk_action_group_set_translate_func (GtkActionGroup   *action_group,
+                                    GtkTranslateFunc  func,
+                                    gpointer          data,
+                                    GtkDestroyNotify  notify)
 {
   g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
   
@@ -1019,7 +1063,11 @@ static gchar *
 dgettext_swapped (const gchar *msgid, 
                  const gchar *domainname)
 {
-  return dgettext (domainname, msgid);
+  /* Pass through dgettext if and only if msgid is nonempty. */
+  if (msgid && *msgid) 
+    return dgettext (domainname, msgid); 
+  else
+    return (gchar*) msgid;
 }
 
 /**
@@ -1048,30 +1096,34 @@ gtk_action_group_set_translation_domain (GtkActionGroup *action_group,
                                       g_free);
 } 
 
+
 /**
  * gtk_action_group_translate_string:
  * @action_group: a #GtkActionGroup
  * @string: a string
  *
  * Translates a string using the specified translate_func(). This
- * is mainly intended for language bindings. 
+ * is mainly intended for language bindings.
  *
  * Returns: the translation of @string
  *
  * Since: 2.6
  **/
-gchar *
+G_CONST_RETURN gchar *
 gtk_action_group_translate_string (GtkActionGroup *action_group,
                                   const gchar    *string)
 {
   GtkTranslateFunc translate_func;
   gpointer translate_data;
-
+  
   g_return_val_if_fail (GTK_IS_ACTION_GROUP (action_group), string);
+  
+  if (string == NULL)
+    return NULL;
 
   translate_func = action_group->private_data->translate_func;
   translate_data = action_group->private_data->translate_data;
-
+  
   if (translate_func)
     return translate_func (string, translate_data);
   else
@@ -1106,7 +1158,10 @@ _gtk_action_group_emit_pre_activate  (GtkActionGroup *action_group,
 
 void
 _gtk_action_group_emit_post_activate (GtkActionGroup *action_group,
-                                     GtkAction *action)
+                                     GtkAction      *action)
 {
   g_signal_emit (action_group, action_group_signals[POST_ACTIVATE], 0, action);
 }
+
+#define __GTK_ACTION_GROUP_C__
+#include "gtkaliasdef.c"