← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~ted/indicator-appmenu/dbus-api-migration into lp:indicator-appmenu

 

Ted Gould has proposed merging lp:~ted/indicator-appmenu/dbus-api-migration into lp:indicator-appmenu.

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


This migrates Indicator Appmenu over to the "AppMenu" Dbus API.
-- 
https://code.launchpad.net/~ted/indicator-appmenu/dbus-api-migration/+merge/30474
Your team ayatana-commits is subscribed to branch lp:indicator-appmenu.
=== modified file 'scripts/menu-pusher.c'
--- scripts/menu-pusher.c	2010-06-21 20:42:00 +0000
+++ scripts/menu-pusher.c	2010-07-20 21:51:16 +0000
@@ -79,7 +79,7 @@
 	DBusGProxy * proxy = dbus_g_proxy_new_for_name_owner(session, DBUS_NAME, REG_OBJECT, REG_IFACE, NULL);
 	g_return_val_if_fail(proxy != NULL, 1);
 
-	org_ayatana_WindowMenu_Registrar_register_window(proxy, 0, "/this/is/a/long/object/path", NULL);
+	org_ayatana_AppMenu_Registrar_register_window(proxy, 0, "/this/is/a/long/object/path", NULL);
 
 	gtk_main();
 

=== modified file 'src/Makefile.am'
--- src/Makefile.am	2010-06-01 16:38:23 +0000
+++ src/Makefile.am	2010-07-20 21:51:16 +0000
@@ -35,7 +35,7 @@
 ######################################
 
 DBUS_SPECS = \
-	application-menu-debug.xml \
+	application-menu-renderer.xml \
 	application-menu-registrar.xml
 
 %-client.h: %.xml

=== modified file 'src/application-menu-registrar.xml'
--- src/application-menu-registrar.xml	2010-05-07 09:14:49 +0000
+++ src/application-menu-registrar.xml	2010-07-20 21:51:16 +0000
@@ -1,13 +1,83 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<node name="/">
-	<interface name="org.ayatana.WindowMenu.Registrar">
-
-<!-- Methods -->
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd";>
+<node xmlns:dox="http://www.ayatana.org/dbus/dox.dtd";>
+	<dox:d><![CDATA[
+	  @mainpage
+	 
+	  An interface to register menus that are associated with a window in an application.  The
+	  main interface is docuemented here: @ref org::ayatana::AppMenu::Registrar.
+	    
+	  The actual menus are transported using the dbusmenu protocol which is available
+	  here: @ref org::ayatana::dbusmenu.
+	]]></dox:d>
+	<interface name="org.ayatana.AppMenu.Registrar">
+		<dox:d>
+		  An interface to register a menu from an application's window to be displayed in another
+		  window.  This manages that association between XWindow Window IDs and the dbus
+		  address and object that provides the menu using the dbusmenu dbus interface.
+		</dox:d>
 		<method name="RegisterWindow">
 			<annotation name="org.freedesktop.DBus.GLib.Async" value="true" />
