[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