[Xfce4-commits] <xfce4-appfinder:port-to-garcon> Port the libxfce4menu code to garcon.

Nick Schermer nick at xfce.org
Mon Aug 17 21:34:02 CEST 2009


Updating branch refs/heads/port-to-garcon
         to 39f62a1cd457b680f05794a57e407b250ab310ec (commit)
       from 5eee87ac7015a0e282de6f111996c2252ed3259b (commit)

commit 39f62a1cd457b680f05794a57e407b250ab310ec
Author: Nick Schermer <nick at xfce.org>
Date:   Mon Aug 17 21:32:58 2009 +0200

    Port the libxfce4menu code to garcon.

 configure.in.in             |    2 +-
 src/Makefile.am             |    4 +-
 src/main.c                  |    5 +-
 src/xfce-appfinder-window.c |  250 +++++++++++--------------------------------
 4 files changed, 69 insertions(+), 192 deletions(-)

diff --git a/configure.in.in b/configure.in.in
index e45e8ce..fb1c5a1 100644
--- a/configure.in.in
+++ b/configure.in.in
@@ -77,7 +77,7 @@ XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.16.0])
 XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.14.0])
 XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.6.0])
 XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.7.0])
-XDT_CHECK_PACKAGE([LIBXFCE4MENU], [libxfce4menu-0.1], [4.6.0])
+XDT_CHECK_PACKAGE([GARCON], [garcon-1], [0.1.0])
 XDT_CHECK_PACKAGE([LIBXFCONF], [libxfconf-0], [4.6.0])
 XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.16.0])
 
diff --git a/src/Makefile.am b/src/Makefile.am
index d735857..caa542f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -22,7 +22,7 @@ xfce4_appfinder_CFLAGS = 						\
 	$(GTK_CFLAGS)							\
 	$(LIBXFCE4UTIL_CFLAGS)						\
 	$(LIBXFCE4UI_CFLAGS)						\
-	$(LIBXFCE4MENU_CFLAGS)						\
+	$(GARCON_CFLAGS)						\
 	$(LIBXFCONF_CFLAGS)						\
 	$(GIO_CFLAGS)
 
@@ -33,6 +33,6 @@ xfce4_appfinder_LDFLAGS = 						\
 	$(GTK_LIBS)							\
 	$(LIBXFCE4UTIL_LIBS)						\
 	$(LIBXFCE4UI_LIBS)						\
-	$(LIBXFCE4MENU_LIBS)						\
+	$(GARCON_LIBS)							\
 	$(LIBXFCONF_LIBS)						\
 	$(GIO_LIBS)
diff --git a/src/main.c b/src/main.c
index 9afd6d3..a283135 100644
--- a/src/main.c
+++ b/src/main.c
@@ -29,7 +29,7 @@
 #include <gtk/gtk.h>
 
 #include <libxfce4util/libxfce4util.h>
-#include <libxfce4menu/libxfce4menu.h>
+#include <garcon/garcon.h>
 #include <xfconf/xfconf.h>
 
 #include "xfce-appfinder-window.h"
@@ -99,7 +99,7 @@ main (int    argc,
     }
 
   /* Initialize menu library */
-  xfce_menu_init ("XFCE");
+  garcon_set_environment ("XFCE");
 
   window = xfce_appfinder_window_new (opt_remaining != NULL ? opt_remaining[0] : NULL);
   xfce_appfinder_window_reload (XFCE_APPFINDER_WINDOW (window));
