[Xfce4-commits] <garcon:jannis/basic-monitoring> Monitor app dirs but don't react on changes there yet.
Jannis Pohlmann
noreply at xfce.org
Sun Sep 5 17:36:01 CEST 2010
Updating branch refs/heads/jannis/basic-monitoring
to 9513c7716c656735e5c6c92769579c854deaa644 (commit)
from ccf88785ae826293eb0a1868985dda89f542eac5 (commit)
commit 9513c7716c656735e5c6c92769579c854deaa644
Author: Jannis Pohlmann <jannis at xfce.org>
Date: Sun Sep 5 17:34:21 2010 +0200
Monitor app dirs but don't react on changes there yet.
garcon/garcon-menu.c | 97 +++++++++++++++++++++++++++++++++++++++----------
1 files changed, 77 insertions(+), 20 deletions(-)
diff --git a/garcon/garcon-menu.c b/garcon/garcon-menu.c
index 467d4f0..3adbaed 100644
--- a/garcon/garcon-menu.c
+++ b/garcon/garcon-menu.c
@@ -155,6 +155,7 @@ static void garcon_menu_monitor_menu_files (GarconM
static void garcon_menu_monitor_files (GarconMenu *menu,
GList *files,
gpointer callback);
+static void garcon_menu_monitor_app_dirs (GarconMenu *menu);
static void garcon_menu_file_changed (GarconMenu *menu,
GFile *file,
GFile *other_file,
@@ -170,8 +171,11 @@ static void garcon_menu_merge_dir_changed (GarconM
GFile *other_file,
GFileMonitorEvent event_type,
GFileMonitor *monitor);
-
-
+static void garcon_menu_app_dir_changed (GarconMenu *menu,
+ GFile *file,
+ GFile *other_file,
+ GFileMonitorEvent event_type,
+ GFileMonitor *monitor);
@@ -981,31 +985,30 @@ garcon_menu_lookup_directory (GarconMenu *menu,
static GList *
-garcon_menu_get_app_dirs (GarconMenu *menu)
+garcon_menu_get_app_dirs (GarconMenu *menu,
+ gboolean recursive)
{
GList *dirs = NULL;
+ GList *lp;
+ GList *sp;
+ GList *submenu_app_dirs;
/* Fetch all application directories */
dirs = garcon_menu_node_tree_get_string_children (menu->priv->tree,
GARCON_MENU_NODE_TYPE_APP_DIR,
TRUE);
-#if 0
- /* A submenu always inherits the application directories of its parent,
- * that is the reason the call below was added.
- * It only turned out we were looking in that same directories for
- * .desktop files multiple times.
- *
- * This was caused by the combination of the parent call below and
- * traversing the children in garcon_menu_collect_files(). For each
- * submenu the appdirs of the root were added and traversed again.
- *
- * This is not needed because we always start at the root and traverse
- * in "pre-order", so all the desktop files are added in the hash-table.
- */
- if (menu->priv->parent != NULL)
- dirs = g_list_concat (dirs, garcon_menu_get_app_dirs (menu->priv->parent));
-#endif
+ if (recursive)
+ {
+ for (lp = menu->priv->submenus; lp != NULL; lp = lp->next)
+ {
+ submenu_app_dirs = garcon_menu_get_app_dirs (lp->data, recursive);
+
+ for (sp = g_list_last (submenu_app_dirs); sp != NULL; sp = sp->prev)
+ if (g_list_find_custom (dirs, sp->data, (GCompareFunc) g_strcmp0) == NULL)
+ dirs = g_list_prepend (dirs, sp->data);
+ }
+ }
return dirs;
}
@@ -1022,7 +1025,7 @@ garcon_menu_collect_files (GarconMenu *menu,
g_return_if_fail (GARCON_IS_MENU (menu));
- app_dirs = garcon_menu_get_app_dirs (menu);
+ app_dirs = garcon_menu_get_app_dirs (menu, FALSE);
/* Collect desktop entry filenames */
for (iter = app_dirs; iter != NULL; iter = g_list_next (iter))
@@ -1722,6 +1725,8 @@ garcon_menu_start_monitoring (GarconMenu *menu)
garcon_menu_monitor_files (menu, menu->priv->merge_dirs,
garcon_menu_merge_dir_changed);
+
+ garcon_menu_monitor_app_dirs (menu);
}
/* Recurse into submenus */
@@ -1864,6 +1869,43 @@ garcon_menu_monitor_files (GarconMenu *menu,
static void
+garcon_menu_monitor_app_dirs (GarconMenu *menu)
+{
+ GFile *dir;
+ GList *app_dirs;
+ GList *dirs = NULL;
+ GList *lp;
+
+ g_return_if_fail (GARCON_IS_MENU (menu));
+ g_return_if_fail (menu->priv->parent == NULL);
+
+ g_return_if_fail (GARCON_IS_MENU (menu));
+
+ /* Determine all application directories we are interested in for this menu */
+ app_dirs = garcon_menu_get_app_dirs (menu, TRUE);
+
+ /* Transform app dir filenames into GFile objects, resolving filenames
+ * relative to the menu file itself */
+ for (lp = app_dirs; lp != NULL; lp = lp->next)
+ {
+ dir = _garcon_file_new_relative_to_file (lp->data, menu->priv->file);
+ dirs = g_list_prepend (dirs, dir);
+ }
+
+ /* Monitor the app dirs */
+ garcon_menu_monitor_files (menu, dirs, garcon_menu_app_dir_changed);
+
+ /* Release the allocated GFiles and free the list */
+ g_list_foreach (dirs, (GFunc) g_object_unref, NULL);
+ g_list_free (dirs);
+
+ /* Free app dir list */
+ g_list_free (app_dirs);
+}
+
+
+
+static void
garcon_menu_file_changed (GarconMenu *menu,
GFile *file,
GFile *other_file,
@@ -1950,3 +1992,18 @@ garcon_menu_merge_dir_changed (GarconMenu *menu,
g_signal_emit (menu, menu_signals[RELOAD_REQUIRED], 0);
}
+
+
+
+static void
+garcon_menu_app_dir_changed (GarconMenu *menu,
+ GFile *file,
+ GFile *other_file,
+ GFileMonitorEvent event_type,
+ GFileMonitor *monitor)
+{
+ g_return_if_fail (GARCON_IS_MENU (menu));
+ g_return_if_fail (menu->priv->parent == NULL);
+
+
+}
More information about the Xfce4-commits
mailing list