void walk_tree(GMenuTreeDirectory *root) { GSList *list = gmenu_tree_directory_get_contents(root); while (list) { const char *category; const char *application; const char *exec; switch (gmenu_tree_item_get_type (list->data)) { case GMENU_TREE_ITEM_DIRECTORY: category = gmenu_tree_directory_get_name (list->data); if (category) { printf("<menu name=\"%s\">\n", category); free((void *)category); } GMenuTreeDirectory *dir = (GMenuTreeDirectory*)list->data; walk_tree(dir); printf("</menu>\n"); break; case GMENU_TREE_ITEM_ENTRY: if (!gmenu_tree_entry_get_is_excluded(list->data) && !gmenu_tree_entry_get_is_nodisplay(list->data)) { application = gmenu_tree_entry_get_name(list->data); if (application) { exec = filter(gmenu_tree_entry_get_exec(list->data)); if (exec) { if (gmenu_tree_entry_get_launch_in_terminal(list->data)) { printf("<command name=\"%s\" execute=\"xterm -title '%s' -e '%s' &\" />\n", application, application, exec); } else { printf("<command name=\"%s\" execute=\"menuorg-execute-wrapper %s '%s'\" />\n", application, application, exec); } free((void *)application); } } } break; default: break; } list = g_slist_next(list); } }
static void add_entry(GMenuTreeEntry *entry, const char *path, GSList**p) { GSList* data = *p; char *utf8_path; char *utf8_file_id; Menu_list_item * item; gchar * file_name; utf8_path = g_filename_to_utf8(gmenu_tree_entry_get_desktop_file_path(entry), -1, NULL, NULL, NULL); utf8_file_id = g_filename_to_utf8(gmenu_tree_entry_get_desktop_file_id(entry), -1, NULL, NULL, NULL); file_name = utf8_path ? utf8_path : _("[Invalid Filename]"); item = g_malloc(sizeof(Menu_list_item)); item->item_type = MENU_ITEM_ENTRY; item->name = gmenu_tree_entry_get_name(entry); item->icon = gmenu_tree_entry_get_icon(entry); item->exec = gmenu_tree_entry_get_exec(entry); char *str = item->exec; while (*str) { if (*str == '%') { *str = ' '; if (*(str + 1)) { str++; *str = ' '; } } str++; } item->comment = gmenu_tree_entry_get_comment(entry); item->launch_in_terminal = gmenu_tree_entry_get_launch_in_terminal(entry); item->desktop = g_strdup(file_name); data = g_slist_append(data, item); *p = data; g_free(utf8_file_id); g_free(utf8_path); }
static void write_entry( FILE* of, GMenuTreeEntry* item ) { const char* cstr; char* str; int flags = 0; // if( gmenu_tree_entry_get_is_nodisplay(item) /* || gmenu_tree_entry_get_is_excluded(item) */ ) // return; /* dekstop id, not necessarily the same as file basename */ fprintf( of, "-%s\n", gmenu_tree_entry_get_desktop_file_id( item ) ); /* Name */ fprintf( of, "%s\n", gmenu_tree_entry_get_name( item ) ); /* Comment */ cstr = gmenu_tree_entry_get_comment( item ); fprintf( of, "%s\n", cstr ? cstr : "" ); /* Icon */ cstr = gmenu_tree_entry_get_icon( item ); fprintf( of, "%s\n", cstr ? cstr : "" ); /* file dir/basename */ if( gmenu_tree_entry_get_desktop_file_path( item ) ) { /* file basenames are the same as desktop ids, except that sometimes * the '/' in paths are replaced with '-'. * for ex, /usr/share/applications/foo/bar.desktop has the app dir * /usr/share/applications, the filename foo/bar.desltop, and the * desktop id: foo-bar.desktop */ /* filename */ str = g_path_get_basename( gmenu_tree_entry_get_desktop_file_path( item ) ); if( strcmp(str, gmenu_tree_entry_get_desktop_file_id(item) ) ) fprintf( of, "%s\n", str ); else fprintf( of, "\n" ); g_free( str ); /* dirname */ str = g_path_get_dirname( gmenu_tree_entry_get_desktop_file_path( item ) ); fprintf( of, "%d\n", dirname_index( str) ); g_free( str ); } else { fprintf( of, "\n-1\n" ); } /* DisplayName */ cstr = gmenu_tree_entry_get_display_name( item ); fprintf( of, "%s\n", cstr ? cstr : "" ); /* Exec */ fprintf( of, "%s\n", gmenu_tree_entry_get_exec( item ) ); /* Terminal/StartupNotify flags */ if( gmenu_tree_entry_get_launch_in_terminal( item ) ) flags |= FLAG_USE_TERMINAL; if( gmenu_tree_entry_get_use_startup_notify( item ) ) flags |= FLAG_USE_SN; if( gmenu_tree_entry_get_is_nodisplay( item ) ) flags |= FLAG_IS_NODISPLAY; fprintf( of, "%u\n", flags ); /* ShowIn info */ fprintf( of, "%d\n", gmenu_tree_entry_get_show_in_flags(item) ); /* if( gmenu_tree_entry_get_desktop_file_path( item ) ) write_item_ex_info(of, gmenu_tree_entry_get_desktop_file_path( item )); fputs( "\n", of ); */ }