]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/greeter.c
Allow in-session greeters to reconnect
[sojka/lightdm.git] / src / greeter.c
index 4534ee2fc0f175e7293936573361d29da0febc52..e2ae19f9d1bff02e07981f522da98fa729ae8e8d 100644 (file)
@@ -25,6 +25,7 @@ enum {
 
 enum {
     CONNECTED,
+    DISCONNECTED,  
     CREATE_SESSION,
     START_SESSION,
     LAST_SIGNAL
@@ -836,6 +837,7 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data)
     {
         g_debug ("Greeter closed communication channel");
         greeter->priv->from_greeter_watch = 0;
+        g_signal_emit (greeter, signals[DISCONNECTED], 0);
         return FALSE;
     }
 
@@ -858,7 +860,14 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data)
     if (error)
         g_warning ("Error reading from greeter: %s", error->message);
     g_clear_error (&error);
-    if (status != G_IO_STATUS_NORMAL)
+    if (status == G_IO_STATUS_EOF)
+    {
+        g_debug ("Greeter closed communication channel");
+        greeter->priv->from_greeter_watch = 0;
+        g_signal_emit (greeter, signals[DISCONNECTED], 0);
+        return FALSE;
+    }
+    else if (status != G_IO_STATUS_NORMAL)
         return TRUE;
 
     greeter->priv->n_read += n_read;
@@ -1084,6 +1093,15 @@ greeter_class_init (GreeterClass *klass)
                       NULL,
                       G_TYPE_NONE, 0);
 
+    signals[DISCONNECTED] =
+        g_signal_new (GREETER_SIGNAL_DISCONNECTED,
+                      G_TYPE_FROM_CLASS (klass),
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (GreeterClass, disconnected),
+                      NULL, NULL,
+                      NULL,
+                      G_TYPE_NONE, 0);
+
     signals[CREATE_SESSION] =
         g_signal_new (GREETER_SIGNAL_CREATE_SESSION,
                       G_TYPE_FROM_CLASS (klass),