@@ -108,7 +108,6 @@ main (int    argc,
   gtk_main ();
 
   /* Shutdown libraries */
-  xfce_menu_shutdown ();
   xfconf_shutdown ();
 
   return EXIT_SUCCESS;
diff --git a/src/xfce-appfinder-window.c b/src/xfce-appfinder-window.c
index bfd2c2e..76d1d73 100644
--- a/src/xfce-appfinder-window.c
+++ b/src/xfce-appfinder-window.c
@@ -33,7 +33,7 @@
 
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4ui/libxfce4ui.h>
-#include <libxfce4menu/libxfce4menu.h>
+#include <garcon/garcon.h>
 #include <gio/gio.h>
 #include <xfconf/xfconf.h>
 
@@ -78,7 +78,6 @@ static void       xfce_appfinder_window_set_property       (GObject
                                                             const GValue             *value,
                                                             GParamSpec               *pspec);
 static void       _xfce_appfinder_window_closed            (XfceAppfinderWindow      *window);
-static gchar     *_xfce_appfinder_window_get_menu_filename (XfceAppfinderWindow      *window);
 static gpointer   _xfce_appfinder_window_reload_menu       (XfceAppfinderWindow      *window);
 static void       _xfce_appfinder_window_entry_changed     (GtkEditable              *editable,
                                                             XfceAppfinderWindow      *window);
@@ -107,21 +106,11 @@ static void       _xfce_appfinder_window_drag_data_get     (GtkWidget
                                                             guint                     drag_time,
                                                             XfceAppfinderWindow      *window);
 static void       _xfce_appfinder_window_execute           (XfceAppfinderWindow      *window);
-static gpointer   _xfce_appfinder_window_monitor_directory (XfceMenu                 *menu,
-                                                            const gchar              *filename,
-                                                            gpointer                  user_data);
-static void       _xfce_appfinder_window_remove_monitor    (XfceMenu                 *menu,
-                                                            gpointer                  monitor_handle);
-static void       _xfce_appfinder_window_something_changed (GFileMonitor             *monitor,
-                                                            GFile                    *file,
-                                                            GFile                    *other_file,
-                                                            GFileMonitorEvent         event_type,
-                                                            gpointer                  user_data);
 static void       _xfce_appfinder_window_load_menu_item    (XfceAppfinderWindow      *window,
-                                                            XfceMenuItem             *item,
+                                                            GarconMenuItem             *item,
                                                             const gchar              *category,
                                                             gint                     *counter);
-static GdkPixbuf *_xfce_appfinder_window_create_item_icon  (XfceMenuItem             *item);
+static GdkPixbuf *_xfce_appfinder_window_create_item_icon  (GarconMenuItem             *item);
 static gboolean   _xfce_appfinder_window_visible_func      (GtkTreeModel             *filter,
                                                             GtkTreeIter              *iter,
                                                             gpointer                  user_data);
@@ -153,7 +142,7 @@ struct _XfceAppfinderWindow
   GtkTreeModel  *filter;
   GtkWidget     *tree_view;
 
-  XfceMenu      *menu;
+  GarconMenu    *menu;
   gchar         *menu_filename;
 
   GThread       *reload_thread;
@@ -167,14 +156,6 @@ static const GtkTargetEntry dnd_target_list[] = {
 
 
 
-XfceMenuMonitorVTable menu_monitor_vtable = {
-  NULL,
-  _xfce_appfinder_window_monitor_directory,
-  _xfce_appfinder_window_remove_monitor,
-};
-
-
-
 G_DEFINE_TYPE (XfceAppfinderWindow, xfce_appfinder_window, XFCE_TYPE_TITLED_DIALOG)
 
 
@@ -313,7 +294,7 @@ xfce_appfinder_window_init (XfceAppfinderWindow *window)
   gtk_widget_show (scrollwin);
 
   window->list_store =
-    gtk_list_store_new (5, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, XFCE_TYPE_MENU_ITEM, G_TYPE_STRING);
+    gtk_list_store_new (5, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, GARCON_TYPE_MENU_ITEM, G_TYPE_STRING);
 
   window->filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (window->list_store), NULL);
   gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (window->filter), _xfce_appfinder_window_visible_func, window, NULL);
@@ -374,8 +355,6 @@ xfce_appfinder_window_constructed (GObject *object)
 {
   XfceAppfinderWindow *window = XFCE_APPFINDER_WINDOW (object);
 
-  xfce_menu_monitor_set_vtable (&menu_monitor_vtable, window);
-
   xfconf_g_property_bind (window->channel, "/category", G_TYPE_STRING, G_OBJECT (window), "category");
 }
 
@@ -397,7 +376,7 @@ xfce_appfinder_window_finalize (GObject *object)
   g_free (window->current_category);
   g_free (window->menu_filename);
 
