Updating branch refs/heads/jannis/global-monitoring to d52de109946d56701477515c6712099c2769a6b3 (commit) from 79683094e2414643c87ff889ba664c7f04536079 (commit)
commit d52de109946d56701477515c6712099c2769a6b3 Author: Jannis Pohlmann <jan...@xfce.org> Date: Tue Mar 9 12:06:03 2010 +0100 Add garcon-marshal.list and GarconMenu::directory-changed signal. The signal is supposed to be emitted whenever the GarconMenuDirectory contents have changed and were updated or when the GarconMenuDirectory was replaced with a different file. garcon/Makefile.am | 73 ++++++++++++++++++++++++++++++++++++-------- garcon/garcon-marshal.list | 1 + garcon/garcon-menu.c | 73 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 133 insertions(+), 14 deletions(-) diff --git a/garcon/Makefile.am b/garcon/Makefile.am index 84bc7e8..e92aace 100644 --- a/garcon/Makefile.am +++ b/garcon/Makefile.am @@ -27,36 +27,45 @@ INCLUDES = \ lib_LTLIBRARIES = \ libgarcon-1.la +libgarcon_built_public_sources = \ + garcon-marshal.h + +libgarcon_built_sources = \ + $(libgarcon_built_public_sources) \ + garcon-marshal.c + libgarcon_headers = \ garcon.h \ garcon-config.h \ - garcon-menu-element.h \ - garcon-menu-separator.h \ + garcon-environment.h \ + garcon-marshal.h \ garcon-menu-directory.h \ + garcon-menu-element.h \ garcon-menu-item-pool.h \ garcon-menu-item-cache.h \ - garcon-environment.h \ - garcon-menu.h \ garcon-menu-item.h \ + garcon-menu-merger.h \ garcon-menu-node.h \ + garcon-menu-parser.h \ + garcon-menu-separator.h \ garcon-menu-tree-provider.h \ - garcon-menu-merger.h \ - garcon-menu-parser.h + garcon-menu.h libgarcon_sources = \ garcon-config.c \ - garcon-menu-element.c \ - garcon-menu-separator.c \ + garcon-environment.c \ + garcon-marshal.c \ garcon-menu-directory.c \ + garcon-menu-element.c \ garcon-menu-item-pool.c \ garcon-menu-item-cache.c \ - garcon-environment.c \ - garcon-menu.c \ garcon-menu-item.c \ - garcon-menu-node.c \ - garcon-menu-tree-provider.c \ garcon-menu-merger.c \ + garcon-menu-node.c \ garcon-menu-parser.c \ + garcon-menu-separator.c \ + garcon-menu-tree-provider.c \ + garcon-menu.c \ garcon-private.c \ garcon-private.h @@ -88,10 +97,48 @@ libgarcon_1_la_LIBADD = \ $(GIO_LIBS) EXTRA_DIST = \ - garcon-config.h.in + garcon-config.h.in \ + garcon-marshal.list pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = garcon-1.pc +DISTCLEANFILES = \ + stamp-garcon-marshal.h \ + garcon-config.h \ + $(libgarcon_built_sources) + +BUILT_SOURCES = \ + $(libgarcon_built_sources) + +garcon-marshal.h: stamp-garcon-marshal.h + @true + +stamp-garcon-marshal.h: garcon-marshal.list Makefile + $(AM_V_GEN) ( \ + cd $(top_builddir)/garcon \ + && echo "#ifndef __GARCON_MARSHAL_H__" > xgen-emh \ + && echo "#define __GARCON_MARSHAL_H__" >> xgen-emh \ + && ( glib-genmarshal \ + --prefix=garcon_marshal \ + --header $(srcdir)/garcon-marshal.list ) >> xgen-emh \ + && echo "#endif /* !__GARCON_MARSHAL_H__ */" >> xgen-emh \ + && ( cmp -s xgen-emh garcon-marshal.h \ + || cp xgen-emh garcon-marshal.h ) \ + && rm -f xgen-emh \ + && echo timestamp > $(@F) \ + ) + +garcon-marshal.c: garcon-marshal.list Makefile + $(AM_V_GEN) ( \ + cd $(top_builddir)/garcon \ + && echo "#include <garcon/garcon-marshal.h>" > xgen-emc \ + && ( glib-genmarshal \ + --prefix=garcon_marshal \ + --body $(srcdir)/garcon-marshal.list ) >> xgen-emc \ + && cp xgen-emc garcon-marshal.c \ + && rm -f xgen-emc \ + ) + # Required for gtk-doc and make distcheck dist-hook: all diff --git a/garcon/garcon-marshal.list b/garcon/garcon-marshal.list new file mode 100644 index 0000000..38076d6 --- /dev/null +++ b/garcon/garcon-marshal.list @@ -0,0 +1 @@ +VOID:OBJECT,OBJECT diff --git a/garcon/garcon-menu.c b/garcon/garcon-menu.c index 579fc01..043c72e 100644 --- a/garcon/garcon-menu.c +++ b/garcon/garcon-menu.c @@ -29,6 +29,7 @@ #include <glib/gi18n.h> #include <garcon/garcon-environment.h> +#include <garcon/garcon-marshal.h> #include <garcon/garcon-menu-element.h> #include <garcon/garcon-menu-item.h> #include <garcon/garcon-menu-directory.h> @@ -101,6 +102,7 @@ enum enum { RELOAD_REQUIRED, + DIRECTORY_CHANGED, LAST_SIGNAL, }; @@ -163,6 +165,11 @@ static void garcon_menu_merge_dir_changed (GarconM GFile *other_file, GFileMonitorEvent event_type, GFileMonitor *monitor); +static void garcon_menu_directory_file_changed (GarconMenu *menu, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + GFileMonitor *monitor); @@ -259,6 +266,19 @@ garcon_menu_class_init (GarconMenuClass *klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + menu_signals[DIRECTORY_CHANGED] = + g_signal_new ("directory-changed", + GARCON_TYPE_MENU, + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_HOOKS, + 0, + NULL, + NULL, + garcon_marshal_VOID__OBJECT_OBJECT, + G_TYPE_NONE, + 2, + GARCON_TYPE_MENU_DIRECTORY, + GARCON_TYPE_MENU_DIRECTORY); } @@ -1658,6 +1678,7 @@ static void garcon_menu_start_monitoring (GarconMenu *menu) { GFileMonitor *monitor; + GFile *file; GList *lp; g_return_if_fail (GARCON_IS_MENU (menu)); @@ -1696,7 +1717,21 @@ garcon_menu_start_monitoring (GarconMenu *menu) } } - /* TODO monitor the .directory file */ + /* Monitor the .directory file */ + if (menu->priv->directory != NULL) + { + file = garcon_menu_directory_get_file (menu->priv->directory); + + monitor = g_file_monitor (file, G_FILE_MONITOR_NONE, NULL, NULL); + if (monitor != NULL) + { + menu->priv->monitors = g_list_prepend (menu->priv->monitors, monitor); + g_signal_connect_swapped (monitor, "changed", + G_CALLBACK (garcon_menu_directory_file_changed), menu); + } + + g_object_unref (file); + } /* TODO monitor desktop directories */ @@ -1753,6 +1788,42 @@ garcon_menu_merge_dir_changed (GarconMenu *menu, static void +garcon_menu_directory_file_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); + + g_debug ("directory file %s changed", g_file_get_path (file)); + + if (event_type == G_FILE_MONITOR_EVENT_CHANGED) + { + /* TODO reload the menu directory (we need a new method + * garcon_menu_directory_load() for this) and emit a + * GarconMenu::directory-changed signal */ + } + else if (event_type == G_FILE_MONITOR_EVENT_DELETED) + { + /* TODO destroy the menu directory and emit a + * GarconMenu::directory-changed signal with the + * GarconMenuDirectory set to NULL */ + + /* TODO check if there is another MenuDirectory + * element that we can use and load instead. If this is + * the case, change the file of the current menu directory, + * reload it and emit a directory-changed signal. + * otherwise destroy the menu directory and emit + * a directory-changed signal with the GarconMenuDirectory + * parameter set to NULL */ + } +} + + + +static void garcon_menu_stop_monitoring (GarconMenu *menu) { GList *lp; _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits