return socket;
}
+static void
+greeter_disconnected_cb (Greeter *greeter, GreeterSocket *socket)
+{
+ if (greeter == socket->priv->greeter)
+ {
+ g_clear_object (&socket->priv->greeter);
+ g_clear_object (&socket->priv->greeter_socket);
+ }
+}
+
static gboolean
greeter_connect_cb (GSocket *s, GIOCondition condition, GreeterSocket *socket)
{
socket->priv->greeter_socket = new_socket;
g_signal_emit (socket, signals[CREATE_GREETER], 0, &socket->priv->greeter);
+ g_signal_connect (socket->priv->greeter, GREETER_SIGNAL_DISCONNECTED, G_CALLBACK (greeter_disconnected_cb), socket);
greeter_set_file_descriptors (socket->priv->greeter, g_socket_get_fd (new_socket), g_socket_get_fd (new_socket));
return G_SOURCE_CONTINUE;
enum {
CONNECTED,
+ DISCONNECTED,
CREATE_SESSION,
START_SESSION,
LAST_SIGNAL
{
g_debug ("Greeter closed communication channel");
greeter->priv->from_greeter_watch = 0;
+ g_signal_emit (greeter, signals[DISCONNECTED], 0);
return FALSE;
}
{
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)
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),
#define IS_GREETER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GREETER_TYPE))
#define GREETER_SIGNAL_CONNECTED "connected"
+#define GREETER_SIGNAL_DISCONNECTED "disconnected"
#define GREETER_SIGNAL_CREATE_SESSION "create-session"
#define GREETER_SIGNAL_START_SESSION "start-session"
{
GObjectClass parent_class;
void (*connected)(Greeter *greeter);
+ void (*disconnected)(Greeter *greeter);
Session *(*create_session)(Greeter *greeter);
gboolean (*start_session)(Greeter *greeter, SessionType type, const gchar *session);
} GreeterClass;
test-switch-to-users \
test-session-greeter \
test-session-greeter-autologin \
+ test-session-greeter-reconnect \
test-vnc-login \
test-vnc-command \
test-vnc-dimensions \
scripts/script-hook-session-setup-fail.conf \
scripts/script-hook-session-setup-missing.conf \
scripts/session-greeter.conf \
- scripts/session-greeter-autologin.conf \
+ scripts/session-greeter-autologin.conf \
+ scripts/session-greeter-reconnect.conf \
scripts/session-stdout.conf \
scripts/session-stderr.conf \
scripts/session-stderr-multi-write.conf \
--- /dev/null
+#
+# Check can reconnect in-session greeter
+#
+
+[Seat:*]
+autologin-user=have-password1
+user-session=greeter
+
+#?*START-DAEMON
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER-0 START VT=7 SEAT=seat0
+
+# Daemon connects when X server is ready
+#?*XSERVER-0 INDICATE-READY
+#?XSERVER-0 INDICATE-READY
+#?XSERVER-0 ACCEPT-CONNECT
+
+# Session starts
+#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=have-password1
+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+#?XSERVER-0 ACCEPT-CONNECT
+#?SESSION-X-0 CONNECT-XSERVER
+
+# Start greeter inside session
+#?*SESSION-X-0 GREETER-START
+#?SESSION-X-0 GREETER-STARTED
+
+# Stop greeter
+#?*SESSION-X-0 GREETER-STOP
+
+# Re-start greeter
+#?*SESSION-X-0 GREETER-START
+#?SESSION-X-0 GREETER-STARTED
+
+# Log into account with a password
+#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=have-password2
+#?SESSION-X-0 GREETER-SHOW-PROMPT TEXT="Password:"
+#?*SESSION-X-0 GREETER-RESPOND TEXT="password"
+#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password2 AUTHENTICATED=TRUE
+#?*SESSION-X-0 GREETER-START-SESSION
+
+# New X server starts
+#?XSERVER-1 START VT=8 SEAT=seat0
+#?*XSERVER-1 INDICATE-READY
+#?XSERVER-1 INDICATE-READY
+#?XSERVER-1 ACCEPT-CONNECT
+
+# New session starts
+#?SESSION-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_GREETER_DATA_DIR=.*/have-password2 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=have-password2
+#?XSERVER-1 ACCEPT-CONNECT
+#?SESSION-X-1 CONNECT-XSERVER
+
+# Switch to new session
+#?VT ACTIVATE VT=8
+#?LOGIN1 LOCK-SESSION SESSION=c0
+#?LOGIN1 ACTIVATE-SESSION SESSION=c1
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-X-0 TERMINATE SIGNAL=15
+#?XSERVER-1 TERMINATE SIGNAL=15
+#?SESSION-X-1 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
}
}
+ else if (strcmp (name, "GREETER-STOP") == 0)
+ {
+ g_assert (greeter != NULL);
+ g_clear_object (&greeter);
+ }
+
else if (strcmp (name, "GREETER-AUTHENTICATE") == 0)
{
if (!lightdm_greeter_authenticate (greeter, g_hash_table_lookup (params, "USERNAME"), &error))
--- /dev/null
+#!/bin/sh
+./src/dbus-env ./src/test-runner session-greeter-reconnect test-gobject-greeter