← Back to team overview

ayatana-commits team mailing list archive

[Branch ~dbusmenu-team/dbusmenu/trunk] Rev 67: Fix IDs to handle the root ID of zero better and to handle merging of properties if items are reu...

 

Merge authors:
  Ted Gould (ted)
------------------------------------------------------------
revno: 67 [merge]
committer: Ted Gould <ted@xxxxxxxx>
branch nick: trunk
timestamp: Fri 2010-02-05 10:54:42 -0800
message:
  Fix IDs to handle the root ID of zero better and to handle merging of properties if items are reused.
modified:
  .bzrignore
  libdbusmenu-glib/client.c
  libdbusmenu-glib/menuitem.c
  libdbusmenu-glib/menuitem.h
  libdbusmenu-glib/server.c
  tests/test-glib-layout-client.c
  tests/test-glib-layout-server.c
  tests/test-glib-layout.h
  tests/test-glib-objects.c
  tests/test-glib-properties-client.c
  tests/test-glib-properties-server.c
  tests/test-glib-properties.h


--
lp:dbusmenu
https://code.launchpad.net/~dbusmenu-team/dbusmenu/trunk

Your team ayatana-commits is subscribed to branch lp:dbusmenu.
To unsubscribe from this branch go to https://code.launchpad.net/~dbusmenu-team/dbusmenu/trunk/+edit-subscription.
=== modified file '.bzrignore'
--- .bzrignore	2010-02-04 19:35:15 +0000
+++ .bzrignore	2010-02-05 05:35:32 +0000
@@ -58,3 +58,4 @@
 tests/test-glib-objects-test
 tests/test-glib-objects.xml
 tools/testapp/dbusmenu-testapp
+libdbusmenu-glib/libdbusmenu_glib_la-client-menuitem.lo

=== modified file 'libdbusmenu-glib/client.c'
--- libdbusmenu-glib/client.c	2010-02-04 17:59:00 +0000
+++ libdbusmenu-glib/client.c	2010-02-05 18:48:48 +0000
@@ -339,6 +339,7 @@
 	g_return_if_fail(menuitem != NULL);
 
 	dbusmenu_menuitem_property_set_value(menuitem, property, value);
+
 	return;
 }
 
@@ -569,6 +570,22 @@
 	return;
 }
 
+static void
+menuitem_get_properties_replace_cb (DBusGProxy * proxy, GHashTable * properties, GError * error, gpointer data)
+{
+	GList * current_props = NULL;
+
+	for (current_props = dbusmenu_menuitem_properties_list(DBUSMENU_MENUITEM(data));
+			current_props != NULL ; current_props = g_list_next(current_props)) {
+		if (g_hash_table_lookup(properties, current_props->data) == NULL) {
+			dbusmenu_menuitem_property_remove(DBUSMENU_MENUITEM(data), (const gchar *)current_props->data);
+		}
+	}
+
+	menuitem_get_properties_cb(proxy, properties, error, data);
+	return;
+}
+
 /* This is a different get properites call back that also sends
    new signals.  It basically is a small wrapper around the original. */
 static void
@@ -647,6 +664,7 @@
 	#ifdef MASSIVEDEBUGGING
 	g_debug("Client looking at node with id: %d", id);
 	#endif
+	/* If we don't have any item, or the IDs don't match */
 	if (item == NULL || dbusmenu_menuitem_get_id(item) != id) {
 		if (item != NULL) {
 			if (parent != NULL) {
@@ -675,7 +693,11 @@
 		} else {
 			g_warning("Unable to allocate memory to get properties for menuitem.  This menuitem will never be realized.");
 		}
-	} 
+	} else {
+		/* Refresh the properties */
+		gchar * properties[1] = {NULL}; /* This gets them all */
+		org_ayatana_dbusmenu_get_properties_async(proxy, id, (const gchar **)properties, menuitem_get_properties_replace_cb, item);
+	}
 
 	xmlNodePtr children;
 	guint position;
@@ -736,6 +758,10 @@
 	xmlNodePtr root = xmlDocGetRootElement(xmldoc);
 
 	DbusmenuMenuitem * oldroot = priv->root;
+	if (oldroot != NULL) {
+		g_object_ref(oldroot);
+	}
+
 	priv->root = parse_layout_xml(client, root, priv->root, NULL, priv->menuproxy);
 	xmlFreeDoc(xmldoc);
 
