[gnome-settings-daemon] xrandr: Port to GDBus



commit 2335eacfa2f6d449133705d5bca9f91a93316529
Author: Bastien Nocera <hadess hadess net>
Date:   Wed Nov 17 02:34:07 2010 +0000

    xrandr: Port to GDBus
    
    And remove the obsolete v1 D-Bus interface.

 plugins/xrandr/Makefile.am            |   11 +--
 plugins/xrandr/gsd-xrandr-manager.c   |  186 ++++++++++++++++++++++-----------
 plugins/xrandr/gsd-xrandr-manager.xml |   31 ------
 3 files changed, 125 insertions(+), 103 deletions(-)
---
diff --git a/plugins/xrandr/Makefile.am b/plugins/xrandr/Makefile.am
index d1acc22..29451e0 100644
--- a/plugins/xrandr/Makefile.am
+++ b/plugins/xrandr/Makefile.am
@@ -1,9 +1,6 @@
 icondir = $(datadir)/icons/hicolor
 context = apps
 
-BUILT_SOURCES =				\
-	gsd-xrandr-manager-glue.h
-
 ICON_FILES = 			\
 	gsd-xrandr-16.png	\
 	gsd-xrandr-22.png	\
@@ -34,13 +31,7 @@ uninstall-local:
 plugin_LTLIBRARIES = \
 	libxrandr.la
 
-gsd-xrandr-manager-glue.h: gsd-xrandr-manager.xml Makefile
-	$(AM_V_GEN) dbus-binding-tool --prefix=gsd_xrandr_manager --mode=glib-server $< > xgen-$(@F) \
-	&& ( cmp -s xgen-$(@F) $@ || cp xgen-$(@F) $@ ) \
-	&& rm -f xgen-$(@F)
-
 libxrandr_la_SOURCES = 		\
-	$(BUILT_SOURCES)	\
 	gsd-xrandr-plugin.h	\
 	gsd-xrandr-plugin.c	\
 	gsd-xrandr-manager.h	\
@@ -73,7 +64,7 @@ plugin_in_files =			\
 plugin_DATA = $(plugin_in_files:.gnome-settings-plugin.in=.gnome-settings-plugin)
 
 EXTRA_DIST = $(plugin_in_files) $(ICON_FILES) gsd-xrandr-manager.xml
-CLEANFILES = $(plugin_DATA) $(BUILT_SOURCES)
+CLEANFILES = $(plugin_DATA)
 DISTCLEANFILES = $(plugin_DATA)
 
 @GSD_INTLTOOL_PLUGIN_RULE@
diff --git a/plugins/xrandr/gsd-xrandr-manager.c b/plugins/xrandr/gsd-xrandr-manager.c
index 8197c31..05f4052 100644
--- a/plugins/xrandr/gsd-xrandr-manager.c
+++ b/plugins/xrandr/gsd-xrandr-manager.c
@@ -38,7 +38,6 @@
 #include <gdk/gdk.h>
 #include <gdk/gdkx.h>
 #include <gtk/gtk.h>
-#include <dbus/dbus-glib.h>
 
 #define GNOME_DESKTOP_USE_UNSTABLE_API
 
@@ -71,14 +70,38 @@
 #define GSD_XRANDR_DBUS_PATH GSD_DBUS_PATH "/XRANDR"
 #define GSD_XRANDR_DBUS_NAME GSD_DBUS_NAME ".XRANDR"
 
+static const gchar introspection_xml[] =
+"<node>"
+"  <interface name='org.gnome.SettingsDaemon.XRANDR_2'>"
+"    <annotation name='org.freedesktop.DBus.GLib.CSymbol' value='gsd_xrandr_manager_2'/>"
+"    <method name='ApplyConfiguration'>"
+"      <!-- transient-parent window for the confirmation dialog; use 0"
+"      for no parent -->"
+"      <arg name='parent_window_id' type='x' direction='in'/>"
+""
+"      <!-- Timestamp used to present the confirmation dialog and (in"
+"      the future) for the RANDR calls themselves -->"
+"      <arg name='timestamp' type='x' direction='in'/>"
+"    </method>"
+"    <method name='VideoModeSwitch'>"
+"       <!-- Timestamp for the RANDR call itself -->"
+"       <arg name='timestamp' type='x' direction='in'/>"
+"    </method>"
+"    <method name='Rotate'>"
+"       <!-- Timestamp for the RANDR call itself -->"
+"       <arg name='timestamp' type='x' direction='in'/>"
+"    </method>"
+"  </interface>"
+"</node>";
+
 struct GsdXrandrManagerPrivate
 {
-        DBusGConnection *dbus_connection;
-
         GnomeRRScreen *rw_screen;
         gboolean running;
 
-        GSettings *settings;
+        GSettings       *settings;
+        GDBusNodeInfo   *introspection_data;
+        guint            owner_id;
 
         /* fn-F7 status */
         int             current_fn_f7_config;             /* -1 if no configs */
@@ -572,14 +595,6 @@ out:
         return result;
 }
 
