]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/login1.c
Load all users only when really needed
[sojka/lightdm.git] / src / login1.c
index 01de48ea2eba14fa03dba580626bde48979d955e..dc60a492a02a09557ba842d0809a71210103e330 100644 (file)
@@ -43,6 +43,7 @@ struct Login1ServicePrivate
 
 enum {
     CAN_GRAPHICAL_CHANGED,
+    ACTIVE_SESSION_CHANGED,
     LAST_SEAT_SIGNAL
 };
 static guint seat_signals[LAST_SEAT_SIGNAL] = { 0 };
@@ -89,6 +90,12 @@ update_property (Login1Seat *seat, const gchar *name, GVariant *value)
         seat->priv->can_graphical = g_variant_get_boolean (value);
         g_signal_emit (seat, seat_signals[CAN_GRAPHICAL_CHANGED], 0);
     }
+    else if (strcmp (name, "ActiveSession") == 0 && g_variant_is_of_type (value, G_VARIANT_TYPE ("(so)")))
+    {
+        const gchar *login1_session_id;
+        g_variant_get (value, "(&so)", &login1_session_id, NULL);
+        g_signal_emit (seat, seat_signals[ACTIVE_SESSION_CHANGED], 0, login1_session_id);
+    }
 }
 
 static void
@@ -133,6 +140,7 @@ seat_properties_changed_cb (GDBusConnection *connection,
         {
             g_variant_get (result, "(v)", &value);
             update_property (seat, name, value);
+            g_variant_unref (value);
             g_variant_unref (result);
         }
     }
@@ -442,7 +450,7 @@ login1_service_finalize (GObject *object)
 
     g_list_free_full (self->priv->seats, g_object_unref);
     g_dbus_connection_signal_unsubscribe (self->priv->connection, self->priv->signal_id);
-    g_object_unref (self->priv->connection);
+    g_clear_object (&self->priv->connection);
 
     G_OBJECT_CLASS (login1_service_parent_class)->finalize (object);
 }
@@ -457,7 +465,7 @@ login1_service_class_init (Login1ServiceClass *klass)
     g_type_class_add_private (klass, sizeof (Login1ServicePrivate));
 
     service_signals[SEAT_ADDED] =
-        g_signal_new ("seat-added",
+        g_signal_new (LOGIN1_SERVICE_SIGNAL_SEAT_ADDED,
                       G_TYPE_FROM_CLASS (klass),
                       G_SIGNAL_RUN_LAST,
                       G_STRUCT_OFFSET (Login1ServiceClass, seat_added),
@@ -465,7 +473,7 @@ login1_service_class_init (Login1ServiceClass *klass)
                       NULL,
                       G_TYPE_NONE, 1, LOGIN1_SEAT_TYPE);
     service_signals[SEAT_REMOVED] =
-        g_signal_new ("seat-removed",
+        g_signal_new (LOGIN1_SERVICE_SIGNAL_SEAT_REMOVED,
                       G_TYPE_FROM_CLASS (klass),
                       G_SIGNAL_RUN_LAST,
                       G_STRUCT_OFFSET (Login1ServiceClass, seat_removed),
@@ -524,11 +532,20 @@ login1_seat_class_init (Login1SeatClass *klass)
     g_type_class_add_private (klass, sizeof (Login1SeatPrivate));
 
     seat_signals[CAN_GRAPHICAL_CHANGED] =
-        g_signal_new ("can-graphical-changed",
+        g_signal_new (LOGIN1_SEAT_SIGNAL_CAN_GRAPHICAL_CHANGED,
                       G_TYPE_FROM_CLASS (klass),
                       G_SIGNAL_RUN_LAST,
                       G_STRUCT_OFFSET (Login1SeatClass, can_graphical_changed),
                       NULL, NULL,
                       NULL,
                       G_TYPE_NONE, 0);
+
+    seat_signals[ACTIVE_SESSION_CHANGED] =
+        g_signal_new (LOGIN1_SIGNAL_ACTIVE_SESION_CHANGED,
+                      G_TYPE_FROM_CLASS (klass),
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (Login1SeatClass, active_session_changed),
+                      NULL, NULL,
+                      NULL,
+                      G_TYPE_NONE, 1, G_TYPE_STRING);
 }