-			<arg type="u" name="windowID" direction="in" />
-			<arg type="o" name="path" direction="in" />
-		</method>
-
+			<dox:d><![CDATA[
+			  Associates a dbusmenu with a window
+	     
+			  /note this method assumes that the connection from the caller is the DBus connection
+			    to use for the object.  Applications that use multiple DBus connections will need to
+			    ensure this method is called with the same connection that implmenets the object.
+			]]></dox:d>
+			<arg name="windowId" type="u" direction="in">
+				<dox:d>The XWindow ID of the window</dox:d>
+			</arg>
+			<arg name="menuObjectPath" type="o" direction="in">
+				<dox:d>The object on the dbus interface implementing the dbusmenu interface</dox:d>
+			</arg>
+		</method>
+		<method name="UnregisterWindow">
+			<dox:d>
+			  A method to allow removing a window from the database.  Windows will also be removed
+			  when the client drops off DBus so this is not required.  It is polite though.  And
+			  important for testing.
+			</dox:d>
+			<arg name="windowId" type="u" direction="in">
+				<dox:d>The XWindow ID of the window</dox:d>
+			</arg>
+		</method>
+		<method name="GetMenuForWindow">
+			<dox:d>Gets the registered menu for a given window ID.</dox:d>
+			<arg name="windowId" type="u" direction="in">
+				<dox:d>The XWindow ID of the window to get</dox:d>
+			</arg>
+			<arg name="service" type="s" direction="out">
+				<dox:d>The address of the connection on DBus (e.g. :1.23 or org.example.service)</dox:d>
+			</arg>
+			<arg name="menuObjectPath" type="o" direction="out">
+				<dox:d>The path to the object which implements the org.ayatana.dbusmenu interface.</dox:d>
+			</arg>
+		</method>
+		<method name="GetMenus">
+			<annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="MenuInfoList"/>
+			<dox:d>Gets the information on all menus that the registrar knows about.  This
+			  is useful for debugging or bringing up a new renderer.</dox:d>
+			<arg name="menus" type="a(uso)" direction="out">
+				<dox:d>An array of structures containing the same parameters as @GetMenuForWindow.  Window ID, Service and ObjectPath.</dox:d>
+			</arg>
+		</method>
+		<signal name="WindowRegistered">
+			<dox:d>Signals when the registrar gets a new menu registered</dox:d>
+			<arg name="windowId" type="u" direction="out">
+				<dox:d>The XWindow ID of the window</dox:d>
+			</arg>
+			<arg name="service" type="s" direction="out">
+				<dox:d>The address of the connection on DBus (e.g. :1.23 or org.example.service)</dox:d>
+			</arg>
+			<arg name="menuObjectPath" type="o" direction="out">
+				<dox:d>The path to the object which implements the org.ayatana.dbusmenu interface.</dox:d>
+			</arg>
+		</signal>
+		<signal name="WindowUnregistered">
+			<dox:d>Signals when the registrar removes a menu registration</dox:d>
+			<arg name="windowId" type="u" direction="out">
+				<dox:d>The XWindow ID of the window</dox:d>
+			</arg>
+		</signal>
 	</interface>
 </node>

=== renamed file 'src/application-menu-debug.xml' => 'src/application-menu-renderer.xml'
--- src/application-menu-debug.xml	2010-07-01 18:16:57 +0000
+++ src/application-menu-renderer.xml	2010-07-20 21:51:16 +0000
@@ -1,20 +1,61 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<node name="/">
-	<interface name="org.ayatana.AppMenu.Debug">
-
-<!-- Methods -->
-		<method name="CurrentMenu">
-			<arg type="u" name="windowID" direction="out" />
-			<arg type="o" name="path" direction="out" />
-			<arg type="s" name="address" direction="out" />
-		</method>
-		<method name="AllMenus">
-			<arg type="a(uos)" name="menus" direction="out" />
-		</method>
-		<method name="JSONDump">
-			<arg type="u" name="windowID" direction="in" />
-			<arg type="s" name="menu-json" direction="out" />
-		</method>
-
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd";>
+<node name="/org/ayatana/AppMenu/Renderer">
+	<dox:d><![CDATA[
+	  @mainpage
+	 
+	  A representation of the process used to render a menu into something visible
+	  to the user.  Many times this will be combined with a Registrar
+	  (@ref org::ayatana::AppMenu::Registrar) but that is not required.  The interface
+	  implemented by the Renderer is here: @ref org::ayatana::AppMenu::Registrar and
+	  used mostly for debugging the status of and testing the renderers.
+	    
+	  The actual menus are transported using the dbusmenu protocol which is available
+	  here: @ref org::ayatana::dbusmenu.
+	]]></dox:d>
+	<interface name="org.ayatana.AppMenu.Renderer">
+		<dox:d>
+		  An interface to register a menu from an application's window to be displayed in another
+		  window.  This manages that association between XWindow Window IDs and the dbus
+		  address and object that provides the menu using the dbusmenu dbus interface.
+		</dox:d>
+		<method name="GetCurrentMenu">
+			<dox:d>Get the location of the menu currently being displayed to the user.</dox:d>
+			<arg name="service" type="s" direction="out">
+				<dox:d>The address of the connection on DBus (e.g. :1.23 or org.example.service)</dox:d>
+			</arg>
+			<arg name="menuObjectPath" type="o" direction="out">
+				<dox:d>The path to the object which implements the org.ayatana.dbusmenu interface.</dox:d>
+			</arg>
+		</method>
+		<method name="ActivateMenuItem">
+			<dox:d>Activate menus via DBus</dox:d>
+			<annotation name="com.trolltech.QtDBus.QtTypeName.In0" value="QList&lt;int&gt;"/>
+			<arg name="menuItemPath" type="ai" direction="in">
+				<dox:d>
+				  An array of indexes of how to get to the menu item to activate.  The list only
+				  includes menu items that are visible to the user.  So if the array was something
+				  like [1, 2] it would be the first submenu, second item as if you looked at the
+				  menu using a mouse.
+				</dox:d>
+			</arg>
+		</method>
+		<method name="DumpCurrentMenu">
+			<dox:d>Turns the currently displayed menu into a JSON representation</dox:d>
+			<arg name="json" type="s" direction="out">
+				<dox:d>
+				  JSON describing the menu structure rendered by the renderer.  The format is
+				  described in the website https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationMenuXdTests#JSON%20format
+				</dox:d>
+			</arg>
+		</method>
+		<method name="DumpMenu">
+			<dox:d>Dumps JSON data describing the menus from a specific window.</dox:d>
+			<arg name="windowId" type="u" direction="in">
+				<dox:d>The XWindow ID of the window to get</dox:d>
+			</arg>
+			<arg name="json" type="s" direction="out">
+				<dox:d>JSON describing the menu structure rendered by the renderer.  Look at @DumpCurrentMenu for more information.</dox:d>
+			</arg>
+		</method>
 	</interface>
 </node>

