[gnome-desktop] gnome_rr_screen_new() now creates a singleton for the specified GdkScreen
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-desktop] gnome_rr_screen_new() now creates a singleton for the specified GdkScreen
- Date: Tue, 10 Jan 2012 23:39:37 +0000 (UTC)
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]