[Goodies-commits] r1772 - in xfce-menu/trunk: . libxfce4menu tests
Jannis Pohlmann
jannis at xfce.org
Mon Jul 17 17:47:18 CEST 2006
Author: jannis
Date: 2006-07-17 15:47:17 +0000 (Mon, 17 Jul 2006)
New Revision: 1772
Modified:
xfce-menu/trunk/ChangeLog
xfce-menu/trunk/libxfce4menu/xfce-menu.c
xfce-menu/trunk/libxfce4menu/xfce-menu.h
xfce-menu/trunk/tests/load-root-menu-test.c
Log:
* libxfce4menu/xfce-menu.{c,h}: Implement recursive <Menu> parsing.
There is no support for merging menus across files and also,
directory and desktop entry lookup is still missing.
* tests/load-root-menu.c: Extend test program to print the complete
menu hierarchy.
Modified: xfce-menu/trunk/ChangeLog
===================================================================
--- xfce-menu/trunk/ChangeLog 2006-07-17 11:44:15 UTC (rev 1771)
+++ xfce-menu/trunk/ChangeLog 2006-07-17 15:47:17 UTC (rev 1772)
@@ -1,5 +1,13 @@
2006-07-17 Jannis Pohlmann <jannis at xfce.org>
+ * libxfce4menu/xfce-menu.{c,h}: Implement recursive <Menu> parsing.
+ There is no support for merging menus across files and also,
+ directory and desktop entry lookup is still missing.
+ * tests/load-root-menu.c: Extend test program to print the complete
+ menu hierarchy.
+
+2006-07-17 Jannis Pohlmann <jannis at xfce.org>
+
* libxfce4menu/xfce-menu.{c,h}: Implemented the following elements:
elements: <DirectoryDir>, <DefaultDirectoryDirs>,
<OnlyUnallocated>, <NotOnlyUnallocated>, <Deleted>, <NotDeleted>.
Modified: xfce-menu/trunk/libxfce4menu/xfce-menu.c
===================================================================
--- xfce-menu/trunk/libxfce4menu/xfce-menu.c 2006-07-17 11:44:15 UTC (rev 1771)
+++ xfce-menu/trunk/libxfce4menu/xfce-menu.c 2006-07-17 15:47:17 UTC (rev 1772)
@@ -79,6 +79,7 @@
XFCE_MENU_PARSE_STATE_START,
XFCE_MENU_PARSE_STATE_ROOT,
XFCE_MENU_PARSE_STATE_MENU,
+ XFCE_MENU_PARSE_STATE_END,
} XfceMenuParseState;
@@ -98,13 +99,13 @@
typedef struct _XfceMenuParseContext
{
/* Menu to be parsed */
- XfceMenu *root_menu;
+ XfceMenu *root_menu;
/* Parser state (position in XML tree */
- XfceMenuParseState state;
+ XfceMenuParseState state;
- /* Current menu */
- XfceMenu *menu;
+ /* Menu hierarchy "stack" */
+ GList *menu_stack;
/* Current node type (for text handler) */
XfceMenuParseNodeType node_type;
@@ -148,6 +149,10 @@
const gchar **attribute_values,
gpointer user_data,
GError **error);
+static void xfce_menu_end_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ gpointer user_data,
+ GError **error);
static void xfce_menu_characters (GMarkupParseContext *context,
const gchar *text,
gsize text_len,
@@ -358,6 +363,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;
}
@@ -668,6 +674,7 @@
xfce_menu_get_directory_dirs (XfceMenu *menu)
{
g_return_val_if_fail (XFCE_IS_MENU (menu), NULL);
+ /* TODO collect directories from the bottom up to the root menu */
return menu->priv->directory_dirs;
}
@@ -677,6 +684,9 @@
xfce_menu_get_legacy_dirs (XfceMenu *menu)
{
g_return_val_if_fail (XFCE_IS_MENU (menu), NULL);
+ /* TODO collect directories from the bottom up to the root menu - does the
+ * spec treat legacy dirs differently than app dirs and directory dirs?
+ * */
return menu->priv->legacy_dirs;
}
@@ -686,6 +696,7 @@
xfce_menu_get_app_dirs (XfceMenu *menu)
{
g_return_val_if_fail (XFCE_IS_MENU (menu), NULL);
+ /* TODO collect directories from the bottom up to the root menu */
return menu->priv->app_dirs;
}
@@ -700,10 +711,7 @@
GMarkupParseContext *context;
GMarkupParser parser = {
xfce_menu_start_element,
-#if 0
xfce_menu_end_element,
-#endif
- NULL,
xfce_menu_characters,
NULL,
NULL
@@ -746,6 +754,7 @@
menu_context.root_menu = menu;
menu_context.state = XFCE_MENU_PARSE_STATE_START;
menu_context.state = XFCE_MENU_PARSE_NODE_TYPE_NONE;
+ menu_context.menu_stack = NULL;
/* Allocate parse context */
context = g_markup_parse_context_new (&parser, 0, &menu_context, NULL);
@@ -763,6 +772,9 @@
/* Free parse context */
g_markup_parse_context_free (context);
+ /* Free menu parse context */
+ g_list_free (menu_context.menu_stack);
+
/* TODO: Resolve internals, like priv->parse_info->directory_name => priv->directory */
}
@@ -777,6 +789,7 @@
GError **error)
{
XfceMenuParseContext *menu_context = (XfceMenuParseContext *)user_data;
+ XfceMenu *current_menu;
switch (menu_context->state)
{
@@ -784,10 +797,15 @@
if (g_utf8_collate (element_name, "Menu") == 0)
{
menu_context->state = XFCE_MENU_PARSE_STATE_ROOT;
- menu_context->menu = menu_context->root_menu;
+ menu_context->menu_stack = g_list_prepend (menu_context->menu_stack, menu_context->root_menu);
}
break;
+
case XFCE_MENU_PARSE_STATE_ROOT:
+ case XFCE_MENU_PARSE_STATE_MENU:
+ /* Fetch current menu from stack */
+ current_menu = g_list_first (menu_context->menu_stack)->data;
+
if (g_utf8_collate (element_name, "Name") == 0)
menu_context->node_type = XFCE_MENU_PARSE_NODE_TYPE_NAME;
@@ -796,31 +814,44 @@
else if (g_utf8_collate (element_name, "DirectoryDir") == 0)
menu_context->node_type = XFCE_MENU_PARSE_NODE_TYPE_DIRECTORY_DIR;
else if (g_utf8_collate (element_name, "DefaultDirectoryDirs") == 0)
- xfce_menu_add_default_directory_dirs (menu_context->menu);
+ xfce_menu_add_default_directory_dirs (current_menu);
else if (g_utf8_collate (element_name, "DefaultAppDirs") == 0)
- xfce_menu_add_default_app_dirs (menu_context->menu);
+ xfce_menu_add_default_app_dirs (current_menu);
else if (g_utf8_collate (element_name, "AppDir") == 0)
menu_context->node_type = XFCE_MENU_PARSE_NODE_TYPE_APP_DIR;
else if (g_utf8_collate (element_name, "KDELegacyDirs") == 0)
- xfce_menu_add_kde_legacy_dirs (menu_context->menu);
+ xfce_menu_add_kde_legacy_dirs (current_menu);
else if (g_utf8_collate (element_name, "LegacyDir") == 0)
menu_context->node_type = XFCE_MENU_PARSE_NODE_TYPE_LEGACY_DIR;
else if (g_utf8_collate (element_name, "OnlyUnallocated") == 0)
- xfce_menu_set_only_unallocated (menu_context->menu, TRUE);
+ xfce_menu_set_only_unallocated (current_menu, TRUE);
else if (g_utf8_collate (element_name, "NotOnlyUnallocated") == 0)
- xfce_menu_set_only_unallocated (menu_context->menu, FALSE);
+ xfce_menu_set_only_unallocated (current_menu, FALSE);
else if (g_utf8_collate (element_name, "Deleted") == 0)
- xfce_menu_set_deleted (menu_context->menu, TRUE);
+ xfce_menu_set_deleted (current_menu, TRUE);
else if (g_utf8_collate (element_name, "NotDeleted") == 0)
- xfce_menu_set_deleted (menu_context->menu, FALSE);
+ xfce_menu_set_deleted (current_menu, FALSE);
else if (g_utf8_collate (element_name, "Menu") == 0)
{
+ /* Create new menu */
+ XfceMenu *menu = g_object_new (XFCE_TYPE_MENU, NULL);
+
+ /* Silently copy filename attribute from the current menu */
+ menu->priv->filename = g_strdup (current_menu->priv->filename);
+
+ /* Add menu as submenu to the current menu */
+ xfce_menu_add_menu (current_menu, menu);
+
+ /* Set parse state */
menu_context->state = XFCE_MENU_PARSE_STATE_MENU;
+
+ /* Push new menu to the stack */
+ menu_context->menu_stack = g_list_prepend (menu_context->menu_stack, menu);
}
break;
@@ -829,6 +860,42 @@
+static void
+xfce_menu_end_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ gpointer user_data,
+ GError **error)
+{
+ XfceMenuParseContext *menu_context = (XfceMenuParseContext *)user_data;
+
+ switch (menu_context->state)
+ {
+ case XFCE_MENU_PARSE_STATE_ROOT:
+ if (g_utf8_collate (element_name, "Menu") == 0)
+ {
+ /* Remove root menu from stack */
+ menu_context->menu_stack = g_list_delete_link (menu_context->menu_stack, g_list_first (menu_context->menu_stack));
+
+ /* Set parser state */
+ menu_context->state = XFCE_MENU_PARSE_STATE_END;
+ }
+ break;
+
+ case XFCE_MENU_PARSE_STATE_MENU:
+ if (g_utf8_collate (element_name, "Menu") == 0)
+ {
+ /* Remove current menu from stack */
+ menu_context->menu_stack = g_list_delete_link (menu_context->menu_stack, g_list_first (menu_context->menu_stack));
+
+ /* Set parse state */
+ menu_context->state = XFCE_MENU_PARSE_STATE_ROOT;
+ }
+ break;
+ }
+}
+
+
+
static void
xfce_menu_characters (GMarkupParseContext *context,
const gchar *text,
@@ -837,6 +904,7 @@
GError **error)
{
XfceMenuParseContext *menu_context = (XfceMenuParseContext *)user_data;
+ XfceMenu *current_menu = g_list_first (menu_context->menu_stack)->data;
/* Generate NULL-terminated string */
gchar *content = g_strndup (text, text_len);
@@ -844,27 +912,26 @@
switch (menu_context->node_type)
{
case XFCE_MENU_PARSE_NODE_TYPE_NAME:
- xfce_menu_set_name (menu_context->menu, content);
+ xfce_menu_set_name (current_menu, content);
break;
case XFCE_MENU_PARSE_NODE_TYPE_DIRECTORY:
- xfce_menu_set_parse_info_directory_name (menu_context->menu, content);
+ xfce_menu_set_parse_info_directory_name (current_menu, content);
break;
case XFCE_MENU_PARSE_NODE_TYPE_APP_DIR:
- xfce_menu_add_app_dir (menu_context->menu, content);
+ xfce_menu_add_app_dir (current_menu, content);
break;
case XFCE_MENU_PARSE_NODE_TYPE_LEGACY_DIR:
- xfce_menu_add_legacy_dir (menu_context->menu, content);
+ xfce_menu_add_legacy_dir (current_menu, content);
break;
}
/* Free string */
g_free (content);
- /* Invalidate node type (TODO remove this later, when end_element is
- * available). */
+ /* Invalidate node type information */
menu_context->node_type = XFCE_MENU_PARSE_NODE_TYPE_NONE;
}
@@ -878,8 +945,9 @@
g_return_if_fail (name != NULL);
/* Abort if names are equal */
- if (G_UNLIKELY (g_utf8_collate (name, menu->priv->parse_info->directory_name) == 0))
- return;
+ if (G_UNLIKELY (menu->priv->parse_info->directory_name != NULL))
+ if (G_UNLIKELY (g_utf8_collate (name, menu->priv->parse_info->directory_name) == 0))
+ return;
/* Set new directory name */
menu->priv->parse_info->directory_name = g_strdup (name);
@@ -1174,3 +1242,31 @@
xfce_menu_add_app_dir (menu, path);
g_free (path);
}
+
+
+
+GSList*
+xfce_menu_get_menus (XfceMenu *menu)
+{
+ g_return_val_if_fail (XFCE_IS_MENU (menu), NULL);
+ return menu->priv->submenus;
+}
+
+
+
+void
+xfce_menu_add_menu (XfceMenu *menu,
+ XfceMenu *submenu)
+{
+ g_return_if_fail (XFCE_IS_MENU (menu));
+ g_return_if_fail (XFCE_IS_MENU (submenu));
+
+ /* Remove floating reference and acquire a 'real' one */
+ g_object_ref_sink (G_OBJECT (submenu));
+
+ /* Append menu to the list */
+ menu->priv->submenus = g_slist_append (menu->priv->submenus, submenu);
+
+ /* TODO: Use property method here */
+ submenu->priv->parent = menu;
+}
Modified: xfce-menu/trunk/libxfce4menu/xfce-menu.h
===================================================================
--- xfce-menu/trunk/libxfce4menu/xfce-menu.h 2006-07-17 11:44:15 UTC (rev 1771)
+++ xfce-menu/trunk/libxfce4menu/xfce-menu.h 2006-07-17 15:47:17 UTC (rev 1772)
@@ -66,6 +66,9 @@
gboolean xfce_menu_get_deleted (XfceMenu *menu);
void xfce_menu_set_deleted (XfceMenu *menu,
gboolean deleted);
+GSList *xfce_menu_get_menus (XfceMenu *menu);
+void xfce_menu_add_menu (XfceMenu *menu,
+ XfceMenu *submenu);
G_END_DECLS;
Modified: xfce-menu/trunk/tests/load-root-menu-test.c
===================================================================
--- xfce-menu/trunk/tests/load-root-menu-test.c 2006-07-17 11:44:15 UTC (rev 1771)
+++ xfce-menu/trunk/tests/load-root-menu-test.c 2006-07-17 15:47:17 UTC (rev 1772)
@@ -28,21 +28,76 @@
#include <libxfce4menu/libxfce4menu.h>
+void
+print_line (const gchar *indent, const gchar *title, const gchar *value)
+{
+ g_print ("%s%s: %s\n", indent, title, value);
+}
+
+
+
+void
+print_int_line (const gchar *indent, const gchar *title, gint value)
+{
+ g_print ("%s%s: %d\n", indent, title, value);
+}
+
+
+
+void
+print_str_slist (const gchar *indent, const gchar *title, GSList *list)
+{
+ GSList *iter = list;
+
+ g_print ("%s%s:\n", indent, title);
+
+ while (iter != NULL)
+ {
+ g_print ("%s %s\n", indent, iter->data);
+ iter = g_slist_next (iter);
+ }
+}
+
+
+
+void
+print_menu_details (XfceMenu *menu,
+ const gchar *indent)
+{
+ gchar *new_indent = g_strconcat (" ", indent, NULL);
+ GSList *submenus = xfce_menu_get_menus (menu);
+
+ print_line (indent, "Name", xfce_menu_get_name (menu));
+ print_line (indent, "Filename", xfce_menu_get_filename (menu));
+ print_int_line (indent, "Only allocated", xfce_menu_get_only_unallocated (menu));
+ print_int_line (indent, "Deleted", xfce_menu_get_deleted (menu));
+
+ print_str_slist (indent, "Directory dirs", xfce_menu_get_directory_dirs (menu));
+
+ g_print ("\n");
+
+ while (submenus != NULL)
+ {
+ print_menu_details (submenus->data, new_indent);
+ submenus = submenus->next;
+ }
+
+ g_free (new_indent);
+}
+
+
+
int
main(int argc,
char **argv)
{
- setlocale (LC_MESSAGES, "de");
-
xfce_menu_init ();
XfceMenu *menu = xfce_menu_get_root ();
- g_debug ("Root menu name: %s", xfce_menu_get_name (menu));
- g_debug ("Root menu filename: %s", xfce_menu_get_filename (menu));
- g_debug ("Root menu only unallocated: %i", xfce_menu_get_only_unallocated (menu));
- g_debug ("Root menu deleted: %i", xfce_menu_get_deleted (menu));
-
+ print_menu_details (menu, "");
+
+#if 0
g_debug ("Root menu directory dirs:");
GSList *dir;
@@ -65,6 +120,14 @@
g_debug ("Root menu directory comment: %s", xfce_menu_directory_get_comment (xfce_menu_get_directory (menu)));
g_debug ("Root menu directory icon: %s", xfce_menu_directory_get_icon (xfce_menu_get_directory (menu)));
+ GSList *iter;
+ for (iter = xfce_menu_get_menus (menu); iter != NULL; iter = g_slist_next (iter))
+ {
+ XfceMenu *submenu = XFCE_MENU (iter->data);
+ g_debug ("Submenu name: %s", xfce_menu_get_name (submenu));
+ }
+#endif
+
xfce_menu_shutdown ();
return 0;
More information about the Goodies-commits
mailing list