[Xfce4-commits] <garcon:master> Derive DefaultMergeDirs value from the menu filename (bug #6491).
Jannis Pohlmann
noreply at xfce.org
Sat Dec 4 17:16:01 CET 2010
Updating branch refs/heads/master
to 6a6807b37ba4409132fa067a3f5bcfe388127b6a (commit)
from b66e39c727817d6ce6cc4de89d3caeee643008fc (commit)
commit 6a6807b37ba4409132fa067a3f5bcfe388127b6a
Author: Jannis Pohlmann <jannis at xfce.org>
Date: Sat Dec 4 17:10:16 2010 +0100
Derive DefaultMergeDirs value from the menu filename (bug #6491).
We now use the following algorithm to derive the directory name of the
default merge dirs:
- if the .menu file is "${XDG_MENU_PREFIX}applications.menu" or if
the name cannot be derived (e.g. because the .menu file is called
".menu" only) we use "$XDG_CONFIG_DIRS/menus/"applications-merged"
- in all other cases, we use "$XDG_CONFIG_DIRS/menus/XYZ-merged"
(where the .menu file is called "XYZ.menu")
NEWS | 3 ++
garcon/garcon-menu-merger.c | 61 +++++++++++++++++++++++++++++++++++++++---
2 files changed, 59 insertions(+), 5 deletions(-)
diff --git a/NEWS b/NEWS
index 8a636f7..8fc61e9 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,9 @@
(bug #5980).
- Explicitly link against gobject, add other missing libs (bug #6405).
- Add workaround to fix empty <DefaultLayout> elements (bug #6882).
+- Derive the directory name of <DefaultMergeDirs> from the name of the
+ .menu file (e.g. preferences.menu becomes preferences-merged) (bug
+ #6491).
0.1.3
diff --git a/garcon/garcon-menu-merger.c b/garcon/garcon-menu-merger.c
index 07bc8b0..e498ed4 100644
--- a/garcon/garcon-menu-merger.c
+++ b/garcon/garcon-menu-merger.c
@@ -457,8 +457,9 @@ compare_files (GFile *file,
static void
-garcon_menu_merger_insert_default_merge_dirs (GNode *parent,
- GNode *defaults_node)
+garcon_menu_merger_insert_default_merge_dirs (GNode *parent,
+ GNode *defaults_node,
+ const gchar *merge_dir_basename)
{
GNode *node;
GNode *prev_node;
@@ -468,6 +469,7 @@ garcon_menu_merger_insert_default_merge_dirs (GNode *parent,
g_return_if_fail (parent != NULL);
g_return_if_fail (defaults_node != NULL);
+ g_return_if_fail (merge_dir_basename != NULL && *merge_dir_basename != '\0');
prev_node = defaults_node;
@@ -475,7 +477,8 @@ garcon_menu_merger_insert_default_merge_dirs (GNode *parent,
dirs = g_get_system_config_dirs ();
for (i = 0; dirs[i] != NULL; i++)
{
- path = g_build_path (G_DIR_SEPARATOR_S, dirs[i], "menus", "applications-merged", NULL);
+ path = g_build_path (G_DIR_SEPARATOR_S, dirs[i], "menus",
+ merge_dir_basename, NULL);
if (G_LIKELY (g_file_test (path, G_FILE_TEST_IS_DIR)))
{
node = g_node_new (garcon_menu_node_create (GARCON_MENU_NODE_TYPE_MERGE_DIR, path));
@@ -486,7 +489,7 @@ garcon_menu_merger_insert_default_merge_dirs (GNode *parent,
/* Append user config dir */
path = g_build_path (G_DIR_SEPARATOR_S, g_get_user_config_dir (), "menus",
- "applications-merged", NULL);
+ merge_dir_basename, NULL);
if (G_LIKELY (g_file_test (path, G_FILE_TEST_IS_DIR)))
{
node = g_node_new (garcon_menu_node_create (GARCON_MENU_NODE_TYPE_MERGE_DIR, path));
@@ -501,6 +504,15 @@ static gboolean
garcon_menu_merger_resolve_default_dirs (GNode *node,
GarconMenuMergerContext *context)
{
+ const gchar *prefix;
+ gboolean is_application_menu = FALSE;
+ GFile *file;
+ gchar *applications_filename;
+ gchar *extension;
+ gchar *filename;
+ gchar *menu_name;
+ gchar *merge_dir_basename = NULL;
+
g_return_val_if_fail (context != NULL, FALSE);
if (garcon_menu_node_tree_get_node_type (node) == context->node_type)
@@ -510,7 +522,46 @@ garcon_menu_merger_resolve_default_dirs (GNode *node,
}
else if (garcon_menu_node_tree_get_node_type (node) == GARCON_MENU_NODE_TYPE_DEFAULT_MERGE_DIRS)
{
- garcon_menu_merger_insert_default_merge_dirs (node->parent, node);
+ /* determine the .menu file basename */
+ file = g_list_first (context->file_stack)->data;
+ filename = g_file_get_basename (file);
+
+ /* check if we have an application menu file */
+ prefix = g_getenv ("XDG_MENU_PREFIX");
+ applications_filename = g_strconcat (prefix != NULL ? prefix : "",
+ "applications.menu", NULL);
+ if (g_strcmp0 (filename, applications_filename) == 0)
+ is_application_menu = TRUE;
+ g_free (applications_filename);
+
+ /* derive the basename of default merge dirs from the menu filename */
+ if (!is_application_menu)
+ {
+ /* find the extension */
+ extension = g_strstr_len (filename, -1, ".");
+
+ /* derive the merge dir name by stripping the extension */
+ if (extension != NULL && extension > filename)
+ {
+ menu_name = g_strndup (filename, extension - filename);
+ merge_dir_basename = g_strconcat (menu_name, "-merged", NULL);
+ g_free (menu_name);
+ }
+ }
+
+ /* free the filename */
+ g_free (filename);
+
+ /* use "applications-merged" as the fallback dir */
+ if (merge_dir_basename == NULL)
+ merge_dir_basename = g_strdup ("applications-merged");
+
+ garcon_menu_merger_insert_default_merge_dirs (node->parent, node,
+ merge_dir_basename);
+
+ /* free the merge dir name */
+ g_free (merge_dir_basename);
+
garcon_menu_node_tree_free (node);
}
More information about the Xfce4-commits
mailing list