-  if (G_LIKELY (XFCE_IS_MENU (window->menu)))
+  if (G_LIKELY (GARCON_IS_MENU (window->menu)))
     g_object_unref (window->menu);
 
   g_slist_free (window->categories_group);
@@ -642,7 +621,7 @@ _xfce_appfinder_window_cursor_changed (GtkTreeView         *tree_view,
   GtkTreeSelection *selection;
   GtkTreeModel     *model;
   GtkTreeIter       iter;
-  XfceMenuItem     *item = NULL;
+  GarconMenuItem     *item = NULL;
 
   g_return_if_fail (XFCE_IS_APPFINDER_WINDOW (window));
 
@@ -673,7 +652,7 @@ _xfce_appfinder_window_drag_data_get (GtkWidget           *widget,
                                       guint                drag_time,
                                       XfceAppfinderWindow *window)
 {
-  XfceMenuItem     *item;
+  GarconMenuItem   *item;
   GtkTreeSelection *selection;
   GtkTreeModel     *model;
   GtkTreeIter       iter;
@@ -691,8 +670,7 @@ _xfce_appfinder_window_drag_data_get (GtkWidget           *widget,
   if (G_UNLIKELY (item == NULL))
     return;
 
-  uri = g_filename_to_uri (xfce_menu_item_get_filename (item), NULL, NULL);
-
+  uri = garcon_menu_item_get_uri (item);
   if (G_LIKELY (uri != NULL))
     {
       gtk_selection_data_set (data, data->target, 8, (guchar *) uri, strlen (uri));
@@ -705,13 +683,13 @@ _xfce_appfinder_window_drag_data_get (GtkWidget           *widget,
 static void
 _xfce_appfinder_window_execute (XfceAppfinderWindow *window)
 {
-  XfceMenuItem     *item;
+  GarconMenuItem   *item;
   GtkTreeSelection *selection;
   GtkTreeModel     *model;
   GtkTreeIter       iter;
   GdkScreen        *screen;
   GError           *error = NULL;
-  gchar            *command;
+  gchar            *command, *uri;
 
   g_return_if_fail (XFCE_IS_APPFINDER_WINDOW (window));
 
@@ -725,14 +703,16 @@ _xfce_appfinder_window_execute (XfceAppfinderWindow *window)
   if (G_UNLIKELY (item == NULL))
     return;
 
-  command = g_strconcat ("exo-open ", xfce_menu_item_get_filename (item), NULL);
+  uri = garcon_menu_item_get_uri (item);
+  command = g_strconcat ("exo-open ", uri, NULL);
+  g_free (uri);
 
   screen = xfce_gdk_screen_get_active (NULL);
 
   if (G_UNLIKELY (!xfce_spawn_command_line_on_screen (screen, command, FALSE, TRUE, &error)))
     {
       xfce_dialog_show_error (GTK_WINDOW (window), error,
-           _("Could not execute application %s."), xfce_menu_element_get_name (XFCE_MENU_ELEMENT (item)));
+           _("Could not execute application %s."), garcon_menu_element_get_name (GARCON_MENU_ELEMENT (item)));
 
       if (error != NULL)
         g_error_free (error);
@@ -766,47 +746,47 @@ _xfce_appfinder_window_closed (XfceAppfinderWindow *window)
 
 static void
 _xfce_appfinder_window_load_menu (XfceAppfinderWindow *window,
-                                  XfceMenu            *menu,
+                                  GarconMenu          *menu,
                                   const gchar         *category,
                                   gint                *counter,
                                   gboolean             is_root,
                                   gboolean             is_category)
 {
-  XfceMenuDirectory *directory;
-  GtkWidget         *button;
-  GSList            *items;
-  GSList            *menus;
-  GSList            *iter;
-  const gchar       *name;
-  gint               current_counter = 0;
-
-  g_return_if_fail (XFCE_IS_MENU (menu));
+  GarconMenuDirectory *directory;
+  GtkWidget           *button;
+  GList               *items;
+  GList               *menus;
+  GList               *iter;
+  const gchar         *name;
+  gint                 current_counter = 0;
+
+  g_return_if_fail (GARCON_IS_MENU (menu));
   g_return_if_fail (XFCE_IS_APPFINDER_WINDOW (window));
 
-  directory = xfce_menu_get_directory (menu);
+  directory = garcon_menu_get_directory (menu);
 
   if (G_LIKELY (directory != NULL))
-    if (G_UNLIKELY (!xfce_menu_directory_show_in_environment (directory)
-                    || xfce_menu_directory_get_hidden (directory)
-                    || xfce_menu_directory_get_no_display (directory)))
+    if (G_UNLIKELY (!garcon_menu_directory_get_show_in_environment (directory)
+                    || garcon_menu_directory_get_hidden (directory)
+                    || garcon_menu_directory_get_no_display (directory)))
       {
         return;
       }
 
   /* Determine menu name */
-  name = xfce_menu_element_get_name (XFCE_MENU_ELEMENT (menu));
+  name = garcon_menu_element_get_name (GARCON_MENU_ELEMENT (menu));
 
   /* Load menu items */
-  items = xfce_menu_get_items (menu);
-  for (iter = items; iter != NULL; iter = g_slist_next (iter))
-    _xfce_appfinder_window_load_menu_item (window, XFCE_MENU_ITEM (iter->data), is_category ? name : category, &current_counter);
-  g_slist_free (items);
+  items = garcon_menu_get_items (menu);
+  for (iter = items; iter != NULL; iter = g_list_next (iter))
+    _xfce_appfinder_window_load_menu_item (window, GARCON_MENU_ITEM (iter->data), is_category ? name : category, &current_counter);
+  g_list_free (items);
 
   /* Load sub-menus */
-  menus = xfce_menu_get_menus (menu);
-  for (iter = menus; iter != NULL; iter = g_slist_next (iter))
-    _xfce_appfinder_window_load_menu (window, XFCE_MENU (iter->data), is_category ? name : category, &current_counter, FALSE, is_root ? TRUE : FALSE);
-  g_slist_free (menus);
+  menus = garcon_menu_get_menus (menu);
+  for (iter = menus; iter != NULL; iter = g_list_next (iter))
+    _xfce_appfinder_window_load_menu (window, GARCON_MENU (iter->data), is_category ? name : category, &current_counter, FALSE, is_root ? TRUE : FALSE);
+  g_list_free (menus);
 
   /* Create category widget */
   if (G_LIKELY (current_counter > 0 && is_category))
@@ -835,37 +815,11 @@ _xfce_appfinder_window_load_menu (XfceAppfinderWindow *window,
 
 
 
-static gchar *
-_xfce_appfinder_window_get_menu_filename (XfceAppfinderWindow *window)
-{
-  gchar **paths;
-  gchar  *filename = NULL;
-  gint    i;
-
-  g_return_val_if_fail (XFCE_IS_APPFINDER_WINDOW (window), NULL);
-
-  paths = xfce_resource_lookup_all (XFCE_RESOURCE_CONFIG, "menus/xfce-applications.menu");
-
-  for (i = 0; paths[i] != NULL; ++i)
-    if (g_file_test (paths[i], G_FILE_TEST_IS_REGULAR))
-      {
-        filename = g_strdup (paths[i]);
-        break;
-      }
-
-  g_strfreev (paths);
-
-  return filename;
-}
-
-
-
 static gpointer
 _xfce_appfinder_window_reload_menu (XfceAppfinderWindow *window)
 {
   GtkWidget *button;
   GError    *error = NULL;
-  gchar     *filename = NULL;
   gint       counter = 0;
 
   g_return_val_if_fail (XFCE_IS_APPFINDER_WINDOW (window), NULL);
@@ -873,26 +827,17 @@ _xfce_appfinder_window_reload_menu (XfceAppfinderWindow *window)
   DBG ("window->menu_filename = %s", window->menu_filename);
 
   if (G_UNLIKELY (window->menu_filename != NULL))
-    window->menu = xfce_menu_new (window->menu_filename, &error);
+    window->menu = garcon_menu_new_for_path (window->menu_filename);
   else
-    {
-      filename = _xfce_appfinder_window_get_menu_filename (window);
-
-      if (G_LIKELY (filename != NULL))
-        window->menu = xfce_menu_new (filename, &error);
-      else
-        window->menu = xfce_menu_get_root (&error);
-
-      g_free (filename);
-    }
+    window->menu = garcon_menu_new_applications ();
 
   if (G_UNLIKELY (window->menu == NULL))
     {
       if (G_UNLIKELY (window->menu_filename != NULL))
-        xfce_dialog_show_error (GTK_WINDOW (window), error,
+        xfce_dialog_show_error (GTK_WINDOW (window), NULL,
           _("Could not load menu from %s"), window->menu_filename);
       else
-        xfce_dialog_show_error (GTK_WINDOW (window), error,
+        xfce_dialog_show_error (GTK_WINDOW (window), NULL,
           _("Could not load system menu"));
 
       if (error != NULL)
@@ -901,6 +846,13 @@ _xfce_appfinder_window_reload_menu (XfceAppfinderWindow *window)
       return NULL;
     }
 
+  if (!garcon_menu_load (window->menu, NULL, &error))
+    {
+      g_message ("failed to load the menu: %s", error->message);
+      g_error_free (error);
+      return NULL;
+    }
+
   if (GTK_IS_WIDGET (window->categories_box))
     gtk_widget_destroy (window->categories_box);
 
@@ -927,83 +879,9 @@ _xfce_appfinder_window_reload_menu (XfceAppfinderWindow *window)
 
 
 
-static gpointer
-_xfce_appfinder_window_monitor_directory (XfceMenu    *menu,
-                                          const gchar *filename,
-                                          gpointer     user_data)
-{
-  XfceAppfinderWindow *window = user_data;
-  GFile               *path;
-  GFileMonitor        *monitor = NULL;
-
-  g_return_val_if_fail (XFCE_IS_MENU (menu), NULL);
-  g_return_val_if_fail (XFCE_IS_APPFINDER_WINDOW (window), NULL);
-  g_return_val_if_fail (filename != NULL, NULL);
-
-  if (G_UNLIKELY (!g_file_test (filename, G_FILE_TEST_IS_DIR)))
-    return NULL;
-
-  path = g_file_new_for_path (filename);
-  if (G_LIKELY (path != NULL))
-    {
-      monitor = g_file_monitor_directory (path, G_FILE_MONITOR_NONE, NULL, NULL);
-      g_signal_connect (G_OBJECT (monitor), "changed", G_CALLBACK (_xfce_appfinder_window_something_changed), window);
-      g_object_unref (G_OBJECT (path));
-    }
-
-  DBG ("monitor_handle = %p", monitor);
-
-  return monitor;
-}
-
-
-
-static void
-_xfce_appfinder_window_remove_monitor (XfceMenu *menu,
-                                       gpointer  monitor_handle)
-{
-  GFileMonitor *monitor = monitor_handle;
-
-  g_return_if_fail (XFCE_IS_MENU (menu));
-  g_return_if_fail (monitor_handle != NULL);
-
-  DBG ("monitor_handle = %p", monitor_handle);
-
-  g_file_monitor_cancel (monitor);
-  g_object_unref (G_OBJECT (monitor));
-}
-
-
-
-static void
-_xfce_appfinder_window_something_changed (GFileMonitor      *monitor,
-                                          GFile             *file,
-                                          GFile             *other_file,
-                                          GFileMonitorEvent  event_type,
-                                          gpointer           user_data)
-{
-  XfceAppfinderWindow *window = user_data;
-  XfceMenuItemCache   *cache;
-
-  g_return_if_fail (XFCE_IS_APPFINDER_WINDOW (window));
-
-  cache = xfce_menu_item_cache_get_default ();
-  xfce_menu_item_cache_invalidate (cache);
-  g_object_unref (cache);
-
-  if (XFCE_IS_MENU (window->menu))
-    g_object_unref (window->menu);
-
-  gtk_list_store_clear (window->list_store);
-
-  _xfce_appfinder_window_reload_menu (window);
-}
-
-
-
 static void
 _xfce_appfinder_window_load_menu_item (XfceAppfinderWindow *window,
-                                       XfceMenuItem        *item,
+                                       GarconMenuItem        *item,
                                        const gchar         *category,
                                        gint                *counter)
 {
@@ -1023,23 +901,23 @@ _xfce_appfinder_window_load_menu_item (XfceAppfinderWindow *window,
 
   g_return_if_fail (XFCE_IS_APPFINDER_WINDOW (window));
 
-  if (G_UNLIKELY (!xfce_menu_item_show_in_environment (item) || xfce_menu_item_get_no_display (item)))
+  if (G_UNLIKELY (!garcon_menu_item_get_show_in_environment (item) || garcon_menu_item_get_no_display (item)))
     return;
 
-  if (G_UNLIKELY (xfce_menu_item_only_show_in_environment (item) || xfce_menu_item_has_category (item, "X-XFCE")))
+  if (G_UNLIKELY (garcon_menu_item_only_show_in_environment (item) || garcon_menu_item_has_category (item, "X-XFCE")))
     {
-      name = xfce_menu_item_get_generic_name (item);
+      name = garcon_menu_item_get_generic_name (item);
 
       if (G_UNLIKELY (name == NULL))
-        name = xfce_menu_element_get_name (XFCE_MENU_ELEMENT (item));
+        name = garcon_menu_element_get_name (GARCON_MENU_ELEMENT (item));
     }
   else
-    name = xfce_menu_element_get_name (XFCE_MENU_ELEMENT (item));
+    name = garcon_menu_element_get_name (GARCON_MENU_ELEMENT (item));
 
-  comment = xfce_menu_item_get_comment (item);
+  comment = garcon_menu_item_get_comment (item);
   pixbuf = _xfce_appfinder_window_create_item_icon (item);
-  categories = xfce_menu_item_get_categories (item);
-  command = xfce_menu_item_get_command (item);
+  categories = garcon_menu_item_get_categories (item);
+  command = garcon_menu_item_get_command (item);
 
   if (G_LIKELY (comment != NULL))
     text = g_strdup_printf ("<b>%s</b>\n%s", name, comment);
@@ -1092,7 +970,7 @@ _xfce_appfinder_window_load_menu_item (XfceAppfinderWindow *window,
 
 
 static GdkPixbuf *
-_xfce_appfinder_window_create_item_icon (XfceMenuItem *item)
+_xfce_appfinder_window_create_item_icon (GarconMenuItem *item)
 {
   GdkPixbuf    *icon = NULL;
   GtkIconTheme *icon_theme;
@@ -1106,8 +984,8 @@ _xfce_appfinder_window_create_item_icon (XfceMenuItem *item)
   /* Get current icon theme */
   icon_theme = gtk_icon_theme_get_default ();
 
-  item_name = xfce_menu_element_get_name (XFCE_MENU_ELEMENT (item));
-  icon_name = xfce_menu_element_get_icon_name (XFCE_MENU_ELEMENT (item));
+  item_name = garcon_menu_element_get_name (GARCON_MENU_ELEMENT (item));
+  icon_name = garcon_menu_element_get_icon_name (GARCON_MENU_ELEMENT (item));
 
   if (icon_name == NULL)
     return NULL;
@@ -1175,7 +1053,7 @@ _xfce_appfinder_window_visible_func (GtkTreeModel *filter,
                                      gpointer      user_data)
 {
   XfceAppfinderWindow *window = user_data;
-  XfceMenuItem        *item;
+  GarconMenuItem      *item;
   gchar               *category;
   gchar               *text;
   gchar               *search_text;
@@ -1202,9 +1080,9 @@ _xfce_appfinder_window_visible_func (GtkTreeModel *filter,
   text = g_utf8_casefold (normalized, -1);
   g_free (normalized);
 
-  if (xfce_menu_item_get_command (item) != NULL)
+  if (garcon_menu_item_get_command (item) != NULL)
     {
-      normalized = g_utf8_normalize (xfce_menu_item_get_command (item), -1, G_NORMALIZE_ALL);
+      normalized = g_utf8_normalize (garcon_menu_item_get_command (item), -1, G_NORMALIZE_ALL);
       command = g_utf8_casefold (normalized, -1);
       g_free (normalized);
     }



More information about the Xfce4-commits mailing list