@@ -747,6 +773,16 @@
 		#ifdef MASSIVEDEBUGGING
 		g_debug("Client signaling root changed.");
 		#endif 
+
+		/* Switch the root around */
+		g_object_ref(priv->root);
+		dbusmenu_menuitem_set_root(priv->root, TRUE);
+
+		if (oldroot != NULL) {
+			dbusmenu_menuitem_set_root(oldroot, FALSE);
+			g_object_unref(oldroot);
+		}
+
 		g_signal_emit(G_OBJECT(client), signals[ROOT_CHANGED], 0, priv->root, TRUE);
 	}
 

=== modified file 'libdbusmenu-glib/menuitem.c'
--- libdbusmenu-glib/menuitem.c	2010-02-04 17:59:00 +0000
+++ libdbusmenu-glib/menuitem.c	2010-02-05 18:48:48 +0000
@@ -80,6 +80,8 @@
 	PROP_ID,
 };
 
+#define PROP_ID_S  "id"
+
 #define DBUSMENU_MENUITEM_GET_PRIVATE(o) \
 (G_TYPE_INSTANCE_GET_PRIVATE ((o), DBUSMENU_TYPE_MENUITEM, DbusmenuMenuitemPrivate))
 
@@ -210,9 +212,9 @@
 	                                           G_TYPE_NONE, 0, G_TYPE_NONE);
 
 	g_object_class_install_property (object_class, PROP_ID,
-	                                 g_param_spec_int("id", "ID for the menu item",
+	                                 g_param_spec_int(PROP_ID_S, "ID for the menu item",
 	                                              "This is a unique indentifier for the menu item.",
-												  0, 30000, 0,
+												  -1, 30000, -1,
 	                                              G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS));
 
 	/* Check transfer functions for GValue */
@@ -249,7 +251,7 @@
 	return;
 }
 
-static gint menuitem_next_id = 0;
+static gint menuitem_next_id = 1;
 
 /* A small little function to both clear the insides of a 
    value as well as the memory it itself uses. */
@@ -270,7 +272,7 @@
 {
 	DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(self);
 
-	priv->id = 0; 
+	priv->id = -1; 
 	priv->children = NULL;
 
 	priv->properties = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, _g_value_free);
@@ -323,6 +325,9 @@
 			menuitem_next_id = priv->id + 1;
 		}
 		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, pspec);
+		break;
 	}
 
 	return;
@@ -335,7 +340,17 @@
 
 	switch (id) {
 	case PROP_ID:
-		g_value_set_int(value, priv->id);
+		if (priv->id == -1) {
+			priv->id = menuitem_next_id++;
+		}
+		if (dbusmenu_menuitem_get_root(DBUSMENU_MENUITEM(obj))) {
+			g_value_set_int(value, 0);
+		} else {
+			g_value_set_int(value, priv->id);
+		}
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, id, pspec);
 		break;
 	}
 
@@ -365,7 +380,7 @@
 DbusmenuMenuitem *
 dbusmenu_menuitem_new (void)
 {
-	return g_object_new(DBUSMENU_TYPE_MENUITEM, "id", menuitem_next_id++, NULL);
+	return g_object_new(DBUSMENU_TYPE_MENUITEM, NULL);
 }
 
 /**
@@ -379,7 +394,7 @@
 DbusmenuMenuitem *
 dbusmenu_menuitem_new_with_id (gint id)
 {
-	DbusmenuMenuitem * mi = g_object_new(DBUSMENU_TYPE_MENUITEM, "id", id, NULL);
+	DbusmenuMenuitem * mi = g_object_new(DBUSMENU_TYPE_MENUITEM, PROP_ID_S, id, NULL);
 	/* g_debug("New Menuitem id %d goal id %d", dbusmenu_menuitem_get_id(mi), id); */
 	return mi;
 }
@@ -392,15 +407,19 @@
 
 	Return value: The ID of the @mi.
 */
-guint
+gint
 dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi)
 {
-	g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), 0);
+	g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), -1);
 
 	GValue retval = {0};
