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

Jannis Pohlmann jannis at xfce.org
Thu Jul 20 16:48:17 CEST 2006


Author: jannis
Date: 2006-07-20 14:48:13 +0000 (Thu, 20 Jul 2006)
New Revision: 1775

Modified:
   xfce-menu/trunk/ChangeLog
   xfce-menu/trunk/libxfce4menu/xfce-menu-directory.c
   xfce-menu/trunk/libxfce4menu/xfce-menu-directory.h
   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-directory.{c,h}: Remove the
	  xfce_menu_directory_lookup method, as the lookup is performed by the
	  menu by using its search paths.
	* libxfce4menu/xfce-menu.{c,h}: Recursively resolve menu directories
	  after the parsing process. xfce_menu_get_parent method added.
	* tests/load-root-menu-test.c: Print menu directory information.

Modified: xfce-menu/trunk/ChangeLog
===================================================================
--- xfce-menu/trunk/ChangeLog	2006-07-19 13:55:21 UTC (rev 1774)
+++ xfce-menu/trunk/ChangeLog	2006-07-20 14:48:13 UTC (rev 1775)
@@ -1,3 +1,12 @@
+2006-07-20	Jannis Pohlmann <jannis at xfce.org>
+
+	* libxfce4menu/xfce-menu-directory.{c,h}: Remove the
+	  xfce_menu_directory_lookup method, as the lookup is performed by the
+	  menu by using its search paths.
+	* libxfce4menu/xfce-menu.{c,h}: Recursively resolve menu directories
+	  after the parsing process. xfce_menu_get_parent method added.
+	* tests/load-root-menu-test.c: Print menu directory information.
+
 2006-07-17	Jannis Pohlmann <jannis at xfce.org>
 
 	* tests/load-root-menu.c: Cleanup the test program. Print legacy

Modified: xfce-menu/trunk/libxfce4menu/xfce-menu-directory.c
===================================================================
--- xfce-menu/trunk/libxfce4menu/xfce-menu-directory.c	2006-07-19 13:55:21 UTC (rev 1774)
+++ xfce-menu/trunk/libxfce4menu/xfce-menu-directory.c	2006-07-20 14:48:13 UTC (rev 1775)
@@ -334,35 +334,6 @@
 
 
 
-XfceMenuDirectory*
-xfce_menu_directory_lookup (const gchar *name)
-{
-  XfceMenuDirectory *directory = NULL;
-
-  /* Build relative search path */
-  gchar *relative_path = g_build_path (G_DIR_SEPARATOR_S, "desktop-directories", name, NULL);
-
-  /* Search file in XDG_DATA_DIRS */
-  gchar *location = xfce_resource_lookup (XFCE_RESOURCE_DATA, relative_path);
-
-  /* Make sure we found the file */
-  if (G_LIKELY (location != NULL))
-    {
-      /* Allocate new directory object and load the desktop entry data */
-      directory = g_object_new (XFCE_TYPE_MENU_DIRECTORY, "filename", location);
-
-      /* Free the location */
-      g_free (location);
-    }
-
-  /* Free relative path */
-  g_free (relative_path);
-
-  return directory;
-}
-
-
-
 const gchar*
 xfce_menu_directory_get_filename (XfceMenuDirectory *directory)
 {

Modified: xfce-menu/trunk/libxfce4menu/xfce-menu-directory.h
===================================================================
--- xfce-menu/trunk/libxfce4menu/xfce-menu-directory.h	2006-07-19 13:55:21 UTC (rev 1774)
+++ xfce-menu/trunk/libxfce4menu/xfce-menu-directory.h	2006-07-20 14:48:13 UTC (rev 1775)
@@ -43,8 +43,6 @@
 
 GType                    xfce_menu_directory_get_type        (void) G_GNUC_CONST;
 
-XfceMenuDirectory       *xfce_menu_directory_lookup          (const gchar       *name) G_GNUC_MALLOC;
-
 const gchar             *xfce_menu_directory_get_filename    (XfceMenuDirectory *directory);
 void                     xfce_menu_directory_set_filename    (XfceMenuDirectory *directory,
                                                               const gchar       *name);

Modified: xfce-menu/trunk/libxfce4menu/xfce-menu.c
===================================================================
--- xfce-menu/trunk/libxfce4menu/xfce-menu.c	2006-07-19 13:55:21 UTC (rev 1774)
+++ xfce-menu/trunk/libxfce4menu/xfce-menu.c	2006-07-20 14:48:13 UTC (rev 1775)
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#include <unistd.h>
+
 #include <libxfce4menu/xfce-menu-directory.h>
 #include <libxfce4menu/xfce-menu.h>
 
@@ -124,55 +126,61 @@
   PROP_DIRECTORY_DIRS, /* TODO */
   PROP_LEGACY_DIRS, /* TODO */
   PROP_APP_DIRS, /* TODO Implement methods for this! */
+  PROP_PARENT, /* TODO */
   PROP_ONLY_UNALLOCATED,
   PROP_DELETED,
 };
 
 
 
