← Back to team overview

ayatana-commits team mailing list archive

[Branch ~dbusmenu-team/dbusmenu/trunk] Rev 109: Set the child-display property automatically on menuitems that have children.

 

Merge authors:
  Ted Gould (ted)
Related merge proposals:
  https://code.launchpad.net/~ted/dbusmenu/submenu-marking/+merge/27083
  proposed by: Ted Gould (ted)
  review: Approve - Aurélien Gâteau (agateau)
------------------------------------------------------------
revno: 109 [merge]
committer: Ted Gould <ted@xxxxxxxx>
branch nick: trunk
timestamp: Thu 2010-06-10 08:29:44 -0500
message:
  Set the child-display property automatically on menuitems that have children.
added:
  tests/test-glib-submenu-client.c
  tests/test-glib-submenu-server.c
  tests/test-glib-submenu.h
modified:
  .bzrignore
  libdbusmenu-glib/menuitem.c
  libdbusmenu-glib/menuitem.h
  tests/Makefile.am


--
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-05-20 16:12:29 +0000
+++ .bzrignore	2010-06-08 18:12:32 +0000
@@ -71,3 +71,6 @@
 libdbusmenu-gtk/DbusmenuGtk-0.2.tmp.gir
 libdbusmenu-gtk/DbusmenuGtk-0.2.typelib
 libdbusmenu-gtk/DbusmenuGtk-0.2.vapi
+tests/test-glib-submenu
+tests/test-glib-submenu-client
+tests/test-glib-submenu-server

=== modified file 'libdbusmenu-glib/menuitem.c'
--- libdbusmenu-glib/menuitem.c	2010-05-27 21:33:38 +0000
+++ libdbusmenu-glib/menuitem.c	2010-06-08 04:00:17 +0000
@@ -517,6 +517,9 @@
 	GList * children = priv->children;
 	priv->children = NULL;
 	g_list_foreach(children, take_children_signal, mi);
+
+	dbusmenu_menuitem_property_remove(mi, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY);
+	
 	return children;
 }
 
@@ -622,6 +625,10 @@
 	DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi);
 	g_return_val_if_fail(g_list_find(priv->children, child) == NULL, FALSE);
 
+	if (priv->children == NULL && !dbusmenu_menuitem_property_exist(mi, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY)) {
+		dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY, DBUSMENU_MENUITEM_CHILD_DISPLAY_SUBMENU);
+	}
+
 	priv->children = g_list_append(priv->children, child);
 	#ifdef MASSIVEDEBUGGING
 	g_debug("Menuitem %d (%s) signalling child added %d (%s) at %d", ID(mi), LABEL(mi), ID(child), LABEL(child), g_list_length(priv->children) - 1);
@@ -650,6 +657,10 @@
 	DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi);
 	g_return_val_if_fail(g_list_find(priv->children, child) == NULL, FALSE);
 
+	if (priv->children == NULL && !dbusmenu_menuitem_property_exist(mi, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY)) {
+		dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY, DBUSMENU_MENUITEM_CHILD_DISPLAY_SUBMENU);
+	}
+
 	priv->children = g_list_prepend(priv->children, child);
 	#ifdef MASSIVEDEBUGGING
 	g_debug("Menuitem %d (%s) signalling child added %d (%s) at %d", ID(mi), LABEL(mi), ID(child), LABEL(child), 0);
@@ -683,6 +694,11 @@
 	#endif
 	g_signal_emit(G_OBJECT(mi), signals[CHILD_REMOVED], 0, child, TRUE);
 	g_object_unref(G_OBJECT(child));
+
+	if (priv->children == NULL) {
+		dbusmenu_menuitem_property_remove(mi, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY);
+	}
+
 	return TRUE;
 }
 
@@ -707,6 +723,10 @@
 	DbusmenuMenuitemPrivate * priv = DBUSMENU_MENUITEM_GET_PRIVATE(mi);
 	g_return_val_if_fail(g_list_find(priv->children, child) == NULL, FALSE);
 
+	if (priv->children == NULL && !dbusmenu_menuitem_property_exist(mi, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY)) {
+		dbusmenu_menuitem_property_set(mi, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY, DBUSMENU_MENUITEM_CHILD_DISPLAY_SUBMENU);
+	}
+
 	priv->children = g_list_insert(priv->children, child, position);
 	#ifdef MASSIVEDEBUGGING
 	g_debug("Menuitem %d (%s) signalling child added %d (%s) at %d", ID(mi), LABEL(mi), ID(child), LABEL(child), position);

=== modified file 'libdbusmenu-glib/menuitem.h'
--- libdbusmenu-glib/menuitem.h	2010-06-04 17:17:21 +0000
+++ libdbusmenu-glib/menuitem.h	2010-06-08 02:15:04 +0000
@@ -58,6 +58,7 @@
 #define DBUSMENU_MENUITEM_PROP_ICON_DATA             "icon-data"
 #define DBUSMENU_MENUITEM_PROP_TOGGLE_TYPE           "toggle-type"
 #define DBUSMENU_MENUITEM_PROP_TOGGLE_STATE          "toggle-state"