=== modified file 'src/dbus-shared.h'
--- src/dbus-shared.h	2010-06-01 16:28:51 +0000
+++ src/dbus-shared.h	2010-07-20 21:51:16 +0000
@@ -20,11 +20,11 @@
 */
 
 
-#define  DBUS_NAME   "org.ayatana.WindowMenu.Registrar"
-
-#define  REG_IFACE  "org.ayatana.WindowMenu.Registrar"
-#define  REG_OBJECT "/org/ayatana/WindowMenu/Registrar"
-
-#define  DEBUG_IFACE   "org.ayatana.AppMenu.Debug"
-#define  DEBUG_OBJECT "/org/ayatana/AppMenu/Debug"
+#define  DBUS_NAME   "org.ayatana.AppMenu.Registrar"
+
+#define  REG_IFACE  "org.ayatana.AppMenu.Registrar"
+#define  REG_OBJECT "/org/ayatana/AppMenu/Registrar"
+
+#define  DEBUG_IFACE   "org.ayatana.AppMenu.Renderer"
+#define  DEBUG_OBJECT "/org/ayatana/AppMenu/Renderer"
 

=== modified file 'src/indicator-appmenu-marshal.list'
--- src/indicator-appmenu-marshal.list	2010-05-07 08:49:13 +0000
+++ src/indicator-appmenu-marshal.list	2010-07-20 21:51:16 +0000
@@ -1,1 +1,2 @@
-VOID: UINT, STRING
+VOID: UINT, STRING, BOXED
+VOID: UINT

=== modified file 'src/indicator-appmenu.c'
--- src/indicator-appmenu.c	2010-07-10 04:40:29 +0000
+++ src/indicator-appmenu.c	2010-07-20 21:51:16 +0000
@@ -63,8 +63,8 @@
 struct _IndicatorAppmenuClass {
 	IndicatorObjectClass parent_class;
 
-	void (*window_registered) (IndicatorAppmenu * iapp, guint wid, gchar * path, gpointer user_data);
-	void (*window_unregistered) (IndicatorAppmenu * iapp, guint wid, gchar * path, gpointer user_data);
+	void (*window_registered) (IndicatorAppmenu * iapp, guint wid, gchar * address, gpointer path, gpointer user_data);
+	void (*window_unregistered) (IndicatorAppmenu * iapp, guint wid, gpointer user_data);
 };
 
 struct _IndicatorAppmenu {
@@ -129,6 +129,17 @@
                                                                       guint windowid,
                                                                       const gchar * objectpath,
                                                                       DBusGMethodInvocation * method);
