1Index: openbox-xdgmenu-0.3/openbox-xdgmenu.c 2=================================================================== 3--- openbox-xdgmenu-0.3.orig/openbox-xdgmenu.c 4+++ openbox-xdgmenu-0.3/openbox-xdgmenu.c 5@@ -32,7 +32,7 @@ 6 #include <string.h> 7 #include <glib.h> 8 #include <glib/gprintf.h> 9-#include <gnome-menus/gmenu-tree.h> 10+#include <gnome-menus-3.0/gmenu-tree.h> 11 12 /*============================================================================= 13 * Declarations 14@@ -42,7 +42,6 @@ static void process_directory(GMenuTreeD 15 static void process_entry(GMenuTreeEntry *entry); 16 static void process_separator(GMenuTreeSeparator *entry); 17 18-gboolean option_show_amount_of_entries = 0; 19 gboolean option_do_not_use_categories = 0; 20 21 /*============================================================================= 22@@ -61,11 +60,6 @@ int main (int argc, char **argv) 23 g_free (xdgfile); 24 return 0; 25 } 26- else if ((strcmp (argv[i], "--show-amount") == 0) || 27- (strcmp (argv[i], "-a") == 0)) 28- { 29- option_show_amount_of_entries = 1; 30- } 31 else if ((strcmp (argv[i], "--plain") == 0) || 32 (strcmp (argv[i], "-p") == 0)) 33 { 34@@ -93,16 +87,15 @@ int main (int argc, char **argv) 35 return 1; 36 } 37 38- FILE * file; 39- if (!(file = fopen(xdgfile, "r"))) 40+ GMenuTree *menuTree = gmenu_tree_new (xdgfile, GMENU_TREE_FLAGS_NONE ); 41+ 42+ GError *error = NULL; 43+ if (!gmenu_tree_load_sync(menuTree, &error)) 44 { 45- g_printf ("Could not read file \"%s\".\n", xdgfile); 46- g_free (xdgfile); 47- return 2; 48+ g_printerr ("Failed to load tree: %s\n", error->message); 49+ g_clear_error (&error); 50+ return 3; 51 } 52- fclose(file); 53- 54- GMenuTree *menuTree = gmenu_tree_lookup (xdgfile, GMENU_TREE_FLAGS_NONE ); 55 56 GMenuTreeDirectory *rootDirectory = gmenu_tree_get_root_directory(menuTree); 57 58@@ -129,11 +122,10 @@ void show_help() 59 g_printf (" openbox-xdgmenu [options] <Xdg menu file>\n"); 60 g_printf ("\n"); 61 g_printf ("Options:\n"); 62- g_printf (" -a: Show the amount of items in each category next to its name.\n"); 63 g_printf (" -p: Do not use categories.\n"); 64 g_printf ("\n"); 65 g_printf ("For example:\n"); 66- g_printf (" openbox-xdgmenu \"/etc/xdg/menus/applications.menu\"\n\n"); 67+ g_printf (" openbox-xdgmenu \"gnome-applications.menu\"\n\n"); 68 } 69 70 /*============================================================================= 71@@ -141,72 +133,61 @@ void show_help() 72 */ 73 void process_directory(GMenuTreeDirectory *directory, gboolean isRoot) 74 { 75- int hasSeparator = 0; 76+ GMenuTreeSeparator *separator = NULL; 77 int hasMenu = 0; 78 GMenuTreeItemType entryType; 79- GSList *entryList = gmenu_tree_directory_get_contents (directory); 80- GSList *l; 81- 82- if (option_do_not_use_categories == 00 && isRoot == 0 && 83- g_slist_length(entryList) > 0) 84+ GMenuTreeIter *iter = gmenu_tree_directory_iter (directory); 85+ GMenuTreeItemType next_type; 86+ 87+ while ((next_type = gmenu_tree_iter_next (iter)) != GMENU_TREE_ITEM_INVALID) 88 { 89- hasMenu = 1; 90- 91- if (option_show_amount_of_entries == 1) 92+ if (option_do_not_use_categories == 00 && isRoot == 0 && hasMenu == 0) 93 { 94+ hasMenu = 1; 95+ 96 g_printf( 97- "<menu id=\"xdg-menu-%s\" label=\"%s (%d)\">\n", 98- g_strjoinv("&", g_strsplit(gmenu_tree_directory_get_name(directory),"&",0)), 99- g_strjoinv("&", g_strsplit(gmenu_tree_directory_get_name(directory),"&",0)), 100- g_slist_length(entryList)); 101+ "<menu id=\"xdg-menu-%s\" label=\"%s\">\n", 102+ g_strjoinv("&", g_strsplit(gmenu_tree_directory_get_name(directory),"&",0)), 103+ g_strjoinv("&", g_strsplit(gmenu_tree_directory_get_name(directory),"&",0))); 104 } 105- else 106- { 107- g_printf( 108- "<menu id=\"xdg-menu-%s\" label=\"%s\">\n", 109- g_strjoinv("&", g_strsplit(gmenu_tree_directory_get_name(directory),"&",0)), 110- g_strjoinv("&", g_strsplit(gmenu_tree_directory_get_name(directory),"&",0))); 111- } 112- } 113 114- for (l = entryList; l; l = l->next) 115- { 116- GMenuTreeItem *item = l->data; 117- 118- entryType = gmenu_tree_item_get_type (GMENU_TREE_ITEM(item)); 119- 120- switch (entryType) 121+ switch (next_type) 122 { 123+ case GMENU_TREE_ITEM_INVALID: 124+ break; 125 case GMENU_TREE_ITEM_DIRECTORY: 126- if (hasSeparator) 127+ if (separator != NULL) 128 { 129- process_separator(GMENU_TREE_SEPARATOR(item)); 130- hasSeparator = 0; 131+ process_separator(separator); 132+ gmenu_tree_item_unref (separator); 133+ separator = NULL; 134 } 135- process_directory(GMENU_TREE_DIRECTORY(item), 0); 136+ process_directory(gmenu_tree_iter_get_directory(iter), 0); 137 break; 138 case GMENU_TREE_ITEM_ENTRY: 139- if (hasSeparator) 140+ if (separator != NULL) 141 { 142- process_separator(GMENU_TREE_SEPARATOR(item)); 143- hasSeparator = 0; 144+ process_separator(separator); 145+ gmenu_tree_item_unref (separator); 146+ separator = NULL; 147 } 148- process_entry(GMENU_TREE_ENTRY(item)); 149+ process_entry(gmenu_tree_iter_get_entry(iter)); 150 break; 151 case GMENU_TREE_ITEM_SEPARATOR: 152- hasSeparator = 1; 153+ separator = gmenu_tree_iter_get_separator(iter); 154 break; 155 } 156- 157- gmenu_tree_item_unref (item); 158 } 159 160 if (hasMenu == 1) 161 { 162 g_printf("</menu>\n"); 163 } 164+ 165+ if (separator != NULL) 166+ gmenu_tree_item_unref (separator); 167 168- g_slist_free (entryList); 169+ gmenu_tree_iter_unref (iter); 170 } 171 172 /*============================================================================= 173@@ -214,8 +195,9 @@ void process_directory(GMenuTreeDirector 174 */ 175 void process_entry(GMenuTreeEntry *entry) 176 { 177- char *name = g_strdup (gmenu_tree_entry_get_name(entry)); 178- char *exec = g_strdup (gmenu_tree_entry_get_exec(entry)); 179+ GDesktopAppInfo *appinfo = gmenu_tree_entry_get_app_info (entry); 180+ char *name = g_strdup (g_app_info_get_name(G_APP_INFO(appinfo))); 181+ char *exec = g_strdup (g_app_info_get_executable(G_APP_INFO(appinfo))); 182 int i; 183 184 for (i = 0; i < strlen(exec) - 1; i++) { 185