From 524d3e4fc324c2cbc2454e8b1fcddc6622dc4714 Mon Sep 17 00:00:00 2001 From: yetist Date: Wed, 2 May 2018 22:46:52 +0800 Subject: backport from gnome-menus --- libmenu/menu-layout.c | 50 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 7 deletions(-) (limited to 'libmenu/menu-layout.c') diff --git a/libmenu/menu-layout.c b/libmenu/menu-layout.c index 89e9752..30d11b3 100644 --- a/libmenu/menu-layout.c +++ b/libmenu/menu-layout.c @@ -64,7 +64,10 @@ struct MenuLayoutNodeRoot char *basedir; char *name; + GMainContext *main_context; + GSList *monitors; + GSource *monitors_idle_handler; }; struct MenuLayoutNodeMenu @@ -133,16 +136,14 @@ node_next (MenuLayoutNode *node) return node->next; } -static void -handle_entry_directory_changed (EntryDirectory *dir, - MenuLayoutNode *node) +static gboolean +menu_layout_invoke_monitors (MenuLayoutNodeRoot *nr) { - MenuLayoutNodeRoot *nr; - GSList *tmp; + GSList *tmp; - g_assert (node->type == MENU_LAYOUT_NODE_MENU); + g_assert (nr->node.type == MENU_LAYOUT_NODE_ROOT); - nr = (MenuLayoutNodeRoot *) menu_layout_node_get_root (node); + nr->monitors_idle_handler = NULL; tmp = nr->monitors; while (tmp != NULL) @@ -154,6 +155,28 @@ handle_entry_directory_changed (EntryDirectory *dir, tmp = next; } + + return FALSE; +} + +static void +handle_entry_directory_changed (EntryDirectory *dir, + MenuLayoutNode *node) +{ + MenuLayoutNodeRoot *nr; + + g_assert (node->type == MENU_LAYOUT_NODE_MENU); + + nr = (MenuLayoutNodeRoot *) menu_layout_node_get_root (node); + + if (nr->monitors_idle_handler == NULL) + { + nr->monitors_idle_handler = g_idle_source_new (); + g_source_set_callback (nr->monitors_idle_handler, + (GSourceFunc) menu_layout_invoke_monitors, nr, NULL); + g_source_attach (nr->monitors_idle_handler, nr->main_context); + g_source_unref (nr->monitors_idle_handler); + } } static void @@ -224,6 +247,14 @@ menu_layout_node_unref (MenuLayoutNode *node) g_slist_foreach (nr->monitors, (GFunc) g_free, NULL); g_slist_free (nr->monitors); + if (nr->monitors_idle_handler != NULL) + g_source_destroy (nr->monitors_idle_handler); + nr->monitors_idle_handler = NULL; + + if (nr->main_context != NULL) + g_main_context_unref (nr->main_context); + nr->main_context = NULL; + g_free (nr->basedir); g_free (nr->name); } @@ -2266,6 +2297,7 @@ menu_layout_load (const char *filename, const char *non_prefixed_basename, GError **err) { + GMainContext *main_context; GMarkupParseContext *context; MenuLayoutNodeRoot *root; MenuLayoutNode *retval; @@ -2281,6 +2313,8 @@ menu_layout_load (const char *filename, retval = NULL; context = NULL; + main_context = g_main_context_get_thread_default (); + menu_verbose ("Loading \"%s\" from disk\n", filename); if (!g_file_get_contents (filename, @@ -2328,6 +2362,8 @@ menu_layout_load (const char *filename, error = NULL; g_markup_parse_context_end_parse (context, &error); + root->main_context = main_context ? g_main_context_ref (main_context) : NULL; + out: if (context) g_markup_parse_context_free (context); -- cgit v1.2.1