summaryrefslogtreecommitdiff
path: root/util/test-menu-spec.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/test-menu-spec.c')
-rw-r--r--util/test-menu-spec.c225
1 files changed, 225 insertions, 0 deletions
diff --git a/util/test-menu-spec.c b/util/test-menu-spec.c
new file mode 100644
index 0000000..e67c0f4
--- /dev/null
+++ b/util/test-menu-spec.c
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2004 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.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 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}
+};
+
+static void append_directory_path(MateMenuTreeDirectory* directory, GString* path)
+{
+ MateMenuTreeDirectory* parent = matemenu_tree_item_get_parent(MATEMENU_TREE_ITEM(directory));
+
+ if (!parent)
+ {
+ g_string_append_c(path, '/');
+ return;
+ }
+
+ append_directory_path(parent, path);
+
+ 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)
+{
+ g_return_val_if_fail(directory != NULL, NULL);
+
+ GString* 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)
+{
+ 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);
+
+ 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>") : "");
+
+ g_free(utf8_file_id);
+ g_free(utf8_path);
+}
+
+static void print_directory(MateMenuTreeDirectory* directory)
+{
+ const char* path;
+ char* freeme = make_path(directory);
+
+ if (!strcmp(freeme, "/"))
+ {
+ path = freeme;
+ }
+ else
+ {
+ path = freeme + 1;
+ }
+
+ GSList* items = matemenu_tree_directory_get_contents(directory);
+ GSList* tmp = items;
+
+ while (tmp != NULL)
+ {
+ MateMenuTreeItem* item = tmp->data;
+
+ switch (matemenu_tree_item_get_type(item))
+ {
+ case MATEMENU_TREE_ITEM_ENTRY:
+ print_entry(MATEMENU_TREE_ENTRY(item), path);
+ break;
+
+ case MATEMENU_TREE_ITEM_DIRECTORY:
+ print_directory(MATEMENU_TREE_DIRECTORY(item));
+ break;
+
+ case MATEMENU_TREE_ITEM_HEADER:
+ case MATEMENU_TREE_ITEM_SEPARATOR:
+ break;
+
+ case MATEMENU_TREE_ITEM_ALIAS:
+ {
+ MateMenuTreeItem* aliased_item = matemenu_tree_alias_get_item(MATEMENU_TREE_ALIAS(item));
+
+ if (matemenu_tree_item_get_type(aliased_item) == MATEMENU_TREE_ITEM_ENTRY)
+ {
+ print_entry(MATEMENU_TREE_ENTRY(aliased_item), path);
+ }
+ }
+ break;
+
+ default:
+ g_assert_not_reached();
+ break;
+ }
+
+ matemenu_tree_item_unref(tmp->data);
+
+ tmp = tmp->next;
+ }
+
+ g_slist_free(items);
+
+ g_free(freeme);
+}
+
+static void handle_tree_changed(MateMenuTree* tree)
+{
+ g_print(_("\n\n\n==== Menu changed, reloading ====\n\n\n"));
+
+ MateMenuTreeDirectory* root = matemenu_tree_get_root_directory(tree);
+
+ if (root == NULL)
+ {
+ g_warning(_("Menu tree is empty"));
+ return;
+ }
+
+ print_directory(root);
+ matemenu_tree_item_unref(root);
+}
+
+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"));
+ 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;
+
+ 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);
+
+ g_assert(tree != NULL);
+
+ MateMenuTreeDirectory* root = matemenu_tree_get_root_directory(tree);
+
+ if (root != NULL)
+ {
+ print_directory(root);
+ matemenu_tree_item_unref(root);
+ }
+ else
+ {
+ g_warning(_("Menu tree is empty"));
+ }
+
+ if (monitor)
+ {
+ matemenu_tree_add_monitor(tree, (MateMenuTreeChangedFunc) handle_tree_changed, NULL);
+
+ GMainLoop* 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);
+
+ return 0;
+}