From e6ff034f6a4215b5ad3a61135d2569d0a5fa8c07 Mon Sep 17 00:00:00 2001 From: Vincent Untz Date: Tue, 8 Sep 2009 01:11:25 +0200 Subject: [PATCH] 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(-) delete mode 100644 data/bug-buddy.menu.in diff --git a/configure.in b/configure.in index c39c1927..6c19ba81 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 ec654885..0bbcb2c7 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/data/bug-buddy.menu.in b/data/bug-buddy.menu.in deleted file mode 100644 index be85227e..00000000 --- a/data/bug-buddy.menu.in +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Bug Buddy programs - - - @prefix@/@DATADIRNAME@/applications - @prefix@/@DATADIRNAME@/gnome/autostart - - - - - - - diff --git a/src/Makefile.am b/src/Makefile.am index 8a4dfd40..b2cee3fc 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 69e06388..1e6f1c4f 100644 --- a/src/bugzilla.c +++ b/src/bugzilla.c @@ -34,8 +34,6 @@ #include -#include - #include #include @@ -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); -- 2.11.4.GIT