[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