[gdm/gnome-3-16] local-display-factory: track autologin displays
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm/gnome-3-16] local-display-factory: track autologin displays
- Date: Tue, 15 Sep 2015 21:05:11 +0000 (UTC)
commit d240d8c661fb88aa46e3d47a8feff4cc1dc7cb62
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 e670921..1c773a2 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;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]