Index: configure.in ================================================================================ --- configure.in +++ configure.in @@ -36,25 +36,11 @@ dnl make sure we keep ACLOCAL_FLAGS around for maintainer builds to work AC_SUBST(ACLOCAL_AMFLAGS, "$ACLOCAL_FLAGS") -PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.6.0) -AC_SUBST(GLIB_CFLAGS) -AC_SUBST(GLIB_LIBS) - -dnl check for FAM -FAM_LIBS= -AC_CHECK_LIB(fam, FAMOpen, - [AC_CHECK_HEADERS(fam.h, - [AC_DEFINE(HAVE_FAM, [], [Define if we have FAM]) - FAM_LIBS="-lfam"], - AC_MSG_WARN(*** FAM support will not be built (header files not found) ***))], - AC_MSG_WARN(*** FAM support will not be built (FAM library not found) ***)) -AC_SUBST(FAM_LIBS) - -dnl check for gamin extension -gmenu_save_libs="$LIBS" -LIBS="$LIBS $FAM_LIBS" -AC_CHECK_FUNCS(FAMNoExists) -LIBS="$gmenu_save_libs" +PKG_CHECK_MODULES(LIBMENU, + glib-2.0 >= 2.5.6 \ + gnome-vfs-2.0 >= 2.8.2) +AC_SUBST(LIBMENU_CFLAGS) +AC_SUBST(LIBMENU_LIBS) GNOME_COMPILE_WARNINGS(yes) @@ -63,11 +49,15 @@ [warn about deprecated usages [default=no]])],, [enable_deprecations=no]) -DISABLE_DEPRECATED_CFLAGS= if test "x$enable_deprecations" = "xyes"; then - DISABLE_DEPRECATED_CFLAGS="-DG_DISABLE_DEPRECATED" + DISABLE_DEPRECATED_CFLAGS="\ +-DG_DISABLE_DEPRECATED \ +-DGDK_DISABLE_DEPRECATED \ +-DGTK_DISABLE_DEPRECATED \ +-DGDK_PIXBUF_DISABLE_DEPRECATED \ +-DGNOME_DISABLE_DEPRECATED" + AC_SUBST(DISABLE_DEPRECATED_CFLAGS) fi -AC_SUBST(DISABLE_DEPRECATED_CFLAGS) dnl --enable-debug=(yes|minimum|no) AC_ARG_ENABLE(debug, [ --enable-debug=[no/yes] turn on debugging [default=no]],,enable_debug=yes) --- libmenu/Makefile.am +++ libmenu/Makefile.am @@ -2,7 +2,7 @@ INCLUDES = \ -DGMENU_I_KNOW_THIS_IS_UNSTABLE \ - $(GLIB_CFLAGS) \ + $(LIBMENU_CFLAGS) \ $(DISABLE_DEPRECATED_CFLAGS) \ $(DEBUG_CFLAGS) \ $(WARN_CFLAGS) \ @@ -21,8 +21,6 @@ gmenu-tree.h \ menu-layout.c \ menu-layout.h \ - menu-monitor.c \ - menu-monitor.h \ menu-monitor-backend.h \ menu-monitor-fam.c \ menu-util.c \ @@ -30,8 +28,7 @@ $(NULL) libgnome_menu_la_LIBADD = \ - $(GLIB_LIBS) \ - $(FAM_LIBS) \ + $(LIBMENU_LIBS) \ $(NULL) libgnome_menu_la_LDFLAGS = \ -version-info $(LIB_MENU_LT_VERSION) \ @@ -52,3 +49,6 @@ pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libgnome-menu.pc + + + --- libmenu/entry-directories.c +++ libmenu/entry-directories.c @@ -25,9 +25,9 @@ #include #include #include +#include #include "menu-util.h" -#include "menu-monitor.h" #include "canonicalize.h" typedef struct CachedDir CachedDir; @@ -58,13 +58,15 @@ GSList *entries; GSList *subdirs; - MenuMonitor *dir_monitor; - GSList *monitors; + GnomeVFSMonitorHandle *monitor; + GSList *monitors; guint have_read_entries : 1; guint deleted : 1; guint references : 28; + + gboolean no_monitor_support; }; struct CachedDirMonitor @@ -78,11 +80,6 @@ static gboolean cached_dir_load_entries_recursive (CachedDir *dir, const char *dirname); -static void handle_cached_dir_changed (MenuMonitor *monitor, - MenuMonitorEvent event, - const char *path, - CachedDir *dir); - /* * Entry directory cache */ @@ -104,14 +101,9 @@ static void cached_dir_free (CachedDir *dir) { - if (dir->dir_monitor) - { - menu_monitor_remove_notify (dir->dir_monitor, - (MenuMonitorNotifyFunc) handle_cached_dir_changed, - dir); - menu_monitor_unref (dir->dir_monitor); - dir->dir_monitor = NULL; - } + if (dir->monitor) + gnome_vfs_monitor_cancel (dir->monitor); + dir->monitor = NULL; g_slist_foreach (dir->monitors, (GFunc) g_free, NULL); g_slist_free (dir->monitors); @@ -399,20 +391,31 @@ } static void -handle_cached_dir_changed (MenuMonitor *monitor, - MenuMonitorEvent event, - const char *path, - CachedDir *dir) +handle_cached_dir_changed (GnomeVFSMonitorHandle *handle, + const char *monitor_uri, + const char *info_uri, + GnomeVFSMonitorEventType event, + CachedDir *dir) { gboolean handled = FALSE; + char *path; char *basename; char *dirname; + if (event != GNOME_VFS_MONITOR_EVENT_CREATED && + event != GNOME_VFS_MONITOR_EVENT_DELETED && + event != GNOME_VFS_MONITOR_EVENT_CHANGED) + return; + + if (!(path = gnome_vfs_get_local_path_from_uri (info_uri))) + return; + menu_verbose ("'%s' notified of '%s' %s - invalidating cache\n", dir->name, path, - event == MENU_MONITOR_EVENT_CREATED ? ("created") : - event == MENU_MONITOR_EVENT_DELETED ? ("deleted") : ("changed")); + event == GNOME_VFS_MONITOR_EVENT_CREATED ? ("created") : + event == GNOME_VFS_MONITOR_EVENT_DELETED ? ("deleted") : + event == GNOME_VFS_MONITOR_EVENT_CHANGED ? ("changed") : ("unknown-event")); dirname = g_path_get_dirname (path); basename = g_path_get_basename (path); @@ -424,12 +427,12 @@ { switch (event) { - case MENU_MONITOR_EVENT_CREATED: - case MENU_MONITOR_EVENT_CHANGED: + case GNOME_VFS_MONITOR_EVENT_CREATED: + case GNOME_VFS_MONITOR_EVENT_CHANGED: handled = cached_dir_update_entry (dir, basename, path); break; - case MENU_MONITOR_EVENT_DELETED: + case GNOME_VFS_MONITOR_EVENT_DELETED: handled = cached_dir_remove_entry (dir, basename); break; @@ -442,14 +445,14 @@ { switch (event) { - case MENU_MONITOR_EVENT_CREATED: + case GNOME_VFS_MONITOR_EVENT_CREATED: handled = cached_dir_add_subdir (dir, basename, path); break; - case MENU_MONITOR_EVENT_CHANGED: + case GNOME_VFS_MONITOR_EVENT_CHANGED: break; - case MENU_MONITOR_EVENT_DELETED: + case GNOME_VFS_MONITOR_EVENT_DELETED: handled = cached_dir_remove_subdir (dir, basename); break; @@ -461,6 +464,7 @@ g_free (basename); g_free (dirname); + g_free (path); if (handled) { @@ -472,13 +476,23 @@ cached_dir_ensure_monitor (CachedDir *dir, const char *dirname) { - if (dir->dir_monitor == NULL) + char *uri; + + if (dir->monitor != NULL || dir->no_monitor_support) + return; + + uri = gnome_vfs_get_uri_from_local_path (dirname); + + if (gnome_vfs_monitor_add (&dir->monitor, + uri, + GNOME_VFS_MONITOR_DIRECTORY, + (GnomeVFSMonitorCallback) handle_cached_dir_changed, + dir) != GNOME_VFS_OK) { - dir->dir_monitor = menu_get_directory_monitor (dirname); - menu_monitor_add_notify (dir->dir_monitor, - (MenuMonitorNotifyFunc) handle_cached_dir_changed, - dir); + dir->no_monitor_support = TRUE; } + + g_free (uri); } static gboolean --- libmenu/gmenu-tree.c +++ libmenu/gmenu-tree.c @@ -23,9 +23,10 @@ #include #include +#include + #include "menu-layout.h" -#include "menu-monitor.h" #include "menu-util.h" #include "canonicalize.h" @@ -263,24 +264,19 @@ MENU_FILE_MONITOR_DIRECTORY } MenuFileMonitorType; -typedef struct -{ - MenuFileMonitorType type; - MenuMonitor *monitor; -} MenuFileMonitor; - static void -handle_nonexistent_menu_file_changed (MenuMonitor *monitor, - MenuMonitorEvent event, - const char *path, - GMenuTree *tree) +handle_nonexistent_menu_file_changed (GnomeVFSMonitorHandle *handle, + const char *monitor_uri, + const char *info_uri, + GnomeVFSMonitorEventType event, + GMenuTree *tree) { - if (event == MENU_MONITOR_EVENT_CHANGED || - event == MENU_MONITOR_EVENT_CREATED) + if (event == GNOME_VFS_MONITOR_EVENT_CHANGED || + event == GNOME_VFS_MONITOR_EVENT_CREATED) { menu_verbose ("\"%s\" %s, marking tree for recanonicalization\n", - path, - event == MENU_MONITOR_EVENT_CREATED ? "created" : "changed"); + info_uri, + event == GNOME_VFS_MONITOR_EVENT_CREATED ? "created" : "changed"); gmenu_tree_force_recanonicalize (tree); gmenu_tree_invoke_monitors (tree); @@ -288,33 +284,45 @@ } static void -handle_menu_file_changed (MenuMonitor *monitor, - MenuMonitorEvent event, - const char *path, - GMenuTree *tree) -{ +handle_menu_file_changed (GnomeVFSMonitorHandle *handle, + const char *monitor_uri, + const char *info_uri, + GnomeVFSMonitorEventType event, + GMenuTree *tree) +{ + if (event != GNOME_VFS_MONITOR_EVENT_DELETED && + event != GNOME_VFS_MONITOR_EVENT_CHANGED && + event != GNOME_VFS_MONITOR_EVENT_CREATED) + return; + menu_verbose ("\"%s\" %s, marking tree for recanicalization\n", - path, - event == MENU_MONITOR_EVENT_CREATED ? "created" : - event == MENU_MONITOR_EVENT_CHANGED ? "changed" : "deleted"); + info_uri, + event == GNOME_VFS_MONITOR_EVENT_CREATED ? "created" : + event == GNOME_VFS_MONITOR_EVENT_CHANGED ? "changed" : "deleted"); gmenu_tree_force_recanonicalize (tree); gmenu_tree_invoke_monitors (tree); } static void -handle_menu_file_directory_changed (MenuMonitor *monitor, - MenuMonitorEvent event, - const char *path, - GMenuTree *tree) -{ - if (!g_str_has_suffix (path, ".menu")) +handle_menu_file_directory_changed (GnomeVFSMonitorHandle *handle, + const char *monitor_uri, + const char *info_uri, + GnomeVFSMonitorEventType event, + GMenuTree *tree) +{ + if (event != GNOME_VFS_MONITOR_EVENT_DELETED && + event != GNOME_VFS_MONITOR_EVENT_CHANGED && + event != GNOME_VFS_MONITOR_EVENT_CREATED) + return; + + if (!g_str_has_suffix (info_uri, ".menu")) return; menu_verbose ("\"%s\" %s, marking tree for recanicalization\n", - path, - event == MENU_MONITOR_EVENT_CREATED ? "created" : - event == MENU_MONITOR_EVENT_CHANGED ? "changed" : "deleted"); + info_uri, + event == GNOME_VFS_MONITOR_EVENT_CREATED ? "created" : + event == GNOME_VFS_MONITOR_EVENT_CHANGED ? "changed" : "deleted"); gmenu_tree_force_recanonicalize (tree); gmenu_tree_invoke_monitors (tree); @@ -325,39 +333,44 @@ const char *path, MenuFileMonitorType type) { - MenuFileMonitor *monitor; + GnomeVFSMonitorHandle *handle; + GnomeVFSResult result; + char *uri; - monitor = g_new0 (MenuFileMonitor, 1); + uri = gnome_vfs_get_uri_from_local_path (path); - monitor->type = type; + handle = NULL; switch (type) { case MENU_FILE_MONITOR_FILE: menu_verbose ("Adding a menu file monitor for \"%s\"\n", path); - monitor->monitor = menu_get_file_monitor (path); - menu_monitor_add_notify (monitor->monitor, - (MenuMonitorNotifyFunc) handle_menu_file_changed, - tree); + result = gnome_vfs_monitor_add (&handle, + uri, + GNOME_VFS_MONITOR_FILE, + (GnomeVFSMonitorCallback) handle_menu_file_changed, + tree); break; case MENU_FILE_MONITOR_NONEXISTENT_FILE: menu_verbose ("Adding a menu file monitor for non-existent \"%s\"\n", path); - monitor->monitor = menu_get_file_monitor (path); - menu_monitor_add_notify (monitor->monitor, - (MenuMonitorNotifyFunc) handle_nonexistent_menu_file_changed, - tree); + result = gnome_vfs_monitor_add (&handle, + uri, + GNOME_VFS_MONITOR_FILE, + (GnomeVFSMonitorCallback) handle_nonexistent_menu_file_changed, + tree); break; case MENU_FILE_MONITOR_DIRECTORY: menu_verbose ("Adding a menu directory monitor for \"%s\"\n", path); - monitor->monitor = menu_get_directory_monitor (path); - menu_monitor_add_notify (monitor->monitor, - (MenuMonitorNotifyFunc) handle_menu_file_directory_changed, - tree); + result = gnome_vfs_monitor_add (&handle, + uri, + GNOME_VFS_MONITOR_DIRECTORY, + (GnomeVFSMonitorCallback) handle_menu_file_directory_changed, + tree); break; default: @@ -365,44 +378,18 @@ break; } - tree->menu_file_monitors = g_slist_prepend (tree->menu_file_monitors, monitor); -} - -static void -remove_menu_file_monitor (MenuFileMonitor *monitor, - GMenuTree *tree) -{ - switch (monitor->type) + if (result == GNOME_VFS_OK) { - case MENU_FILE_MONITOR_FILE: - menu_monitor_remove_notify (monitor->monitor, - (MenuMonitorNotifyFunc) handle_menu_file_changed, - tree); - break; - - case MENU_FILE_MONITOR_NONEXISTENT_FILE: - menu_monitor_remove_notify (monitor->monitor, - (MenuMonitorNotifyFunc) handle_nonexistent_menu_file_changed, - tree); - break; - - case MENU_FILE_MONITOR_DIRECTORY: - menu_monitor_remove_notify (monitor->monitor, - (MenuMonitorNotifyFunc) handle_menu_file_directory_changed, - tree); - break; - - default: - g_assert_not_reached (); - break; + tree->menu_file_monitors = g_slist_prepend (tree->menu_file_monitors, handle); + } + else + { + g_assert (handle == NULL); + menu_verbose ("Failed to add monitor for %s: %s\n", + path, gnome_vfs_result_to_string (result)); } - menu_monitor_unref (monitor->monitor); - monitor->monitor = NULL; - - monitor->type = MENU_FILE_MONITOR_INVALID; - - g_free (monitor); + g_free (uri); } static void @@ -411,8 +398,8 @@ menu_verbose ("Removing all menu file monitors\n"); g_slist_foreach (tree->menu_file_monitors, - (GFunc) remove_menu_file_monitor, - tree); + (GFunc) gnome_vfs_monitor_cancel, + NULL); g_slist_free (tree->menu_file_monitors); tree->menu_file_monitors = NULL; } --- python/Makefile.am +++ python/Makefile.am @@ -5,7 +5,7 @@ -I$(srcdir)/../libmenu \ $(WARN_CFLAGS) \ $(NO_STRICT_ALIASING_CFLAGS) \ - $(GLIB_CFLAGS) \ + $(LIBMENU_CFLAGS) \ $(PYTHON_INCLUDES) \ $(DISABLE_DEPRECATED_CFLAGS) \ $(DEBUG_CFLAGS) \ @@ -15,5 +15,5 @@ gmenu_LTLIBRARIES = gmenu.la gmenu_la_LDFLAGS = -module -avoid-version -fPIC -export-symbols-regex initgmenu -gmenu_la_LIBADD = $(GLIB_LIBS) $(top_builddir)/libmenu/libgnome-menu.la +gmenu_la_LIBADD = $(top_builddir)/libmenu/libgnome-menu.la gmenu_la_SOURCES = gmenu.c --- python/gmenu.c +++ python/gmenu.c @@ -21,6 +21,7 @@ #include #include +#include typedef struct { @@ -1716,6 +1717,9 @@ if (!PyArg_ParseTuple (args, "s|i:gmenu.lookup_tree", &menu_file, &flags)) return NULL; + if (!gnome_vfs_initialized ()) + gnome_vfs_init (); + if (!(tree = gmenu_tree_lookup (menu_file, flags))) { Py_INCREF (Py_None); --- util/Makefile.am +++ util/Makefile.am @@ -4,7 +4,7 @@ -DGMENU_I_KNOW_THIS_IS_UNSTABLE \ -DGNOMELOCALEDIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ -I$(srcdir)/../libmenu \ - $(GLIB_CFLAGS) \ + $(LIBMENU_CFLAGS) \ $(DISABLE_DEPRECATED_CFLAGS) \ $(DEBUG_CFLAGS) \ $(WARN_CFLAGS) \ @@ -20,5 +20,5 @@ gnome_menu_spec_test_LDADD = \ ../libmenu/libgnome-menu.la \ - $(GLIB_LIBS) \ + $(LIBMENU_LIBS) \ $(NULL) --- util/test-menu-spec.c +++ util/test-menu-spec.c @@ -23,6 +23,7 @@ #include #include +#include static char *menu_file = NULL; static gboolean monitor = FALSE; @@ -186,6 +187,8 @@ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); + gnome_vfs_init (); + options_context = g_option_context_new (_("- test GNOME's implementation of the Desktop Menu Specification")); g_option_context_add_main_entries (options_context, options, GETTEXT_PACKAGE); g_option_context_parse (options_context, &argc, &argv, NULL); @@ -231,5 +234,7 @@ gmenu_tree_unref (tree); + gnome_vfs_shutdown (); + return 0; }