-static void xfce_menu_class_init                    (XfceMenuClass       *klass);
-static void xfce_menu_instance_init                 (XfceMenu            *menu);
-static void xfce_menu_finalize                      (GObject             *object);
-static void xfce_menu_get_property                  (GObject             *object,
-                                                     guint                prop_id,
-                                                     GValue              *value,
-                                                     GParamSpec          *pspec);
-static void xfce_menu_set_property                  (GObject             *object,
-                                                     guint                prop_id,
-                                                     const GValue        *value,
-                                                     GParamSpec          *pspec);
+static void               xfce_menu_class_init                    (XfceMenuClass       *klass);
+static void               xfce_menu_instance_init                 (XfceMenu            *menu);
+static void               xfce_menu_finalize                      (GObject             *object);
+static void               xfce_menu_get_property                  (GObject             *object,
+                                                                   guint                prop_id,
+                                                                   GValue              *value,
+                                                                   GParamSpec          *pspec);
+static void               xfce_menu_set_property                  (GObject             *object,
+                                                                   guint                prop_id,
+                                                                   const GValue        *value,
+                                                                   GParamSpec          *pspec);
 
-static void xfce_menu_load                          (XfceMenu            *menu);
-static void xfce_menu_start_element                 (GMarkupParseContext *context,
-                                                     const gchar         *element_name,
-                                                     const gchar        **attribute_names,
-                                                     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,
-                                                     gpointer             user_data,
-                                                     GError             **error);
-static void xfce_menu_set_parse_info_directory_name (XfceMenu            *menu,
-                                                     const gchar         *name);
+static void               xfce_menu_load                          (XfceMenu            *menu);
+static void               xfce_menu_start_element                 (GMarkupParseContext *context,
+                                                                   const gchar         *element_name,
+                                                                   const gchar        **attribute_names,
+                                                                   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,
+                                                                   gpointer             user_data,
+                                                                   GError             **error);
+static void               xfce_menu_set_parse_info_directory_name (XfceMenu            *menu,
+                                                                   const gchar         *name);
+static void               xfce_menu_free_parse_info               (XfceMenu            *menu);
 
-static void xfce_menu_add_directory_dir             (XfceMenu            *menu,
-                                                     const gchar         *dir);
-static void xfce_menu_add_default_directory_dirs    (XfceMenu            *menu);
-static void xfce_menu_add_app_dir                   (XfceMenu            *menu,
-                                                     const gchar         *dir);
-static void xfce_menu_add_legacy_dir                (XfceMenu            *menu,
-                                                     const gchar         *dir);
-static void xfce_menu_add_kde_legacy_dirs           (XfceMenu            *menu);
-static void xfce_menu_add_default_app_dirs          (XfceMenu            *menu);
+static void               xfce_menu_add_directory_dir             (XfceMenu            *menu,
+                                                                   const gchar         *dir);
+static void               xfce_menu_add_default_directory_dirs    (XfceMenu            *menu);
+static void               xfce_menu_add_app_dir                   (XfceMenu            *menu,
+                                                                   const gchar         *dir);
+static void               xfce_menu_add_legacy_dir                (XfceMenu            *menu,
+                                                                   const gchar         *dir);
+static void               xfce_menu_add_kde_legacy_dirs           (XfceMenu            *menu);
+static void               xfce_menu_add_default_app_dirs          (XfceMenu            *menu);
 
+static void               xfce_menu_resolve_directory             (XfceMenu    *menu);
+static XfceMenuDirectory *xfce_menu_lookup_directory              (XfceMenu    *menu,
+                                                                   const gchar *filename);
 
 
+
 typedef struct _XfceMenuParseInfo
 {
   /* Directory name */
@@ -776,6 +784,10 @@
   g_list_free (menu_context.menu_stack);
 
   /* TODO: Resolve internals, like priv->parse_info->directory_name => priv->directory */
+  xfce_menu_resolve_directory (menu);
+
+  /* Free parse info */
+  xfce_menu_free_parse_info (menu);
 }
 
 
@@ -956,6 +968,18 @@
 
 
 static void
+xfce_menu_free_parse_info (XfceMenu *menu)
+{
+  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);
+}
+
+
+
+static void
 xfce_menu_add_directory_dir (XfceMenu    *menu,
                              const gchar *dir)
 {
@@ -1270,3 +1294,100 @@
   /* TODO: Use property method here */
   submenu->priv->parent = menu;
 }
