diff options
-rw-r--r-- | .bzrignore | 6 | ||||
-rw-r--r-- | configure.ac | 5 | ||||
-rw-r--r-- | tests/Makefile.am | 93 | ||||
-rw-r--r-- | tests/dbusmenu-jsonloader.pc.in | 14 | ||||
-rw-r--r-- | tests/json-loader.c | 220 | ||||
-rw-r--r-- | tests/json-loader.h | 31 | ||||
-rw-r--r-- | tests/test-gtk-label-server.c | 71 | ||||
-rw-r--r-- | tests/test-json-01.json | 4023 | ||||
-rw-r--r-- | tests/test-json-client.c | 75 | ||||
-rw-r--r-- | tests/test-json-server.c | 81 | ||||
-rw-r--r-- | tools/dbusmenu-dumper.c | 6 |
11 files changed, 4551 insertions, 74 deletions
@@ -182,3 +182,9 @@ docs/libdbusmenu-gtk/reference/tmpl/menuitem.sgml docs/libdbusmenu-gtk/reference/tmpl/menuitem.sgml.bak gtk-doc.make m4/gtk-doc.m4 +tests/dbusmenu-jsonloader.pc +tests/libdbusmenu-jsonloader.la +tests/libdbusmenu_jsonloader_la-json-loader.lo +tests/test-json-server +tests/test-json-client +tests/test-json diff --git a/configure.ac b/configure.ac index 80c4b8b..598df4a 100644 --- a/configure.ac +++ b/configure.ac @@ -62,8 +62,10 @@ AC_SUBST(DBUSMENUGTK_LIBS) ########################### JSON_GLIB_REQUIRED_VERSION=0.6.0 +GIO_UNIX_REQUIRED_VERSION=2.24 -PKG_CHECK_MODULES(DBUSMENUTESTS, json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION) +PKG_CHECK_MODULES(DBUSMENUTESTS, json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION + gio-unix-2.0 >= $GIO_UNIX_REQUIRED_VERSION) AC_SUBST(DBUSMENUTESTS_CFLAGS) AC_SUBST(DBUSMENUTESTS_LIBS) @@ -126,6 +128,7 @@ libdbusmenu-gtk/dbusmenu-gtk.pc tools/Makefile tools/testapp/Makefile tests/Makefile +tests/dbusmenu-jsonloader.pc docs/Makefile docs/libdbusmenu-glib/Makefile docs/libdbusmenu-glib/reference/Makefile diff --git a/tests/Makefile.am b/tests/Makefile.am index 66f286b..63857a2 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,14 +1,17 @@ DBUS_RUNNER=dbus-test-runner +CLEANFILES= + TESTS = \ test-glib-objects-test \ test-glib-layout \ test-glib-properties \ test-glib-proxy \ test-glib-simple-items \ - test-gtk-objects-test \ test-glib-submenu \ + test-json \ + test-gtk-objects-test \ test-gtk-label \ test-gtk-shortcut \ test-gtk-reorder @@ -31,11 +34,50 @@ check_PROGRAMS = \ test-gtk-shortcut-client \ test-gtk-shortcut-server \ test-glib-simple-items \ - test-gtk-reorder-server + test-gtk-reorder-server \ + test-json-client \ + test-json-server XVFB_RUN=". $(srcdir)/run-xvfb.sh" ###################### +# JSON Loader lib +###################### + +lib_LTLIBRARIES = libdbusmenu-jsonloader.la + +libdbusmenu_jsonloaderincludedir=$(includedir)/libdbusmenu-0.1/libdbusmenu-jsonloader/ + +libdbusmenu_jsonloaderinclude_HEADERS = \ + json-loader.h + +libdbusmenu_jsonloader_la_SOURCES = \ + json-loader.h \ + json-loader.c + +libdbusmenu_jsonloader_la_LDFLAGS = \ + -version-info $(LIBDBUSMENU_CURRENT):$(LIBDBUSMENU_REVISION):$(LIBDBUSMENU_AGE) \ + -no-undefined \ + -export-symbols-regex "^[^_].*" + +libdbusmenu_jsonloader_la_CFLAGS = \ + $(DBUSMENUGLIB_CFLAGS) \ + $(DBUSMENUTESTS_CFLAGS) \ + -I $(srcdir)/.. \ + -Wall \ + -Werror \ + -DG_DISABLE_DEPRECATED \ + -DG_LOG_DOMAIN="\"LIBDBUSMENU-JSONLOADER\"" + +libdbusmenu_jsonloader_la_LIBADD = \ + ../libdbusmenu-glib/libdbusmenu-glib.la \ + $(DBUSMENUGLIB_LIBS) \ + $(DBUSMENUTESTS_LIBS) + +pkgconfig_DATA = dbusmenu-jsonloader.pc +pkgconfigdir = $(libdir)/pkgconfig + +###################### # Test GLib server ###################### @@ -84,6 +126,47 @@ test_glib_layout_client_LDADD = \ $(DBUSMENUGLIB_LIBS) ###################### +# Test JSON +###################### + +test-json: test-json-client test-json-server Makefile.am + @echo "#!/bin/bash" > $@ + @echo $(XVFB_RUN) >> $@ + @echo $(DBUS_RUNNER) --task ./test-json-client --task-name Client --parameter $(top_builddir)/tools/dbusmenu-dumper --parameter test-json-01.output.json --ignore-return --task ./test-json-server --task-name Server --parameter $(srcdir)/test-json-01.json --ignore-return >> $@ + @echo diff $(srcdir)/test-json-01.json test-json-01.output.json \> /dev/null >> $@ + @chmod +x $@ + +CLEANFILES += test-json-01.output.json + +test_json_server_SOURCES = \ + test-json-server.c + +test_json_server_CFLAGS = \ + -I $(srcdir)/.. \ + -I $(srcdir) \ + $(DBUSMENUGLIB_CFLAGS) \ + $(DBUSMENUTESTS_CFLAGS) \ + -Wall -Werror + +test_json_server_LDADD = \ + ../libdbusmenu-glib/libdbusmenu-glib.la \ + libdbusmenu-jsonloader.la \ + $(DBUSMENUTESTS_LIBS) \ + $(DBUSMENUGLIB_LIBS) + +test_json_client_SOURCES = \ + test-json-client.c + +test_json_client_CFLAGS = \ + -I $(srcdir)/.. \ + $(DBUSMENUGLIB_CFLAGS) -Wall -Werror + +test_json_client_LDADD = \ + ../libdbusmenu-glib/libdbusmenu-glib.la \ + $(DBUSMENUTESTS_LIBS) \ + $(DBUSMENUGLIB_LIBS) + +###################### # Test Glib Submenu ###################### @@ -286,6 +369,7 @@ test_gtk_label_server_CFLAGS = \ test_gtk_label_server_LDADD = \ ../libdbusmenu-glib/libdbusmenu-glib.la \ ../libdbusmenu-gtk/libdbusmenu-gtk.la \ + libdbusmenu-jsonloader.la \ $(DBUSMENUGTK_LIBS) \ $(DBUSMENUTESTS_LIBS) @@ -421,9 +505,10 @@ EXTRA_DIST = \ dbusmenu-gtk/mago_tests/data/several_submenus_recursive.json \ dbusmenu-gtk/mago_tests/data/several_submenus_utf8.json \ dbusmenu-gtk/mago_tests/data/static.json \ - dbusmenu-gtk/mago_tests/data/test-gtk-label.json + dbusmenu-gtk/mago_tests/data/test-gtk-label.json \ + test-json-01.json -CLEANFILES = \ +CLEANFILES += \ dbusmenu-gtk/mago_tests/dbusmenu.pyc distclean-local: diff --git a/tests/dbusmenu-jsonloader.pc.in b/tests/dbusmenu-jsonloader.pc.in new file mode 100644 index 0000000..d042132 --- /dev/null +++ b/tests/dbusmenu-jsonloader.pc.in @@ -0,0 +1,14 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +bindir=@bindir@ +includedir=@includedir@ + +Cflags: -I${includedir}/libdbusmenu-0.1 +Requires: dbus-glib-1,dbusmenu-glib,json-glib-1.0 +Libs: -L${libdir} -ldbusmenu-jsonloader + +Name: libdbusmenu-jsonloader +Description: A small library to load JSON descriptions of menus. Mostly for testing. +Version: @VERSION@ + diff --git a/tests/json-loader.c b/tests/json-loader.c new file mode 100644 index 0000000..aad4295 --- /dev/null +++ b/tests/json-loader.c @@ -0,0 +1,220 @@ +/* +A loader to turn JSON into dbusmenu menuitems + +Copyright 2010 Canonical Ltd. + +Authors: + Ted Gould <ted@canonical.com> + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "json-loader.h" +#include <dbus/dbus-gtype-specialized.h> + +static GValue * +node2value (JsonNode * node) +{ + if (node == NULL) { + return NULL; + } + + GValue * value = g_new0(GValue, 1); + + if (JSON_NODE_TYPE(node) == JSON_NODE_VALUE) { + json_node_get_value(node, value); + return value; + } + + if (JSON_NODE_TYPE(node) == JSON_NODE_ARRAY) { + JsonArray * array = json_node_get_array(node); + JsonNode * first = json_array_get_element(array, 0); + + if (JSON_NODE_TYPE(first) == JSON_NODE_VALUE) { + GValue subvalue = {0}; + json_node_get_value(first, &subvalue); + + if (G_VALUE_TYPE(&subvalue) == G_TYPE_STRING) { + GArray * garray = g_array_sized_new(TRUE, TRUE, sizeof(gchar *), json_array_get_length(array)); + g_value_init(value, G_TYPE_STRV); + g_value_take_boxed(value, garray->data); + + int i; + for (i = 0; i < json_array_get_length(array); i++) { + const gchar * str = json_node_get_string(json_array_get_element(array, i)); + gchar * dupstr = g_strdup(str); + g_array_append_val(garray, dupstr); + } + + g_array_free(garray, FALSE); + } else { + GValueArray * varray = g_value_array_new(json_array_get_length(array)); + g_value_init(value, G_TYPE_VALUE_ARRAY); + g_value_take_boxed(value, varray); + + g_value_array_append(varray, &subvalue); + g_value_unset(&subvalue); + + int i; + for (i = 1; i < json_array_get_length(array); i++) { + json_node_get_value(first, &subvalue); + g_value_array_append(varray, &subvalue); + g_value_unset(&subvalue); + } + } + + } else { + GValue * subvalue = node2value(first); + GType type = dbus_g_type_get_collection("GPtrArray", G_VALUE_TYPE(subvalue)); + gpointer * wrapper = dbus_g_type_specialized_construct(type); + + g_value_init(value, type); + g_value_take_boxed(value, wrapper); + + DBusGTypeSpecializedAppendContext ctx; + dbus_g_type_specialized_init_append(value, &ctx); + + dbus_g_type_specialized_collection_append(&ctx, subvalue); + int i; + for (i = 1; i < json_array_get_length(array); i++) { + GValue * subvalue = node2value(node); + dbus_g_type_specialized_collection_append(&ctx, subvalue); + } + + dbus_g_type_specialized_collection_end_append(&ctx); + } + } + + if (JSON_NODE_TYPE(node) == JSON_NODE_OBJECT) { + JsonObject * obj = json_node_get_object(node); + + GType type = dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE); + GHashTable * hash = (GHashTable *)dbus_g_type_specialized_construct(type); + + g_value_init(value, type); + g_value_take_boxed(value, hash); + + DBusGTypeSpecializedAppendContext ctx; + dbus_g_type_specialized_init_append(value, &ctx); + + GList * members = NULL; + for (members = json_object_get_members(obj); members != NULL; members = g_list_next(members)) { + const gchar * member = members->data; + + JsonNode * lnode = json_object_get_member(obj, member); + GValue * value = node2value(lnode); + + if (value != NULL) { + GValue name = {0}; + g_value_init(&name, G_TYPE_STRING); + g_value_set_static_string(&name, member); + + dbus_g_type_specialized_map_append(&ctx, &name, value); + + g_value_unset(&name); + g_value_unset(value); + g_free(value); + } + } + } + + return value; +} + +static void +set_props (DbusmenuMenuitem * mi, JsonObject * node) +{ + if (node == NULL) return; + + GList * members = NULL; + for (members = json_object_get_members(node); members != NULL; members = g_list_next(members)) { + const gchar * member = members->data; + + if (!g_strcmp0(member, "id")) { continue; } + if (!g_strcmp0(member, "submenu")) { continue; } + + JsonNode * lnode = json_object_get_member(node, member); + GValue * value = node2value(lnode); + + if (value != NULL) { + dbusmenu_menuitem_property_set_value(mi, member, value); + g_value_unset(value); + g_free(value); + } + } + + return; +} + +DbusmenuMenuitem * +dbusmenu_json_build_from_node (const JsonNode * cnode) +{ + JsonNode * node = (JsonNode *)cnode; /* To match the jsonglib API :( */ + + if (node == NULL) return NULL; + if (JSON_NODE_TYPE(node) != JSON_NODE_OBJECT) return NULL; + + JsonObject * layout = json_node_get_object(node); + + DbusmenuMenuitem * local = NULL; + if (json_object_has_member(layout, "id")) { + JsonNode * node = json_object_get_member(layout, "id"); + g_return_val_if_fail(JSON_NODE_TYPE(node) == JSON_NODE_VALUE, NULL); + local = dbusmenu_menuitem_new_with_id(json_node_get_int(node)); + } else { + local = dbusmenu_menuitem_new(); + } + + set_props(local, layout); + + if (json_object_has_member(layout, "submenu")) { + JsonNode * node = json_object_get_member(layout, "submenu"); + g_return_val_if_fail(JSON_NODE_TYPE(node) == JSON_NODE_ARRAY, local); + JsonArray * array = json_node_get_array(node); + guint count; + for (count = 0; count < json_array_get_length(array); count++) { + DbusmenuMenuitem * child = dbusmenu_json_build_from_node(json_array_get_element(array, count)); + if (child != NULL) { + dbusmenu_menuitem_child_append(local, child); + } + } + } + + /* g_debug("Layout to menu return: 0x%X", (unsigned int)local); */ + return local; +} + +DbusmenuMenuitem * +dbusmenu_json_build_from_file (const gchar * filename) +{ + JsonParser * parser = json_parser_new(); + + GError * error = NULL; + if (!json_parser_load_from_file(parser, filename, &error)) { + g_warning("Failed parsing file %s because: %s", filename, error->message); + g_error_free(error); + return NULL; + } + + JsonNode * root_node = json_parser_get_root(parser); + if (JSON_NODE_TYPE(root_node) != JSON_NODE_OBJECT) { + g_warning("Root node is not an object, fail. It's an: %s", json_node_type_name(root_node)); + return NULL; + } + + DbusmenuMenuitem * mi = dbusmenu_json_build_from_node(root_node); + + g_object_unref(parser); + + return mi; +} diff --git a/tests/json-loader.h b/tests/json-loader.h new file mode 100644 index 0000000..666bb6e --- /dev/null +++ b/tests/json-loader.h @@ -0,0 +1,31 @@ +/* +A loader to turn JSON into dbusmenu menuitems + +Copyright 2010 Canonical Ltd. + +Authors: + Ted Gould <ted@canonical.com> + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef __DBUSMENU_JSON_LOADER_H__ +#define __DBUSMENU_JSON_LOADER_H__ + +#include <libdbusmenu-glib/menuitem.h> +#include <json-glib/json-glib.h> + +DbusmenuMenuitem * dbusmenu_json_build_from_node (const JsonNode * node); +DbusmenuMenuitem * dbusmenu_json_build_from_file (const gchar * filename); + +#endif /* __DBUSMENU_JSON_LOADER_H__ */ diff --git a/tests/test-gtk-label-server.c b/tests/test-gtk-label-server.c index 32d7a43..32572fc 100644 --- a/tests/test-gtk-label-server.c +++ b/tests/test-gtk-label-server.c @@ -30,74 +30,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <libdbusmenu-glib/server.h> #include <json-glib/json-glib.h> - -static void -menuitem_click(DbusmenuMenuitem * mi, guint32 time, gpointer user_data) -{ - g_debug("Clicked on: %d @ %d", dbusmenu_menuitem_get_id(mi), time); - return; -} - -static void -set_props (DbusmenuMenuitem * mi, JsonObject * node) -{ - if (node == NULL) return; - - GList * members = NULL; - for (members = json_object_get_members(node); members != NULL; members = g_list_next(members)) { - const gchar * member = members->data; - - if (!g_strcmp0(member, "id")) { continue; } - if (!g_strcmp0(member, "submenu")) { continue; } - - JsonNode * lnode = json_object_get_member(node, member); - if (JSON_NODE_TYPE(lnode) != JSON_NODE_VALUE) { continue; } - - GValue value = {0}; - json_node_get_value(lnode, &value); - dbusmenu_menuitem_property_set_value(mi, member, &value); - g_value_unset(&value); - } - - return; -} - -static DbusmenuMenuitem * -layout2menuitem (JsonNode * inlayout) -{ - if (inlayout == NULL) return NULL; - if (JSON_NODE_TYPE(inlayout) != JSON_NODE_OBJECT) return NULL; - - JsonObject * layout = json_node_get_object(inlayout); - - DbusmenuMenuitem * local = NULL; - if (json_object_has_member(layout, "id")) { - JsonNode * node = json_object_get_member(layout, "id"); - g_return_val_if_fail(JSON_NODE_TYPE(node) == JSON_NODE_VALUE, NULL); - local = dbusmenu_menuitem_new_with_id(json_node_get_int(node)); - } else { - local = dbusmenu_menuitem_new(); - } - g_signal_connect(G_OBJECT(local), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(menuitem_click), NULL); - - set_props(local, layout); - - if (json_object_has_member(layout, "submenu")) { - JsonNode * node = json_object_get_member(layout, "submenu"); - g_return_val_if_fail(JSON_NODE_TYPE(node) == JSON_NODE_ARRAY, local); - JsonArray * array = json_node_get_array(node); - guint count; - for (count = 0; count < json_array_get_length(array); count++) { - DbusmenuMenuitem * child = layout2menuitem(json_array_get_element(array, count)); - if (child != NULL) { - dbusmenu_menuitem_child_append(local, child); - } - } - } - - /* g_debug("Layout to menu return: 0x%X", (unsigned int)local); */ - return local; -} +#include "json-loader.h" static JsonArray * root_array = NULL; static guint layouton = 0; @@ -114,7 +47,7 @@ timer_func (gpointer data) } g_debug("Updating to Layout %d", layouton); - dbusmenu_server_set_root(server, layout2menuitem(json_array_get_element(root_array, layouton))); + dbusmenu_server_set_root(server, dbusmenu_json_build_from_node(json_array_get_element(root_array, layouton))); layouton++; return TRUE; diff --git a/tests/test-json-01.json b/tests/test-json-01.json new file mode 100644 index 0000000..88e1cbf --- /dev/null +++ b/tests/test-json-01.json @@ -0,0 +1,4023 @@ +{ + "id": 0, + "children-display": "submenu", + "submenu": [ + { + "id": 5, + "enabled": true, + "label": "File", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 6, + "shortcut": [["Control", "q"]], + "enabled": true, + "label": "Quit", + "visible": true + }, + { + "id": 7, + "shortcut": [["Control", "Shift", "w"]], + "enabled": true, + "label": "Close all", + "visible": true + }, + { + "id": 8, + "shortcut": [["Control", "w"]], + "enabled": true, + "label": "Close", + "visible": true + }, + { + "id": 9, + "type": "separator" + }, + { + "id": 10, + "enabled": true, + "label": "Send by Email...", + "visible": true + }, + { + "id": 11, + "shortcut": [["Control", "p"]], + "enabled": true, + "label": "Print...", + "visible": true + }, + { + "id": 12, + "enabled": true, + "label": "Page Setup", + "visible": true + }, + { + "id": 13, + "type": "separator" + }, + { + "id": 14, + "enabled": true, + "label": "Revert", + "visible": true + }, + { + "id": 15, + "enabled": true, + "label": "Save as Template...", + "visible": true + }, + { + "id": 16, + "enabled": true, + "label": "Save a Copy...", + "visible": true + }, + { + "id": 17, + "shortcut": [["Control", "Shift", "s"]], + "enabled": true, + "label": "Save As...", + "visible": true + }, + { + "id": 18, + "shortcut": [["Control", "s"]], + "enabled": true, + "label": "Save", + "visible": true + }, + { + "id": 19, + "type": "separator" + }, + { + "id": 20, + "enabled": true, + "label": "Open Recent", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 21, + "enabled": true, + "label": "Document History", + "visible": true + }, + { + "id": 22, + "type": "separator" + }, + { + "id": 23, + "shortcut": [["Control", "2"]], + "enabled": true, + "label": "giggity.jpg", + "visible": true + }, + { + "id": 24, + "shortcut": [["Control", "1"]], + "enabled": true, + "label": "Icon Height.svg", + "visible": true + } + ] + }, + { + "id": 25, + "enabled": true, + "label": "Open Location...", + "visible": true + }, + { + "id": 26, + "shortcut": [["Control", "Alt", "o"]], + "enabled": true, + "label": "Open as Layers...", + "visible": true + }, + { + "id": 27, + "shortcut": [["Control", "o"]], + "enabled": true, + "label": "Open...", + "visible": true + }, + { + "id": 28, + "enabled": true, + "label": "Create", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 29, + "enabled": true, + "label": "Web Page Themes", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 30, + "enabled": true, + "label": "Classic.Gimp.Org", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 31, + "enabled": true, + "label": "Tube Sub-Sub-Button Label...", + "visible": true + }, + { + "id": 32, + "enabled": true, + "label": "Tube Sub-Button Label...", + "visible": true + }, + { + "id": 33, + "enabled": true, + "label": "Tube Button Label...", + "visible": true + }, + { + "id": 34, + "enabled": true, + "label": "Small Header...", + "visible": true + }, + { + "id": 35, + "enabled": true, + "label": "General Tube Labels...", + "visible": true + }, + { + "id": 36, + "enabled": true, + "label": "Big Header...", + "visible": true + } + ] + }, + { + "id": 37, + "enabled": true, + "label": "Beveled Pattern", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 38, + "enabled": true, + "label": "Hrule...", + "visible": true + }, + { + "id": 39, + "enabled": true, + "label": "Heading...", + "visible": true + }, + { + "id": 40, + "enabled": true, + "label": "Button...", + "visible": true + }, + { + "id": 41, + "enabled": true, + "label": "Bullet...", + "visible": true + }, + { + "id": 42, + "enabled": true, + "label": "Arrow...", + "visible": true + } + ] + }, + { + "id": 43, + "enabled": true, + "label": "Alien Glow", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 44, + "enabled": true, + "label": "Hrule...", + "visible": true + }, + { + "id": 45, + "enabled": true, + "label": "Button...", + "visible": true + }, + { + "id": 46, + "enabled": true, + "label": "Bullet...", + "visible": true + }, + { + "id": 47, + "enabled": true, + "label": "Arrow...", + "visible": true + } + ] + } + ] + }, + { + "id": 48, + "enabled": true, + "label": "Patterns", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 49, + "enabled": true, + "label": "Truchet...", + "visible": true + }, + { + "id": 50, + "enabled": true, + "label": "Swirly...", + "visible": true + }, + { + "id": 51, + "enabled": true, + "label": "Swirl-Tile...", + "visible": true + }, + { + "id": 52, + "enabled": true, + "label": "Render Map...", + "visible": true + }, + { + "id": 53, + "enabled": true, + "label": "Land...", + "visible": true + }, + { + "id": 54, + "enabled": true, + "label": "Flatland...", + "visible": true + }, + { + "id": 55, + "enabled": true, + "label": "Camouflage...", + "visible": true + }, + { + "id": 56, + "enabled": true, + "label": "3D Truchet...", + "visible": true + } + ] + }, + { + "id": 57, + "enabled": true, + "label": "Logos", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 58, + "enabled": true, + "label": "Web Title Header...", + "visible": true + }, + { + "id": 59, + "enabled": true, + "label": "Textured...", + "visible": true + }, + { + "id": 60, + "enabled": true, + "label": "Text Circle...", + "visible": true + }, + { + "id": 61, + "enabled": true, + "label": "Starscape...", + "visible": true + }, + { + "id": 62, + "enabled": true, + "label": "Speed Text...", + "visible": true + }, + { + "id": 63, + "enabled": true, + "label": "SOTA Chrome...", + "visible": true + }, + { + "id": 64, + "enabled": true, + "label": "Particle Trace...", + "visible": true + }, + { + "id": 65, + "enabled": true, + "label": "Newsprint Text...", + "visible": true + }, + { + "id": 66, + "enabled": true, + "label": "Neon...", + "visible": true + }, + { + "id": 67, + "enabled": true, + "label": "Imigre-26...", + "visible": true + }, + { + "id": 68, + "enabled": true, + "label": "Gradient Bevel...", + "visible": true + }, + { + "id": 69, + "enabled": true, + "label": "Glowing Hot...", + "visible": true + }, + { + "id": 70, + "enabled": true, + "label": "Glossy...", + "visible": true + }, + { + "id": 71, + "enabled": true, + "label": "Frosty...", + "visible": true + }, + { + "id": 72, + "enabled": true, + "label": "Crystal...", + "visible": true + }, + { + "id": 73, + "enabled": true, + "label": "Cool Metal...", + "visible": true + }, + { + "id": 74, + "enabled": true, + "label": "Comic Book...", + "visible": true + }, + { + "id": 75, + "enabled": true, + "label": "Chrome...", + "visible": true + }, + { + "id": 76, + "enabled": true, + "label": "Chip Away...", + "visible": true + }, + { + "id": 77, + "enabled": true, + "label": "Chalk...", + "visible": true + }, + { + "id": 78, + "enabled": true, + "label": "Carved...", + "visible": true + }, + { + "id": 79, + "enabled": true, + "label": "Bovination...", + "visible": true + }, + { + "id": 80, + "enabled": true, + "label": "Blended...", + "visible": true + }, + { + "id": 81, + "enabled": true, + "label": "Basic I...", + "visible": true + }, + { + "id": 82, + "enabled": true, + "label": "Basic II...", + "visible": true + }, + { + "id": 83, + "enabled": true, + "label": "Alien Neon...", + "visible": true + }, + { + "id": 84, + "enabled": true, + "label": "Alien Glow...", + "visible": true + }, + { + "id": 85, + "enabled": true, + "label": "3D Outline...", + "visible": true + } + ] + }, + { + "id": 86, + "enabled": true, + "label": "Buttons", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 87, + "enabled": true, + "label": "Simple Beveled Button...", + "visible": true + }, + { + "id": 88, + "enabled": true, + "label": "Round Button...", + "visible": true + } + ] + }, + { + "id": 89, + "type": "separator" + }, + { + "id": 90, + "enabled": true, + "label": "xscanimage", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 91, + "enabled": false, + "label": "Device dialog...", + "visible": true + } + ] + }, + { + "id": 92, + "enabled": true, + "label": "Screenshot...", + "visible": true + }, + { + "id": 93, + "shortcut": [["Control", "Shift", "v"]], + "enabled": true, + "label": "From Clipboard", + "visible": true + } + ] + }, + { + "id": 94, + "shortcut": [["Control", "n"]], + "enabled": true, + "label": "New...", + "visible": true + } + ] + }, + { + "id": 95, + "enabled": true, + "label": "Edit", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 96, + "enabled": true, + "label": "Units", + "visible": true + }, + { + "id": 97, + "enabled": true, + "label": "Modules", + "visible": true + }, + { + "id": 98, + "enabled": true, + "label": "Keyboard Shortcuts", + "visible": true + }, + { + "id": 99, + "enabled": true, + "label": "Preferences", + "visible": true + }, + { + "id": 100, + "type": "separator" + }, + { + "id": 101, + "enabled": false, + "label": "Stroke Path...", + "visible": true + }, + { + "id": 102, + "enabled": false, + "label": "Stroke Selection...", + "visible": true + }, + { + "id": 103, + "shortcut": [["Control", "semicolon"]], + "enabled": true, + "label": "Fill with Pattern", + "visible": true + }, + { + "id": 104, + "shortcut": [["Control", "period"]], + "enabled": true, + "label": "Fill with BG Color", + "visible": true + }, + { + "id": 105, + "shortcut": [["Control", "comma"]], + "enabled": true, + "label": "Fill with FG Color", + "visible": true + }, + { + "id": 106, + "shortcut": [["Delete"]], + "enabled": true, + "label": "Clear", + "visible": true + }, + { + "id": 107, + "type": "separator" + }, + { + "id": 108, + "enabled": true, + "label": "Buffer", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 109, + "enabled": true, + "label": "Paste Named...", + "visible": true + }, + { + "id": 110, + "enabled": true, + "label": "Copy Visible Named...", + "visible": true + }, + { + "id": 111, + "enabled": true, + "label": "Copy Named...", + "visible": true + }, + { + "id": 112, + "enabled": true, + "label": "Cut Named...", + "visible": true + } + ] + }, + { + "id": 113, + "enabled": true, + "label": "Paste as", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 114, + "enabled": true, + "label": "New Pattern...", + "visible": true + }, + { + "id": 115, + "enabled": true, + "label": "New Brush...", + "visible": true + }, + { + "id": 116, + "enabled": true, + "label": "New Layer", + "visible": true + }, + { + "id": 117, + "shortcut": [["Control", "Shift", "v"]], + "enabled": true, + "label": "New Image", + "visible": true + } + ] + }, + { + "id": 118, + "enabled": true, + "label": "Paste Into", + "visible": true + }, + { + "id": 119, + "shortcut": [["Control", "v"]], + "enabled": true, + "label": "Paste", + "visible": true + }, + { + "id": 120, + "shortcut": [["Control", "Shift", "c"]], + "enabled": true, + "label": "Copy Visible", + "visible": true + }, + { + "id": 121, + "shortcut": [["Control", "c"]], + "enabled": true, + "label": "Copy", + "visible": true + }, + { + "id": 122, + "shortcut": [["Control", "x"]], + "enabled": true, + "label": "Cut", + "visible": true + }, + { + "id": 123, + "type": "separator" + }, + { + "id": 124, + "enabled": true, + "label": "Undo History", + "visible": true + }, + { + "id": 3, + "enabled": false, + "label": "_Fade...", + "visible": true + }, + { + "id": 2, + "shortcut": [["Control", "y"]], + "enabled": false, + "label": "_Redo", + "visible": true + }, + { + "id": 1, + "shortcut": [["Control", "z"]], + "enabled": false, + "label": "_Undo", + "visible": true + } + ] + }, + { + "id": 125, + "enabled": true, + "label": "Select", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 126, + "enabled": false, + "label": "To Path", + "visible": true + }, + { + "id": 127, + "enabled": true, + "label": "Save to Channel", + "visible": true + }, + { + "id": 128, + "shortcut": [["Shift", "q"]], + "enabled": true, + "toggle-state": 0, + "label": "Toggle Quick Mask", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 129, + "type": "separator" + }, + { + "id": 130, + "enabled": true, + "label": "Distort...", + "visible": true + }, + { + "id": 131, + "enabled": false, + "label": "Border...", + "visible": true + }, + { + "id": 132, + "enabled": false, + "label": "Grow...", + "visible": true + }, + { + "id": 133, + "enabled": false, + "label": "Shrink...", + "visible": true + }, + { + "id": 134, + "enabled": false, + "label": "Sharpen", + "visible": true + }, + { + "id": 135, + "enabled": false, + "label": "Feather...", + "visible": true + }, + { + "id": 136, + "type": "separator" + }, + { + "id": 137, + "enabled": true, + "label": "Selection Editor", + "visible": true + }, + { + "id": 138, + "shortcut": [["Shift", "v"]], + "enabled": false, + "label": "From Path", + "visible": true + }, + { + "id": 139, + "shortcut": [["Shift", "o"]], + "enabled": true, + "label": "By Color", + "visible": true + }, + { + "id": 140, + "shortcut": [["Control", "Shift", "l"]], + "enabled": false, + "label": "Float", + "visible": true + }, + { + "id": 141, + "shortcut": [["Control", "i"]], + "enabled": true, + "label": "Invert", + "visible": true + }, + { + "id": 142, + "shortcut": [["Control", "Shift", "a"]], + "enabled": false, + "label": "None", + "visible": true + }, + { + "id": 143, + "shortcut": [["Control", "a"]], + "enabled": true, + "label": "All", + "visible": true + } + ] + }, + { + "id": 144, + "enabled": true, + "label": "View", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 145, + "enabled": true, + "toggle-state": 1, + "label": "Show Statusbar", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 146, + "enabled": true, + "toggle-state": 0, + "label": "Show Scrollbars", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 147, + "shortcut": [["Control", "Shift", "r"]], + "enabled": true, + "toggle-state": 0, + "label": "Show Rulers", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 148, + "enabled": true, + "toggle-state": 1, + "label": "Show Menubar", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 149, + "enabled": true, + "label": "Padding Color", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 150, + "enabled": true, + "label": "As in Preferences", + "visible": true + }, + { + "id": 151, + "type": "separator" + }, + { + "id": 152, + "enabled": true, + "label": "Select Custom Color...", + "visible": true + }, + { + "id": 153, + "enabled": true, + "label": "Dark Check Color", + "visible": true + }, + { + "id": 154, + "enabled": true, + "label": "Light Check Color", + "visible": true + }, + { + "id": 155, + "enabled": true, + "label": "From Theme", + "visible": true + } + ] + }, + { + "id": 156, + "type": "separator" + }, + { + "id": 157, + "enabled": true, + "toggle-state": 0, + "label": "Snap to Active Path", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 158, + "enabled": true, + "toggle-state": 0, + "label": "Snap to Canvas Edges", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 159, + "enabled": true, + "toggle-state": 0, + "label": "Snap to Grid", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 160, + "enabled": true, + "toggle-state": 1, + "label": "Snap to Guides", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 161, + "type": "separator" + }, + { + "id": 162, + "enabled": true, + "toggle-state": 0, + "label": "Show Sample Points", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 163, + "enabled": true, + "toggle-state": 0, + "label": "Show Grid", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 164, + "shortcut": [["Control", "Shift", "t"]], + "enabled": true, + "toggle-state": 0, + "label": "Show Guides", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 165, + "enabled": true, + "toggle-state": 0, + "label": "Show Layer Boundary", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 166, + "shortcut": [["Control", "t"]], + "enabled": true, + "toggle-state": 0, + "label": "Show Selection", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 167, + "type": "separator" + }, + { + "id": 168, + "enabled": true, + "label": "Display Filters...", + "visible": true + }, + { + "id": 169, + "enabled": true, + "label": "Navigation Window", + "visible": true + }, + { + "id": 170, + "type": "separator" + }, + { + "id": 171, + "enabled": true, + "shortcut": [["F11"]], + "toggle-state": 0, + "label": "Fullscreen", + "toggle-type": "checkmark", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 172, + "enabled": true, + "label": "Open Display...", + "visible": true + } + ] + }, + { + "id": 173, + "shortcut": [["Control", "e"]], + "enabled": true, + "label": "Shrink Wrap", + "visible": true + }, + { + "id": 174, + "type": "separator" + }, + { + "id": 175, + "enabled": true, + "label": "_Zoom (67%)", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 176, + "enabled": true, + "toggle-state": 0, + "label": "Othe_r (67%)...", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 177, + "type": "separator" + }, + { + "id": 178, + "enabled": true, + "toggle-state": 0, + "label": "1:16 (6.25%)", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 179, + "enabled": true, + "toggle-state": 0, + "label": "1:8 (12.5%)", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 180, + "enabled": true, + "toggle-state": 0, + "label": "1:4 (25%)", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 181, + "enabled": true, + "toggle-state": 0, + "label": "1:2 (50%)", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 182, + "shortcut": [["1"]], + "enabled": true, + "toggle-state": 1, + "label": "1:1 (100%)", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 183, + "enabled": true, + "toggle-state": 0, + "label": "2:1 (200%)", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 184, + "enabled": true, + "toggle-state": 0, + "label": "4:1 (400%)", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 185, + "enabled": true, + "toggle-state": 0, + "label": "8:1 (800%)", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 186, + "enabled": true, + "toggle-state": 0, + "label": "16:1 (1600%)", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 187, + "type": "separator" + }, + { + "id": 188, + "enabled": true, + "label": "Fill Window", + "visible": true + }, + { + "id": 189, + "shortcut": [["Control", "Shift", "e"]], + "enabled": true, + "label": "Fit Image in Window", + "visible": true + }, + { + "id": 190, + "shortcut": [["plus"]], + "enabled": true, + "label": "Zoom In", + "visible": true + }, + { + "id": 191, + "shortcut": [["minus"]], + "enabled": true, + "label": "Zoom Out", + "visible": true + }, + { + "id": 4, + "shortcut": [["grave"]], + "enabled": true, + "label": "Re_vert Zoom (67%)", + "visible": true + } + ] + }, + { + "id": 192, + "enabled": true, + "toggle-state": 1, + "label": "Dot for Dot", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 193, + "enabled": true, + "label": "New View", + "visible": true + } + ] + }, + { + "id": 194, + "enabled": true, + "label": "Image", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 195, + "shortcut": [["Alt", "Return"]], + "enabled": true, + "label": "Image Properties", + "visible": true + }, + { + "id": 196, + "enabled": true, + "label": "Configure Grid...", + "visible": true + }, + { + "id": 197, + "enabled": true, + "label": "Guides", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 198, + "enabled": true, + "label": "Remove all Guides", + "visible": true + }, + { + "id": 199, + "enabled": true, + "label": "New Guides from Selection", + "visible": true + }, + { + "id": 200, + "enabled": true, + "label": "New Guide...", + "visible": true + }, + { + "id": 201, + "enabled": true, + "label": "New Guide (by Percent)...", + "visible": true + } + ] + }, + { + "id": 202, + "type": "separator" + }, + { + "id": 203, + "enabled": true, + "label": "Align Visible Layers...", + "visible": true + }, + { + "id": 204, + "enabled": true, + "label": "Flatten Image", + "visible": true + }, + { + "id": 205, + "shortcut": [["Control", "m"]], + "enabled": true, + "label": "Merge Visible Layers...", + "visible": true + }, + { + "id": 206, + "type": "separator" + }, + { + "id": 207, + "enabled": true, + "label": "Zealous Crop", + "visible": true + }, + { + "id": 208, + "enabled": true, + "label": "Autocrop Image", + "visible": true + }, + { + "id": 209, + "enabled": false, + "label": "Crop to Selection", + "visible": true + }, + { + "id": 210, + "type": "separator" + }, + { + "id": 211, + "enabled": true, + "label": "Scale Image...", + "visible": true + }, + { + "id": 212, + "enabled": true, + "label": "Print Size...", + "visible": true + }, + { + "id": 213, + "enabled": false, + "label": "Fit Canvas to Selection", + "visible": true + }, + { + "id": 214, + "enabled": true, + "label": "Fit Canvas to Layers", + "visible": true + }, + { + "id": 215, + "enabled": true, + "label": "Canvas Size...", + "visible": true + }, + { + "id": 216, + "type": "separator" + }, + { + "id": 217, + "enabled": true, + "label": "Transform", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 218, + "enabled": true, + "label": "Guillotine", + "visible": true + }, + { + "id": 219, + "type": "separator" + }, + { + "id": 220, + "enabled": true, + "label": "Rotate 180\302\260", + "visible": true + }, + { + "id": 221, + "enabled": true, + "label": "Rotate 90\302\260 counter-clockwise", + "visible": true + }, + { + "id": 222, + "enabled": true, + "label": "Rotate 90\302\260 clockwise", + "visible": true + }, + { + "id": 223, + "type": "separator" + }, + { + "id": 224, + "enabled": true, + "label": "Flip Vertically", + "visible": true + }, + { + "id": 225, + "enabled": true, + "label": "Flip Horizontally", + "visible": true + } + ] + }, + { + "id": 226, + "enabled": true, + "label": "Mode", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 227, + "enabled": true, + "label": "Convert to Color Profile...", + "visible": true + }, + { + "id": 228, + "enabled": true, + "label": "Assign Color Profile...", + "visible": true + }, + { + "id": 229, + "type": "separator" + }, + { + "id": 230, + "enabled": true, + "toggle-state": 0, + "label": "Indexed...", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 231, + "enabled": true, + "toggle-state": 0, + "label": "Grayscale", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 232, + "enabled": true, + "toggle-state": 1, + "label": "RGB", + "toggle-type": "checkmark", + "visible": true + } + ] + }, + { + "id": 233, + "shortcut": [["Control", "d"]], + "enabled": true, + "label": "Duplicate", + "visible": true + } + ] + }, + { + "id": 234, + "enabled": true, + "label": "Layer", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 235, + "enabled": true, + "label": "Autocrop Layer", + "visible": true + }, + { + "id": 236, + "enabled": false, + "label": "Crop to Selection", + "visible": true + }, + { + "id": 237, + "enabled": true, + "label": "Scale Layer...", + "visible": true + }, + { + "id": 238, + "enabled": true, + "label": "Layer to Image Size", + "visible": true + }, + { + "id": 239, + "enabled": true, + "label": "Layer Boundary Size...", + "visible": true + }, + { + "id": 240, + "type": "separator" + }, + { + "id": 241, + "enabled": true, + "label": "Transform", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 242, + "shortcut": [["Control", "Shift", "o"]], + "enabled": true, + "label": "Offset...", + "visible": true + }, + { + "id": 243, + "type": "separator" + }, + { + "id": 244, + "enabled": true, + "label": "Arbitrary Rotation...", + "visible": true + }, + { + "id": 245, + "enabled": true, + "label": "Rotate 180\302\260", + "visible": true + }, + { + "id": 246, + "enabled": true, + "label": "Rotate 90\302\260 counter-clockwise", + "visible": true + }, + { + "id": 247, + "enabled": true, + "label": "Rotate 90\302\260 clockwise", + "visible": true + }, + { + "id": 248, + "type": "separator" + }, + { + "id": 249, + "enabled": true, + "label": "Flip Vertically", + "visible": true + }, + { + "id": 250, + "enabled": true, + "label": "Flip Horizontally", + "visible": true + } + ] + }, + { + "id": 251, + "enabled": true, + "label": "Transparency", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 252, + "enabled": true, + "label": "Intersect with Selection", + "visible": true + }, + { + "id": 253, + "enabled": true, + "label": "Subtract from Selection", + "visible": true + }, + { + "id": 254, + "enabled": true, + "label": "Add to Selection", + "visible": true + }, + { + "id": 255, + "enabled": true, + "label": "Alpha to Selection", + "visible": true + }, + { + "id": 256, + "type": "separator" + }, + { + "id": 257, + "enabled": true, + "label": "Threshold Alpha...", + "visible": true + }, + { + "id": 258, + "enabled": true, + "label": "Semi-Flatten", + "visible": true + }, + { + "id": 259, + "enabled": true, + "label": "Color to Alpha...", + "visible": true + }, + { + "id": 260, + "enabled": true, + "label": "Remove Alpha Channel", + "visible": true + }, + { + "id": 261, + "enabled": false, + "label": "Add Alpha Channel", + "visible": true + } + ] + }, + { + "id": 262, + "enabled": true, + "label": "Mask", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 263, + "enabled": false, + "label": "Intersect with Selection", + "visible": true + }, + { + "id": 264, + "enabled": false, + "label": "Subtract from Selection", + "visible": true + }, + { + "id": 265, + "enabled": false, + "label": "Add to Selection", + "visible": true + }, + { + "id": 266, + "enabled": false, + "label": "Mask to Selection", + "visible": true + }, + { + "id": 267, + "type": "separator" + }, + { + "id": 268, + "enabled": false, + "toggle-state": 0, + "label": "Disable Layer Mask", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 269, + "enabled": false, + "toggle-state": 0, + "label": "Edit Layer Mask", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 270, + "enabled": false, + "toggle-state": 0, + "label": "Show Layer Mask", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 271, + "type": "separator" + }, + { + "id": 272, + "enabled": false, + "label": "Delete Layer Mask", + "visible": true + }, + { + "id": 273, + "enabled": false, + "label": "Apply Layer Mask", + "visible": true + }, + { + "id": 274, + "enabled": true, + "label": "Add Layer Mask...", + "visible": true + } + ] + }, + { + "id": 275, + "enabled": true, + "label": "Stack", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 276, + "enabled": true, + "label": "Reverse Layer Order", + "visible": true + }, + { + "id": 277, + "type": "separator" + }, + { + "id": 278, + "enabled": false, + "label": "Layer to Bottom", + "visible": true + }, + { + "id": 279, + "enabled": false, + "label": "Layer to Top", + "visible": true + }, + { + "id": 280, + "enabled": false, + "label": "Lower Layer", + "visible": true + }, + { + "id": 281, + "enabled": false, + "label": "Raise Layer", + "visible": true + }, + { + "id": 282, + "type": "separator" + }, + { + "id": 283, + "shortcut": [["End"]], + "enabled": false, + "label": "Select Bottom Layer", + "visible": true + }, + { + "id": 284, + "shortcut": [["Home"]], + "enabled": false, + "label": "Select Top Layer", + "visible": true + }, + { + "id": 285, + "shortcut": [["Page_Down"]], + "enabled": false, + "label": "Select Next Layer", + "visible": true + }, + { + "id": 286, + "shortcut": [["Page_Up"]], + "enabled": false, + "label": "Select Previous Layer", + "visible": true + } + ] + }, + { + "id": 287, + "type": "separator", + "children-display": "submenu", + "submenu": [ + { + "id": 288, + "enabled": false, + "label": "Empty", + "visible": true + } + ] + }, + { + "id": 289, + "enabled": true, + "label": "Delete Layer", + "visible": true + }, + { + "id": 290, + "enabled": false, + "label": "Merge Down", + "visible": true + }, + { + "id": 291, + "shortcut": [["Control", "h"]], + "enabled": false, + "label": "Anchor Layer", + "visible": true + }, + { + "id": 292, + "shortcut": [["Control", "Shift", "d"]], + "enabled": true, + "label": "Duplicate Layer", + "visible": true + }, + { + "id": 293, + "enabled": true, + "label": "New from Visible", + "visible": true + }, + { + "id": 294, + "shortcut": [["Control", "Shift", "n"]], + "enabled": true, + "label": "New Layer...", + "visible": true + } + ] + }, + { + "id": 295, + "enabled": true, + "label": "Colors", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 296, + "enabled": true, + "label": "Retinex...", + "visible": true + }, + { + "id": 297, + "enabled": true, + "label": "Maximum RGB...", + "visible": true + }, + { + "id": 298, + "enabled": false, + "label": "Hot...", + "visible": true + }, + { + "id": 299, + "enabled": true, + "label": "Filter Pack...", + "visible": true + }, + { + "id": 300, + "enabled": true, + "label": "Color to Alpha...", + "visible": true + }, + { + "id": 301, + "enabled": true, + "label": "Colorify...", + "visible": true + }, + { + "id": 302, + "type": "separator" + }, + { + "id": 303, + "enabled": true, + "label": "Info", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 304, + "enabled": true, + "label": "Smooth Palette...", + "visible": true + }, + { + "id": 305, + "enabled": true, + "label": "Colorcube Analysis...", + "visible": true + }, + { + "id": 306, + "enabled": true, + "label": "Border Average...", + "visible": true + }, + { + "id": 307, + "enabled": true, + "label": "Histogram", + "visible": true + } + ] + }, + { + "id": 308, + "enabled": true, + "label": "Map", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 309, + "enabled": true, + "label": "Sample Colorize...", + "visible": true + }, + { + "id": 310, + "enabled": true, + "label": "Rotate Colors...", + "visible": true + }, + { + "id": 311, + "enabled": true, + "label": "Palette Map", + "visible": true + }, + { + "id": 312, + "enabled": true, + "label": "Gradient Map", + "visible": true + }, + { + "id": 313, + "enabled": true, + "label": "Color Exchange...", + "visible": true + }, + { + "id": 314, + "enabled": true, + "label": "Alien Map...", + "visible": true + }, + { + "id": 315, + "type": "separator" + }, + { + "id": 316, + "enabled": false, + "label": "Set Colormap...", + "visible": true + }, + { + "id": 317, + "enabled": false, + "label": "Rearrange Colormap...", + "visible": true + } + ] + }, + { + "id": 318, + "enabled": true, + "label": "Components", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 319, + "enabled": false, + "label": "Recompose", + "visible": true + }, + { + "id": 320, + "enabled": true, + "label": "Decompose...", + "visible": true + }, + { + "id": 321, + "enabled": false, + "label": "Compose...", + "visible": true + }, + { + "id": 322, + "enabled": true, + "label": "Channel Mixer...", + "visible": true + } + ] + }, + { + "id": 323, + "enabled": true, + "label": "Auto", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 324, + "enabled": true, + "label": "Stretch HSV", + "visible": true + }, + { + "id": 325, + "enabled": true, + "label": "Stretch Contrast", + "visible": true + }, + { + "id": 326, + "enabled": true, + "label": "Normalize", + "visible": true + }, + { + "id": 327, + "enabled": true, + "label": "Color Enhance", + "visible": true + }, + { + "id": 328, + "enabled": true, + "label": "White Balance", + "visible": true + }, + { + "id": 329, + "enabled": true, + "label": "Equalize", + "visible": true + } + ] + }, + { + "id": 330, + "type": "separator" + }, + { + "id": 331, + "enabled": true, + "toggle-state": 0, + "label": "Use GEGL", + "toggle-type": "checkmark", + "visible": true + }, + { + "id": 332, + "type": "separator" + }, + { + "id": 333, + "enabled": true, + "label": "Value Invert", + "visible": true + }, + { + "id": 334, + "enabled": true, + "label": "Invert", + "visible": true + }, + { + "id": 335, + "type": "separator" + }, + { + "id": 336, + "enabled": true, + "label": "Desaturate...", + "visible": true + }, + { + "id": 337, + "enabled": true, + "label": "Posterize...", + "visible": true + }, + { + "id": 338, + "enabled": true, + "label": "Curves...", + "visible": true + }, + { + "id": 339, + "enabled": true, + "label": "Levels...", + "visible": true + }, + { + "id": 340, + "enabled": true, + "label": "Threshold...", + "visible": true + }, + { + "id": 341, + "enabled": true, + "label": "Brightness-Contrast...", + "visible": true + }, + { + "id": 342, + "enabled": true, + "label": "Colorize...", + "visible": true + }, + { + "id": 343, + "enabled": true, + "label": "Hue-Saturation...", + "visible": true + }, + { + "id": 344, + "enabled": true, + "label": "Color Balance...", + "visible": true + } + ] + }, + { + "id": 345, + "enabled": true, + "label": "Tools", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 346, + "shortcut": [["x"]], + "enabled": true, + "label": "Swap Colors", + "visible": true + }, + { + "id": 347, + "shortcut": [["d"]], + "enabled": true, + "label": "Default Colors", + "visible": true + }, + { + "id": 348, + "shortcut": [["Control", "b"]], + "enabled": true, + "label": "Toolbox", + "visible": true + }, + { + "id": 349, + "type": "separator" + }, + { + "id": 350, + "enabled": true, + "label": "GEGL Operation...", + "visible": true + }, + { + "id": 351, + "shortcut": [["t"]], + "enabled": true, + "label": "Text", + "visible": true + }, + { + "id": 352, + "shortcut": [["Shift", "m"]], + "enabled": true, + "label": "Measure", + "visible": true + }, + { + "id": 353, + "shortcut": [["z"]], + "enabled": true, + "label": "Zoom", + "visible": true + }, + { + "id": 354, + "shortcut": [["o"]], + "enabled": true, + "label": "Color Picker", + "visible": true + }, + { + "id": 355, + "shortcut": [["b"]], + "enabled": true, + "label": "Paths", + "visible": true + }, + { + "id": 356, + "enabled": true, + "label": "Color Tools", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 357, + "enabled": true, + "label": "Desaturate...", + "visible": true + }, + { + "id": 358, + "enabled": true, + "label": "Posterize...", + "visible": true + }, + { + "id": 359, + "enabled": true, + "label": "Curves...", + "visible": true + }, + { + "id": 360, + "enabled": true, + "label": "Levels...", + "visible": true + }, + { + "id": 361, + "enabled": true, + "label": "Threshold...", + "visible": true + }, + { + "id": 362, + "enabled": true, + "label": "Brightness-Contrast...", + "visible": true + }, + { + "id": 363, + "enabled": true, + "label": "Colorize...", + "visible": true + }, + { + "id": 364, + "enabled": true, + "label": "Hue-Saturation...", + "visible": true + }, + { + "id": 365, + "enabled": true, + "label": "Color Balance...", + "visible": true + } + ] + }, + { + "id": 366, + "enabled": true, + "label": "Transform Tools", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 367, + "shortcut": [["Shift", "f"]], + "enabled": true, + "label": "Flip", + "visible": true + }, + { + "id": 368, + "shortcut": [["Shift", "p"]], + "enabled": true, + "label": "Perspective", + "visible": true + }, + { + "id": 369, + "shortcut": [["Shift", "s"]], + "enabled": true, + "label": "Shear", + "visible": true + }, + { + "id": 370, + "shortcut": [["Shift", "t"]], + "enabled": true, + "label": "Scale", + "visible": true + }, + { + "id": 371, + "shortcut": [["Shift", "r"]], + "enabled": true, + "label": "Rotate", + "visible": true + }, + { + "id": 372, + "shortcut": [["Shift", "c"]], + "enabled": true, + "label": "Crop", + "visible": true + }, + { + "id": 373, + "shortcut": [["m"]], + "enabled": true, + "label": "Move", + "visible": true + }, + { + "id": 374, + "shortcut": [["q"]], + "enabled": true, + "label": "Align", + "visible": true + } + ] + }, + { + "id": 375, + "enabled": true, + "label": "Paint Tools", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 376, + "shortcut": [["Shift", "d"]], + "enabled": true, + "label": "Dodge / Burn", + "visible": true + }, + { + "id": 377, + "shortcut": [["s"]], + "enabled": true, + "label": "Smudge", + "visible": true + }, + { + "id": 378, + "shortcut": [["Shift", "u"]], + "enabled": true, + "label": "Blur / Sharpen", + "visible": true + }, + { + "id": 379, + "enabled": true, + "label": "Perspective Clone", + "visible": true + }, + { + "id": 380, + "shortcut": [["h"]], + "enabled": true, + "label": "Heal", + "visible": true + }, + { + "id": 381, + "shortcut": [["c"]], + "enabled": true, + "label": "Clone", + "visible": true + }, + { + "id": 382, + "shortcut": [["k"]], + "enabled": true, + "label": "Ink", + "visible": true + }, + { + "id": 383, + "shortcut": [["a"]], + "enabled": true, + "label": "Airbrush", + "visible": true + }, + { + "id": 384, + "shortcut": [["Shift", "e"]], + "enabled": true, + "label": "Eraser", + "visible": true + }, + { + "id": 385, + "shortcut": [["p"]], + "enabled": true, + "label": "Paintbrush", + "visible": true + }, + { + "id": 386, + "shortcut": [["n"]], + "enabled": true, + "label": "Pencil", + "visible": true + }, + { + "id": 387, + "shortcut": [["l"]], + "enabled": true, + "label": "Blend", + "visible": true + }, + { + "id": 388, + "shortcut": [["Shift", "b"]], + "enabled": true, + "label": "Bucket Fill", + "visible": true + } + ] + }, + { + "id": 389, + "enabled": true, + "label": "Selection Tools", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 390, + "shortcut": [["i"]], + "enabled": true, + "label": "Intelligent Scissors", + "visible": true + }, + { + "id": 391, + "shortcut": [["Shift", "o"]], + "enabled": true, + "label": "By Color Select", + "visible": true + }, + { + "id": 392, + "shortcut": [["u"]], + "enabled": true, + "label": "Fuzzy Select", + "visible": true + }, + { + "id": 393, + "enabled": true, + "label": "Foreground Select", + "visible": true + }, + { + "id": 394, + "shortcut": [["f"]], + "enabled": true, + "label": "Free Select", + "visible": true + }, + { + "id": 395, + "shortcut": [["e"]], + "enabled": true, + "label": "Ellipse Select", + "visible": true + }, + { + "id": 396, + "shortcut": [["r"]], + "enabled": true, + "label": "Rectangle Select", + "visible": true + } + ] + } + ] + }, + { + "id": 397, + "enabled": true, + "label": "Filters", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 398, + "enabled": true, + "label": "Script-Fu", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 399, + "enabled": true, + "label": "Start Server...", + "visible": true + }, + { + "id": 400, + "enabled": true, + "label": "Refresh Scripts", + "visible": true + }, + { + "id": 401, + "enabled": true, + "label": "Console", + "visible": true + } + ] + }, + { + "id": 402, + "enabled": true, + "label": "Python-Fu", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 403, + "enabled": true, + "label": "Console", + "visible": true + } + ] + }, + { + "id": 404, + "type": "separator" + }, + { + "id": 405, + "enabled": true, + "label": "Alpha to Logo", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 406, + "enabled": true, + "label": "Textured...", + "visible": true + }, + { + "id": 407, + "enabled": true, + "label": "Particle Trace...", + "visible": true + }, + { + "id": 408, + "enabled": true, + "label": "Neon...", + "visible": true + }, + { + "id": 409, + "enabled": true, + "label": "Gradient Bevel...", + "visible": true + }, + { + "id": 410, + "enabled": true, + "label": "Glowing Hot...", + "visible": true + }, + { + "id": 411, + "enabled": true, + "label": "Glossy...", + "visible": true + }, + { + "id": 412, + "enabled": true, + "label": "Frosty...", + "visible": true + }, + { + "id": 413, + "enabled": true, + "label": "Cool Metal...", + "visible": true + }, + { + "id": 414, + "enabled": true, + "label": "Comic Book...", + "visible": true + }, + { + "id": 415, + "enabled": true, + "label": "Chrome...", + "visible": true + }, + { + "id": 416, + "enabled": true, + "label": "Chip Away...", + "visible": true + }, + { + "id": 417, + "enabled": true, + "label": "Chalk...", + "visible": true + }, + { + "id": 418, + "enabled": true, + "label": "Bovination...", + "visible": true + }, + { + "id": 419, + "enabled": true, + "label": "Blended...", + "visible": true + }, + { + "id": 420, + "enabled": true, + "label": "Basic I...", + "visible": true + }, + { + "id": 421, + "enabled": true, + "label": "Basic II...", + "visible": true + }, + { + "id": 422, + "enabled": true, + "label": "Alien Neon...", + "visible": true + }, + { + "id": 423, + "enabled": true, + "label": "Alien Glow...", + "visible": true + }, + { + "id": 424, + "enabled": true, + "label": "3D Outline...", + "visible": true + } + ] + }, + { + "id": 425, + "type": "separator" + }, + { + "id": 426, + "enabled": true, + "label": "Animation", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 427, + "enabled": true, + "label": "Unoptimize", + "visible": true + }, + { + "id": 428, + "enabled": true, + "label": "Playback...", + "visible": true + }, + { + "id": 429, + "enabled": true, + "label": "Optimize (for GIF)", + "visible": true + }, + { + "id": 430, + "enabled": true, + "label": "Optimize (Difference)", + "visible": true + }, + { + "id": 431, + "type": "separator" + }, + { + "id": 432, + "enabled": true, + "label": "Waves...", + "visible": true + }, + { + "id": 433, + "enabled": true, + "label": "Spinning Globe...", + "visible": true + }, + { + "id": 434, + "enabled": true, + "label": "Rippling...", + "visible": true + }, + { + "id": 435, + "enabled": true, + "label": "Burn-In...", + "visible": true + }, + { + "id": 436, + "enabled": true, + "label": "Blend...", + "visible": true + } + ] + }, + { + "id": 437, + "enabled": true, + "label": "Web", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 438, + "enabled": true, + "label": "Slice...", + "visible": true + }, + { + "id": 439, + "enabled": true, + "label": "Semi-Flatten", + "visible": true + }, + { + "id": 440, + "enabled": true, + "label": "Image Map...", + "visible": true + } + ] + }, + { + "id": 441, + "enabled": true, + "label": "Render", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 442, + "enabled": true, + "label": "Spyrogimp...", + "visible": true + }, + { + "id": 443, + "enabled": true, + "label": "Sphere Designer...", + "visible": true + }, + { + "id": 444, + "enabled": true, + "label": "Line Nova...", + "visible": true + }, + { + "id": 445, + "enabled": true, + "label": "Lava...", + "visible": true + }, + { + "id": 446, + "enabled": true, + "label": "Gfig...", + "visible": true + }, + { + "id": 447, + "enabled": true, + "label": "Fractal Explorer...", + "visible": true + }, + { + "id": 448, + "enabled": true, + "label": "Circuit...", + "visible": true + }, + { + "id": 449, + "type": "separator" + }, + { + "id": 450, + "enabled": true, + "label": "Pattern", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 451, + "enabled": true, + "label": "Sinus...", + "visible": true + }, + { + "id": 452, + "enabled": true, + "label": "Qbist...", + "visible": true + }, + { + "id": 453, + "enabled": true, + "label": "Maze...", + "visible": true + }, + { + "id": 454, + "enabled": true, + "label": "Jigsaw...", + "visible": true + }, + { + "id": 455, + "enabled": true, + "label": "Grid...", + "visible": true + }, + { + "id": 456, + "enabled": true, + "label": "Diffraction Patterns...", + "visible": true + }, + { + "id": 457, + "enabled": true, + "label": "CML Explorer...", + "visible": true + }, + { + "id": 458, + "enabled": true, + "label": "Checkerboard...", + "visible": true + } + ] + }, + { + "id": 459, + "enabled": true, + "label": "Nature", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 460, + "enabled": true, + "label": "IFS Fractal...", + "visible": true + }, + { + "id": 461, + "enabled": true, + "label": "Flame...", + "visible": true + } + ] + }, + { + "id": 462, + "enabled": true, + "label": "Clouds", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 463, + "enabled": true, + "label": "Solid Noise...", + "visible": true + }, + { + "id": 464, + "enabled": true, + "label": "Plasma...", + "visible": true + }, + { + "id": 465, + "enabled": true, + "label": "Fog...", + "visible": true + }, + { + "id": 466, + "enabled": true, + "label": "Difference Clouds...", + "visible": true + } + ] + } + ] + }, + { + "id": 467, + "enabled": true, + "label": "Map", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 468, + "enabled": true, + "label": "Warp...", + "visible": true + }, + { + "id": 469, + "enabled": true, + "label": "Tile...", + "visible": true + }, + { + "id": 470, + "enabled": true, + "label": "Small Tiles...", + "visible": true + }, + { + "id": 471, + "enabled": true, + "label": "Paper Tile...", + "visible": true + }, + { + "id": 472, + "enabled": true, + "label": "Map Object...", + "visible": true + }, + { + "id": 473, + "enabled": true, + "label": "Make Seamless", + "visible": true + }, + { + "id": 474, + "enabled": true, + "label": "Illusion...", + "visible": true + }, + { + "id": 475, + "enabled": true, + "label": "Fractal Trace...", + "visible": true + }, + { + "id": 476, + "enabled": true, + "label": "Displace...", + "visible": true + }, + { + "id": 477, + "enabled": true, + "label": "Bump Map...", + "visible": true + } + ] + }, + { + "id": 478, + "enabled": true, + "label": "Decor", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 479, + "enabled": false, + "label": "Stencil Chrome...", + "visible": true + }, + { + "id": 480, + "enabled": false, + "label": "Stencil Carve...", + "visible": true + }, + { + "id": 481, + "enabled": false, + "label": "Slide...", + "visible": true + }, + { + "id": 482, + "enabled": false, + "label": "Round Corners...", + "visible": true + }, + { + "id": 483, + "enabled": true, + "label": "Old Photo...", + "visible": true + }, + { + "id": 484, + "enabled": true, + "label": "Fuzzy Border...", + "visible": true + }, + { + "id": 485, + "enabled": true, + "label": "Coffee Stain...", + "visible": true + }, + { + "id": 486, + "enabled": true, + "label": "Add Border...", + "visible": true + }, + { + "id": 487, + "enabled": true, + "label": "Add Bevel...", + "visible": true + } + ] + }, + { + "id": 488, + "enabled": true, + "label": "Artistic", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 489, + "enabled": true, + "label": "Weave...", + "visible": true + }, + { + "id": 490, + "enabled": true, + "label": "Van Gogh (LIC)...", + "visible": true + }, + { + "id": 491, + "enabled": true, + "label": "Softglow...", + "visible": true + }, + { + "id": 492, + "enabled": true, + "label": "Predator...", + "visible": true + }, + { + "id": 493, + "enabled": true, + "label": "Photocopy...", + "visible": true + }, + { + "id": 494, + "enabled": true, + "label": "Oilify...", + "visible": true + }, + { + "id": 495, + "enabled": true, + "label": "GIMPressionist...", + "visible": true + }, + { + "id": 496, + "enabled": true, + "label": "Cubism...", + "visible": true + }, + { + "id": 497, + "enabled": true, + "label": "Clothify...", + "visible": true + }, + { + "id": 498, + "enabled": true, + "label": "Cartoon...", + "visible": true + }, + { + "id": 499, + "enabled": true, + "label": "Apply Canvas...", + "visible": true + } + ] + }, + { + "id": 500, + "enabled": true, + "label": "Combine", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 501, + "enabled": true, + "label": "Filmstrip...", + "visible": true + }, + { + "id": 502, + "enabled": true, + "label": "Depth Merge...", + "visible": true + } + ] + }, + { + "id": 503, + "enabled": true, + "label": "Generic", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 504, + "enabled": true, + "label": "Erode", + "visible": true + }, + { + "id": 505, + "enabled": true, + "label": "Dilate", + "visible": true + }, + { + "id": 506, + "enabled": true, + "label": "Convolution Matrix...", + "visible": true + } + ] + }, + { + "id": 507, + "enabled": true, + "label": "Edge-Detect", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 508, + "enabled": true, + "label": "Sobel...", + "visible": true + }, + { + "id": 509, + "enabled": true, + "label": "Neon...", + "visible": true + }, + { + "id": 510, + "enabled": true, + "label": "Laplace", + "visible": true + }, + { + "id": 511, + "enabled": true, + "label": "Edge...", + "visible": true + }, + { + "id": 512, + "enabled": true, + "label": "Difference of Gaussians...", + "visible": true + } + ] + }, + { + "id": 513, + "enabled": true, + "label": "Noise", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 514, + "enabled": true, + "label": "Spread...", + "visible": true + }, + { + "id": 515, + "enabled": true, + "label": "Slur...", + "visible": true + }, + { + "id": 516, + "enabled": true, + "label": "RGB Noise...", + "visible": true + }, + { + "id": 517, + "enabled": true, + "label": "Pick...", + "visible": true + }, + { + "id": 518, + "enabled": true, + "label": "Hurl...", + "visible": true + }, + { + "id": 519, + "enabled": true, + "label": "HSV Noise...", + "visible": true + } + ] + }, + { + "id": 520, + "enabled": true, + "label": "Light and Shadow", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 521, + "enabled": true, + "label": "Glass Tile...", + "visible": true + }, + { + "id": 522, + "enabled": true, + "label": "Apply Lens...", + "visible": true + }, + { + "id": 523, + "type": "separator" + }, + { + "id": 524, + "enabled": true, + "label": "Xach-Effect...", + "visible": true + }, + { + "id": 525, + "enabled": true, + "label": "Perspective...", + "visible": true + }, + { + "id": 526, + "enabled": true, + "label": "Drop Shadow...", + "visible": true + }, + { + "id": 527, + "type": "separator" + }, + { + "id": 528, + "enabled": true, + "label": "Supernova...", + "visible": true + }, + { + "id": 529, + "enabled": true, + "label": "Sparkle...", + "visible": true + }, + { + "id": 530, + "enabled": true, + "label": "Lighting Effects...", + "visible": true + }, + { + "id": 531, + "enabled": true, + "label": "Lens Flare...", + "visible": true + }, + { + "id": 532, + "enabled": true, + "label": "Gradient Flare...", + "visible": true + } + ] + }, + { + "id": 533, + "enabled": true, + "label": "Distorts", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 534, + "enabled": true, + "label": "Wind...", + "visible": true + }, + { + "id": 535, + "enabled": true, + "label": "Whirl and Pinch...", + "visible": true + }, + { + "id": 536, + "enabled": true, + "label": "Waves...", + "visible": true + }, + { + "id": 537, + "enabled": true, + "label": "Video...", + "visible": true + }, + { + "id": 538, + "enabled": true, + "label": "Value Propagate...", + "visible": true + }, + { + "id": 539, + "enabled": true, + "label": "Shift...", + "visible": true + }, + { + "id": 540, + "enabled": true, + "label": "Ripple...", + "visible": true + }, + { + "id": 541, + "enabled": true, + "label": "Polar Coordinates...", + "visible": true + }, + { + "id": 542, + "enabled": true, + "label": "Pagecurl...", + "visible": true + }, + { + "id": 543, + "enabled": true, + "label": "Newsprint...", + "visible": true + }, + { + "id": 544, + "enabled": true, + "label": "Mosaic...", + "visible": true + }, + { + "id": 545, + "enabled": true, + "label": "Lens Distortion...", + "visible": true + }, + { + "id": 546, + "enabled": true, + "label": "IWarp...", + "visible": true + }, + { + "id": 547, + "enabled": true, + "label": "Erase Every Other Row...", + "visible": true + }, + { + "id": 548, + "enabled": true, + "label": "Engrave...", + "visible": true + }, + { + "id": 549, + "enabled": true, + "label": "Emboss...", + "visible": true + }, + { + "id": 550, + "enabled": true, + "label": "Curve Bend...", + "visible": true + }, + { + "id": 551, + "enabled": true, + "label": "Blinds...", + "visible": true + } + ] + }, + { + "id": 552, + "enabled": true, + "label": "Enhance", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 553, + "enabled": true, + "label": "Unsharp Mask...", + "visible": true + }, + { + "id": 554, + "enabled": true, + "label": "Sharpen...", + "visible": true + }, + { + "id": 555, + "enabled": true, + "label": "Red Eye Removal...", + "visible": true + }, + { + "id": 556, + "enabled": false, + "label": "NL Filter...", + "visible": true + }, + { + "id": 557, + "enabled": true, + "label": "Destripe...", + "visible": true + }, + { + "id": 558, + "enabled": true, + "label": "Despeckle...", + "visible": true + }, + { + "id": 559, + "enabled": true, + "label": "Deinterlace...", + "visible": true + }, + { + "id": 560, + "enabled": true, + "label": "Antialias", + "visible": true + } + ] + }, + { + "id": 561, + "enabled": true, + "label": "Blur", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 562, + "enabled": true, + "label": "Tileable Blur...", + "visible": true + }, + { + "id": 563, + "enabled": true, + "label": "Selective Gaussian Blur...", + "visible": true + }, + { + "id": 564, + "enabled": true, + "label": "Pixelize...", + "visible": true + }, + { + "id": 565, + "enabled": true, + "label": "Motion Blur...", + "visible": true + }, + { + "id": 566, + "enabled": true, + "label": "Gaussian Blur...", + "visible": true + }, + { + "id": 567, + "enabled": true, + "label": "Blur", + "visible": true + } + ] + }, + { + "id": 568, + "type": "separator" + }, + { + "id": 569, + "enabled": true, + "label": "Reset all Filters", + "visible": true + }, + { + "id": 570, + "shortcut": [["Control", "Shift", "f"]], + "enabled": false, + "label": "Re-Show Last", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 571, + "enabled": false, + "label": "Empty", + "visible": true + } + ] + }, + { + "id": 572, + "shortcut": [["Control", "f"]], + "enabled": false, + "label": "Repeat Last", + "visible": true + } + ] + }, + { + "id": 573, + "enabled": true, + "label": "Windows", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 574, + "shortcut": [["Control", "b"]], + "enabled": true, + "label": "Toolbox", + "visible": true + }, + { + "id": 575, + "type": "separator" + }, + { + "id": 576, + "enabled": true, + "label": "Dockable Dialogs", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 577, + "enabled": true, + "label": "Error Console", + "visible": true + }, + { + "id": 578, + "enabled": true, + "label": "Tools", + "visible": true + }, + { + "id": 579, + "enabled": true, + "label": "Templates", + "visible": true + }, + { + "id": 580, + "enabled": true, + "label": "Document History", + "visible": true + }, + { + "id": 581, + "enabled": true, + "label": "Images", + "visible": true + }, + { + "id": 582, + "type": "separator" + }, + { + "id": 583, + "enabled": true, + "label": "Buffers", + "visible": true + }, + { + "id": 584, + "enabled": true, + "label": "Fonts", + "visible": true + }, + { + "id": 585, + "enabled": true, + "label": "Palettes", + "visible": true + }, + { + "id": 586, + "shortcut": [["Control", "g"]], + "enabled": true, + "label": "Gradients", + "visible": true + }, + { + "id": 587, + "shortcut": [["Control", "Shift", "p"]], + "enabled": true, + "label": "Patterns", + "visible": true + }, + { + "id": 588, + "shortcut": [["Control", "Shift", "b"]], + "enabled": true, + "label": "Brushes", + "visible": true + }, + { + "id": 589, + "enabled": true, + "label": "Colors", + "visible": true + }, + { + "id": 590, + "type": "separator" + }, + { + "id": 591, + "enabled": true, + "label": "Sample Points", + "visible": true + }, + { + "id": 592, + "enabled": true, + "label": "Pointer", + "visible": true + }, + { + "id": 593, + "enabled": true, + "label": "Undo History", + "visible": true + }, + { + "id": 594, + "enabled": true, + "label": "Navigation", + "visible": true + }, + { + "id": 595, + "enabled": true, + "label": "Selection Editor", + "visible": true + }, + { + "id": 596, + "enabled": true, + "label": "Histogram", + "visible": true + }, + { + "id": 597, + "enabled": true, + "label": "Colormap", + "visible": true + }, + { + "id": 598, + "enabled": true, + "label": "Paths", + "visible": true + }, + { + "id": 599, + "enabled": true, + "label": "Channels", + "visible": true + }, + { + "id": 600, + "shortcut": [["Control", "l"]], + "enabled": true, + "label": "Layers", + "visible": true + }, + { + "id": 601, + "type": "separator" + }, + { + "id": 602, + "enabled": true, + "label": "Device Status", + "visible": true + }, + { + "id": 603, + "enabled": true, + "label": "Tool Options", + "visible": true + } + ] + }, + { + "id": 604, + "enabled": true, + "label": "Recently Closed Docks", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 605, + "enabled": false, + "label": "Empty", + "visible": true + } + ] + } + ] + }, + { + "id": 606, + "enabled": true, + "label": "Help", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 607, + "enabled": true, + "label": "User Manual", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 608, + "enabled": true, + "label": "Working with Digital Camera Photos", + "visible": true + }, + { + "id": 609, + "enabled": true, + "label": "Using Paths", + "visible": true + }, + { + "id": 610, + "enabled": true, + "label": "Preparing your Images for the Web", + "visible": true + }, + { + "id": 611, + "enabled": true, + "label": "How to Use Dialogs", + "visible": true + }, + { + "id": 612, + "enabled": true, + "label": "Drawing Simple Objects", + "visible": true + }, + { + "id": 613, + "enabled": true, + "label": "Create, Open and Save Files", + "visible": true + }, + { + "id": 614, + "enabled": true, + "label": "Basic Concepts", + "visible": true + } + ] + }, + { + "id": 615, + "enabled": true, + "label": "GIMP Online", + "children-display": "submenu", + "visible": true, + "submenu": [ + { + "id": 616, + "enabled": true, + "label": "User Manual Web Site", + "visible": true + }, + { + "id": 617, + "enabled": true, + "label": "Plug-in Registry", + "visible": true + }, + { + "id": 618, + "enabled": true, + "label": "Main Web Site", + "visible": true + }, + { + "id": 619, + "enabled": true, + "label": "Developer Web Site", + "visible": true + } + ] + }, + { + "id": 620, + "type": "separator" + }, + { + "id": 621, + "enabled": true, + "label": "Procedure Browser", + "visible": true + }, + { + "id": 622, + "enabled": true, + "label": "Plug-In Browser", + "visible": true + }, + { + "id": 623, + "type": "separator" + }, + { + "id": 624, + "enabled": true, + "label": "About", + "visible": true + }, + { + "id": 625, + "enabled": true, + "label": "Tip of the Day", + "visible": true + }, + { + "id": 626, + "shortcut": [["Shift", "F1"]], + "enabled": true, + "label": "Context Help", + "visible": true + }, + { + "id": 627, + "shortcut": [["F1"]], + "enabled": true, + "label": "Help", + "visible": true + } + ] + } + ] +} diff --git a/tests/test-json-client.c b/tests/test-json-client.c new file mode 100644 index 0000000..f9da55e --- /dev/null +++ b/tests/test-json-client.c @@ -0,0 +1,75 @@ +/* +Test to check the json-loader and dbusmenu-dumper + +Copyright 2010 Canonical Ltd. + +Authors: + Ted Gould <ted@canonical.com> + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <glib.h> +#include <gio/gio.h> +#include <dbus/dbus-glib.h> +#include <dbus/dbus-glib-bindings.h> +#include <dbus/dbus-glib-lowlevel.h> + +GMainLoop * mainloop = NULL; + +int +main (int argc, char ** argv) +{ + g_type_init(); + g_debug("Wait for friends"); + + GError * error = NULL; + DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + if (error != NULL) { + g_error("Unable to get session bus: %s", error->message); + return 1; + } + + DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(session_bus, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + + gboolean has_owner = FALSE; + gint owner_count = 0; + while (!has_owner && owner_count < 10000) { + org_freedesktop_DBus_name_has_owner(bus_proxy, "org.dbusmenu.test", &has_owner, NULL); + owner_count++; + } + + if (owner_count == 10000) { + g_error("Unable to get name owner after 10000 tries"); + return 1; + } + + g_usleep(500000); + + g_debug("Initing"); + + gchar * command = g_strdup_printf("%s --dbus-name=org.dbusmenu.test --dbus-object=/org/test", argv[1]); + g_debug("Executing: %s", command); + + gchar * output; + g_spawn_command_line_sync(command, &output, NULL, NULL, NULL); + + GFile * ofile = g_file_new_for_commandline_arg(argv[2]); + if (ofile != NULL) { + g_file_replace_contents(ofile, output, g_utf8_strlen(output, -1), NULL, FALSE, 0, NULL, NULL, NULL); + } + + g_debug("Exiting"); + + return 0; +} diff --git a/tests/test-json-server.c b/tests/test-json-server.c new file mode 100644 index 0000000..fe9507a --- /dev/null +++ b/tests/test-json-server.c @@ -0,0 +1,81 @@ +/* +Test to check the json-loader and dbusmenu-dumper + +Copyright 2010 Canonical Ltd. + +Authors: + Ted Gould <ted@canonical.com> + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <glib.h> + +#include <dbus/dbus.h> +#include <dbus/dbus-glib.h> +#include <dbus/dbus-glib-lowlevel.h> +#include <dbus/dbus-glib-bindings.h> + +#include <libdbusmenu-glib/server.h> +#include <libdbusmenu-glib/menuitem.h> + +#include "json-loader.h" + +static GMainLoop * mainloop = NULL; + +static gboolean +timer_func (gpointer data) +{ + g_main_loop_quit(mainloop); + return FALSE; +} + +int +main (int argc, char ** argv) +{ + GError * error = NULL; + + g_type_init(); + + DBusGConnection * connection = dbus_g_bus_get(DBUS_BUS_SESSION, NULL); + g_debug("DBus ID: %s", dbus_connection_get_server_id(dbus_g_connection_get_connection(dbus_g_bus_get(DBUS_BUS_SESSION, NULL)))); + + DBusGProxy * bus_proxy = dbus_g_proxy_new_for_name(connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + guint nameret = 0; + + if (!org_freedesktop_DBus_request_name(bus_proxy, "org.dbusmenu.test", 0, &nameret, &error)) { + g_error("Unable to call to request name"); + return 1; + } + + if (nameret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + g_error("Unable to get name"); + return 1; + } + + DbusmenuServer * server = dbusmenu_server_new("/org/test"); + + DbusmenuMenuitem * root = dbusmenu_json_build_from_file(argv[1]); + g_return_val_if_fail(root!=NULL, 1); + + dbusmenu_server_set_root(server, root); + + g_timeout_add(10000, timer_func, NULL); + + mainloop = g_main_loop_new(NULL, FALSE); + g_main_loop_run(mainloop); + + g_debug("Quiting"); + + return 0; +} diff --git a/tools/dbusmenu-dumper.c b/tools/dbusmenu-dumper.c index f2e2bec..6ce9655 100644 --- a/tools/dbusmenu-dumper.c +++ b/tools/dbusmenu-dumper.c @@ -116,6 +116,12 @@ value2string (const GValue * value, int depth) str = collection_dumper(value, depth); } else if (G_VALUE_TYPE(value) == G_TYPE_STRV) { str = strv_dumper(value); + } else if (G_VALUE_TYPE(value) == G_TYPE_BOOLEAN) { + if (g_value_get_boolean(value)) { + str = g_strdup("true"); + } else { + str = g_strdup("false"); + } } else { str = g_strdup_value_contents(value); } |