+static gboolean _application_menu_registrar_server_unregister_window (IndicatorAppmenu * iapp,
+                                                                      guint windowid,
+                                                                      GError ** error);
+static gboolean _application_menu_registrar_server_get_menu_for_window (IndicatorAppmenu * iapp,
+                                                                      guint windowid,
+                                                                      gchar ** objectpath,
+                                                                      gchar ** address,
+                                                                      GError ** error);
+static gboolean _application_menu_registrar_server_get_menus         (IndicatorAppmenu * iapp,
+                                                                      GPtrArray ** entries,
+                                                                      GError ** error);
 static void request_name_cb                                          (DBusGProxy *proxy,
                                                                       guint result,
                                                                       GError *error,
@@ -143,24 +154,34 @@
                                                                       BamfView * oldview,
                                                                       BamfView * newview,
                                                                       gpointer user_data);
-static gboolean _application_menu_debug_server_current_menu          (IndicatorAppmenuDebug * iappd,
-                                                                      guint * windowid,
+static gboolean _application_menu_renderer_server_get_current_menu   (IndicatorAppmenuDebug * iappd,
                                                                       gchar ** objectpath,
                                                                       gchar ** address,
                                                                       GError ** error);
-static gboolean _application_menu_debug_server_all_menus             (IndicatorAppmenuDebug * iappd,
-                                                                      GPtrArray ** entries,
-                                                                      GError ** error);
-static gboolean _application_menu_debug_server_j_so_ndump            (IndicatorAppmenuDebug * iappd,
+static gboolean _application_menu_renderer_server_activate_menu_item (IndicatorAppmenuDebug * iappd,
+                                                                      GArray * menulist,
+                                                                      GError ** error);
+static gboolean _application_menu_renderer_server_dump_current_menu  (IndicatorAppmenuDebug * iappd,
+                                                                      gchar ** jsondata,
+                                                                      GError ** error);
+static gboolean _application_menu_renderer_server_dump_menu          (IndicatorAppmenuDebug * iappd,
                                                                       guint windowid,
                                                                       gchar ** jsondata,
                                                                       GError ** error);
+static GQuark error_quark                                            (void);
+
+/* Unique error codes for debug interface */
+enum {
+	ERROR_NO_APPLICATIONS,
+	ERROR_NO_DEFAULT_APP,
+	ERROR_WINDOW_NOT_FOUND
+};
 
 /**********************
   DBus Interfaces
  **********************/
 #include "application-menu-registrar-server.h"
-#include "application-menu-debug-server.h"
+#include "application-menu-renderer-server.h"
 
 enum {
 	WINDOW_REGISTERED,
@@ -191,15 +212,15 @@
 	                                      G_SIGNAL_RUN_LAST,
 	                                      G_STRUCT_OFFSET (IndicatorAppmenuClass, window_registered),
 	                                      NULL, NULL,
-	                                      _indicator_appmenu_marshal_VOID__UINT_STRING,
-	                                      G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_STRING);
+	                                      _indicator_appmenu_marshal_VOID__UINT_STRING_BOXED,
+	                                      G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_STRING, DBUS_TYPE_G_OBJECT_PATH);
 	signals[WINDOW_UNREGISTERED] =  g_signal_new("window-unregistered",
 	                                      G_TYPE_FROM_CLASS(klass),
 	                                      G_SIGNAL_RUN_LAST,
 	                                      G_STRUCT_OFFSET (IndicatorAppmenuClass, window_unregistered),
 	                                      NULL, NULL,
-	                                      _indicator_appmenu_marshal_VOID__UINT_STRING,
-	                                      G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_STRING);
+	                                      _indicator_appmenu_marshal_VOID__UINT,
+	                                      G_TYPE_NONE, 1, G_TYPE_UINT);
 
 	dbus_g_object_type_install_info(INDICATOR_APPMENU_TYPE, &dbus_glib__application_menu_registrar_server_object_info);
 
