[Goodies-commits] r1803 - in xfce-menu/trunk: . libxfce4menu tests

Jannis Pohlmann jannis at xfce.org
Thu Jul 27 03:28:58 CEST 2006


Author: jannis
Date: 2006-07-27 01:28:55 +0000 (Thu, 27 Jul 2006)
New Revision: 1803

Modified:
   xfce-menu/trunk/ChangeLog
   xfce-menu/trunk/libxfce4menu/xfce-menu.c
   xfce-menu/trunk/libxfce4menu/xfce-menu.h
   xfce-menu/trunk/tests/display-menu.c
Log:
	* tests/display-menu.c: Removed debug statement and tooltips allocation.
	* libxfce4menu/xfce-menu.c: Use list for possible directory names and
	  try to load them in reverse order when resolving the menu directory of
	  an XfceMenu object. Free string lists properly.

Modified: xfce-menu/trunk/ChangeLog
===================================================================
--- xfce-menu/trunk/ChangeLog	2006-07-27 00:26:07 UTC (rev 1802)
+++ xfce-menu/trunk/ChangeLog	2006-07-27 01:28:55 UTC (rev 1803)
@@ -1,3 +1,10 @@
+2006-07-27	Jannis Pohlmann <jannis at xfce.org>
+
+	* tests/display-menu.c: Removed debug statement and tooltips allocation.
+	* libxfce4menu/xfce-menu.c: Use list for possible directory names and
+	  try to load them in reverse order when resolving the menu directory of
+	  an XfceMenu object. Free string lists properly.
+
 2006-07-21	Jannis Pohlmann <jannis at xfce.org>
 
 	* STATUS: Detailled information about the implementation status added.

Modified: xfce-menu/trunk/libxfce4menu/xfce-menu.c
===================================================================
--- xfce-menu/trunk/libxfce4menu/xfce-menu.c	2006-07-27 00:26:07 UTC (rev 1802)
+++ xfce-menu/trunk/libxfce4menu/xfce-menu.c	2006-07-27 01:28:55 UTC (rev 1803)
@@ -161,7 +161,7 @@
                                                                    gsize                text_len,
                                                                    gpointer             user_data,
                                                                    GError             **error);
-static void               xfce_menu_set_parse_info_directory_name (XfceMenu            *menu,
+static void               xfce_menu_add_parse_info_directory_name (XfceMenu            *menu,
                                                                    const gchar         *name);
 static void               xfce_menu_free_parse_info               (XfceMenu            *menu);
 
@@ -183,8 +183,8 @@
 
 typedef struct _XfceMenuParseInfo
 {
-  /* Directory name */
-  gchar *directory_name;
+  /* Directory names */
+  GSList           *directory_names;
 
 } XfceMenuParseInfo;
 
@@ -371,7 +371,7 @@
   menu->priv->app_dirs = NULL;
   menu->priv->only_unallocated = FALSE;
   menu->priv->parse_info = g_new (XfceMenuParseInfo, 1);
-  menu->priv->parse_info->directory_name = NULL;
+  menu->priv->parse_info->directory_names = NULL;
 }
 
 
@@ -388,14 +388,21 @@
   g_free (menu->priv->name);
 
   /* TODO Free other variables */
+  g_slist_foreach (menu->priv->directory_dirs, (GFunc) g_free, NULL);
   g_slist_free (menu->priv->directory_dirs);
 
   /* Free legacy dirs (check if this is the best way to free the list) */
+  g_slist_foreach (menu->priv->legacy_dirs, (GFunc) g_free, NULL);
   g_slist_free (menu->priv->legacy_dirs);
 
   /* Free app dirs */
+  g_slist_foreach (menu->priv->app_dirs, (GFunc) g_free, NULL);
   g_slist_free (menu->priv->app_dirs);
 
+  /* TODO Free submenus etc. */
+  g_slist_foreach (menu->priv->submenus, (GFunc) g_object_unref, NULL);
+  g_slist_free (menu->priv->submenus);
+
   /* Free parse information */
   xfce_menu_free_parse_info (menu);
 
@@ -782,7 +789,7 @@
   /* Free menu parse context */
   g_list_free (menu_context.menu_stack);
 
-  /* TODO: Resolve internals, like priv->parse_info->directory_name => priv->directory */
+  /* TODO: Resolve internals, like priv->parse_info->directory_names => priv->directory */
   xfce_menu_resolve_directory (menu);
 }
 
@@ -924,7 +931,7 @@
       break;
 
     case XFCE_MENU_PARSE_NODE_TYPE_DIRECTORY:
-      xfce_menu_set_parse_info_directory_name (current_menu, content);
+      xfce_menu_add_parse_info_directory_name (current_menu, content);
       break;
 
     case XFCE_MENU_PARSE_NODE_TYPE_APP_DIR:
@@ -946,23 +953,31 @@
 
 
 static void