-	g_value_init(&retval, G_TYPE_UINT);
-	g_object_get_property(G_OBJECT(mi), "id", &retval);
-	return g_value_get_uint(&retval);
+	g_value_init(&retval, G_TYPE_INT);
+	g_object_get_property(G_OBJECT(mi), PROP_ID_S, &retval);
+	gint ret = g_value_get_int(&retval);
+	#ifdef MASSIVEDEBUGGING
+	g_debug("Getting menuitem ID: %d", ret);
+	#endif
+	return ret;
 }
 
 /**
@@ -710,6 +729,12 @@
 dbusmenu_menuitem_find_id (DbusmenuMenuitem * mi, gint id)
 {
 	g_return_val_if_fail(DBUSMENU_IS_MENUITEM(mi), NULL);
+	if (id == 0) {
+		if (dbusmenu_menuitem_get_root(mi) == FALSE) {
+			g_warning("Getting a menuitem with id zero, but it's not set as root.");
+		}
+		return mi;
+	}
 	find_id_t find_id = {mi: NULL, id: id};
 	find_id_helper(mi, &find_id);
 	return find_id.mi;
@@ -963,6 +988,26 @@
 }
 
 /**
+	dbusmenu_menuitem_property_remove:
+	@mi: The #DbusmenuMenuitem to remove the property on.
+	@property: The property to look for.
+
+	Removes a property from the menuitem.
+*/
+void
+dbusmenu_menuitem_property_remove (DbusmenuMenuitem * mi, const gchar * property)
+{
+	g_return_if_fail(DBUSMENU_IS_MENUITEM(mi));
+	g_return_if_fail(property != NULL);
+
+	DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi);
+
+	g_hash_table_remove(priv->properties, property);
+
+	return;
+}
+
+/**
 	dbusmenu_menuitem_properties_list:
 	@mi: #DbusmenuMenuitem to list the properties on
 

=== modified file 'libdbusmenu-glib/menuitem.h'
--- libdbusmenu-glib/menuitem.h	2010-02-04 17:59:00 +0000
+++ libdbusmenu-glib/menuitem.h	2010-02-05 18:48:48 +0000
@@ -127,7 +127,7 @@
 
 DbusmenuMenuitem * dbusmenu_menuitem_new (void) G_GNUC_WARN_UNUSED_RESULT;
 DbusmenuMenuitem * dbusmenu_menuitem_new_with_id (gint id) G_GNUC_WARN_UNUSED_RESULT;
-guint dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi);
+gint dbusmenu_menuitem_get_id (DbusmenuMenuitem * mi);
 
 GList * dbusmenu_menuitem_get_children (DbusmenuMenuitem * mi);
 GList * dbusmenu_menuitem_take_children (DbusmenuMenuitem * mi) G_GNUC_WARN_UNUSED_RESULT;
@@ -152,6 +152,7 @@
 gboolean dbusmenu_menuitem_property_exist (DbusmenuMenuitem * mi, const gchar * property);
 GList * dbusmenu_menuitem_properties_list (DbusmenuMenuitem * mi) G_GNUC_WARN_UNUSED_RESULT;
 GHashTable * dbusmenu_menuitem_properties_copy (DbusmenuMenuitem * mi);
+void dbusmenu_menuitem_property_remove (DbusmenuMenuitem * mi, const gchar * property);
 
 void dbusmenu_menuitem_set_root (DbusmenuMenuitem * mi, gboolean root);
 gboolean dbusmenu_menuitem_get_root (DbusmenuMenuitem * mi);

=== modified file 'libdbusmenu-glib/server.c'
--- libdbusmenu-glib/server.c	2010-02-04 20:12:17 +0000
+++ libdbusmenu-glib/server.c	2010-02-05 05:17:32 +0000
@@ -237,12 +237,14 @@
 	case PROP_ROOT_NODE:
 		if (priv->root != NULL) {
 			dbusmenu_menuitem_foreach(priv->root, menuitem_signals_remove, obj);
+			dbusmenu_menuitem_set_root(priv->root, FALSE);
 			g_object_unref(G_OBJECT(priv->root));
 			priv->root = NULL;
 		}
 		priv->root = DBUSMENU_MENUITEM(g_value_get_object(value));
 		if (priv->root != NULL) {
 			g_object_ref(G_OBJECT(priv->root));
+			dbusmenu_menuitem_set_root(priv->root, TRUE);
 			dbusmenu_menuitem_foreach(priv->root, menuitem_signals_create, obj);
 		} else {
 			g_debug("Setting root node to NULL");
@@ -516,7 +518,7 @@
 _dbusmenu_server_get_children (DbusmenuServer * server, gint id, GPtrArray * properties, GPtrArray ** output, GError ** error)
 {
 	DbusmenuServerPrivate * priv = DBUSMENU_SERVER_GET_PRIVATE(server);
-	DbusmenuMenuitem * mi = id == 0 ? priv->root : dbusmenu_menuitem_find_id(priv->root, id);
+	DbusmenuMenuitem * mi = dbusmenu_menuitem_find_id(priv->root, id);
 
 	if (mi == NULL) {
 		if (error != NULL) {

=== modified file 'tests/test-glib-layout-client.c'
--- tests/test-glib-layout-client.c	2010-01-07 14:55:35 +0000
+++ tests/test-glib-layout-client.c	2010-02-05 17:54:42 +0000
@@ -36,8 +36,10 @@
 	g_debug("Verifying ID: %d", layout->id);
 
 	if (layout->id != dbusmenu_menuitem_get_id(mi)) {
-		g_debug("Failed as ID %d is not equal to %d", layout->id, dbusmenu_menuitem_get_id(mi));
-		return FALSE;
+		if (!(dbusmenu_menuitem_get_root(mi) && dbusmenu_menuitem_get_id(mi) == 0)) {
+			g_debug("Failed as ID %d is not equal to %d", layout->id, dbusmenu_menuitem_get_id(mi));
+			return FALSE;
+		}
 	}
 
 	GList * children = dbusmenu_menuitem_get_children(mi);
@@ -55,13 +57,13 @@
 	}
 
 	guint i = 0;
-	for (i = 0; children != NULL && layout->submenu[i].id != 0; children = g_list_next(children), i++) {
+	for (i = 0; children != NULL && layout->submenu[i].id != -1; children = g_list_next(children), i++) {
 		if (!verify_root_to_layout(DBUSMENU_MENUITEM(children->data), &layout->submenu[i])) {
 			return FALSE;
 		}
 	}
 
-	if (children == NULL && layout->submenu[i].id == 0) {
+	if (children == NULL && layout->submenu[i].id == -1) {
 		return TRUE;
 	}
 
@@ -88,7 +90,7 @@
 
 	layouton++;
 
-	if (layouts[layouton].id == 0) {
+	if (layouts[layouton].id == -1) {
 		g_main_loop_quit(mainloop);
 	}
 

=== modified file 'tests/test-glib-layout-server.c'
--- tests/test-glib-layout-server.c	2010-01-07 14:55:35 +0000
+++ tests/test-glib-layout-server.c	2010-02-05 07:18:24 +0000
@@ -41,7 +41,7 @@
 	
 	if (layout->submenu != NULL) {
 		guint count;
-		for (count = 0; layout->submenu[count].id != 0; count++) {
+		for (count = 0; layout->submenu[count].id != -1; count++) {
 			DbusmenuMenuitem * child = layout2menuitem(&layout->submenu[count]);
 			if (child != NULL) {
 				dbusmenu_menuitem_child_append(local, child);
@@ -60,7 +60,7 @@
 static gboolean
 timer_func (gpointer data)
 {
-	if (layouts[layouton].id == 0) {
+	if (layouts[layouton].id == -1) {
 		g_main_loop_quit(mainloop);
 		return FALSE;
 	}

=== modified file 'tests/test-glib-layout.h'
--- tests/test-glib-layout.h	2009-05-12 13:38:58 +0000
+++ tests/test-glib-layout.h	2010-02-05 07:18:24 +0000
@@ -21,51 +21,51 @@
 
 typedef struct _layout_t layout_t;
 struct _layout_t {
-	guint id;
+	gint id;
 	layout_t * submenu;
 };
 
 layout_t submenu_2[] = {
 	{id: 2, submenu: NULL},
 	{id: 3, submenu: NULL},
-	{id: 0, submenu: NULL}
+	{id: -1, submenu: NULL}
 };
 layout_t submenu_3_1[] = {
 	{id: 3, submenu: NULL},
 	{id: 4, submenu: NULL},
 	{id: 5, submenu: NULL},
-	{id: 0, submenu: NULL}
+	{id: -1, submenu: NULL}
 };
 layout_t submenu_3_2[] = {
 	{id: 7, submenu: NULL},
 	{id: 8, submenu: NULL},
 	{id: 9, submenu: NULL},
-	{id: 0, submenu: NULL}
+	{id: -1, submenu: NULL}
 };
 layout_t submenu_3[] = {
 	{id: 2, submenu: submenu_3_1},
 	{id: 6, submenu: submenu_3_2},
-	{id: 0, submenu: NULL}
+	{id: -1, submenu: NULL}
 };
 layout_t submenu_4_1[] = {
 	{id: 6, submenu: NULL},
-	{id: 0, submenu: NULL}
+	{id: -1, submenu: NULL}
 };
 layout_t submenu_4_2[] = {
 	{id: 5, submenu: submenu_4_1},
-	{id: 0, submenu: NULL}
+	{id: -1, submenu: NULL}
 };
 layout_t submenu_4_3[] = {
 	{id: 4, submenu: submenu_4_2},
-	{id: 0, submenu: NULL}
+	{id: -1, submenu: NULL}
 };
 layout_t submenu_4_4[] = {
 	{id: 3, submenu: submenu_4_3},
-	{id: 0, submenu: NULL}
+	{id: -1, submenu: NULL}
 };
 layout_t submenu_4_5[] = {
 	{id: 2, submenu: submenu_4_4},
-	{id: 0, submenu: NULL}
+	{id: -1, submenu: NULL}
 };
 
 layout_t layouts[] = {
@@ -73,6 +73,6 @@
 	{id: 1, submenu: submenu_2},
 	{id: 1, submenu: submenu_3},
 	{id: 1, submenu: submenu_4_5},
-	{id: 0, submenu: NULL}
+	{id: -1, submenu: NULL}
 };
 

=== modified file 'tests/test-glib-objects.c'
--- tests/test-glib-objects.c	2009-12-23 02:51:37 +0000
+++ tests/test-glib-objects.c	2010-02-05 05:40:32 +0000
@@ -47,6 +47,30 @@
 	return;
 }
 
+/* Check to make sure a new ID is bigger than 0 */
+static void
+test_object_menuitem_id (void)
+{
+	/* Build a menu item */
+	DbusmenuMenuitem * item = dbusmenu_menuitem_new();
+
+	/* Test to make sure it's a happy object */
+	g_assert(item != NULL);
+	g_assert(G_IS_OBJECT(item));
+	g_assert(DBUSMENU_IS_MENUITEM(item));
+
+	g_assert(dbusmenu_menuitem_get_id(item) > 0);
+
+	/* Set up a check to make sure it gets destroyed on unref */
+	g_object_add_weak_pointer(G_OBJECT(item), (gpointer *)&item);
+	g_object_unref(item);
+
+	/* Did it go away? */
+	g_assert(item == NULL);
+
+	return;
+}
+
 /* Set a string prop, make sure it's stored as one */
 static void
 test_object_menuitem_props_string (void)
