[gdm] local-display-factory: track autologin displays



commit abb46853f824a004e0d7f58b26e068589b121d6b
Author: Ray Strode <rstrode redhat com>
Date:   Wed Sep 9 15:24:31 2015 -0400

    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

 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 676303c..c794313 100644
--- a/daemon/gdm-local-display-factory.c
+++ b/daemon/gdm-local-display-factory.c
@@ -183,11 +183,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);
 }
@@ -544,13 +539,59 @@ gdm_local_display_factory_stop_monitor (GdmLocalDisplayFactory *factory)
         }
 }
 
+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);
+        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);
+
         gdm_local_display_factory_start_monitor (factory);
         return gdm_local_display_factory_sync_seats (factory);
 }
@@ -559,11 +600,21 @@ 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);
 
         gdm_local_display_factory_stop_monitor (factory);
 
+        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;
 }
 


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