-xfce_menu_set_parse_info_directory_name (XfceMenu    *menu,
+xfce_menu_add_parse_info_directory_name (XfceMenu    *menu,
                                          const gchar *name)
 {
   g_return_if_fail (XFCE_IS_MENU (menu));
   g_return_if_fail (name != NULL);
 
-  /* Abort if names are equal */
-  if (G_UNLIKELY (menu->priv->parse_info->directory_name != NULL))
+  /* Remove all previous occurences of the directory name from the list */
+  /* TODO: This probably is rather dirty and should be replaced with a more
+   * clean algorithm. */
+  GSList *iter = menu->priv->parse_info->directory_names;
+  while (iter != NULL) 
     {
-      if (G_UNLIKELY (g_utf8_collate (name, menu->priv->parse_info->directory_name) == 0))
-        return;
-
-      g_free (menu->priv->parse_info->directory_name);
+      gchar *data = (gchar *)iter->data;
+      if (g_utf8_collate (data, name) == 0)
+        {
+          GSList *tmp = g_slist_next (iter);
+          menu->priv->parse_info->directory_names = g_slist_remove_link (menu->priv->parse_info->directory_names, iter);
+          iter = tmp;
+        }
+      else
+        iter = iter->next;
     }
-
-  /* Set new directory name */
-  menu->priv->parse_info->directory_name = g_strdup (name);
+  
+  /* Append directory */
+  menu->priv->parse_info->directory_names = g_slist_append (menu->priv->parse_info->directory_names, g_strdup (name));
 }
 
 
@@ -973,8 +988,9 @@
   g_return_if_fail (XFCE_IS_MENU (menu));
   g_return_if_fail (menu->priv->parse_info != NULL);
 
-  /* Free directory name */
-  g_free (menu->priv->parse_info->directory_name);
+  /* Free directory names */
+  g_slist_foreach (menu->priv->parse_info->directory_names, (GFunc) g_free, NULL);
+  g_slist_free (menu->priv->parse_info->directory_names);
 
   /* Free parse info */
   g_free (menu->priv->parse_info);
@@ -1312,15 +1328,32 @@
 static void
 xfce_menu_resolve_directory (XfceMenu *menu)
 {
+  GSList            *directory_names;
   GSList            *iter;
-  XfceMenuDirectory *directory;
+  XfceMenuDirectory *directory = NULL;
 
   g_return_if_fail (XFCE_IS_MENU (menu));
 
-  /* Load directory for the menu */
-  directory = xfce_menu_lookup_directory (menu, menu->priv->parse_info->directory_name);
+  /* Get reverse copy of all directory names */
+  directory_names = g_slist_reverse (g_slist_copy (menu->priv->parse_info->directory_names));
+
+  /* Try to load one directory name after another */
+  for (iter = directory_names; iter != NULL; iter = g_slist_next (iter))
+    {
+      /* Try to load the directory with this name */
+      directory = xfce_menu_lookup_directory (menu, iter->data);
+
+      /* Abort search if the directory was loaded successfully */
+      if (G_LIKELY (directory != NULL))
+        break;
+    }
+
+  /* Set the directory (assuming that we found at least one valid name) */
   xfce_menu_set_directory (menu, directory);
 
+  /* Free reverse list copy */
+  g_slist_free (directory_names);
+
   /* ... and all submenus (recursively) */
   for (iter = xfce_menu_get_menus (menu); iter != NULL; iter = g_slist_next (iter))
     xfce_menu_resolve_directory (iter->data);

Modified: xfce-menu/trunk/libxfce4menu/xfce-menu.h
===================================================================
--- xfce-menu/trunk/libxfce4menu/xfce-menu.h	2006-07-27 00:26:07 UTC (rev 1802)
+++ xfce-menu/trunk/libxfce4menu/xfce-menu.h	2006-07-27 01:28:55 UTC (rev 1803)
@@ -46,7 +46,7 @@
 
 GType              xfce_menu_get_type              (void) G_GNUC_CONST;
 
-XfceMenu          *xfce_menu_get_root              (void);
+XfceMenu          *xfce_menu_get_root              (void) G_GNUC_CONST;
 
 const gchar       *xfce_menu_get_filename          (XfceMenu          *menu);
 void               xfce_menu_set_filename          (XfceMenu          *menu,

Modified: xfce-menu/trunk/tests/display-menu.c
===================================================================
--- xfce-menu/trunk/tests/display-menu.c	2006-07-27 00:26:07 UTC (rev 1802)
+++ xfce-menu/trunk/tests/display-menu.c	2006-07-27 01:28:55 UTC (rev 1803)
@@ -62,7 +62,6 @@
   GtkWidget         *image;
   GSList            *iter;
   GSList            *menus;
-  GtkTooltips       *tooltips = gtk_tooltips_new ();
 
   /* Create sorted copy of the submenu list */
   menus = g_slist_sort (g_slist_copy (xfce_menu_get_menus (menu)), (GCompareFunc) compare_menus);
@@ -174,11 +173,10 @@
   /* Enter main loop */
   gtk_main ();
 
-  /* Destroy the root menu */
-  g_object_unref (root);
-
   /* Shut down the menu library */
   xfce_menu_shutdown ();
 
+  g_debug ("Exiting");
+
   return EXIT_SUCCESS;
 }




More information about the Goodies-commits mailing list