@@ -255,6 +279,7 @@
 test_glib_objects_suite (void)
 {
 	g_test_add_func ("/dbusmenu/glib/objects/menuitem/base",          test_object_menuitem);
+	g_test_add_func ("/dbusmenu/glib/objects/menuitem/id",            test_object_menuitem_id);
 	g_test_add_func ("/dbusmenu/glib/objects/menuitem/props_string",  test_object_menuitem_props_string);
 	g_test_add_func ("/dbusmenu/glib/objects/menuitem/props_int",     test_object_menuitem_props_int);
 	g_test_add_func ("/dbusmenu/glib/objects/menuitem/props_bool",    test_object_menuitem_props_bool);

=== modified file 'tests/test-glib-properties-client.c'
--- tests/test-glib-properties-client.c	2009-12-23 02:51:37 +0000
+++ tests/test-glib-properties-client.c	2010-02-05 18:10:47 +0000
@@ -60,8 +60,10 @@
 	g_debug("Verifying ID: %d", layout->id);
 
 	if (layout->id != dbusmenu_menuitem_get_id(mi)) {
-		g_debug("\tFailed as ID %d is not equal to %d", layout->id, dbusmenu_menuitem_get_id(mi));
-		return FALSE;
+		if (!dbusmenu_menuitem_get_root(mi)) {
+			g_debug("\tFailed as ID %d is not equal to %d", layout->id, dbusmenu_menuitem_get_id(mi));
+			return FALSE;
+		}
 	}
 
 	if (!verify_props(mi, layout->properties)) {
@@ -85,13 +87,13 @@
 	}
 
 	guint i = 0;
-	for (i = 0; children != NULL && layout->submenu[i].id != 0; children = g_list_next(children), i++) {
+	for (i = 0; children != NULL && layout->submenu[i].id != -1; children = g_list_next(children), i++) {
 		if (!verify_root_to_layout(DBUSMENU_MENUITEM(children->data), &layout->submenu[i])) {
 			return FALSE;
 		}
 	}
 
-	if (children == NULL && layout->submenu[i].id == 0) {
+	if (children == NULL && layout->submenu[i].id == -1) {
 		g_debug("\tPassed: %d", layout->id);
 		return TRUE;
 	}
@@ -140,7 +142,7 @@
 
 	layouton++;
 	
-	if (layouts[layouton].id == 0) {
+	if (layouts[layouton].id == -1) {
 		g_main_loop_quit(mainloop);
 	}
 

=== modified file 'tests/test-glib-properties-server.c'
--- tests/test-glib-properties-server.c	2009-06-18 19:11:42 +0000
+++ tests/test-glib-properties-server.c	2010-02-05 18:10:47 +0000
@@ -46,14 +46,14 @@
 static DbusmenuMenuitem *
 layout2menuitem (proplayout_t * layout)
 {
-	if (layout == NULL || layout->id == 0) return NULL;
+	if (layout == NULL || layout->id == -1) return NULL;
 
 	DbusmenuMenuitem * local = dbusmenu_menuitem_new_with_id(layout->id);
 	set_props(local, layout->properties);
 	
 	if (layout->submenu != NULL) {
 		guint count;
-		for (count = 0; layout->submenu[count].id != 0; count++) {
+		for (count = 0; layout->submenu[count].id != -1; count++) {
 			DbusmenuMenuitem * child = layout2menuitem(&layout->submenu[count]);
 			if (child != NULL) {
 				dbusmenu_menuitem_child_append(local, child);
@@ -72,7 +72,7 @@
 static gboolean
 timer_func (gpointer data)
 {
-	if (layouts[layouton].id == 0) {
+	if (layouts[layouton].id == -1) {
 		g_main_loop_quit(mainloop);
 		return FALSE;
 	}

=== modified file 'tests/test-glib-properties.h'
--- tests/test-glib-properties.h	2009-06-18 19:11:42 +0000
+++ tests/test-glib-properties.h	2010-02-05 18:10:47 +0000
@@ -24,7 +24,7 @@
 
 typedef struct _proplayout_t proplayout_t;
 struct _proplayout_t {
-	guint id;
+	gint id;
 	gchar ** properties;
 	proplayout_t * submenu;
 };
@@ -68,7 +68,7 @@
 	{id: 17, properties: props2, submenu: NULL},
 	{id: 18, properties: props2, submenu: NULL},
 	{id: 19, properties: props2, submenu: NULL},
-	{id: 0, properties: NULL, submenu: NULL}
+	{id: -1, properties: NULL, submenu: NULL}
 };
 
 proplayout_t submenu_4_2[] = {
@@ -82,7 +82,7 @@
 	{id: 27, properties: props2, submenu: NULL},
 	{id: 28, properties: props2, submenu: NULL},
 	{id: 29, properties: props2, submenu: NULL},
-	{id: 0, properties: NULL, submenu: NULL}
+	{id: -1, properties: NULL, submenu: NULL}
 };
 
 proplayout_t submenu_4_3[] = {
@@ -96,14 +96,14 @@
 	{id: 37, properties: props2, submenu: NULL},
 	{id: 38, properties: props2, submenu: NULL},
 	{id: 39, properties: props2, submenu: NULL},
-	{id: 0, properties: NULL, submenu: NULL}
+	{id: -1, properties: NULL, submenu: NULL}
 };
 
 proplayout_t submenu_4_0[] = {
 	{id: 1, properties: props2, submenu: submenu_4_1},
 	{id: 2, properties: props2, submenu: submenu_4_2},
 	{id: 3, properties: props2, submenu: submenu_4_3},
-	{id: 0, properties: NULL, submenu: NULL}
+	{id: -1, properties: NULL, submenu: NULL}
 };
 
 proplayout_t layouts[] = {
@@ -111,6 +111,6 @@
 	{id: 10, properties: props2, submenu: NULL},
 	{id: 20, properties: props3, submenu: NULL},
 	{id: 100, properties: props2, submenu: submenu_4_0},
-	{id: 0, properties: NULL, submenu: NULL}
+	{id: -1, properties: NULL, submenu: NULL}
 };