Skip to content
Permalink
Browse files

udpate examples

  • Loading branch information...
yetist authored and raveit65 committed May 2, 2018
1 parent 524d3e4 commit 6399b844738571244bb52d144a60ede86c8a45bc
Showing with 127 additions and 110 deletions.
  1. +1 −1 util/Makefile.am
  2. +18 −30 util/mate-menus-ls.py
  3. +108 −79 util/test-menu-spec.c
@@ -18,7 +18,7 @@ mate_menu_spec_test_LDADD = \
../libmenu/libmate-menu.la

exampledir = $(pkgdatadir)/examples
example_DATA = mate-menus-ls.py mate-menus-ls.js
example_DATA = mate-menus-ls.py

EXTRA_DIST = $(example_DATA)

@@ -23,37 +23,25 @@

import optparse
import sys

import matemenu

def print_entry(entry, path):
if entry.get_is_excluded():
excluded = ' <excluded>'
else:
excluded = ''

print '%s\t%s\t%s%s' % (path, entry.get_desktop_file_id(), entry.get_desktop_file_path(), excluded)
import gi
gi.require_version('MateMenu', '2.0')
from gi.repository import MateMenu

def print_directory(dir, parent_path = None):
if not parent_path:
path = '/'
else:
path = '%s%s/' % (parent_path, dir.get_name())

for item in dir.get_contents():
type = item.get_type()
if type == matemenu.TYPE_ENTRY:
print_entry(item, path)
elif type == matemenu.TYPE_DIRECTORY:
print_directory(item, path)
elif type == matemenu.TYPE_ALIAS:
aliased = item.get_item()
if aliased.get_type() == matemenu.TYPE_ENTRY:
print_entry(aliased, path)
elif type in [ matemenu.TYPE_HEADER, matemenu.TYPE_SEPARATOR ]:
pass
else:
print >> sys.stderr, 'Unsupported item type: %s' % type
iter = dir.iter()
nextType = iter.next()
while(nextType != MateMenu.TreeItemType.INVALID):
if (nextType == MateMenu.TreeItemType.ENTRY):
entry = iter.get_entry()
print(path + "\t" + entry.get_app_info().get_name() + "\t" + entry.get_desktop_file_path())
elif (nextType == MateMenu.TreeItemType.DIRECTORY):
print_directory(iter.get_directory(), path);
nextType = iter.next()

def main(args):
parser = optparse.OptionParser()
@@ -74,17 +62,17 @@ def main(args):
else:
menu_file = 'mate-applications.menu'

flags = matemenu.FLAGS_NONE
flags = MateMenu.TreeFlags.NONE
if options.exclude:
flags |= matemenu.FLAGS_INCLUDE_EXCLUDED
flags |= MateMenu.TreeFlags.INCLUDE_EXCLUDED
if options.nodisplay:
flags |= matemenu.FLAGS_INCLUDE_NODISPLAY

tree = matemenu.lookup_tree(menu_file, flags)
flags |= MateMenu.TreeFlags.INCLUDE_NODISPLAY
tree = MateMenu.Tree(menu_basename = "mate-applications.menu", flags = flags)
tree.load_sync();
root = tree.get_root_directory()

if not root:
print 'Menu tree is empty'
print('Menu tree is empty')
else:
print_directory(root)

@@ -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;
}

0 comments on commit 6399b84

Please sign in to comment.
You can’t perform that action at this time.