diff options
author | Ray Strode <rstrode@redhat.com> | 2015-09-09 15:24:31 -0400 |
---|---|---|
committer | Federico Mena Quintero <federico@gnome.org> | 2015-09-15 14:08:58 -0500 |
commit | d240d8c661fb88aa46e3d47a8feff4cc1dc7cb62 (patch) | |
tree | b2895e7151082f65f9732e2f68d6ab532e834073 | |
parent | 0dd2dfcbc8b1987ad72dbb3d898412f5a6b3cfa3 (diff) | |
download | gdm-d240d8c661fb88aa46e3d47a8feff4cc1dc7cb62.tar.gz |
local-display-factory: track autologin displays
At the moment the display-factory only tracks displays it adds itself.
autologin displays aren't added by the display-factory, but by the
manager.
This commit makes sure the display-factory is notified about the
autologin display, so when it finishes a login screen can be put in
its place.
https://bugzilla.gnome.org/show_bug.cgi?id=749418
-rw-r--r-- | daemon/gdm-local-display-factory.c | 61 |
1 files changed, 56 insertions, 5 deletions
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c index e6709219..1c773a2f 100644 --- a/daemon/gdm-local-display-factory.c +++ b/daemon/gdm-local-display-factory.c @@ -186,11 +186,6 @@ 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)); gdm_display_store_add (store, display); } @@ -577,14 +572,60 @@ gdm_local_display_factory_stop_monitor (GdmLocalDisplayFactory *factory) #endif +static void +on_display_added (GdmDisplayStore *display_store, + const char *id, + GdmLocalDisplayFactory *factory) +{ + GdmDisplay *display; + + display = gdm_display_store_lookup (display_store, id); + + if (display != NULL) { + 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); + } +} + +static void +on_display_removed (GdmDisplayStore *display_store, + const char *id, + GdmLocalDisplayFactory *factory) +{ + GdmDisplay *display; + + display = gdm_display_store_lookup (display_store, id); + + if (display != NULL) { + g_signal_handlers_disconnect_by_func (display, G_CALLBACK (on_display_status_changed), factory); + g_object_weak_unref (G_OBJECT (display), (GWeakNotify)on_display_disposed, factory); + + } +} + static gboolean gdm_local_display_factory_start (GdmDisplayFactory *base_factory) { GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (base_factory); GdmDisplay *display; + GdmDisplayStore *store; g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE); + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + + g_signal_connect (G_OBJECT (store), + "display-added", + G_CALLBACK (on_display_added), + factory); + + g_signal_connect (G_OBJECT (store), + "display-removed", + G_CALLBACK (on_display_removed), + factory); + #ifdef WITH_SYSTEMD if (LOGIND_RUNNING()) { gdm_local_display_factory_start_monitor (factory); @@ -602,6 +643,7 @@ static gboolean gdm_local_display_factory_stop (GdmDisplayFactory *base_factory) { GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (base_factory); + GdmDisplayStore *store; g_return_val_if_fail (GDM_IS_LOCAL_DISPLAY_FACTORY (factory), FALSE); @@ -609,6 +651,15 @@ gdm_local_display_factory_stop (GdmDisplayFactory *base_factory) gdm_local_display_factory_stop_monitor (factory); #endif + store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); + + g_signal_handlers_disconnect_by_func (G_OBJECT (store), + G_CALLBACK (on_display_added), + factory); + g_signal_handlers_disconnect_by_func (G_OBJECT (store), + G_CALLBACK (on_display_removed), + factory); + return TRUE; } |