diff options
| author | Federico Mena Quintero <federico@gnome.org> | 2012-01-10 23:36:58 (GMT) |
|---|---|---|
| committer | Federico Mena Quintero <federico@gnome.org> | 2012-01-10 23:41:14 (GMT) |
| commit | a81bd53c44a0785373ba9fba543556e3c4e12431 (patch) | |
| tree | 929768545912d9310ebe2c91a3a50dc27ffb0fcf | |
| parent | 7d3cd44cdb70029ab2a107b5a22df5ba968036f0 (diff) | |
| download | gnome-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.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 |