+#define DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY         "child-display"
 
 #define DBUSMENU_MENUITEM_TOGGLE_CHECK               "checkmark"
 #define DBUSMENU_MENUITEM_TOGGLE_RADIO               "radio"
@@ -68,6 +69,8 @@
 
 #define DBUSMENU_MENUITEM_ICON_NAME_BLANK            "blank-icon"
 
+#define DBUSMENU_MENUITEM_CHILD_DISPLAY_SUBMENU      "submenu"
+
 /**
  * DbusmenuMenuitem:
  * 

=== modified file 'tests/Makefile.am'
--- tests/Makefile.am	2010-02-10 22:55:26 +0000
+++ tests/Makefile.am	2010-06-08 18:12:12 +0000
@@ -7,6 +7,7 @@
 	test-glib-properties \
 	test-glib-proxy \
 	test-glib-simple-items \
+	test-glib-submenu \
 	test-gtk-label \
 	test-gtk-reorder
 
@@ -20,6 +21,8 @@
 	test-glib-proxy-client \
 	test-glib-proxy-server \
 	test-glib-proxy-proxy \
+	test-glib-submenu-client \
+	test-glib-submenu-server \
 	test-gtk-label-client \
 	test-gtk-label-server \
 	test-glib-simple-items \
@@ -75,6 +78,38 @@
 	../libdbusmenu-glib/libdbusmenu-glib.la \
 	$(DBUSMENUGLIB_LIBS)
 
+######################
+# Test Glib Submenu
+######################
+
+test-glib-submenu: test-glib-submenu-client test-glib-submenu-server Makefile.am
+	@echo "#!/bin/bash" > $@
+	@echo $(DBUS_RUNNER) --task ./test-glib-submenu-client --task-name Client --task ./test-glib-submenu-server --task-name Server --ignore-return >> $@
+	@chmod +x $@
+
+test_glib_submenu_server_SOURCES = \
+	test-glib-submenu.h \
+	test-glib-submenu-server.c
+
+test_glib_submenu_server_CFLAGS = \
+	-I $(srcdir)/.. \
+	$(DBUSMENUGLIB_CFLAGS) -Wall -Werror
+
+test_glib_submenu_server_LDADD = \
+	../libdbusmenu-glib/libdbusmenu-glib.la \
+	$(DBUSMENUGLIB_LIBS)
+
+test_glib_submenu_client_SOURCES = \
+	test-glib-submenu.h \
+	test-glib-submenu-client.c
+
+test_glib_submenu_client_CFLAGS = \
+	-I $(srcdir)/.. \
+	$(DBUSMENUGLIB_CFLAGS) -Wall -Werror
+
+test_glib_submenu_client_LDADD = \
+	../libdbusmenu-glib/libdbusmenu-glib.la \
+	$(DBUSMENUGLIB_LIBS)
 
 ######################
 # Test Glib Object

=== added file 'tests/test-glib-submenu-client.c'
--- tests/test-glib-submenu-client.c	1970-01-01 00:00:00 +0000
+++ tests/test-glib-submenu-client.c	2010-06-08 20:48:01 +0000
@@ -0,0 +1,119 @@
+/*
+A test for libdbusmenu to ensure its quality.
+
+Copyright 2009 Canonical Ltd.
+
+Authors:
+    Ted Gould <ted@xxxxxxxxxxxxx>
+
+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 <libdbusmenu-glib/client.h>
+#include <libdbusmenu-glib/menuitem.h>
+
+#include "test-glib-submenu.h"
+
+static guint layouton = 0;
+static GMainLoop * mainloop = NULL;
+static gboolean passed = TRUE;
+
+static void
+realization (DbusmenuMenuitem * mi)
+{
+	const gchar * value;
+	gboolean original = passed;
+
+	value = dbusmenu_menuitem_property_get(mi, DBUSMENU_MENUITEM_PROP_CHILD_DISPLAY);
+
+	if (layouton % 2 == 0) {
+		if (value == NULL) {
+			passed = FALSE;
+		}
+	} else {
+		if (value != NULL) {
+			passed = FALSE;
+		}
+	}
+
+	if (original != passed) {
+		g_debug("Oops, this is where we failed");
+	}
+
+	return;
+}
+
+static void
+layout_updated (DbusmenuClient * client, gpointer data)
+{
+	g_debug("Layout Updated");
+
+	DbusmenuMenuitem * menuroot = dbusmenu_client_get_root(client);
+	if (menuroot == NULL) {
+		g_debug("Root is NULL?");
+		return;
+	}
+
+	GList * children = dbusmenu_menuitem_get_children(menuroot);
+	if (children == NULL) {
+		g_debug("No Children on root -- fail");
+		passed = FALSE;
+	} else {
+		for (; children != NULL; children = g_list_next(children)) {
+			g_signal_connect(G_OBJECT(children->data), DBUSMENU_MENUITEM_SIGNAL_REALIZED, G_CALLBACK(realization), NULL);
+		}
+	}
+
+	layouton++;
+
+	if (layouts[layouton].id == -1) {
+		g_main_loop_quit(mainloop);
+	}
+
+	return;
+}
+
+static gboolean
+timer_func (gpointer data)
+{
+	g_debug("Death timer.  Oops.  Got to: %d", layouton);
+	passed = FALSE;
+	g_main_loop_quit(mainloop);
+	return FALSE;
+}
+
+int
+main (int argc, char ** argv)
+{
+	g_type_init();
+
+	DbusmenuClient * client = dbusmenu_client_new("org.dbusmenu.test", "/org/test");
+	g_signal_connect(G_OBJECT(client), DBUSMENU_CLIENT_SIGNAL_LAYOUT_UPDATED, G_CALLBACK(layout_updated), NULL);
+
+	g_timeout_add_seconds(10, timer_func, client);
+
+	mainloop = g_main_loop_new(NULL, FALSE);
+	g_main_loop_run(mainloop);
+
+	g_object_unref(G_OBJECT(client));
+
+	if (passed) {
+		g_debug("Quiting");
+		return 0;
+	} else {
+		g_debug("Quiting as we're a failure");
+		return 1;
+	}
+}

=== added file 'tests/test-glib-submenu-server.c'
--- tests/test-glib-submenu-server.c	1970-01-01 00:00:00 +0000
+++ tests/test-glib-submenu-server.c	2010-06-08 15:19:37 +0000
@@ -0,0 +1,109 @@
+/*
+A test for libdbusmenu to ensure its quality.
+
+Copyright 2009 Canonical Ltd.
+
+Authors:
+    Ted Gould <ted@xxxxxxxxxxxxx>
+
+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 "test-glib-submenu.h"
+
+
+static DbusmenuMenuitem *
+layout2menuitem (layout_t * layout)
+{
+	if (layout == NULL || layout->id == 0) return NULL;
+
+	DbusmenuMenuitem * local = dbusmenu_menuitem_new_with_id(layout->id);
+	
+	if (layout->submenu != NULL) {
+		guint 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);
+			}
+		}
+	}
+
+	/* g_debug("Layout to menu return: 0x%X", (unsigned int)local); */
+	return local;
+}
+
+static guint layouton = 0;
+static DbusmenuServer * server = NULL;
+static GMainLoop * mainloop = NULL;
+
+static gboolean
+timer_func (gpointer data)
+{
+	if (layouts[layouton].id == -1) {
+		g_main_loop_quit(mainloop);
+		return FALSE;
+	}
+	g_debug("Updating to Layout %d", layouton);
+
+	dbusmenu_server_set_root(server, layout2menuitem(&layouts[layouton]));
+	layouton++;
+
+	return TRUE;
+}
+
+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;
+	}
+
+	server = dbusmenu_server_new("/org/test");
+
+	timer_func(NULL);
+	g_timeout_add(2500, timer_func, NULL);
+
+	mainloop = g_main_loop_new(NULL, FALSE);
+	g_main_loop_run(mainloop);
+
+	g_debug("Quiting");
+
+	return 0;
+}

