← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~ted/indicator-application/property-for-dbus-stuff into lp:indicator-application

 

Ted Gould has proposed merging lp:~ted/indicator-application/property-for-dbus-stuff into lp:indicator-application.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)


Adding a property to get the dbusmenu server so we can use it for testing.  Oh, and a test to prove that it can be used for testing :)
-- 
https://code.launchpad.net/~ted/indicator-application/property-for-dbus-stuff/+merge/40688
Your team ayatana-commits is subscribed to branch lp:indicator-application.
=== modified file 'src/app-indicator.c'
--- src/app-indicator.c	2010-10-20 19:22:46 +0000
+++ src/app-indicator.c	2010-11-12 04:40:04 +0000
@@ -34,6 +34,7 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-bindings.h>
 
+#include <libdbusmenu-glib/menuitem.h>
 #include <libdbusmenu-glib/server.h>
 #include <libdbusmenu-gtk/client.h>
 
@@ -121,7 +122,8 @@
 	PROP_X_LABEL,
 	PROP_X_LABEL_GUIDE,
 	PROP_ORDERING_INDEX,
-	PROP_X_ORDERING_INDEX
+	PROP_X_ORDERING_INDEX,
+	PROP_DBUS_MENU_SERVER
 };
 
 /* The strings so that they can be slowly looked up. */
@@ -139,6 +141,7 @@
 #define PROP_X_LABEL_GUIDE_S         ("x-ayatana-" PROP_LABEL_GUIDE_S)
 #define PROP_ORDERING_INDEX_S        "ordering-index"
 #define PROP_X_ORDERING_INDEX_S      ("x-ayatana-" PROP_ORDERING_INDEX_S)
+#define PROP_DBUS_MENU_SERVER_S      "dbus-menu-server"
 
 /* Private macro, shhhh! */
 #define APP_INDICATOR_GET_PRIVATE(o) \
@@ -406,6 +409,19 @@
 	                                                     "A wrapper, please don't use.",
 	                                                     NULL,
 	                                                     G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+	/**
+		AppIndicator:dbus-menu-server:
+
+		A way to get the internal dbusmenu server if it is available.
+		This should only be used for testing.
+	*/
+	g_object_class_install_property(object_class,
+	                                PROP_DBUS_MENU_SERVER,
+	                                g_param_spec_object (PROP_DBUS_MENU_SERVER_S,
+	                                                     "The internal DBusmenu Server",
+	                                                     "DBusmenu server which is available for testing the application indicators.",
+	                                                     DBUSMENU_TYPE_SERVER,
+	                                                     G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
 	/* Signals */
 
@@ -794,6 +810,14 @@
 		  priv->ordering_index = g_value_get_uint(value);
 		  break;
 
+		case PROP_DBUS_MENU_SERVER:
+			if (priv->menuservice != NULL) {
+				g_object_unref (priv->menuservice);
+			}
+			gpointer val = g_value_dup_object(value);
+			priv->menuservice = DBUSMENU_SERVER(val);
+			break;
+
         default:
           G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
           break;
@@ -866,6 +890,10 @@
 		  g_value_set_uint(value, priv->ordering_index);
 		  break;
 
+		case PROP_DBUS_MENU_SERVER:
+			g_value_set_object(value, priv->menuservice);
+			break;
+
         default:
           G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
           break;

=== modified file 'tests/test-libappindicator.c'
--- tests/test-libappindicator.c	2010-08-04 02:13:34 +0000
+++ tests/test-libappindicator.c	2010-11-12 04:40:04 +0000
@@ -25,6 +25,9 @@
 
 #include <app-indicator.h>
 
+#include <libdbusmenu-glib/menuitem.h>
+#include <libdbusmenu-glib/server.h>
+
 void
 test_libappindicator_prop_signals_status_helper (AppIndicator * ci, gchar * status, gboolean * signalactivated)
 {
@@ -225,6 +228,57 @@
 }
 
 void
+test_libappindicator_set_menu (void)
+{
+	AppIndicator * ci = app_indicator_new ("my-id",
+	                                       "my-name",
+	                                       APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
+
+	g_assert(ci != NULL);
+
+	GtkMenu * menu = GTK_MENU(gtk_menu_new());
+
+	GtkMenuItem * item = GTK_MENU_ITEM(gtk_menu_item_new_with_label("Test Label"));
+	gtk_menu_shell_append(GTK_MENU_SHELL(menu), GTK_WIDGET(item));
+	gtk_widget_show(GTK_WIDGET(item));
+
+	app_indicator_set_menu(ci, menu);
+
+	g_assert(app_indicator_get_menu(ci) != NULL);
+
+	GValue serverval = {0};
+	g_value_init(&serverval, DBUSMENU_TYPE_SERVER);
+	g_object_get_property(G_OBJECT(ci), "dbus-menu-server", &serverval);
+
+	DbusmenuServer * server = DBUSMENU_SERVER(g_value_get_object(&serverval));
+	g_assert(server != NULL);
+
+	GValue rootval = {0};
+	g_value_init(&rootval, DBUSMENU_TYPE_MENUITEM);
+	g_object_get_property(G_OBJECT(server), DBUSMENU_SERVER_PROP_ROOT_NODE, &rootval);
+	DbusmenuMenuitem * root = DBUSMENU_MENUITEM(g_value_get_object(&rootval));
+	g_assert(root != NULL);
+
+	GList * children = dbusmenu_menuitem_get_children(root);
+	g_assert(children != NULL);
+	g_assert(g_list_length(children) == 1);
+
+	const gchar * label = dbusmenu_menuitem_property_get(DBUSMENU_MENUITEM(children->data), DBUSMENU_MENUITEM_PROP_LABEL);
+	g_assert(label != NULL);
+	g_assert(g_strcmp0(label, "Test Label") == 0);
+
+	/* Interesting, eh?  We need this because we send out events on the bus
+	   but they don't come back until the idle is run.  So we need those
+	   events to clear before removing the object */
+	while (g_main_context_pending(NULL)) {
+		g_main_context_iteration(NULL, TRUE);
+	}
+
+	g_object_unref(G_OBJECT(ci));
+	return;
+}
+
+void
 label_signals_cb (AppIndicator * appindicator, gchar * label, gchar * guide, gpointer user_data)
 {
 	gint * label_signals_count = (gint *)user_data;
@@ -301,6 +355,7 @@
 	g_test_add_func ("/indicator-application/libappindicator/init_set_props",  test_libappindicator_init_set_props);
 	g_test_add_func ("/indicator-application/libappindicator/prop_signals",    test_libappindicator_prop_signals);
 	g_test_add_func ("/indicator-application/libappindicator/set_label",       test_libappindicator_set_label);
+	g_test_add_func ("/indicator-application/libappindicator/set_menu",        test_libappindicator_set_menu);
 	g_test_add_func ("/indicator-application/libappindicator/label_signals",   test_libappindicator_label_signals);
 
 	return;


Follow ups