+
+
+
+XfceMenu *
+xfce_menu_get_parent (XfceMenu *menu)
+{
+  g_return_val_if_fail (XFCE_IS_MENU (menu), NULL);
+  return menu->priv->parent;
+}
+
+
+
+static void
+xfce_menu_resolve_directory (XfceMenu *menu)
+{
+  GSList            *iter;
+  XfceMenuDirectory *directory;
+
+  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);
+  xfce_menu_set_directory (menu, directory);
+
+  /* ... and all submenus (recursively) */
+  for (iter = xfce_menu_get_menus (menu); iter != NULL; iter = g_slist_next (iter))
+    xfce_menu_resolve_directory (iter->data);
+}
+
+
+
+static XfceMenuDirectory*
+xfce_menu_lookup_directory (XfceMenu    *menu,
+                            const gchar *filename)
+{
+  XfceMenuDirectory *directory = NULL;
+  XfceMenu          *current;
+  GSList            *dirs;
+  gchar             *dirname;
+  gchar             *absolute_path;
+  GSList            *iter;
+  gboolean           found = FALSE;
+  
+  g_return_val_if_fail (XFCE_IS_MENU (menu), NULL);
+  g_return_val_if_fail (filename != NULL, NULL);
+
+  /* Iterate through all (parent) menus from the bottom up */
+  for (current = menu; current != NULL; current = xfce_menu_get_parent (current))
+    {
+      /* Allocate a reverse copy of the menu's directory dirs */
+      dirs = g_slist_reverse (g_slist_copy (xfce_menu_get_directory_dirs (current)));
+
+      /* Iterate through all directories */
+      for (iter = dirs; iter != NULL; iter = g_slist_next (iter))
+        {
+          /* Check if the path is absolute */
+          if (G_UNLIKELY (!g_path_is_absolute (iter->data)))
+            {
+              /* Determine directory of the menu file */
+              dirname = g_path_get_dirname (xfce_menu_get_filename (menu));
+              
+              /* Build absolute path */
+              absolute_path = g_build_filename (dirname, iter->data, filename, NULL);
+
+              /* Free directory name */
+              g_free (dirname); 
+            }
+          else
+            absolute_path = g_build_filename (iter->data, filename, NULL);
+
+          /* Check if the file exists and is readable */
+          if (G_UNLIKELY (g_file_test (absolute_path, G_FILE_TEST_EXISTS)))
+            {
+              if (G_LIKELY (g_access (absolute_path, R_OK) == 0))
+                {
+                  /* Load menu directory */
+                  directory = g_object_new (XFCE_TYPE_MENU_DIRECTORY, "filename", absolute_path, NULL);
+
+                  /* Update search status */
+                  found = TRUE;
+                }
+            }
+          
+          /* Free the absolute path */
+          g_free (absolute_path);
+
+          /* Cancel search if we found the menu directory file */
+          if (G_UNLIKELY (found))
+            break;
+        }
+
+      /* Free reverse copy */
+      g_slist_free (dirs);
+    }
+
+  return directory;
+}

Modified: xfce-menu/trunk/libxfce4menu/xfce-menu.h
===================================================================
--- xfce-menu/trunk/libxfce4menu/xfce-menu.h	2006-07-19 13:55:21 UTC (rev 1774)
+++ xfce-menu/trunk/libxfce4menu/xfce-menu.h	2006-07-20 14:48:13 UTC (rev 1775)
@@ -69,6 +69,7 @@
 GSList            *xfce_menu_get_menus             (XfceMenu          *menu);
 void               xfce_menu_add_menu              (XfceMenu          *menu,
                                                     XfceMenu          *submenu);
+XfceMenu          *xfce_menu_get_parent            (XfceMenu          *menu);
 
 G_END_DECLS;
 

Modified: xfce-menu/trunk/tests/load-root-menu-test.c
===================================================================
--- xfce-menu/trunk/tests/load-root-menu-test.c	2006-07-19 13:55:21 UTC (rev 1774)
+++ xfce-menu/trunk/tests/load-root-menu-test.c	2006-07-20 14:48:13 UTC (rev 1775)
@@ -76,6 +76,11 @@
   print_str_slist (indent, "App dirs", xfce_menu_get_app_dirs (menu));
   print_str_slist (indent, "Legacy dirs", xfce_menu_get_legacy_dirs (menu));
 
+  print_line (indent, "Directory file", xfce_menu_directory_get_filename (xfce_menu_get_directory (menu)));
+  print_line (indent, "Directory name", xfce_menu_directory_get_name (xfce_menu_get_directory (menu)));
+  print_line (indent, "Directory comment", xfce_menu_directory_get_comment (xfce_menu_get_directory (menu)));
+  print_line (indent, "Directory icon", xfce_menu_directory_get_icon (xfce_menu_get_directory (menu)));
+
   g_print ("\n");
 
   while (submenus != NULL)




More information about the Goodies-commits mailing list