[bug-buddy] Remove gnome-menus dependency



commit e6ff034f6a4215b5ad3a61135d2569d0a5fa8c07
Author: Vincent Untz <vuntz gnome org>
Date:   Tue Sep 8 01:11:25 2009 +0200

    Remove gnome-menus dependency
    
    It was only needed to find all the .desktop files, but we can do this
    ourselves -- it will be cheaper (no need to parse desktop file twice)
    and simpler (the code is trivial).
    
    http://bugzilla.gnome.org/show_bug.cgi?id=594439

 configure.in           |    3 -
 data/Makefile.am       |    6 +-
 data/bug-buddy.menu.in |   19 ---
 src/Makefile.am        |    1 -
 src/bugzilla.c         |  293 +++++++++++++++++++----------------------------
 5 files changed, 121 insertions(+), 201 deletions(-)
---
diff --git a/configure.in b/configure.in
index c39c192..6c19ba8 100644
--- a/configure.in
+++ b/configure.in
@@ -28,7 +28,6 @@ BONOBO_ACTIVATION_REQUIRED="bonobo-activation-2.0 >= 1.0.0"
 GDK_PIXBUF_REQUIRED="gdk-pixbuf-2.0 >= 2.0.0"
 GMODULE_REQUIRED="gmodule-2.0 >= 2.0.0"
 LIBBONOBO_REQUIRED="libbonobo-2.0 >= 2.0.0"
-LIBGNOMEMENU_REQUIRED="libgnome-menu >= 2.11.1"
 LIBXML_REQUIRED="libxml-2.0 >= 2.4.6"
 GTK_REQUIRED="gtk+-2.0 >= 2.14.0"
 GIO_REQUIRED="gio-2.0 >= 2.16.0"
@@ -43,7 +42,6 @@ PKG_CHECK_MODULES(BUG_BUDDY,
 	$GMODULE_REQUIRED
 	$GIO_REQUIRED
 	$LIBBONOBO_REQUIRED
-	$LIBGNOMEMENU_REQUIRED
 	$LIBXML_REQUIRED
 	$GTK_REQUIRED
 	$LIBSOUP_REQUIRED
@@ -150,7 +148,6 @@ Makefile
 data/Makefile
 data/icons/Makefile
 data/bug-buddy.schemas
-data/bug-buddy.menu
 data/bug-buddy.desktop.in
 docs/Makefile
 po/Makefile.in
diff --git a/data/Makefile.am b/data/Makefile.am
index ec65488..0bbcb2c 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -15,8 +15,7 @@ desktop_DATA = 			\
 
 uidir = $(pkgdatadir)
 ui_DATA = 			\
-	bug-buddy.gtkbuilder	\
-	bug-buddy.menu
+	bug-buddy.gtkbuilder
 
 utilsdir = $(pkgdatadir)
 utils_DATA =			\
@@ -39,7 +38,6 @@ EXTRA_DIST = 			\
 
 DISTCLEANFILES = 		\
 	$(desktop_DATA)		\
-	$(schemas_DATA)		\
-	bug-buddy.menu
+	$(schemas_DATA)
 
 
diff --git a/src/Makefile.am b/src/Makefile.am
index 8a4dfd4..b2cee3f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -8,7 +8,6 @@ INCLUDES = \
 	$(DISABLE_DEPRECATED)                           \
 	$(DISABLE_SINGLE_INCLUDES)			\
 	$(BUG_BUDDY_EDS_CFLAGS)				\
-	-DGMENU_I_KNOW_THIS_IS_UNSTABLE			\
 	-D_GNU_SOURCE
 
 
diff --git a/src/bugzilla.c b/src/bugzilla.c
index 69e0638..1e6f1c4 100644
--- a/src/bugzilla.c
+++ b/src/bugzilla.c
@@ -34,8 +34,6 @@
 
 #include <glib/gi18n.h>
 
-#include <gmenu-tree.h>
-
 #include <bonobo/bonobo-exception.h>
 #include <bonobo-activation/bonobo-activation.h>
 
@@ -229,110 +227,140 @@ NULL)) {
 	CORBA_free (info_list);
 }
 