@@ -320,7 +341,7 @@
 static void
 indicator_appmenu_debug_class_init (IndicatorAppmenuDebugClass *klass)
 {
-	dbus_g_object_type_install_info(INDICATOR_APPMENU_DEBUG_TYPE, &dbus_glib__application_menu_debug_server_object_info);
+	dbus_g_object_type_install_info(INDICATOR_APPMENU_DEBUG_TYPE, &dbus_glib__application_menu_renderer_server_object_info);
 
 	return;
 }
@@ -674,17 +695,18 @@
 static gboolean
 _application_menu_registrar_server_register_window (IndicatorAppmenu * iapp, guint windowid, const gchar * objectpath, DBusGMethodInvocation * method)
 {
-	g_debug("Registering window ID %d with path %s from %s", windowid, objectpath, dbus_g_method_get_sender(method));
+	const gchar * sender = dbus_g_method_get_sender(method);
+	g_debug("Registering window ID %d with path %s from %s", windowid, objectpath, sender);
 
 	if (g_hash_table_lookup(iapp->apps, GUINT_TO_POINTER(windowid)) == NULL && windowid != 0) {
-		WindowMenus * wm = window_menus_new(windowid, dbus_g_method_get_sender(method), objectpath);
+		WindowMenus * wm = window_menus_new(windowid, sender, objectpath);
 		g_return_val_if_fail(wm != NULL, FALSE);
 
 		g_signal_connect(G_OBJECT(wm), WINDOW_MENUS_SIGNAL_DESTROY, G_CALLBACK(menus_destroyed), iapp);
 
 		g_hash_table_insert(iapp->apps, GUINT_TO_POINTER(windowid), wm);
 
-		g_signal_emit(G_OBJECT(iapp), signals[WINDOW_REGISTERED], 0, windowid, objectpath, TRUE);
+		g_signal_emit(G_OBJECT(iapp), signals[WINDOW_REGISTERED], 0, windowid, sender, objectpath, TRUE);
 
 		/* Note: Does not cause ref */
 		BamfWindow * win = bamf_matcher_get_active_window(iapp->matcher);
@@ -692,9 +714,9 @@
 		active_window_changed(iapp->matcher, NULL, BAMF_VIEW(win), iapp);
 	} else {
 		if (windowid == 0) {
-			g_warning("Can't build windows for a NULL window ID %d with path %s from %s", windowid, objectpath, dbus_g_method_get_sender(method));
+			g_warning("Can't build windows for a NULL window ID %d with path %s from %s", windowid, objectpath, sender);
 		} else {
-			g_warning("Already have a menu for window ID %d with path %s from %s", windowid, objectpath, dbus_g_method_get_sender(method));
+			g_warning("Already have a menu for window ID %d with path %s from %s", windowid, objectpath, sender);
 		}
 	}
 
@@ -702,6 +724,80 @@
 	return TRUE;
 }
 
