[bug-buddy] Remove gnome-menus dependency
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [bug-buddy] Remove gnome-menus dependency
- Date: Tue, 8 Sep 2009 10:33:53 +0000 (UTC)
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]