summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@gnome.org>2012-01-10 23:36:58 (GMT)
committerFederico Mena Quintero <federico@gnome.org>2012-01-10 23:41:14 (GMT)
commita81bd53c44a0785373ba9fba543556e3c4e12431 (patch)
tree929768545912d9310ebe2c91a3a50dc27ffb0fcf
parent7d3cd44cdb70029ab2a107b5a22df5ba968036f0 (diff)
downloadgnome-desktop-a81bd53c44a0785373ba9fba543556e3c4e12431.zip
gnome-desktop-a81bd53c44a0785373ba9fba543556e3c4e12431.tar.xz
gnome_rr_screen_new() now creates a singleton for the specified GdkScreen
Gnome-settings-daemon has now more than plugin that requires a GnomeRRScreen. Having two instances of a GnomeRRScreen would mean extra roundtrips to the X server when RANDR events come in. Also, it is better if GObject signals can be emitted in order from a single GnomeRRScreen instance. So, we now create a single GnomeRRScreen instance per GdkScreen, and return that. Signed-off-by: Federico Mena Quintero <federico@gnome.org>
-rw-r--r--libgnome-desktop/gnome-rr.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/libgnome-desktop/gnome-rr.c b/libgnome-desktop/gnome-rr.c
index 243d2d0..628e1a1 100644
--- a/libgnome-desktop/gnome-rr.c
+++ b/libgnome-desktop/gnome-rr.c
@@ -935,6 +935,15 @@ gnome_rr_screen_init (GnomeRRScreen *self)
priv->rr_minor_version = 0;
}
+/* Weak reference callback set in gnome_rr_screen_new(); we remove the GObject data from the GdkScreen. */
+static void
+rr_screen_weak_notify_cb (gpointer data, GObject *where_the_object_was)
+{
+ GdkScreen *screen = GDK_SCREEN (data);
+
+ g_object_set_data (G_OBJECT (screen), "GnomeRRScreen", NULL);
+}
+
/**
* gnome_rr_screen_new:
* Creates a new #GnomeRRScreen instance
@@ -949,8 +958,25 @@ GnomeRRScreen *
gnome_rr_screen_new (GdkScreen *screen,
GError **error)
{
- _gnome_desktop_init_i18n ();
- return g_initable_new (GNOME_TYPE_RR_SCREEN, NULL, error, "gdk-screen", screen, NULL);
+ GnomeRRScreen *rr_screen;
+
+ g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ rr_screen = g_object_get_data (G_OBJECT (screen), "GnomeRRScreen");
+ if (rr_screen)
+ g_object_ref (rr_screen);
+ else {
+ _gnome_desktop_init_i18n ();
+
+ rr_screen = g_initable_new (GNOME_TYPE_RR_SCREEN, NULL, error, "gdk-screen", screen, NULL);
+ if (rr_screen) {
+ g_object_set_data (G_OBJECT (screen), "GnomeRRScreen", rr_screen);
+ g_object_weak_ref (G_OBJECT (rr_screen), rr_screen_weak_notify_cb, screen);
+ }
+ }
+
+ return rr_screen;
}
void