-/* DBus method for org.gnome.SettingsDaemon.XRANDR ApplyConfiguration; see gsd-xrandr-manager.xml for the interface definition */
-static gboolean
-gsd_xrandr_manager_apply_configuration (GsdXrandrManager *manager,
-                                        GError          **error)
-{
-        return try_to_apply_intended_configuration (manager, NULL, GDK_CURRENT_TIME, error);
-}
-
 /* DBus method for org.gnome.SettingsDaemon.XRANDR_2 ApplyConfiguration; see gsd-xrandr-manager.xml for the interface definition */
 static gboolean
 gsd_xrandr_manager_2_apply_configuration (GsdXrandrManager *manager,
@@ -606,26 +621,23 @@ gsd_xrandr_manager_2_apply_configuration (GsdXrandrManager *manager,
 /* DBus method for org.gnome.SettingsDaemon.XRANDR_2 VideoModeSwitch; see gsd-xrandr-manager.xml for the interface definition */
 static gboolean
 gsd_xrandr_manager_2_video_mode_switch (GsdXrandrManager *manager,
-					guint32           timestamp,
-					GError          **error)
+                                        guint32           timestamp,
+                                        GError          **error)
 {
-	handle_fn_f7 (manager, timestamp);
-	return TRUE;
+        handle_fn_f7 (manager, timestamp);
+        return TRUE;
 }
 
 /* DBus method for org.gnome.SettingsDaemon.XRANDR_2 Rotate; see gsd-xrandr-manager.xml for the interface definition */
 static gboolean
 gsd_xrandr_manager_2_rotate (GsdXrandrManager *manager,
-			     guint32           timestamp,
-			     GError          **error)
+                             guint32           timestamp,
+                             GError          **error)
 {
-	handle_rotate_windows (manager, timestamp);
-	return TRUE;
+        handle_rotate_windows (manager, timestamp);
+        return TRUE;
 }
 
-/* We include this after the definition of gsd_xrandr_manager_* D-Bus methods so the prototype will already exist */
-#include "gsd-xrandr-manager-glue.h"
-
 static gboolean
 is_laptop (GnomeRRScreen *screen, GnomeOutputInfo *output)
 {
@@ -1605,22 +1617,22 @@ apply_default_boot_configuration (GsdXrandrManager *mgr, guint32 timestamp)
         boot = g_settings_get_enum (priv->settings, CONF_KEY_DEFAULT_MONITORS_SETUP);
 
         switch (boot) {
-	case GSD_XRANDR_BOOT_BEHAVIOUR_DO_NOTHING:
-		return;
-	case GSD_XRANDR_BOOT_BEHAVIOUR_CLONE:
-		config = make_clone_setup (screen);
-		break;
-	case GSD_XRANDR_BOOT_BEHAVIOUR_DOCK:
-		config = make_other_setup (screen);
-		break;
-	default:
-		g_assert_not_reached ();
-	}
-
-	if (config) {
-		apply_configuration_and_display_error (mgr, config, timestamp);
-		gnome_rr_config_free (config);
-	}
+        case GSD_XRANDR_BOOT_BEHAVIOUR_DO_NOTHING:
+                return;
+        case GSD_XRANDR_BOOT_BEHAVIOUR_CLONE:
+                config = make_clone_setup (screen);
+                break;
+        case GSD_XRANDR_BOOT_BEHAVIOUR_DOCK:
+                config = make_other_setup (screen);
+                break;
+        default:
+                g_assert_not_reached ();
+        }
+
+        if (config) {
+                apply_configuration_and_display_error (mgr, config, timestamp);
+                gnome_rr_config_free (config);
+        }
 }
 
 static gboolean
@@ -1727,7 +1739,7 @@ gsd_xrandr_manager_start (GsdXrandrManager *manager,
         show_timestamps_dialog (manager, "Startup");
         if (!apply_stored_configuration_at_startup (manager, GDK_CURRENT_TIME)) /* we don't have a real timestamp at startup anyway */
                 if (!apply_default_configuration_from_file (manager, GDK_CURRENT_TIME))
-			apply_default_boot_configuration (manager, GDK_CURRENT_TIME);
+                        apply_default_boot_configuration (manager, GDK_CURRENT_TIME);
 
         log_msg ("State of screen after initial configuration:\n");
         log_screen (manager->priv->rw_screen);
@@ -1756,11 +1768,6 @@ gsd_xrandr_manager_stop (GsdXrandrManager *manager)
                 manager->priv->rw_screen = NULL;
         }
 
-        if (manager->priv->dbus_connection != NULL) {
-                dbus_g_connection_unref (manager->priv->dbus_connection);
-                manager->priv->dbus_connection = NULL;
-        }
-
         log_open ();
         log_msg ("STOPPING XRANDR PLUGIN\n------------------------------------------------------------\n");
         log_close ();
