[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