diff options
author | Giovanni Campagna <gcampagna@src.gnome.org> | 2012-07-07 15:07:11 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2012-07-17 04:12:33 -0400 |
commit | 133e18ebc5eccf9e12832586038da28f4f8a15f8 (patch) | |
tree | 38cac9032322f0cadeaa5e4171209f70bd7e43e4 /daemon/gdm-local-display-factory.c | |
parent | 4e392e230d0ea8531c1ea387fca2a6273568efdb (diff) | |
download | gdm-133e18ebc5eccf9e12832586038da28f4f8a15f8.tar.gz |
daemon: Remove transient displays from display store when finished
When a display finishes (because it failed to start, or the users
session ended) the GDM display handling code needs to remove the
display from its display store.
For static (logind or the first automatic) displays this happens in the
on_static_display_status_changed
function. For transient (user-switch initiated) displays, though,
it never happens.
This commit reworks on_static_display_status_changed into a more
generally applicable on_display_status_changed function, so the proper
bookkeeping can happen for transient displays, too.
Diffstat (limited to 'daemon/gdm-local-display-factory.c')
-rw-r--r-- | daemon/gdm-local-display-factory.c | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c index a533d558..bef22093 100644 --- a/daemon/gdm-local-display-factory.c +++ b/daemon/gdm-local-display-factory.c @@ -32,6 +32,7 @@ #include <systemd/sd-daemon.h> #endif +#include "gdm-manager.h" #include "gdm-display-factory.h" #include "gdm-local-display-factory.h" #include "gdm-local-display-factory-glue.h" @@ -77,6 +78,10 @@ static void gdm_local_display_factory_finalize (GObject static GdmDisplay *create_display (GdmLocalDisplayFactory *factory, const char *seat_id); +static void on_display_status_changed (GdmDisplay *display, + GParamSpec *arg1, + GdmLocalDisplayFactory *factory); + static gpointer local_display_factory_object = NULL; G_DEFINE_TYPE (GdmLocalDisplayFactory, gdm_local_display_factory, GDM_TYPE_DISPLAY_FACTORY) @@ -180,6 +185,9 @@ store_display (GdmLocalDisplayFactory *factory, { GdmDisplayStore *store; + g_signal_connect (display, "notify::status", + G_CALLBACK (on_display_status_changed), factory); + g_object_weak_ref (G_OBJECT (display), (GWeakNotify)on_display_disposed, factory); store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); @@ -255,9 +263,9 @@ gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *fact } static void -on_static_display_status_changed (GdmDisplay *display, - GParamSpec *arg1, - GdmLocalDisplayFactory *factory) +on_display_status_changed (GdmDisplay *display, + GParamSpec *arg1, + GdmLocalDisplayFactory *factory) { int status; GdmDisplayStore *store; @@ -274,29 +282,40 @@ on_static_display_status_changed (GdmDisplay *display, status = gdm_display_get_status (display); - g_debug ("GdmLocalDisplayFactory: static display status changed: %d", status); + g_debug ("GdmLocalDisplayFactory: display status changed: %d", status); switch (status) { case GDM_DISPLAY_FINISHED: /* remove the display number from factory->priv->displays so that it may be reused */ g_hash_table_remove (factory->priv->displays, GUINT_TO_POINTER (num)); gdm_display_store_remove (store, display); - /* reset num failures */ - factory->priv->num_failures = 0; - create_display (factory, seat_id); + + /* Create a new equivalent display if it was static */ + if (GDM_IS_STATIC_DISPLAY (display)) { + /* reset num failures */ + factory->priv->num_failures = 0; + + create_display (factory, seat_id); + } break; case GDM_DISPLAY_FAILED: /* leave the display number in factory->priv->displays so that it doesn't get reused */ gdm_display_store_remove (store, display); - factory->priv->num_failures++; - if (factory->priv->num_failures > MAX_DISPLAY_FAILURES) { - /* oh shit */ - g_warning ("GdmLocalDisplayFactory: maximum number of X display failures reached: check X server log for errors"); - /* FIXME: should monitor hardware changes to - try again when seats change */ - } else { - create_display (factory, seat_id); + + /* Create a new equivalent display if it was static */ + if (GDM_IS_STATIC_DISPLAY (display)) { + + factory->priv->num_failures++; + + if (factory->priv->num_failures > MAX_DISPLAY_FAILURES) { + /* oh shit */ + g_warning ("GdmLocalDisplayFactory: maximum number of X display failures reached: check X server log for errors"); + /* FIXME: should monitor hardware changes to + try again when seats change */ + } else { + create_display (factory, seat_id); + } } break; case GDM_DISPLAY_UNMANAGED: @@ -354,11 +373,6 @@ create_display (GdmLocalDisplayFactory *factory, g_object_set (display, "seat-id", seat_id, NULL); - g_signal_connect (display, - "notify::status", - G_CALLBACK (on_static_display_status_changed), - factory); - store_display (factory, num, display); /* let store own the ref */ |