@@ -1838,8 +1845,6 @@ gsd_xrandr_manager_class_init (GsdXrandrManagerClass *klass)
         object_class->dispose = gsd_xrandr_manager_dispose;
         object_class->finalize = gsd_xrandr_manager_finalize;
 
-        dbus_g_object_type_install_info (GSD_TYPE_XRANDR_MANAGER, &dbus_glib_gsd_xrandr_manager_object_info);
-
         g_type_class_add_private (klass, sizeof (GsdXrandrManagerPrivate));
 }
 
@@ -1864,27 +1869,87 @@ gsd_xrandr_manager_finalize (GObject *object)
 
         g_return_if_fail (xrandr_manager->priv != NULL);
 
+        if (xrandr_manager->priv->owner_id > 0)
+                g_bus_unown_name (xrandr_manager->priv->owner_id);
+
         G_OBJECT_CLASS (gsd_xrandr_manager_parent_class)->finalize (object);
 }
 
-static gboolean
-register_manager_dbus (GsdXrandrManager *manager)
+static void
+handle_method_call (GDBusConnection       *connection,
+                    const gchar           *sender,
+                    const gchar           *object_path,
+                    const gchar           *interface_name,
+                    const gchar           *method_name,
+                    GVariant              *parameters,
+                    GDBusMethodInvocation *invocation,
+                    gpointer               user_data) 
 {
+        GsdXrandrManager *manager = (GsdXrandrManager *) user_data;
+        gint64 timestamp;
         GError *error = NULL;
 
-        manager->priv->dbus_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
-        if (manager->priv->dbus_connection == NULL) {
-                if (error != NULL) {
-                        g_warning ("Error getting session bus: %s", error->message);
-                        g_error_free (error);
+        g_debug ("Calling method '%s' for XRandR", method_name);
+
+        if (g_strcmp0 (method_name, "ApplyConfiguration") == 0) {
+                gint64 parent_window_id;
+
+                g_variant_get (parameters, "(xx)", &parent_window_id, &timestamp);
+                if (gsd_xrandr_manager_2_apply_configuration (manager, parent_window_id,
+                                                              timestamp, &error) == FALSE) {
+                        g_dbus_method_invocation_return_gerror (invocation, error);
+                } else {
+                        g_dbus_method_invocation_return_value (invocation, NULL);
                 }
-                return FALSE;
+        } else if (g_strcmp0 (method_name, "VideoModeSwitch") == 0) {
+                g_variant_get (parameters, "(x)", &timestamp);
+                gsd_xrandr_manager_2_video_mode_switch (manager, timestamp, NULL);
+                g_dbus_method_invocation_return_value (invocation, NULL);
+        } else if (g_strcmp0 (method_name, "Rotate") == 0) {
+                g_variant_get (parameters, "(x)", &timestamp);
+                gsd_xrandr_manager_2_rotate (manager, timestamp, NULL);
+                g_dbus_method_invocation_return_value (invocation, NULL);
         }
+}
 
-        /* Hmm, should we do this in gsd_xrandr_manager_start()? */
-        dbus_g_connection_register_g_object (manager->priv->dbus_connection, GSD_XRANDR_DBUS_PATH, G_OBJECT (manager));
 
-        return TRUE;
+static const GDBusInterfaceVTable interface_vtable =
+{
+        handle_method_call,
+        NULL, /* Get Property */
+        NULL, /* Set Property */
+};
+
+static void
+on_bus_acquired (GDBusConnection     *connection,
+                 const gchar         *name,
+                 GsdXrandrManager    *manager)
+{
+        guint registration_id;
+
+        registration_id = g_dbus_connection_register_object (connection,
+                                                             GSD_XRANDR_DBUS_PATH,
+                                                             manager->priv->introspection_data->interfaces[0],
+                                                             &interface_vtable,
+                                                             manager,
+                                                             NULL,
+                                                             NULL);
+}
+
+static void
+register_manager_dbus (GsdXrandrManager *manager)
+{
+        manager->priv->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
+        g_assert (manager->priv->introspection_data != NULL);
+
+        manager->priv->owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
+                                                  GSD_DBUS_NAME,
+                                                  G_BUS_NAME_OWNER_FLAGS_NONE,
+                                                  (GBusAcquiredCallback) on_bus_acquired,
+                                                  NULL,
+                                                  NULL,
+                                                  manager,
+                                                  NULL);
 }
 
 GsdXrandrManager *
@@ -1897,10 +1962,7 @@ gsd_xrandr_manager_new (void)
                 g_object_add_weak_pointer (manager_object,
                                            (gpointer *) &manager_object);
 
-                if (!register_manager_dbus (manager_object)) {
-                        g_object_unref (manager_object);
-                        return NULL;
-                }
+                register_manager_dbus (manager_object);
         }
 
         return GSD_XRANDR_MANAGER (manager_object);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]