diff options
| -rw-r--r-- | plugins/xrandr/Makefile.am | 23 | ||||
| -rw-r--r-- | plugins/xrandr/msd-xrandr-manager.c | 264 | ||||
| -rw-r--r-- | plugins/xrandr/msd-xrandr-manager.h | 8 | ||||
| -rw-r--r-- | plugins/xrandr/msd-xrandr-manager.xml | 2 |
4 files changed, 206 insertions, 91 deletions
diff --git a/plugins/xrandr/Makefile.am b/plugins/xrandr/Makefile.am index f0a8815..0ea6790 100644 --- a/plugins/xrandr/Makefile.am +++ b/plugins/xrandr/Makefile.am @@ -1,9 +1,6 @@ icondir = $(datadir)/icons/hicolor context = apps -BUILT_SOURCES = \ - msd-xrandr-manager-glue.h - ICON_FILES = \ msd-xrandr-16.png \ msd-xrandr-22.png \ @@ -46,13 +43,19 @@ uninstall-local: plugin_LTLIBRARIES = \ libxrandr.la -msd-xrandr-manager-glue.h: msd-xrandr-manager.xml Makefile - $(AM_V_GEN) dbus-binding-tool --prefix=msd_xrandr_manager --mode=glib-server $< > xgen-$(@F) \ - && ( cmp -s xgen-$(@F) $@ || cp xgen-$(@F) $@ ) \ - && rm -f xgen-$(@F) +msd_xrandr_built_sources = \ + msd-xrandr-generated.h \ + msd-xrandr-generated.c \ + $(NULL) + +$(msd_xrandr_built_sources) : $(srcdir)/msd-xrandr-manager.xml + $(AM_V_GEN) $(GDBUS_CODEGEN) \ + --interface-prefix org.mate.SettingsDaemon. \ + --c-namespace MateXrandr \ + --generate-c-code msd-xrandr-generated $< libxrandr_la_SOURCES = \ - $(BUILT_SOURCES) \ + $(msd_xrandr_built_sources) \ msd-xrandr-plugin.h \ msd-xrandr-plugin.c \ msd-xrandr-manager.h \ @@ -85,8 +88,8 @@ plugin_in_files = \ plugin_DATA = $(plugin_in_files:.mate-settings-plugin.desktop.in=.mate-settings-plugin) EXTRA_DIST = $(plugin_in_files) $(ICON_FILES) msd-xrandr-manager.xml -CLEANFILES = $(plugin_DATA) $(BUILT_SOURCES) -DISTCLEANFILES = $(plugin_DATA) +CLEANFILES = $(plugin_DATA) $(msd_xrandr_built_sources) +DISTCLEANFILES = $(plugin_DATA) $(msd_xrandr_built_sources) $(plugin_DATA): $(plugin_in_files) $(AM_V_GEN) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@ diff --git a/plugins/xrandr/msd-xrandr-manager.c b/plugins/xrandr/msd-xrandr-manager.c index 0e157a8..d0db6b3 100644 --- a/plugins/xrandr/msd-xrandr-manager.c +++ b/plugins/xrandr/msd-xrandr-manager.c @@ -1,4 +1,5 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * vim: set ts=8 sts=8 sw=8 expandtab: * * Copyright (C) 2007 William Jon McCann <[email protected]> * Copyright (C) 2007, 2008 Red Hat, Inc @@ -38,7 +39,6 @@ #include <gdk/gdkx.h> #include <gtk/gtk.h> #include <gio/gio.h> -#include <dbus/dbus-glib.h> #define MATE_DESKTOP_USE_UNSTABLE_API #include <libmate-desktop/mate-rr-config.h> @@ -52,6 +52,7 @@ #include "mate-settings-profile.h" #include "msd-xrandr-manager.h" +#include "msd-xrandr-generated.h" #define CONF_SCHEMA "org.mate.SettingsDaemon.plugins.xrandr" #define CONF_KEY_SHOW_NOTIFICATION_ICON "show-notification-icon" @@ -76,12 +77,15 @@ #define MSD_DBUS_PATH "/org/mate/SettingsDaemon" #define MSD_DBUS_NAME "org.mate.SettingsDaemon" -#define MSD_XRANDR_DBUS_PATH MSD_DBUS_PATH "/XRANDR" #define MSD_XRANDR_DBUS_NAME MSD_DBUS_NAME ".XRANDR" +#define MSD_XRANDR_DBUS_PATH MSD_DBUS_PATH "/XRANDR" +#define MSD_XRANDR_DBUS_PATH_2 MSD_DBUS_PATH "/XRANDR_2" struct MsdXrandrManagerPrivate { - DBusGConnection *dbus_connection; + MateXrandrXRANDR *skeleton; + MateXrandrXRANDR_2 *skeleton_2; + guint bus_name_id; /* Key code of the XF86Display key (Fn-F7 on Thinkpads, Fn-F4 on HP machines, etc.) */ guint switch_video_mode_keycode; @@ -125,6 +129,14 @@ static void get_allowed_rotations_for_output (MateRRConfig *config, MateRROutputInfo *output, int *out_num_rotations, MateRRRotation *out_rotations); +static gboolean on_handle_apply_configuration (MateXrandrXRANDR *object, + GDBusMethodInvocation *invocation, + gpointer user_data); +static gboolean on_handle_apply_configuration_2 (MateXrandrXRANDR_2 *object, + GDBusMethodInvocation *invocation, + gint64 parent_window_id, + gint64 timestamp, + gpointer user_data); G_DEFINE_TYPE_WITH_PRIVATE (MsdXrandrManager, msd_xrandr_manager, G_TYPE_OBJECT) @@ -596,40 +608,6 @@ out: return result; } -/* DBus method for org.mate.SettingsDaemon.XRANDR ApplyConfiguration; see msd-xrandr-manager.xml for the interface definition */ -static gboolean -msd_xrandr_manager_apply_configuration (MsdXrandrManager *manager, - GError **error) -{ - return try_to_apply_intended_configuration (manager, NULL, GDK_CURRENT_TIME, error); -} - -/* DBus method for org.mate.SettingsDaemon.XRANDR_2 ApplyConfiguration; see msd-xrandr-manager.xml for the interface definition */ -static gboolean -msd_xrandr_manager_2_apply_configuration (MsdXrandrManager *manager, - gint64 parent_window_id, - gint64 timestamp, - GError **error) -{ - GdkWindow *parent_window; - gboolean result; - - if (parent_window_id != 0) - parent_window = gdk_x11_window_foreign_new_for_display (gdk_display_get_default (), (Window) parent_window_id); - else - parent_window = NULL; - - result = try_to_apply_intended_configuration (manager, parent_window, (guint32) timestamp, error); - - if (parent_window) - g_object_unref (parent_window); - - return result; -} - -/* We include this after the definition of msd_xrandr_manager_apply_configuration() so the prototype will already exist */ -#include "msd-xrandr-manager-glue.h" - static gboolean is_laptop (MateRRScreen *screen, MateRROutputInfo *output) { @@ -1780,8 +1758,8 @@ make_menu_item_for_output_title (MsdXrandrManager *manager, MateRROutputInfo *ou /*Load the icon unless the user has icons in menus turned off*/ icon_settings = g_settings_new ("org.mate.interface"); if (g_settings_get_boolean (icon_settings, "menus-have-icons")){ - gtk_container_add (GTK_CONTAINER (box), image); - } + gtk_container_add (GTK_CONTAINER (box), image); + } gtk_container_add (GTK_CONTAINER (box), label); gtk_container_add (GTK_CONTAINER (item), box); @@ -2656,11 +2634,6 @@ msd_xrandr_manager_stop (MsdXrandrManager *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; - } - status_icon_stop (manager); log_open (); @@ -2668,14 +2641,184 @@ msd_xrandr_manager_stop (MsdXrandrManager *manager) log_close (); } +/* + * DBus method for org.mate.SettingsDaemon.XRANDR ApplyConfiguration; + * see msd-xrandr-manager.xml for the interface definition + * */ +static gboolean +on_handle_apply_configuration (MateXrandrXRANDR *object, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + MsdXrandrManager *manager; + GError *error = NULL; + gboolean result; + + manager = MSD_XRANDR_MANAGER (user_data); + result = try_to_apply_intended_configuration (manager, NULL, GDK_CURRENT_TIME, &error); + if (!result) { + g_dbus_method_invocation_return_gerror (invocation, error); + g_error_free (error); + } else { + mate_xrandr_xrandr_complete_apply_configuration (object, invocation); + } + return result; +} + +/* + * DBus method for org.mate.SettingsDaemon.XRANDR_2 ApplyConfiguration; + * see msd-xrandr-manager.xml for the interface definition + * */ +static gboolean +on_handle_apply_configuration_2 (MateXrandrXRANDR_2 *object, + GDBusMethodInvocation *invocation, + gint64 parent_window_id, + gint64 timestamp, + gpointer user_data) +{ + MsdXrandrManager *manager; + GdkWindow *parent_window; + gboolean result; + GError *error = NULL; + + if (parent_window_id != 0) + parent_window = gdk_x11_window_foreign_new_for_display ( + gdk_display_get_default (), + (Window) parent_window_id); + else + parent_window = NULL; + + manager = MSD_XRANDR_MANAGER (user_data); + result = try_to_apply_intended_configuration (manager, + parent_window, + (guint32) timestamp, + &error); + if (!result) { + g_dbus_method_invocation_return_gerror (invocation, error); + g_error_free (error); + } else { + mate_xrandr_xrandr_2_complete_apply_configuration (object, invocation); + } + + if (parent_window) + g_object_unref (parent_window); + + return result; +} + +static void +bus_acquired_handler_cb (GDBusConnection *connection, + const gchar *name G_GNUC_UNUSED, + gpointer user_data) +{ + MsdXrandrManager *manager; + + GError *error = NULL; + gboolean exported; + + manager = MSD_XRANDR_MANAGER (user_data); + + g_signal_connect (manager->priv->skeleton, + "handle-apply-configuration", + G_CALLBACK (on_handle_apply_configuration), + manager); + exported = g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (manager->priv->skeleton), + connection, + MSD_XRANDR_DBUS_PATH, + &error); + if (!exported) + { + g_warning ("MsdXrandrManager: Failed to export interface: %s", error->message); + g_error_free (error); + gtk_main_quit (); + } + + g_signal_connect (manager->priv->skeleton_2, + "handle-apply-configuration", + G_CALLBACK (on_handle_apply_configuration_2), + manager); + exported = g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (manager->priv->skeleton_2), + connection, + MSD_XRANDR_DBUS_PATH_2, + &error); + if (!exported) + { + g_warning ("MsdXrandrManager: Failed to export interface: %s", error->message); + g_error_free (error); + gtk_main_quit (); + } +} + +static void +name_lost_handler_cb (GDBusConnection *connection G_GNUC_UNUSED, + const gchar *name G_GNUC_UNUSED, + gpointer user_data G_GNUC_UNUSED) +{ + g_debug("bus name lost\n"); + gtk_main_quit (); +} + +static void +msd_xrandr_manager_constructed (GObject *object) +{ + MsdXrandrManager *manager; + + manager = MSD_XRANDR_MANAGER (object); + + G_OBJECT_CLASS (msd_xrandr_manager_parent_class)->constructed (object); + + manager->priv->bus_name_id = g_bus_own_name (G_BUS_TYPE_SESSION, + MSD_XRANDR_DBUS_NAME, + G_BUS_NAME_OWNER_FLAGS_NONE, + bus_acquired_handler_cb, + NULL, + name_lost_handler_cb, + manager, + NULL); +} + +static void +msd_xrandr_manager_dispose (GObject *object) +{ + MsdXrandrManager *manager; + + manager = MSD_XRANDR_MANAGER (object); + + if (manager->priv->skeleton != NULL) + { + GDBusInterfaceSkeleton *skeleton; + + skeleton = G_DBUS_INTERFACE_SKELETON (manager->priv->skeleton); + g_dbus_interface_skeleton_unexport (skeleton); + g_clear_object (&manager->priv->skeleton); + } + + if (manager->priv->skeleton_2 != NULL) + { + GDBusInterfaceSkeleton *skeleton; + + skeleton = G_DBUS_INTERFACE_SKELETON (manager->priv->skeleton_2); + g_dbus_interface_skeleton_unexport (skeleton); + g_clear_object (&manager->priv->skeleton_2); + } + + if (manager->priv->bus_name_id > 0) + { + g_bus_unown_name (manager->priv->bus_name_id); + manager->priv->bus_name_id = 0; + } + + G_OBJECT_CLASS (msd_xrandr_manager_parent_class)->dispose (object); +} + static void msd_xrandr_manager_class_init (MsdXrandrManagerClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = msd_xrandr_manager_finalize; - - dbus_g_object_type_install_info (MSD_TYPE_XRANDR_MANAGER, &dbus_glib_msd_xrandr_manager_object_info); + object_class->constructed = msd_xrandr_manager_constructed; + object_class->dispose = msd_xrandr_manager_dispose; } static guint @@ -2700,6 +2843,8 @@ msd_xrandr_manager_init (MsdXrandrManager *manager) manager->priv->current_fn_f7_config = -1; manager->priv->fn_f7_configs = NULL; + manager->priv->skeleton = mate_xrandr_xrandr_skeleton_new (); + manager->priv->skeleton_2 = mate_xrandr_xrandr_2_skeleton_new (); } static void @@ -2717,26 +2862,6 @@ msd_xrandr_manager_finalize (GObject *object) G_OBJECT_CLASS (msd_xrandr_manager_parent_class)->finalize (object); } -static gboolean -register_manager_dbus (MsdXrandrManager *manager) -{ - 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); - } - return FALSE; - } - - /* Hmm, should we do this in msd_xrandr_manager_start()? */ - dbus_g_connection_register_g_object (manager->priv->dbus_connection, MSD_XRANDR_DBUS_PATH, G_OBJECT (manager)); - - return TRUE; -} - MsdXrandrManager * msd_xrandr_manager_new (void) { @@ -2744,13 +2869,6 @@ msd_xrandr_manager_new (void) g_object_ref (manager_object); } else { manager_object = g_object_new (MSD_TYPE_XRANDR_MANAGER, NULL); - g_object_add_weak_pointer (manager_object, - (gpointer *) &manager_object); - - if (!register_manager_dbus (manager_object)) { - g_object_unref (manager_object); - return NULL; - } } return MSD_XRANDR_MANAGER (manager_object); diff --git a/plugins/xrandr/msd-xrandr-manager.h b/plugins/xrandr/msd-xrandr-manager.h index 8d8f12f..8d1a00b 100644 --- a/plugins/xrandr/msd-xrandr-manager.h +++ b/plugins/xrandr/msd-xrandr-manager.h @@ -23,9 +23,7 @@ #include <glib-object.h> -#ifdef __cplusplus -extern "C" { -#endif +G_BEGIN_DECLS #define MSD_TYPE_XRANDR_MANAGER (msd_xrandr_manager_get_type ()) #define MSD_XRANDR_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), MSD_TYPE_XRANDR_MANAGER, MsdXrandrManager)) @@ -54,8 +52,6 @@ gboolean msd_xrandr_manager_start (MsdXrandrManager GError **error); void msd_xrandr_manager_stop (MsdXrandrManager *manager); -#ifdef __cplusplus -} -#endif +G_END_DECLS #endif /* __MSD_XRANDR_MANAGER_H */ diff --git a/plugins/xrandr/msd-xrandr-manager.xml b/plugins/xrandr/msd-xrandr-manager.xml index c82a594..68f9dd6 100644 --- a/plugins/xrandr/msd-xrandr-manager.xml +++ b/plugins/xrandr/msd-xrandr-manager.xml @@ -1,7 +1,6 @@ <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd"> <node> <interface name="org.mate.SettingsDaemon.XRANDR"> - <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="msd_xrandr_manager"/> <method name="ApplyConfiguration"> <!-- This method is implemented, but deprecated in favor of the same method in the XRANDR-2 interface defined below. --> @@ -9,7 +8,6 @@ </interface> <interface name="org.mate.SettingsDaemon.XRANDR_2"> - <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="msd_xrandr_manager_2"/> <method name="ApplyConfiguration"> <!-- transient-parent window for the confirmation dialog; use 0 for no parent --> |
