[gnome-desktop] gnome_rr_screen_new() now creates a singleton for the specified GdkScreen



commit a81bd53c44a0785373ba9fba543556e3c4e12431
Author: Federico Mena Quintero <federico gnome org>
Date:   Tue Jan 10 17:36:58 2012 -0600

    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>

 libgnome-desktop/gnome-rr.c |   30 ++++++++++++++++++++++++++++--
 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



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