=== added file 'tests/test-glib-submenu.h'
--- tests/test-glib-submenu.h	1970-01-01 00:00:00 +0000
+++ tests/test-glib-submenu.h	2010-06-08 19:18:36 +0000
@@ -0,0 +1,54 @@
+/*
+A test for libdbusmenu to ensure its quality.
+
+Copyright 2009 Canonical Ltd.
+
+Authors:
+    Ted Gould <ted@xxxxxxxxxxxxx>
+
+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/>.
+*/
+
+typedef struct _layout_t layout_t;
+struct _layout_t {
+	gint id;
+	layout_t * submenu;
+};
+
+layout_t submenu_l2[] = {
+	{id: 6, submenu: NULL},
+	{id: 7, submenu: NULL},
+	{id: 8, submenu: NULL},
+	{id: -1, submenu: NULL}
+};
+
+layout_t submenu[] = {
+	{id: 2, submenu: submenu_l2},
+	{id: 3, submenu: submenu_l2},
+	{id: -1, submenu: NULL}
+};
+
+layout_t no_submenu[] = {
+	{id: 4, submenu: NULL},
+	{id: 5, submenu: NULL},
+	{id: -1, submenu: NULL}
+};
+
+layout_t layouts[] = {
+	{id: 1, submenu: no_submenu},
+	{id: 1, submenu: submenu},
+	{id: 1, submenu: no_submenu},
+	{id: 1, submenu: submenu},
+	{id: -1, submenu: NULL}
+};
+