-static int
-compare_applications (GMenuTreeEntry *a,
-		      GMenuTreeEntry *b)
-{
-	return g_utf8_collate (gmenu_tree_entry_get_name (a),
-			       gmenu_tree_entry_get_name (b));
-}
-
-static GSList *get_all_applications_from_dir (GMenuTreeDirectory *directory,
-					      GSList             *list);
-
-static GSList *
-get_all_applications_from_alias (GMenuTreeAlias *alias,
-				 GSList         *list)
+static void
+add_bugzilla_application_from_desktop_file (GHashTable *hash,
+					    const char *desktop_file_path)
 {
-	GMenuTreeItem *aliased_item;
-
-	aliased_item = gmenu_tree_alias_get_item (alias);
-
-	switch (gmenu_tree_item_get_type (aliased_item)) {
-	case GMENU_TREE_ITEM_DIRECTORY:
-		list = get_all_applications_from_dir (GMENU_TREE_DIRECTORY (aliased_item), list);
-		break;
-
-	case GMENU_TREE_ITEM_ENTRY:
-		list = g_slist_append (list, gmenu_tree_item_ref (aliased_item));
-		break;
-
-	default:
-		break;
+	GKeyFile *key_file;
+	GError	 *error = NULL;
+	char *name;
+	char *cname;
+	char *comment;
+	char *bugzilla;
+	char *product;
+	char *component;
+	char *version;
+	char *icon;
+	char *exec;
+	char *other_binaries;
+	char *extra_info_script;
+
+	key_file = g_key_file_new ();
+	g_key_file_load_from_file (key_file, desktop_file_path,
+				   G_KEY_FILE_NONE, &error);
+	if (error) {
+		g_warning ("Couldn't load %s: %s", desktop_file_path,
+			   error->message);
+		g_error_free (error);
+		error = NULL;
+		return;
 	}
 
-	gmenu_tree_item_unref (aliased_item);
+	if (!g_key_file_has_group (key_file, DESKTOP_ENTRY) ||
+	    !g_key_file_has_key (key_file, DESKTOP_ENTRY, BUGZILLA_BUGZILLA, &error)) {
+		g_key_file_free (key_file);	
+		if (error)
+			g_error_free (error);
+		return;
+	}
 
-	return list;
+	name = g_key_file_get_locale_string (key_file, DESKTOP_ENTRY, DESKTOP_NAME, NULL, NULL);
+	cname = g_key_file_get_string (key_file, DESKTOP_ENTRY, DESKTOP_NAME, NULL);
+	comment = g_key_file_get_locale_string (key_file, DESKTOP_ENTRY, DESKTOP_COMMENT, NULL, NULL);
+	bugzilla = g_key_file_get_string (key_file, DESKTOP_ENTRY, BUGZILLA_BUGZILLA, NULL);
+	product = g_key_file_get_string (key_file, DESKTOP_ENTRY, BUGZILLA_PRODUCT, NULL);
+	component = g_key_file_get_string (key_file, DESKTOP_ENTRY, BUGZILLA_COMPONENT, NULL);
+	version = g_key_file_get_string (key_file, DESKTOP_ENTRY, BUGZILLA_VERSION, NULL);
+	icon = g_key_file_get_string (key_file, DESKTOP_ENTRY, DESKTOP_ICON, NULL);
+	exec = g_key_file_get_string (key_file, DESKTOP_ENTRY, DESKTOP_EXEC, NULL);
+	other_binaries = g_key_file_get_string (key_file, DESKTOP_ENTRY, BUGZILLA_OTHER_BINARIES, NULL);
+	extra_info_script = g_key_file_get_string (key_file, DESKTOP_ENTRY, BUGZILLA_EXTRA_INFO_SCRIPT, NULL);
+
+	add_bugzilla_application (hash,
+				  name,
+				  cname,
+				  comment,
+				  bugzilla,
+				  product,
+				  component,
+				  version,
+				  icon,
+				  exec,
+				  other_binaries,
+				  extra_info_script);
+	g_free (name);
+	g_free (cname);
+	g_free (comment);
+	g_free (bugzilla);
+	g_free (product);
+	g_free (component);
+	g_free (version);
+	g_free (icon);
+	g_free (exec);
+	g_free (other_binaries);
+	g_free (extra_info_script);
+	g_key_file_free (key_file);
 }
 
-static GSList *
-get_all_applications_from_dir (GMenuTreeDirectory *directory,
-			       GSList             *list)
+static void
+load_applications_from_dir (GHashTable *hash,
+			    const char *path)
 {
-	GSList *items;
-	GSList *l;
-
-	if (g_main_context_pending (NULL)) {
-		g_main_context_iteration (NULL, FALSE);
-	}
+	GDir *dir;
+	char *name;
+	char *desktop_file;
 
-	items = gmenu_tree_directory_get_contents (directory);
-	for (l = items; l; l = l->next) {
-		GMenuTreeItem *item = l->data;
-
-		switch (gmenu_tree_item_get_type (item)) {
-		case GMENU_TREE_ITEM_DIRECTORY:
-			list = get_all_applications_from_dir (GMENU_TREE_DIRECTORY (item), list);
-			break;
-
-		case GMENU_TREE_ITEM_ENTRY:
-			list = g_slist_append (list, gmenu_tree_item_ref (item));
-			break;
+	dir = g_dir_open (path, 0, NULL);
+	if (!dir)
+		return;
 
-		case GMENU_TREE_ITEM_ALIAS:
-			list = get_all_applications_from_alias (GMENU_TREE_ALIAS (item), list);
-			break;
+	while ((name = g_dir_read_name (dir))) {
+		if (g_main_context_pending (NULL)) {
+			g_main_context_iteration (NULL, FALSE);
+		}
 
-		default:
-			break;
+		if (!g_str_has_suffix (name, ".desktop")) {
+			continue;
 		}
 
-		gmenu_tree_item_unref (item);
+		desktop_file = g_build_filename (path, name, NULL);
+		add_bugzilla_application_from_desktop_file (hash, desktop_file);
+		g_free (desktop_file);
 	}
 
-	g_slist_free (items);
-
-	return list;
+	g_dir_close (dir);
 }
 
-static GSList *
-get_all_applications (void)
+static char **
+get_all_directories (void)
 {
-	GMenuTree          *tree;
-	GMenuTreeDirectory *root;
-	GSList             *retval;
-	const char         *menufile = BUDDY_DATADIR "/bug-buddy.menu";
-
-	if (g_file_test (menufile, G_FILE_TEST_IS_REGULAR)) {
-		/* use a custom menu file to scan desktop entry files so we aren't limited
-		 * to reporting bugs only present in the applications menu*/
-		tree = gmenu_tree_lookup (menufile, GMENU_TREE_FLAGS_INCLUDE_NODISPLAY);
-	} else {
-		/* fallback to using the applications menu */
-		tree = gmenu_tree_lookup ("applications.menu", GMENU_TREE_FLAGS_INCLUDE_NODISPLAY);
+	GPtrArray          *dirs;
+	const char * const *system_config_dirs;
+	const char * const *system_data_dirs;
+	int                 i;
+
+	dirs = g_ptr_array_new ();
+
+	system_data_dirs = g_get_system_data_dirs ();
+	for (i = 0; system_data_dirs[i]; i++) {
+		g_ptr_array_add (dirs,
+				 g_build_filename (system_data_dirs[i],
+						   "applications", NULL));
+		g_ptr_array_add (dirs,
+				 g_build_filename (system_data_dirs[i],
+						   "gnome", "autostart", NULL));
 	}
 
-	root = gmenu_tree_get_root_directory (tree);
-
-	retval = get_all_applications_from_dir (root, NULL);
-
-	gmenu_tree_item_unref (root);
-	gmenu_tree_unref (tree);
+	system_config_dirs = g_get_system_config_dirs ();
+	for (i = 0; system_config_dirs[i]; i++) {
+		g_ptr_array_add (dirs,
+				 g_build_filename (system_config_dirs[i],
+						   "autostart", NULL));
+	}
 
-	retval = g_slist_sort (retval, (GCompareFunc) compare_applications);
+	g_ptr_array_add (dirs, NULL);
 
-	return retval;
+	return (char **) g_ptr_array_free (dirs, FALSE);
 }
 
 GQuark
@@ -344,98 +372,15 @@ bugzilla_error_quark (void)
 GHashTable *
 load_applications (void)
 {
-	GSList         *all_applications;
-	GSList         *l;
-	char           *prev_name = NULL;
-	GError	       *error = NULL;
+	char **directories;
+	int    i;
 
 	GHashTable *program_to_application = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) application_free);
 
-	all_applications = get_all_applications ();
-	for (l = all_applications; l; l = l->next) {
-		GKeyFile *key_file;
-		char *name;
-		char *cname;
-		char *comment;
-		char *bugzilla;
-		char *product;
-		char *component;
-		char *version;
-		char *icon;
-		char *exec;
-		char *other_binaries;
-		char *extra_info_script;
-		GMenuTreeEntry *entry = l->data;
-
-		if (g_main_context_pending (NULL)) {
-			g_main_context_iteration (NULL, FALSE);
-		}
-
-		if (prev_name && strcmp (gmenu_tree_entry_get_name (entry), prev_name) == 0) {
-			gmenu_tree_item_unref (entry);
-			continue;
-		}
-		key_file = g_key_file_new ();
-		g_key_file_load_from_file (key_file, gmenu_tree_entry_get_desktop_file_path (entry), 
-					   G_KEY_FILE_NONE, &error);
-		if (error) {
-			g_warning ("Couldn't load %s: %s", gmenu_tree_entry_get_desktop_file_path (entry),
-				   error->message);
-			g_error_free (error);
-			error = NULL;
-			gmenu_tree_item_unref (entry);
-			continue;
-		}
-    
-		if (!g_key_file_has_group (key_file, DESKTOP_ENTRY) || !g_key_file_has_key (key_file, DESKTOP_ENTRY, BUGZILLA_BUGZILLA, &error)) {
-			g_key_file_free (key_file);	
-			gmenu_tree_item_unref (entry);
-			if (error)
-				g_error_free (error);
-			continue;
-		}
-
-		name = g_key_file_get_locale_string (key_file, DESKTOP_ENTRY, DESKTOP_NAME, NULL, NULL);
-		cname = g_key_file_get_string (key_file, DESKTOP_ENTRY, DESKTOP_NAME, NULL);
-		comment = g_key_file_get_locale_string (key_file, DESKTOP_ENTRY, DESKTOP_COMMENT, NULL, NULL);
-		bugzilla = g_key_file_get_string (key_file, DESKTOP_ENTRY, BUGZILLA_BUGZILLA, NULL);
-		product = g_key_file_get_string (key_file, DESKTOP_ENTRY, BUGZILLA_PRODUCT, NULL);
-		component = g_key_file_get_string (key_file, DESKTOP_ENTRY, BUGZILLA_COMPONENT, NULL);
-		version = g_key_file_get_string (key_file, DESKTOP_ENTRY, BUGZILLA_VERSION, NULL);
-		icon = g_key_file_get_string (key_file, DESKTOP_ENTRY, DESKTOP_ICON, NULL);
-		exec = g_key_file_get_string (key_file, DESKTOP_ENTRY, DESKTOP_EXEC, NULL);
-		other_binaries = g_key_file_get_string (key_file, DESKTOP_ENTRY, BUGZILLA_OTHER_BINARIES, NULL);
-		extra_info_script = g_key_file_get_string (key_file, DESKTOP_ENTRY, BUGZILLA_EXTRA_INFO_SCRIPT, NULL);
-
-		add_bugzilla_application (program_to_application,
-					  name,
-					  cname,
-					  comment,
-					  bugzilla,
-					  product,
-					  component,
-					  version,
-					  icon,
-					  exec,
-					  other_binaries,
-					  extra_info_script);
-		g_free (name);
-		g_free (cname);
-		g_free (comment);
-		g_free (bugzilla);
-		g_free (product);
-		g_free (component);
-		g_free (version);
-		g_free (icon);
-		g_free (exec);
-		g_free (other_binaries);
-		g_free (extra_info_script);
-		g_free (prev_name);
-		prev_name = g_strdup (gmenu_tree_entry_get_name (entry));
-		g_key_file_free (key_file);	
-		gmenu_tree_item_unref (entry);
-	}
-	g_slist_free (all_applications);
+	directories = get_all_directories ();
+	for (i = 0; directories[i] != NULL; i++)
+		load_applications_from_dir (program_to_application, directories[i]);
+	g_strfreev (directories);
 
 	load_applets (program_to_application);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]