[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