Merge lp:~dbusmenu-team/libdbusmenu/ubuntu into lp:~ubuntu-desktop/libdbusmenu/ubuntu

Proposed by Ted Gould
Status: Merged
Merged at revision: not available
Proposed branch: lp:~dbusmenu-team/libdbusmenu/ubuntu
Merge into: lp:~ubuntu-desktop/libdbusmenu/ubuntu
Diff against target: None lines
To merge this branch: bzr merge lp:~dbusmenu-team/libdbusmenu/ubuntu
Reviewer Review Type Date Requested Status
Ken VanDine Pending
Review via email: mp+11152@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Ted Gould (ted) wrote :

Update to upstream version 0.1.1.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file '.bzrignore'
--- .bzrignore 2009-07-18 02:43:25 +0000
+++ .bzrignore 2009-09-03 19:26:18 +0000
@@ -1,5 +1,6 @@
1compile1compile
2m42m4
3debian/compat
3libdbusmenu-glib/.deps4libdbusmenu-glib/.deps
4libdbusmenu-glib/.libs5libdbusmenu-glib/.libs
5libdbusmenu-glib/dbusmenu-glib.pc6libdbusmenu-glib/dbusmenu-glib.pc
@@ -41,4 +42,4 @@
41dbusmenu.py42dbusmenu.py
42mago.results43mago.results
43test-glib-simple-items44test-glib-simple-items
44debian/compat45libdbusmenu-gtk/libdbusmenu_gtk_la-menuitem.lo
4546
=== modified file 'configure.ac'
--- configure.ac 2009-08-27 18:25:07 +0000
+++ configure.ac 2009-09-03 19:16:48 +0000
@@ -1,11 +1,11 @@
11
2AC_INIT(libdbusmenu, 0.1.0, ted@canonical.com)2AC_INIT(libdbusmenu, 0.1.1, ted@canonical.com)
3AC_COPYRIGHT([Copyright 2009 Canonical])3AC_COPYRIGHT([Copyright 2009 Canonical])
44
5AC_PREREQ(2.53)5AC_PREREQ(2.53)
66
7AM_CONFIG_HEADER(config.h)7AM_CONFIG_HEADER(config.h)
8AM_INIT_AUTOMAKE(libdbusmenu, 0.1.0)8AM_INIT_AUTOMAKE(libdbusmenu, 0.1.1)
99
10AM_MAINTAINER_MODE10AM_MAINTAINER_MODE
1111
1212
=== modified file 'debian/changelog'
--- debian/changelog 2009-08-27 18:32:15 +0000
+++ debian/changelog 2009-09-03 19:29:59 +0000
@@ -1,3 +1,9 @@
1libdbusmenu (0.1.1-0ubuntu1~ppa1) karmic; urgency=low
2
3 * Upstream release 0.1.1
4
5 -- Ted Gould <ted@ubuntu.com> Thu, 03 Sep 2009 14:28:11 -0500
6
1libdbusmenu (0.1.0-0ubuntu1) UNRELEASED; urgency=low7libdbusmenu (0.1.0-0ubuntu1) UNRELEASED; urgency=low
28
3 * Upstream release 0.1.09 * Upstream release 0.1.0
410
=== modified file 'libdbusmenu-glib/menuitem.h'
--- libdbusmenu-glib/menuitem.h 2009-08-26 20:18:50 +0000
+++ libdbusmenu-glib/menuitem.h 2009-09-02 14:48:52 +0000
@@ -51,6 +51,7 @@
51#define DBUSMENU_MENUITEM_SIGNAL_REALIZED_ID (g_signal_lookup(DBUSMENU_MENUITEM_SIGNAL_REALIZED, DBUSMENU_TYPE_MENUITEM))51#define DBUSMENU_MENUITEM_SIGNAL_REALIZED_ID (g_signal_lookup(DBUSMENU_MENUITEM_SIGNAL_REALIZED, DBUSMENU_TYPE_MENUITEM))
5252
53#define DBUSMENU_MENUITEM_PROP_VISIBLE "visible"53#define DBUSMENU_MENUITEM_PROP_VISIBLE "visible"
54#define DBUSMENU_MENUITEM_PROP_SENSITIVE "sensitive"
54#define DBUSMENU_MENUITEM_PROP_LABEL "label"55#define DBUSMENU_MENUITEM_PROP_LABEL "label"
55#define DBUSMENU_MENUITEM_PROP_ICON "icon"56#define DBUSMENU_MENUITEM_PROP_ICON "icon"
56#define DBUSMENU_MENUITEM_PROP_ICON_DATA "icon-data"57#define DBUSMENU_MENUITEM_PROP_ICON_DATA "icon-data"
5758
=== modified file 'libdbusmenu-gtk/Makefile.am'
--- libdbusmenu-gtk/Makefile.am 2009-06-24 04:05:44 +0000
+++ libdbusmenu-gtk/Makefile.am 2009-09-02 18:29:01 +0000
@@ -9,13 +9,16 @@
99
10libdbusmenu_gtkinclude_HEADERS = \10libdbusmenu_gtkinclude_HEADERS = \
11 client.h \11 client.h \
12 menu.h12 menu.h \
13 menuitem.h
1314
14libdbusmenu_gtk_la_SOURCES = \15libdbusmenu_gtk_la_SOURCES = \
15 client.h \16 client.h \
16 client.c \17 client.c \
17 menu.h \18 menu.h \
18 menu.c19 menu.c \
20 menuitem.h \
21 menuitem.c
1922
20libdbusmenu_gtk_la_LDFLAGS = \23libdbusmenu_gtk_la_LDFLAGS = \
21 -version-info $(LIBDBUSMENU_CURRENT):$(LIBDBUSMENU_REVISION):$(LIBDBUSMENU_AGE) \24 -version-info $(LIBDBUSMENU_CURRENT):$(LIBDBUSMENU_REVISION):$(LIBDBUSMENU_AGE) \
2225
=== modified file 'libdbusmenu-gtk/client.c'
--- libdbusmenu-gtk/client.c 2009-08-27 13:45:49 +0000
+++ libdbusmenu-gtk/client.c 2009-09-03 19:16:01 +0000
@@ -33,6 +33,7 @@
33#include <gtk/gtk.h>33#include <gtk/gtk.h>
3434
35#include "client.h"35#include "client.h"
36#include "menuitem.h"
3637
37/* Prototypes */38/* Prototypes */
38static void dbusmenu_gtkclient_class_init (DbusmenuGtkClientClass *klass);39static void dbusmenu_gtkclient_class_init (DbusmenuGtkClientClass *klass);
@@ -48,6 +49,9 @@
48static gboolean new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client);49static gboolean new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client);
49static gboolean new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client);50static gboolean new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client);
5051
52static void process_visible (GtkMenuItem * gmi, const gchar * value);
53static void process_sensitive (GtkMenuItem * gmi, const gchar * value);
54
51/* GObject Stuff */55/* GObject Stuff */
52G_DEFINE_TYPE (DbusmenuGtkClient, dbusmenu_gtkclient, DBUSMENU_TYPE_CLIENT);56G_DEFINE_TYPE (DbusmenuGtkClient, dbusmenu_gtkclient, DBUSMENU_TYPE_CLIENT);
5357
@@ -116,6 +120,18 @@
116 return;120 return;
117}121}
118122
123/* Process the sensitive property */
124static void
125process_sensitive (GtkMenuItem * gmi, const gchar * value)
126{
127 if (value == NULL || !g_strcmp0(value, "true")) {
128 gtk_widget_set_sensitive(GTK_WIDGET(gmi), TRUE);
129 } else {
130 gtk_widget_set_sensitive(GTK_WIDGET(gmi), FALSE);
131 }
132 return;
133}
134
119/* Whenever we have a property change on a DbusmenuMenuitem135/* Whenever we have a property change on a DbusmenuMenuitem
120 we need to be responsive to that. */136 we need to be responsive to that. */
121static void137static void
@@ -125,6 +141,8 @@
125 gtk_menu_item_set_label(gmi, value);141 gtk_menu_item_set_label(gmi, value);
126 } else if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_VISIBLE)) {142 } else if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_VISIBLE)) {
127 process_visible(gmi, value);143 process_visible(gmi, value);
144 } else if (!g_strcmp0(prop, DBUSMENU_MENUITEM_PROP_SENSITIVE)) {
145 process_sensitive(gmi, value);
128 }146 }
129147
130 return;148 return;
@@ -171,6 +189,7 @@
171 g_object_weak_ref(G_OBJECT(item), destoryed_dbusmenuitem_cb, gmi);189 g_object_weak_ref(G_OBJECT(item), destoryed_dbusmenuitem_cb, gmi);
172190
173 process_visible(gmi, dbusmenu_menuitem_property_get(item, DBUSMENU_MENUITEM_PROP_VISIBLE));191 process_visible(gmi, dbusmenu_menuitem_property_get(item, DBUSMENU_MENUITEM_PROP_VISIBLE));
192 process_sensitive(gmi, dbusmenu_menuitem_property_get(item, DBUSMENU_MENUITEM_PROP_SENSITIVE));
174193
175 if (parent != NULL) {194 if (parent != NULL) {
176 new_child(parent, item, dbusmenu_menuitem_get_position(item, parent), DBUSMENU_GTKCLIENT(client));195 new_child(parent, item, dbusmenu_menuitem_get_position(item, parent), DBUSMENU_GTKCLIENT(client));
@@ -284,6 +303,8 @@
284 return mi;303 return mi;
285}304}
286305
306/* The base type handler that builds a plain ol'
307 GtkMenuItem to represent, well, the GtkMenuItem */
287static gboolean308static gboolean
288new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client)309new_item_normal (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client)
289{310{
@@ -303,6 +324,8 @@
303 return TRUE;324 return TRUE;
304}325}
305326
327/* Type handler for the seperators where it builds
328 a GtkSeparator to act as the GtkMenuItem */
306static gboolean329static gboolean
307new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client)330new_item_seperator (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client)
308{331{
@@ -322,9 +345,124 @@
322 return TRUE;345 return TRUE;
323}346}
324347
348/* This handler looks at property changes for items that are
349 image menu items. */
350static void
351image_property_handle (DbusmenuMenuitem * item, const gchar * property, const gchar * value, gpointer userdata)
352{
353 /* We're only looking at these two properties here */
354 g_return_if_fail(!g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON) || !g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON_DATA));
355
356 if (value == NULL || value[0] == '\0') {
357 /* This means that we're unsetting a value. */
358 /* Try to use the other one */
359 if (g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON)) {
360 property = DBUSMENU_MENUITEM_PROP_ICON_DATA;
361 } else {
362 property = DBUSMENU_MENUITEM_PROP_ICON;
363 }
364 }
365
366 /* Grab the data of the items that we've got, so that
367 we can know how things need to change. */
368 GtkMenuItem * gimi = dbusmenu_gtkclient_menuitem_get (DBUSMENU_GTKCLIENT(userdata), item);
369 if (gimi == NULL) {
370 g_warning("Oddly we're handling image properties on a menuitem that doesn't have any GTK structures associated with it.");
371 return;
372 }
373 GtkWidget * gtkimage = gtk_image_menu_item_get_image(GTK_IMAGE_MENU_ITEM(gimi));
374
375 if (!g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON_DATA)) {
376 /* If we have an image already built from a name that is
377 way better than a pixbuf. Keep it. */
378 if (gtk_image_get_storage_type(GTK_IMAGE(gtkimage)) == GTK_IMAGE_ICON_NAME) {
379 return;
380 }
381 }
382
383 /* Now figure out what to change */
384 if (!g_strcmp0(property, DBUSMENU_MENUITEM_PROP_ICON)) {
385 const gchar * iconname = dbusmenu_menuitem_property_get(item, property);
386 if (iconname == NULL) {
387 /* If there is no name, by golly we want no
388 icon either. */
389 gtkimage = NULL;
390 } else {
391 /* If we don't have an image, we need to build
392 one so that we can set the name. Otherwise we
393 can just convert it to this name. */
394 if (gtkimage == NULL) {
395 gtkimage = gtk_image_new_from_icon_name(iconname, GTK_ICON_SIZE_MENU);
396 } else {
397 gtk_image_set_from_icon_name(GTK_IMAGE(gtkimage), iconname, GTK_ICON_SIZE_MENU);
398 }
399 }
400 } else {
401 GdkPixbuf * image = dbusmenu_menuitem_property_get_image(item, property);
402 if (image == NULL) {
403 /* If there is no pixbuf, by golly we want no
404 icon either. */
405 gtkimage = NULL;
406 } else {
407 /* Resize the pixbuf */
408 gint width, height;
409 gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height);
410 if (gdk_pixbuf_get_width(image) > width ||
411 gdk_pixbuf_get_height(image) > height) {
412 GdkPixbuf * newimage = gdk_pixbuf_scale_simple(image,
413 width,
414 height,
415 GDK_INTERP_BILINEAR);
416 g_object_unref(image);
417 image = newimage;
418 }
419
420 /* If we don't have an image, we need to build
421 one so that we can set the pixbuf. */
422 if (gtkimage == NULL) {
423 gtkimage = gtk_image_new_from_pixbuf(image);
424 } else {
425 gtk_image_set_from_pixbuf(GTK_IMAGE(gtkimage), image);
426 }
427 }
428
429 }
430
431 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(gimi), gtkimage);
432
433 return;
434}
435
436/* This is a type call back for the image type where
437 it uses the GtkImageMenuitem to create the menu item. */
325static gboolean438static gboolean
326new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client)439new_item_image (DbusmenuMenuitem * newitem, DbusmenuMenuitem * parent, DbusmenuClient * client)
327{440{
441 g_return_val_if_fail(DBUSMENU_IS_MENUITEM(newitem), FALSE);
442 g_return_val_if_fail(DBUSMENU_IS_GTKCLIENT(client), FALSE);
443 /* Note: not checking parent, it's reasonable for it to be NULL */
444
445 GtkMenuItem * gmi;
446 gmi = GTK_MENU_ITEM(gtk_image_menu_item_new_with_label(dbusmenu_menuitem_property_get(newitem, DBUSMENU_MENUITEM_PROP_LABEL)));
447
448 if (gmi != NULL) {
449 dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, gmi, parent);
450 } else {
451 return FALSE;
452 }
453
454 image_property_handle(newitem,
455 DBUSMENU_MENUITEM_PROP_ICON,
456 dbusmenu_menuitem_property_get(newitem, DBUSMENU_MENUITEM_PROP_ICON),
457 client);
458 image_property_handle(newitem,
459 DBUSMENU_MENUITEM_PROP_ICON_DATA,
460 dbusmenu_menuitem_property_get(newitem, DBUSMENU_MENUITEM_PROP_ICON_DATA),
461 client);
462 g_signal_connect(G_OBJECT(newitem),
463 DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED,
464 G_CALLBACK(image_property_handle),
465 client);
328466
329 return TRUE;467 return TRUE;
330}468}
331469
=== added file 'libdbusmenu-gtk/menuitem.c'
--- libdbusmenu-gtk/menuitem.c 1970-01-01 00:00:00 +0000
+++ libdbusmenu-gtk/menuitem.c 2009-09-02 18:50:29 +0000
@@ -0,0 +1,130 @@
1/*
2A library to take the object model made consistent by libdbusmenu-glib
3and visualize it in GTK.
4
5Copyright 2009 Canonical Ltd.
6
7Authors:
8 Ted Gould <ted@canonical.com>
9
10This program is free software: you can redistribute it and/or modify it
11under the terms of either or both of the following licenses:
12
131) the GNU Lesser General Public License version 3, as published by the
14Free Software Foundation; and/or
152) the GNU Lesser General Public License version 2.1, as published by
16the Free Software Foundation.
17
18This program is distributed in the hope that it will be useful, but
19WITHOUT ANY WARRANTY; without even the implied warranties of
20MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
21PURPOSE. See the applicable version of the GNU Lesser General Public
22License for more details.
23
24You should have received a copy of both the GNU Lesser General Public
25License version 3 and version 2.1 along with this program. If not, see
26<http://www.gnu.org/licenses/>
27*/
28
29#include "menuitem.h"
30
31/**
32 dbusmenu_menuitem_property_set_image:
33 @menuitem: The #DbusmenuMenuitem to set the property on.
34 @property: Name of the property to set.
35 @data: The image to place on the property.
36
37 This function takes the pixbuf that is stored in @data and
38 turns it into a base64 encoded PNG so that it can be placed
39 onto a standard #DbusmenuMenuitem property.
40
41 Return value: Whether the function was able to set the property
42 or not.
43*/
44gboolean
45dbusmenu_menuitem_property_set_image (DbusmenuMenuitem * menuitem, const gchar * property, const GdkPixbuf * data)
46{
47 g_return_val_if_fail(GDK_IS_PIXBUF(data), FALSE);
48 g_return_val_if_fail(DBUSMENU_IS_MENUITEM(menuitem), FALSE);
49 g_return_val_if_fail(property != NULL && property[0] != '\0', FALSE);
50
51 GError * error = NULL;
52 gchar * png_data;
53 gsize png_data_len;
54
55 if (!gdk_pixbuf_save_to_buffer((GdkPixbuf *)data, &png_data, &png_data_len, "png", &error, NULL)) {
56 if (error == NULL) {
57 g_warning("Unable to create pixbuf data stream: %d", png_data_len);
58 } else {
59 g_warning("Unable to create pixbuf data stream: %s", error->message);
60 g_error_free(error);
61 error = NULL;
62 }
63
64 return FALSE;
65 }
66
67 gchar * prop_str = g_base64_encode((guchar *)png_data, png_data_len);
68 gboolean propreturn = FALSE;
69 propreturn = dbusmenu_menuitem_property_set(menuitem, property, prop_str);
70
71 g_free(prop_str);
72 g_free(png_data);
73
74 return propreturn;
75}
76
77/**
78 dbusmenu_menuitem_property_get_image:
79 @menuitem: The #DbusmenuMenuite to look for the property on
80 @property: The name of the property to look for.
81
82 This function looks on the menu item for a property by the
83 name of @property. If one exists it tries to turn it into
84 a #GdkPixbuf. It assumes that the property is a base64 encoded
85 PNG file like the one created by #dbusmenu_menuite_property_set_image.
86
87 Return value: A pixbuf or #NULL to signal error.
88*/
89GdkPixbuf *
90dbusmenu_menuitem_property_get_image (DbusmenuMenuitem * menuitem, const gchar * property)
91{
92 g_return_val_if_fail(DBUSMENU_IS_MENUITEM(menuitem), NULL);
93 g_return_val_if_fail(property != NULL && property[0] != '\0', NULL);
94
95 const gchar * value = dbusmenu_menuitem_property_get(menuitem, property);
96
97 /* There is no icon */
98 if (value == NULL || value[0] == '\0') {
99 return NULL;
100 }
101
102 gsize length = 0;
103 guchar * icondata = g_base64_decode(value, &length);
104
105 GInputStream * input = g_memory_input_stream_new_from_data(icondata, length, NULL);
106 if (input == NULL) {
107 g_warning("Cound not create input stream from icon property data");
108 g_free(icondata);
109 return NULL;
110 }
111
112 GError * error = NULL;
113 GdkPixbuf * icon = gdk_pixbuf_new_from_stream(input, NULL, &error);
114
115 if (error != NULL) {
116 g_warning("Unable to build Pixbuf from icon data: %s", error->message);
117 g_error_free(error);
118 }
119
120 error = NULL;
121 g_input_stream_close(input, NULL, &error);
122 if (error != NULL) {
123 g_warning("Unable to close input stream: %s", error->message);
124 g_error_free(error);
125 }
126 g_free(icondata);
127
128 return icon;
129}
130
0131
=== added file 'libdbusmenu-gtk/menuitem.h'
--- libdbusmenu-gtk/menuitem.h 1970-01-01 00:00:00 +0000
+++ libdbusmenu-gtk/menuitem.h 2009-09-02 18:29:01 +0000
@@ -0,0 +1,39 @@
1/*
2A library to take the object model made consistent by libdbusmenu-glib
3and visualize it in GTK.
4
5Copyright 2009 Canonical Ltd.
6
7Authors:
8 Ted Gould <ted@canonical.com>
9
10This program is free software: you can redistribute it and/or modify it
11under the terms of either or both of the following licenses:
12
131) the GNU Lesser General Public License version 3, as published by the
14Free Software Foundation; and/or
152) the GNU Lesser General Public License version 2.1, as published by
16the Free Software Foundation.
17
18This program is distributed in the hope that it will be useful, but
19WITHOUT ANY WARRANTY; without even the implied warranties of
20MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
21PURPOSE. See the applicable version of the GNU Lesser General Public
22License for more details.
23
24You should have received a copy of both the GNU Lesser General Public
25License version 3 and version 2.1 along with this program. If not, see
26<http://www.gnu.org/licenses/>
27*/
28
29#ifndef __DBUSMENU_GTKMENUITEM_H__
30#define __DBUSMENU_GTKMENUITEM_H__ 1
31
32#include <glib.h>
33#include <gdk-pixbuf/gdk-pixbuf.h>
34#include <libdbusmenu-glib/menuitem.h>
35
36gboolean dbusmenu_menuitem_property_set_image (DbusmenuMenuitem * menuitem, const gchar * property, const GdkPixbuf * data);
37GdkPixbuf * dbusmenu_menuitem_property_get_image (DbusmenuMenuitem * menuitem, const gchar * property);
38
39#endif
040
=== modified file 'tests/test-gtk-label-server.c'
--- tests/test-gtk-label-server.c 2009-07-20 21:04:00 +0000
+++ tests/test-gtk-label-server.c 2009-09-02 20:13:15 +0000
@@ -156,7 +156,7 @@
156 server = dbusmenu_server_new("/org/test");156 server = dbusmenu_server_new("/org/test");
157157
158 timer_func(NULL);158 timer_func(NULL);
159 g_timeout_add_seconds(15, timer_func, NULL);159 g_timeout_add_seconds(5, timer_func, NULL);
160160
161 mainloop = g_main_loop_new(NULL, FALSE);161 mainloop = g_main_loop_new(NULL, FALSE);
162 g_main_loop_run(mainloop);162 g_main_loop_run(mainloop);
163163
=== modified file 'tests/test-gtk-label.json'
--- tests/test-gtk-label.json 2009-08-26 20:32:37 +0000
+++ tests/test-gtk-label.json 2009-09-03 19:16:01 +0000
@@ -49,6 +49,52 @@
49 "label": "value29"}49 "label": "value29"}
50 ]50 ]
51 },51 },
52 {"id": 4, "type": "menuitem",
53 "label": "value4",
54 "submenu": [
55 {"id": 40,
56 "type": "menuitem",
57 "sensitive": "true",
58 "label": "value40"},
59 {"id": 41,
60 "type": "menuitem",
61 "sensitive": "false",
62 "label": "value41"},
63 {"id": 42,
64 "type": "menuitem",
65 "sensitive": "true",
66 "label": "value42"},
67 {"id": 43,
68 "type": "menuitem",
69 "sensitive": "false",
70 "label": "value43"},
71 {"id": 44,
72 "type": "menuitem",
73 "sensitive": "true",
74 "label": "value44"},
75 {"id": 45,
76 "type": "menuitem",
77 "sensitive": "false",
78 "label": "value45"},
79 {"id": 46,
80 "type": "menuitem",
81 "sensitive": "true",
82 "label": "value46"},
83 {"id": 47,
84 "type": "menuitem",
85 "sensitive": "false",
86 "label": "value47"},
87 {"id": 48,
88 "type": "menuitem",
89 "sensitive": "true",
90 "label": "value48"},
91 {"id": 49,
92 "type": "menuitem",
93 "visible": "false",
94 "sensitive": "false",
95 "label": "value49"}
96 ]
97 },
52 {"id": 3, "type": "menuitem",98 {"id": 3, "type": "menuitem",
53 "label": "a super long label that is really of unreasonable length but we should make sure it makes it across the bus",99 "label": "a super long label that is really of unreasonable length but we should make sure it makes it across the bus",
54 "not.a.value": "A useless value",100 "not.a.value": "A useless value",
@@ -154,5 +200,123 @@
154 ]200 ]
155 },201 },
156 ]202 ]
157 }203 },
204 {"id": 8, "type": "menuitem",
205 "label": "value1",
206 "submenu": [
207 {"id": 80,
208 "type": "imageitem",
209 "icon": "face-angel",
210 "label": "angel"},
211 {"id": 81,
212 "type": "imageitem",
213 "icon": "face-angry",
214 "label": "angry"},
215 {"id": 82,
216 "type": "imageitem",
217 "icon": "face-cool",
218 "label": "cool"},
219 {"id": 83,
220 "type":"imageitem",
221 "icon": "face-devilish",
222 "label": "devilish"},
223 {"id": 84,
224 "type": "imageitem",
225 "icon": "face-embarrassed",
226 "label": "embarrassed"},
227 {"id": 85,
228 "type": "imageitem",
229 "icon": "face-kiss",
230 "label": "kiss"},
231 {"id": 86,
232 "type": "imageitem",
233 "icon": "face-laugh",
234 "label": "laugh"},
235 {"id": 87,
236 "type": "imageitem",
237 "icon": "face-monkey",
238 "label": "monkey"},
239 {"id": 88,
240 "type": "imageitem",
241 "icon": "face-sad",
242 "label": "sad"},
243 {"id": 89,
244 "type": "imageitem",
245 "icon": "face-sick",
246 "label": "sick"}
247 ]
248 },
249 {"id": 9, "type": "menuitem",
250 "label": "value1",
251 "submenu": [
252 {"id": 90,
253 "type": "imageitem",
254 "icon-data":
255"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACPUlEQVR4nGJgoBAAAAAA///Ch1gW
256BzK0LQ5iaGNgYGDBpQgAAAD//8KpeY4/Q9+DCV7/H/S4/p8byDABlyEAAAAA///CqnluAMOEx5O8
257/3/f0/P/+47m/4967P7PC2GYysDAwIquGAAAAP//YkLXPC+AodfNyStfRMuegenvdwamP98ZhJWM
258GJzNzLIWhGMaAgAAAP//YkLT3Odq75InomrBwPT7CwPDr68M//98Y2D+951BREadwdFAL3VxJMNM
259ZEMAAAAA//9ihPs5gKHPzdo2V0TNkoGZ4T/D//9/GRj+/WJg+PeT4f/vHwwMf78z/P31jeHN89sM
260+6/dXpS4lCGFgYHhNwAAAP//ghkguDqC4Z0CNwMDLwsDgxAHAwOfdQrD/1+fGP5/e83w/9tbhq/P
261LjG8+8PA8PkPA8PDbwwMIXMYhBkYGN4BAAAA//80zDEOQDAAAMBLZ2MnITEafEziK2YfM/QBLDoX
262g4jJPeD+IGJAgypNlrbuvNfBcxLYb/rZiIINK/IHAAD//zTRoRHAIBAAsMAU3X8iZCUSy5W7R0EN
263rJDcmoEXFU8sVq/ko5SIDQoaJj74AQAA//+CGfADKoEIGZhmZiQ+RM0D5FgAAAAA//9Cj0aEKNRm
264uGZmrCoZAAAAAP//wm4AskZkg7AAAAAAAP//wpo8n/6A2siEoJ/+wG4AAAAA///CZq4EAwODAZRG
265Bi8YEIEIBwAAAAD//8JmAAcDA4MAlEYGPxgYGD5AaTgAAAAA//8DAD6xjTP5Y+A7AAAAAElFTkSu
266QmCC",
267 "label": "up"},
268 {"id": 91,
269 "type": "imageitem",
270 "icon-data":
271"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACl0lEQVR4nGJgoBAAAAAA//9ixCLG
272sSWS4bs0B1QWip/+YGDwWcLAycDA8ANZMQAAAP//YsFigIA0JwODdvIsBob/fxgY/vxk+P/7OwPD
2736ioGBgYGAQYGhhfIigEAAAD//8JmAAcDEwMDw5/vDAz/fjP8//uLgeHvDwYGJqgcGgAAAAD//8Jm
274AAMDIwPD/99fGBj+/WVg+PeLgeHvTwYGZqwqGQAAAAD//8JuADMDA8PPLwwMDH8Z/v//AzGACbsB
275AAAAAP//wmoAJwsDw/8/XxgY/v9l+P/rM8P/ry8ZONmwGwAAAAD//4LFAsfqaIbvCtwMDLxsDAxC
2767AwMPMqWDP+/Pmf4//01w//fXxm+/2NgePebgeHLHwaGR98ZGIKmQ2IEAAAA//80zisSQFAAAMAd
277wczzKRSvCIqrO4XqGoIkGTOv+SV7gv1j1XqY2jiI/agoSve2eM7VeyUyQk5X0gT2ZEYNHwAAAP//
278gnnhb+lWhuk//90TD1dncBThYGBgYWGA+JsRQv9lYGB4/5uBYcdDhotZSxhaGRgY/jEwMDAAAAAA
279//+CueALAwPDnZrtDK3r7jIcefuHgeEvI5JmRgaG938YGHY9YriatYShkoGB4TYDA8MnBgYGBgAA
280AAD//4IZ8JuBgeE1AwPDjfLNDE2b7jGcfPsLYutfRgaGD78ZGPY+ZrievpChjIGB4SoDA8NLqB4G
281AAAAAP//QkesDAwMMgwMDG6TwxnO3q5i+H+nhuH/nESGawwMDF4MDAzyDAwMKPEBAAAA///CZYgs
282AwODR18kw4UJ0QyX8WkGAAAA///ClpkYoAolGBgYFKBqHjAwMDxnYGD4ha4QAAAA///CZQDMEG4o
283+ys2zQwMDAwAAAAA//8DAAF5nhyE7tENAAAAAElFTkSuQmCC",
284 "label": "down"},
285 {"id": 92,
286 "type": "imageitem",
287 "icon": "up",
288 "icon-data":
289"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACl0lEQVR4nGJgoBAAAAAA//9ixCLG
290sSWS4bs0B1QWip/+YGDwWcLAycDA8ANZMQAAAP//YsFigIA0JwODdvIsBob/fxgY/vxk+P/7OwPD
2916ioGBgYGAQYGhhfIigEAAAD//8JmAAcDEwMDw5/vDAz/fjP8//uLgeHvDwYGJqgcGgAAAAD//8Jm
292AAMDIwPD/99fGBj+/WVg+PeLgeHvTwYGZqwqGQAAAAD//8JuADMDA8PPLwwMDH8Z/v//AzGACbsB
293AAAAAP//wmoAJwsDw/8/XxgY/v9l+P/rM8P/ry8ZONmwGwAAAAD//4LFAsfqaIbvCtwMDLxsDAxC
2947AwMPMqWDP+/Pmf4//01w//fXxm+/2NgePebgeHLHwaGR98ZGIKmQ2IEAAAA//80zisSQFAAAMAd
295wczzKRSvCIqrO4XqGoIkGTOv+SV7gv1j1XqY2jiI/agoSve2eM7VeyUyQk5X0gT2ZEYNHwAAAP//
296gnnhb+lWhuk//90TD1dncBThYGBgYWGA+JsRQv9lYGB4/5uBYcdDhotZSxhaGRgY/jEwMDAAAAAA
297//+CueALAwPDnZrtDK3r7jIcefuHgeEvI5JmRgaG938YGHY9YriatYShkoGB4TYDA8MnBgYGBgAA
298AAD//4IZ8JuBgeE1AwPDjfLNDE2b7jGcfPsLYutfRgaGD78ZGPY+ZrievpChjIGB4SoDA8NLqB4G
299AAAAAP//QkesDAwMMgwMDG6TwxnO3q5i+H+nhuH/nESGawwMDF4MDAzyDAwMKPEBAAAA///CZYgs
300AwODR18kw4UJ0QyX8WkGAAAA///ClpkYoAolGBgYFKBqHjAwMDxnYGD4ha4QAAAA///CZQDMEG4o
301+ys2zQwMDAwAAAAA//8DAAF5nhyE7tENAAAAAElFTkSuQmCC",
302 "label": "up"},
303 {"id": 93,
304 "type": "imageitem",
305 "icon": "down",
306 "icon-data":
307"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACPUlEQVR4nGJgoBAAAAAA///Ch1gW
308BzK0LQ5iaGNgYGDBpQgAAAD//8KpeY4/Q9+DCV7/H/S4/p8byDABlyEAAAAA///CqnluAMOEx5O8
309/3/f0/P/+47m/4967P7PC2GYysDAwIquGAAAAP//YkLXPC+AodfNyStfRMuegenvdwamP98ZhJWM
310GJzNzLIWhGMaAgAAAP//YkLT3Odq75InomrBwPT7CwPDr68M//98Y2D+951BREadwdFAL3VxJMNM
311ZEMAAAAA//9ihPs5gKHPzdo2V0TNkoGZ4T/D//9/GRj+/WJg+PeT4f/vHwwMf78z/P31jeHN89sM
312+6/dXpS4lCGFgYHhNwAAAP//ghkguDqC4Z0CNwMDLwsDgxAHAwOfdQrD/1+fGP5/e83w/9tbhq/P
313LjG8+8PA8PkPA8PDbwwMIXMYhBkYGN4BAAAA//80zDEOQDAAAMBLZ2MnITEafEziK2YfM/QBLDoX
314g4jJPeD+IGJAgypNlrbuvNfBcxLYb/rZiIINK/IHAAD//zTRoRHAIBAAsMAU3X8iZCUSy5W7R0EN
315rJDcmoEXFU8sVq/ko5SIDQoaJj74AQAA//+CGfADKoEIGZhmZiQ+RM0D5FgAAAAA//9Cj0aEKNRm
316uGZmrCoZAAAAAP//wm4AskZkg7AAAAAAAP//wpo8n/6A2siEoJ/+wG4AAAAA///CZq4EAwODAZRG
317Bi8YEIEIBwAAAAD//8JmAAcDA4MAlEYGPxgYGD5AaTgAAAAA//8DAD6xjTP5Y+A7AAAAAElFTkSu
318QmCC",
319 "label": "down"}
320 ]
321 },
158]322]

Subscribers

People subscribed via source and target branches

to all changes: