]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkitemfactory.c
version bump to 1.1.8, binary age 0, interface age 0, depend on GLib
[~andy/gtk] / gtk / gtkitemfactory.c
index dd605d23442da78be8dd6a5fb91ffca374bf2763..72f5b859d46c9ff28a6ce01585712013039555bb 100644 (file)
@@ -29,7 +29,6 @@
 #include       "gtk/gtkcheckmenuitem.h"
 #include       "gtk/gtktearoffmenuitem.h"
 #include       "gtk/gtkaccellabel.h"
-#include       "gdk/gdkprivate.h" /* for gdk_progname */
 #include        "gdk/gdkkeysyms.h"
 #include       <string.h>
 #include       <sys/stat.h>
@@ -159,7 +158,7 @@ gtk_item_factory_get_type (void)
   
   if (!item_factory_type)
     {
-      GtkTypeInfo item_factory_info =
+      static const GtkTypeInfo item_factory_info =
       {
        "GtkItemFactory",
        sizeof (GtkItemFactory),
@@ -319,15 +318,15 @@ gtk_item_factory_propagate_accelerator (GtkItemFactoryItem *item,
                                            GTK_ACCEL_VISIBLE);
              else
                {
-                 GSList *slist;
+                 GSList *work;
                  
-                 slist = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
-                 while (slist)
+                 work = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
+                 while (work)
                    {
                      GtkAccelEntry *ac_entry;
                      
-                     ac_entry = slist->data;
-                     slist = slist->next;
+                     ac_entry = work->data;
+                     work = work->next;
                      if (ac_entry->accel_flags & GTK_ACCEL_VISIBLE &&
                          ac_entry->accel_group == ifactory->accel_group &&
                          ac_entry->signal_id == signal_id)
@@ -514,7 +513,7 @@ gtk_item_factory_add_item (GtkItemFactory           *ifactory,
 
   /* keep a per-action list of the widgets on the factory
    */
-  if (callback_action)
+  if (callback)
     {
       GtkIFActionLink *link;
 
@@ -629,6 +628,9 @@ gtk_item_factory_from_path (const gchar      *path)
   fname[i + 1] = 0;
 
   item = g_hash_table_lookup (class->item_ht, fname);
+
+  g_free (fname);
+
   if (item && item->widgets)
     return gtk_item_factory_from_widget (item->widgets->data);
 
@@ -636,7 +638,7 @@ gtk_item_factory_from_path (const gchar      *path)
 }
 
 static void
-gtk_item_factory_destroy (GtkObject             *object)
+gtk_item_factory_destroy (GtkObject *object)
 {
   GtkItemFactory *ifactory;
   GSList *slist;
@@ -648,14 +650,14 @@ gtk_item_factory_destroy (GtkObject                *object)
 
   if (ifactory->widget)
     {
-      GtkObject *object;
+      GtkObject *dobj;
 
-      object = GTK_OBJECT (ifactory->widget);
+      dobj = GTK_OBJECT (ifactory->widget);
 
-      gtk_object_ref (object);
-      gtk_object_sink (object);
-      gtk_object_destroy (object);
-      gtk_object_unref (object);
+      gtk_object_ref (dobj);
+      gtk_object_sink (dobj);
+      gtk_object_destroy (dobj);
+      gtk_object_unref (dobj);
 
       ifactory->widget = NULL;
     }
@@ -682,6 +684,9 @@ gtk_item_factory_finalize (GtkObject                  *object)
   g_free (ifactory->path);
   g_assert (ifactory->widget == NULL);
 
+  if (ifactory->translate_data && ifactory->translate_notify)
+    ifactory->translate_notify (ifactory->translate_data);
+  
   parent_class->finalize (object);
 }
 
@@ -785,8 +790,8 @@ gtk_item_factory_dump_rc (const gchar            *file_name,
     return;
 
   fputs ("; ", f_out);
-  if (gdk_progname)
-    fputs (gdk_progname, f_out);
+  if (g_get_prgname ())
+    fputs (g_get_prgname (), f_out);
   fputs (" GtkItemFactory rc-file         -*- scheme -*-\n", f_out);
   fputs ("; this file is an automated menu-path dump\n", f_out);
   fputs (";\n", f_out);
@@ -891,11 +896,13 @@ gtk_item_factory_get_widget_by_action (GtkItemFactory   *ifactory,
 }
 
 static gboolean
-gtk_item_factory_parse_path (gchar  *str,
-                            gchar **path,
-                            gchar **parent_path,
-                            gchar **item)
+gtk_item_factory_parse_path (GtkItemFactory *ifactory,
+                            gchar          *str,
+                            gchar         **path,
+                            gchar         **parent_path,
+                            gchar         **item)
 {
+  gchar *translation;
   gchar *p, *q;
 
   *path = g_strdup (str);
@@ -920,7 +927,12 @@ gtk_item_factory_parse_path (gchar  *str,
     }
   *p = 0;
 
-  p = strrchr (str, '/');
+  if (ifactory->translate_func)
+    translation = ifactory->translate_func (str, ifactory->translate_data);
+  else
+    translation = str;
+                             
+  p = strrchr (translation, '/');
   p++;
 
   *item = g_strdup (p);
@@ -1004,10 +1016,10 @@ gtk_item_factory_create_item (GtkItemFactory         *ifactory,
        }
     }
 
-  if (!gtk_item_factory_parse_path (entry->path, 
+  if (!gtk_item_factory_parse_path (ifactory, entry->path, 
                                    &path, &parent_path, &name))
     return;
-  
+
   parent = gtk_item_factory_get_widget (ifactory, parent_path);
   if (!parent)
     {
@@ -1085,6 +1097,10 @@ gtk_item_factory_create_item (GtkItemFactory          *ifactory,
     {
       GtkAccelGroup *menu_group;
 
+      if (entry->callback)
+       g_warning ("gtk_item_factory_create_item(): Can't specify a callback on a branch: \"%s\"",
+                  entry->path);
+       
       menu_group = gtk_accel_group_new ();
       
       if (type_id == quark_type_last_branch)
@@ -1101,10 +1117,15 @@ gtk_item_factory_create_item (GtkItemFactory         *ifactory,
   
   gtk_item_factory_add_item (ifactory,
                             path, entry->accelerator,
-                            entry->callback, entry->callback_action, callback_data,
+                            (type_id == quark_type_branch ||
+                             type_id == quark_type_last_branch) ?
+                             (GtkItemFactoryCallback) NULL : entry->callback,
+                            entry->callback_action, callback_data,
                             callback_type,
                             item_type_path,
                             widget);
+
+  g_free (path);
 }
 
 void
@@ -1482,7 +1503,7 @@ gtk_item_factory_parse_statement (GScanner            *scanner,
 
       parser_func = scanner->value.v_symbol;
 
-      /* check whether this is a GtkItemFactory symbol...
+      /* check whether this is a GtkItemFactory symbol.
        */
       if (parser_func == gtk_item_factory_parse_menu_path)
        expected_token = parser_func (scanner, class);
@@ -1588,3 +1609,19 @@ gtk_item_factory_parse_rc (const gchar     *file_name)
 
   close (fd);
 }
+
+void
+gtk_item_factory_set_translate_func (GtkItemFactory      *ifactory,
+                                    GtkTranslateFunc     func,
+                                    gpointer             data,
+                                    GtkDestroyNotify     notify)
+{
+  g_return_if_fail (ifactory != NULL);
+  
+  if (ifactory->translate_data && ifactory->translate_notify)
+    ifactory->translate_notify (ifactory->translate_data);
+      
+  ifactory->translate_func = func;
+  ifactory->translate_data = data;
+  ifactory->translate_notify = notify;
+}