+/* Kindly remove an entry from our DB */
+static gboolean
+_application_menu_registrar_server_unregister_window (IndicatorAppmenu * iapp, guint windowid, GError ** error)
+{
+	/* TODO: Do it */
+
+	return FALSE;
+}
+
+/* Grab the menu information for a specific window */
+static gboolean
+_application_menu_registrar_server_get_menu_for_window (IndicatorAppmenu * iapp, guint windowid, gchar ** objectpath, gchar ** address, GError ** error)
+{
+	WindowMenus * wm = NULL;
+
+	if (windowid == 0) {
+		wm = iapp->default_app;
+	} else {
+		wm = WINDOW_MENUS(g_hash_table_lookup(iapp->apps, GUINT_TO_POINTER(windowid)));
+	}
+
+	if (wm == NULL) {
+		g_set_error_literal(error, error_quark(), ERROR_WINDOW_NOT_FOUND, "Window not found");
+		return FALSE;
+	}
+
+	*objectpath = window_menus_get_path(wm);
+	*address = window_menus_get_address(wm);
+
+	return TRUE;
+}
+
+/* Get all the menus we have */
+static gboolean
+_application_menu_registrar_server_get_menus (IndicatorAppmenu * iapp, GPtrArray ** entries, GError ** error)
+{
+	if (iapp->apps == NULL) {
+		g_set_error_literal(error, error_quark(), ERROR_NO_APPLICATIONS, "No applications are registered");
+		return FALSE;
+	}
+
+	*entries = g_ptr_array_new();
+
+	GList * appkeys = NULL;
+	for (appkeys = g_hash_table_get_keys(iapp->apps); appkeys != NULL; appkeys = g_list_next(appkeys)) {
+		GValueArray * structval = g_value_array_new(3);
+		gpointer hash_val = g_hash_table_lookup(iapp->apps, appkeys->data);
+
+		if (hash_val == NULL) { continue; }
+
+		GValue winid = {0};
+		g_value_init(&winid, G_TYPE_UINT);
+		g_value_set_uint(&winid, window_menus_get_xid(WINDOW_MENUS(hash_val)));
+		g_value_array_append(structval, &winid);
+		g_value_unset(&winid);
+
+		GValue path = {0};
+		g_value_init(&path, DBUS_TYPE_G_OBJECT_PATH);
+		g_value_take_boxed(&path, window_menus_get_path(WINDOW_MENUS(hash_val)));
+		g_value_array_append(structval, &path);
+		g_value_unset(&path);
+
+		GValue address = {0};
+		g_value_init(&address, G_TYPE_STRING);
+		g_value_take_string(&address, window_menus_get_address(WINDOW_MENUS(hash_val)));
+		g_value_array_append(structval, &address);
+		g_value_unset(&address);
+
+		g_ptr_array_add(*entries, structval);
+	}
+
+	return TRUE;
+}
+
 /* Response to whether we got our name or not */
 static void
 request_name_cb (DBusGProxy *proxy, guint result, GError * inerror, gpointer userdata)
@@ -763,75 +859,6 @@
 	return error_quark;
 }
 
-/* Unique error codes for debug interface */
-enum {
-	ERROR_NO_APPLICATIONS,
-	ERROR_NO_DEFAULT_APP,
-	ERROR_WINDOW_NOT_FOUND
-};
-
-/* Get the current menu */
-static gboolean
-_application_menu_debug_server_current_menu (IndicatorAppmenuDebug * iappd, guint * windowid, gchar ** objectpath, gchar ** address, GError ** error)
-{
-	IndicatorAppmenu * iapp = iappd->appmenu;
-
-	if (iapp->default_app == NULL) {
-		g_set_error_literal(error, error_quark(), ERROR_NO_DEFAULT_APP, "Not currently showing an application");
-		return FALSE;
-	}
-
-	*windowid = window_menus_get_xid(iapp->default_app);
-	*objectpath = window_menus_get_path(iapp->default_app);
-	*address = window_menus_get_address(iapp->default_app);
-
-	return TRUE;
-}
-
-/* Get all the menus we have */
-static gboolean
-_application_menu_debug_server_all_menus(IndicatorAppmenuDebug * iappd, GPtrArray ** entries, GError ** error)
-{
-	IndicatorAppmenu * iapp = iappd->appmenu;
-
-	if (iapp->apps == NULL) {
-		g_set_error_literal(error, error_quark(), ERROR_NO_APPLICATIONS, "No applications are registered");
-		return FALSE;
-	}
-
-	*entries = g_ptr_array_new();
-
-	GList * appkeys = NULL;
-	for (appkeys = g_hash_table_get_keys(iapp->apps); appkeys != NULL; appkeys = g_list_next(appkeys)) {
-		GValueArray * structval = g_value_array_new(3);
-		gpointer hash_val = g_hash_table_lookup(iapp->apps, appkeys->data);
-
-		if (hash_val == NULL) { continue; }
-
-		GValue winid = {0};
-		g_value_init(&winid, G_TYPE_UINT);
-		g_value_set_uint(&winid, window_menus_get_xid(WINDOW_MENUS(hash_val)));
-		g_value_array_append(structval, &winid);
-		g_value_unset(&winid);
-
-		GValue path = {0};
-		g_value_init(&path, DBUS_TYPE_G_OBJECT_PATH);
-		g_value_take_boxed(&path, window_menus_get_path(WINDOW_MENUS(hash_val)));
-		g_value_array_append(structval, &path);
-		g_value_unset(&path);
-
-		GValue address = {0};
-		g_value_init(&address, G_TYPE_STRING);
-		g_value_take_string(&address, window_menus_get_address(WINDOW_MENUS(hash_val)));
-		g_value_array_append(structval, &address);
-		g_value_unset(&address);
-
-		g_ptr_array_add(*entries, structval);
-	}
-
-	return TRUE;
-}
-
 /* Looks to see if we can find an accel label to steal the
    closure from */
 static void
