diff options
Diffstat (limited to 'util/test-menu-spec.c')
-rw-r--r-- | util/test-menu-spec.c | 187 |
1 files changed, 108 insertions, 79 deletions
diff --git a/util/test-menu-spec.c b/util/test-menu-spec.c index cda6e02..bb621fe 100644 --- a/util/test-menu-spec.c +++ b/util/test-menu-spec.c @@ -18,34 +18,34 @@ */ #include <config.h> +#include <glib/gi18n.h> #include "matemenu-tree.h" #include <string.h> -/* This is only a test program, so we don't need translations. Still keep the - * infrastructure in place in case we suddenly decide we want to localize this - * program. Don't forget to reenable the call to bindtextdomain() if going back - * to real localization. */ -#define _(x) x -#define N_(x) x - -static char* menu_file = NULL; -static gboolean monitor = FALSE; -static gboolean include_excluded = FALSE; -static gboolean include_nodisplay = FALSE; +static char *menu_file = NULL; +static gboolean monitor = FALSE; +static gboolean include_excluded = FALSE; +static gboolean include_nodisplay = FALSE; +static gboolean include_unallocated = FALSE; static GOptionEntry options[] = { - {"file", 'f', 0, G_OPTION_ARG_STRING, &menu_file, N_("Menu file"), N_("MENU_FILE")}, - {"monitor", 'm', 0, G_OPTION_ARG_NONE, &monitor, N_("Monitor for menu changes"), NULL}, - {"include-excluded", 'i', 0, G_OPTION_ARG_NONE, &include_excluded, N_("Include <Exclude>d entries"), NULL}, - {"include-nodisplay", 'n', 0, G_OPTION_ARG_NONE, &include_nodisplay, N_("Include NoDisplay=true entries"), NULL}, - {NULL} + { "file", 'f', 0, G_OPTION_ARG_STRING, &menu_file, N_("Menu file"), N_("MENU_FILE") }, + { "monitor", 'm', 0, G_OPTION_ARG_NONE, &monitor, N_("Monitor for menu changes"), NULL }, + { "include-excluded", 'i', 0, G_OPTION_ARG_NONE, &include_excluded, N_("Include <Exclude>d entries"), NULL }, + { "include-nodisplay", 'n', 0, G_OPTION_ARG_NONE, &include_nodisplay, N_("Include NoDisplay=true entries"), NULL }, + { "include-unallocated", 'u', 0, G_OPTION_ARG_NONE, &include_unallocated, N_("Include unallocated entries"), NULL }, + { NULL } }; -static void append_directory_path(MateMenuTreeDirectory* directory, GString* path) +static void +append_directory_path (MateMenuTreeDirectory *directory, + GString *path) { - MateMenuTreeDirectory* parent = matemenu_tree_item_get_parent(MATEMENU_TREE_ITEM(directory)); + MateMenuTreeDirectory *parent; + + parent = matemenu_tree_directory_get_parent(directory); if (!parent) { @@ -55,81 +55,97 @@ static void append_directory_path(MateMenuTreeDirectory* directory, GString* pat append_directory_path(parent, path); - g_string_append(path, matemenu_tree_directory_get_name(directory)); + g_string_append(path, matemenu_tree_directory_get_name (directory)); g_string_append_c(path, '/'); matemenu_tree_item_unref(parent); } -static char* make_path(MateMenuTreeDirectory* directory) +static char * +make_path (MateMenuTreeDirectory *directory) { + GString *path; + g_return_val_if_fail(directory != NULL, NULL); - GString* path = g_string_new(NULL); + path = g_string_new(NULL); append_directory_path(directory, path); return g_string_free(path, FALSE); } -static void print_entry(MateMenuTreeEntry* entry, const char* path) +static void +print_entry (MateMenuTreeEntry *entry, + const char *path) { - char* utf8_path = g_filename_to_utf8(matemenu_tree_entry_get_desktop_file_path(entry), -1, NULL, NULL, NULL); - char* utf8_file_id = g_filename_to_utf8(matemenu_tree_entry_get_desktop_file_id(entry), -1, NULL, NULL, NULL); + char *utf8_path; + char *utf8_file_id; + + utf8_path = g_filename_to_utf8(matemenu_tree_entry_get_desktop_file_path (entry), + -1, NULL, NULL, NULL); - g_print("%s %s %s%s%s\n", - path, - utf8_file_id ? utf8_file_id : _("Invalid desktop file ID"), - utf8_path ? utf8_path : _("[Invalid Filename]"), - matemenu_tree_entry_get_is_excluded(entry) ? _(" <excluded>") : "", - matemenu_tree_entry_get_is_nodisplay(entry) ? _(" <nodisplay>") : ""); + utf8_file_id = g_filename_to_utf8(matemenu_tree_entry_get_desktop_file_id (entry), + -1, NULL, NULL, NULL); + + g_print("%s\t%s\t%s%s\n", + path, + utf8_file_id ? utf8_file_id : _("Invalid desktop file ID"), + utf8_path ? utf8_path : _("[Invalid Filename]"), + matemenu_tree_entry_get_is_excluded(entry) ? _(" <excluded>") : ""); g_free(utf8_file_id); g_free(utf8_path); } -static void print_directory(MateMenuTreeDirectory* directory) +static void +print_directory(MateMenuTreeDirectory *directory) { - const char* path; - char* freeme = make_path(directory); + MateMenuTreeIter *iter; + const char *path; + char *freeme; - if (!strcmp(freeme, "/")) - { + freeme = make_path(directory); + if (!strcmp (freeme, "/")) path = freeme; - } else - { path = freeme + 1; - } - GSList* items = matemenu_tree_directory_get_contents(directory); - GSList* tmp = items; + iter = matemenu_tree_directory_iter(directory); - while (tmp != NULL) + while(TRUE) { - MateMenuTreeItem* item = tmp->data; + gpointer item; - switch (matemenu_tree_item_get_type(item)) + switch (matemenu_tree_iter_next (iter)) { + case MATEMENU_TREE_ITEM_INVALID: + goto done; + case MATEMENU_TREE_ITEM_ENTRY: - print_entry(MATEMENU_TREE_ENTRY(item), path); + item = matemenu_tree_iter_get_entry(iter); + print_entry((MateMenuTreeEntry*)item, path); break; case MATEMENU_TREE_ITEM_DIRECTORY: - print_directory(MATEMENU_TREE_DIRECTORY(item)); + item = matemenu_tree_iter_get_directory(iter); + print_directory((MateMenuTreeDirectory*)item); break; case MATEMENU_TREE_ITEM_HEADER: case MATEMENU_TREE_ITEM_SEPARATOR: + item = NULL; break; case MATEMENU_TREE_ITEM_ALIAS: { - MateMenuTreeItem* aliased_item = matemenu_tree_alias_get_item(MATEMENU_TREE_ALIAS(item)); + item = matemenu_tree_iter_get_alias(iter); - if (matemenu_tree_item_get_type(aliased_item) == MATEMENU_TREE_ITEM_ENTRY) + if (matemenu_tree_alias_get_aliased_item_type (item) == MATEMENU_TREE_ITEM_ENTRY) { - print_entry(MATEMENU_TREE_ENTRY(aliased_item), path); + MateMenuTreeEntry *entry = matemenu_tree_alias_get_aliased_entry(item); + print_entry(entry, path); + matemenu_tree_item_unref(entry); } } break; @@ -139,22 +155,33 @@ static void print_directory(MateMenuTreeDirectory* directory) break; } - matemenu_tree_item_unref(tmp->data); - - tmp = tmp->next; + matemenu_tree_item_unref(item); + continue; +done: + break; } - g_slist_free(items); + matemenu_tree_iter_unref(iter); g_free(freeme); } -static void handle_tree_changed(MateMenuTree* tree) +static void +handle_tree_changed (MateMenuTree *tree) { + MateMenuTreeDirectory *root; + GError *error = NULL; + g_print(_("\n\n\n==== Menu changed, reloading ====\n\n\n")); - MateMenuTreeDirectory* root = matemenu_tree_get_root_directory(tree); + if(!matemenu_tree_load_sync (tree, &error)) + { + g_printerr("Failed to load tree: %s\n", error->message); + g_clear_error(&error); + return; + } + root = matemenu_tree_get_root_directory(tree); if (root == NULL) { g_warning(_("Menu tree is empty")); @@ -165,39 +192,41 @@ static void handle_tree_changed(MateMenuTree* tree) matemenu_tree_item_unref(root); } -int main(int argc, char** argv) +int +main (int argc, char **argv) { - #if 0 - /* See comment when defining _() at the top of this file. */ - bindtextdomain(GETTEXT_PACKAGE, MATELOCALEDIR); - bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); - textdomain(GETTEXT_PACKAGE); - #endif - - GOptionContext* options_context = g_option_context_new(_("- test MATE's implementation of the Desktop Menu Specification")); + GOptionContext *options_context; + MateMenuTree *tree; + MateMenuTreeDirectory *root; + MateMenuTreeFlags flags; + GError *error = NULL; + + setlocale(LC_ALL, ""); + options_context = g_option_context_new(_("- test MATE's implementation of the Desktop Menu Specification")); g_option_context_add_main_entries(options_context, options, GETTEXT_PACKAGE); g_option_context_parse(options_context, &argc, &argv, NULL); g_option_context_free(options_context); - MateMenuTreeFlags flags = MATEMENU_TREE_FLAGS_NONE; - + flags = MATEMENU_TREE_FLAGS_NONE; if (include_excluded) - { flags |= MATEMENU_TREE_FLAGS_INCLUDE_EXCLUDED; - } - if (include_nodisplay) - { flags |= MATEMENU_TREE_FLAGS_INCLUDE_NODISPLAY; - } - - // Usamos applications.menu is existe. Para compatibilidad con GNOME - MateMenuTree* tree = matemenu_tree_lookup(menu_file ? menu_file : "mate-applications.menu", flags); + if (include_unallocated) + flags |= MATEMENU_TREE_FLAGS_INCLUDE_UNALLOCATED; + tree = matemenu_tree_new(menu_file ? menu_file : "mate-applications.menu", flags); g_assert(tree != NULL); - MateMenuTreeDirectory* root = matemenu_tree_get_root_directory(tree); + if (!matemenu_tree_load_sync (tree, &error)) + { + g_printerr("Failed to load tree: %s\n", error->message); + return 1; + } + + g_print("Loaded menu from %s\n", matemenu_tree_get_canonical_menu_path(tree)); + root = matemenu_tree_get_root_directory(tree); if (root != NULL) { print_directory(root); @@ -210,16 +239,16 @@ int main(int argc, char** argv) if (monitor) { - matemenu_tree_add_monitor(tree, (MateMenuTreeChangedFunc) handle_tree_changed, NULL); + GMainLoop *main_loop; + + g_signal_connect(tree, "changed", G_CALLBACK(handle_tree_changed), NULL); - GMainLoop* main_loop = g_main_loop_new(NULL, FALSE); + main_loop = g_main_loop_new(NULL, FALSE); g_main_loop_run(main_loop); g_main_loop_unref(main_loop); - - matemenu_tree_remove_monitor(tree, (MateMenuTreeChangedFunc) handle_tree_changed, NULL); } - matemenu_tree_unref(tree); + g_object_unref(tree); return 0; } |