@@ -1040,9 +1067,42 @@
 	return;
 }
 
-/* Make JSON out of our menus */
-static gboolean
-_application_menu_debug_server_j_so_ndump (IndicatorAppmenuDebug * iappd, guint windowid, gchar ** jsondata, GError ** error)
+/* Grab the location of the dbusmenu of the current menu */
+static gboolean
+_application_menu_renderer_server_get_current_menu (IndicatorAppmenuDebug * iappd, gchar ** objectpath, gchar ** address, GError ** error)
+{
+	IndicatorAppmenu * iapp = iappd->appmenu;
+
+	if (iapp->default_app == NULL) {
+		g_set_error_literal(error, error_quark(), ERROR_NO_DEFAULT_APP, "Not currently showing an application");
+		return FALSE;
+	}
+
+	*objectpath = window_menus_get_path(iapp->default_app);
+	*address = window_menus_get_address(iapp->default_app);
+
+	return TRUE;
+}
+
+/* Activate menu items through a script given as a parameter */
+static gboolean
+_application_menu_renderer_server_activate_menu_item (IndicatorAppmenuDebug * iappd, GArray * menulist, GError ** error)
+{
+	/* TODO: Do it */
+
+	return FALSE;
+}
+
+/* Dump the current menu to a JSON file */
+static gboolean
+_application_menu_renderer_server_dump_current_menu  (IndicatorAppmenuDebug * iappd, gchar ** jsondata, GError ** error)
+{
+	return _application_menu_renderer_server_dump_menu(iappd, 0, jsondata, error);
+}
+
+/* Dump a specific window's menus to a JSON file */
+static gboolean
+_application_menu_renderer_server_dump_menu (IndicatorAppmenuDebug * iappd, guint windowid, gchar ** jsondata, GError ** error)
 {
 	IndicatorAppmenu * iapp = iappd->appmenu;
 	WindowMenus * wm = NULL;
@@ -1109,3 +1169,4 @@
 
 	return TRUE;
 }
+

=== modified file 'tools/mock-json-app.c'
--- tools/mock-json-app.c	2010-06-29 22:17:00 +0000
+++ tools/mock-json-app.c	2010-07-20 21:51:16 +0000
@@ -57,7 +57,7 @@
 		return;
 	}
 
-	org_ayatana_WindowMenu_Registrar_register_window_async(registrar, GDK_WINDOW_XID (gtk_widget_get_window (window)), MENU_PATH, register_cb, NULL);
+	org_ayatana_AppMenu_Registrar_register_window_async(registrar, GDK_WINDOW_XID (gtk_widget_get_window (window)), MENU_PATH, register_cb, NULL);
 
 	return;
 }
@@ -75,7 +75,7 @@
 	registrar = dbus_g_proxy_new_for_name(session_bus, DBUS_NAME, REG_OBJECT, REG_IFACE);
 	g_return_val_if_fail(registrar != NULL, FALSE);
 
-	org_ayatana_WindowMenu_Registrar_register_window_async(registrar, GDK_WINDOW_XID (gtk_widget_get_window (window)), MENU_PATH, register_cb, NULL);
+	org_ayatana_AppMenu_Registrar_register_window_async(registrar, GDK_WINDOW_XID (gtk_widget_get_window (window)), MENU_PATH, register_cb, NULL);
 
 	DBusGProxy * dbus_proxy = dbus_g_proxy_new_for_name(session_bus,
 		                                                DBUS_SERVICE_DBUS,


Follow ups