return g_object_new (LIGHTDM_TYPE_GREETER, NULL);
}
+ /**
+ * lightdm_greeter_set_resettable:
+ * @greeter: A #LightDMGreeter
+ * @resettable: Whether the greeter wants to be reset instead of killed after the user logs in
+ *
+ * Set whether the greeter will be reset instead of killed after the user logs in.
+ * This must be called before lightdm_greeter_connect is called.
+ **/
+ void
+ lightdm_greeter_set_resettable (LightDMGreeter *greeter, gboolean resettable)
+ {
+ LightDMGreeterPrivate *priv;
+
+ g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
+
+ priv = GET_PRIVATE (greeter);
+
+ g_return_if_fail (!priv->connected);
+ priv->resettable = resettable;
+ }
+
static Request *
-request_new (void)
+request_new (GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
{
Request *request;
return TRUE;
}
-static void
+static gboolean
- send_connect (LightDMGreeter *greeter)
+ send_connect (LightDMGreeter *greeter, gboolean resettable)
{
guint8 message[MAX_MESSAGE_LENGTH];
gsize offset = 0;
g_debug ("Connecting to display manager...");
- write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECT, string_length (VERSION), &offset);
+ write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECT, string_length (VERSION) + int_length (), &offset);
write_string (message, MAX_MESSAGE_LENGTH, VERSION, &offset);
- write_message (greeter, message, offset);
+ write_int (message, MAX_MESSAGE_LENGTH, resettable ? 1 : 0, &offset);
++
+ return send_message (greeter, message, offset);
}
-static void
+static gboolean
send_start_session (LightDMGreeter *greeter, const gchar *session)
{
guint8 message[MAX_MESSAGE_LENGTH];
write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_ENSURE_SHARED_DIR, string_length (username), &offset);
write_string (message, MAX_MESSAGE_LENGTH, username, &offset);
- write_message (greeter, message, offset);
+ return send_message (greeter, message, offset);
+}
+
+/**
+ * lightdm_greeter_connect:
+ * @greeter: The greeter to connect
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: (allow-none): A #GAsyncReadyCallback to call when completed or %NULL.
+ * @user_data: (allow-none): data to pass to the @callback or %NULL.
+ *
+ * Asynchronously connects the greeter to the display manager.
+ *
+ * When the operation is finished, @callback will be invoked. You can then call lightdm_greeter_connect_finish() to get the result of the operation.
+ *
+ * See lightdm_greeter_connect_sync() for the synchronous version.
+ **/
+void
+lightdm_greeter_connect (LightDMGreeter *greeter, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
+{
+ LightDMGreeterPrivate *priv;
+ Request *request;
+
+ g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
+
+ priv = GET_PRIVATE (greeter);
+
+ request = request_new (cancellable, callback, user_data);
+ priv->connect_requests = g_list_append (priv->connect_requests, request);
- send_connect (greeter);
++ send_connect (greeter, priv->resettable);
+}
+
+/**
+ * lightdm_greeter_connect_finish:
+ * @result: A #GAsyncResult.
+ * @error: return location for a #GError, or %NULL
+ *
+ * Finishes an operation started with lightdm_greeter_connect().
+ *
+ * Return value: #TRUE if successfully connected
+ **/
+gboolean
+lightdm_greeter_connect_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error)
+{
+ g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
+ return REQUEST (result)->complete;
}
/**
priv = GET_PRIVATE (greeter);
- fd = g_getenv ("LIGHTDM_TO_SERVER_FD");
- if (!fd)
- {
- g_warning ("No LIGHTDM_TO_SERVER_FD environment variable");
- return FALSE;
- }
- priv->to_server_channel = g_io_channel_unix_new (atoi (fd));
- g_io_channel_set_encoding (priv->to_server_channel, NULL, NULL);
-
- fd = g_getenv ("LIGHTDM_FROM_SERVER_FD");
- if (!fd)
- {
- g_warning ("No LIGHTDM_FROM_SERVER_FD environment variable");
- return FALSE;
- }
- priv->from_server_channel = g_io_channel_unix_new (atoi (fd));
- g_io_channel_set_encoding (priv->from_server_channel, NULL, NULL);
- g_io_add_watch (priv->from_server_channel, G_IO_IN, from_server_cb, greeter);
-
/* Read until we are connected */
- send_connect (greeter);
+ send_connect (greeter, priv->resettable);
- request = request_new ();
+ request = request_new (NULL, NULL, NULL);
priv->connect_requests = g_list_append (priv->connect_requests, g_object_ref (request));
do
{
status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
}
- if (lightdm_greeter_get_select_user_hint (greeter))
- status_notify ("%s SELECT-USER-HINT USERNAME=%s", greeter_id, lightdm_greeter_get_select_user_hint (greeter));
- if (lightdm_greeter_get_select_guest_hint (greeter))
- status_notify ("%s SELECT-GUEST-HINT", greeter_id);
- if (lightdm_greeter_get_lock_hint (greeter))
- status_notify ("%s LOCK-HINT", greeter_id);
- if (!lightdm_greeter_get_has_guest_account_hint (greeter))
- status_notify ("%s HAS-GUEST-ACCOUNT-HINT=FALSE", greeter_id);
- if (lightdm_greeter_get_hide_users_hint (greeter))
- status_notify ("%s HIDE-USERS-HINT", greeter_id);
- if (lightdm_greeter_get_show_manual_login_hint (greeter))
- status_notify ("%s SHOW-MANUAL-LOGIN-HINT", greeter_id);
- if (!lightdm_greeter_get_show_remote_login_hint (greeter))
- status_notify ("%s SHOW-REMOTE-LOGIN-HINT=FALSE", greeter_id);
+static void
+connect_finished (GObject *object, GAsyncResult *result, gpointer data)
+{
+ LightDMGreeter *greeter = LIGHTDM_GREETER (object);
+ GError *error = NULL;
+
+ if (!lightdm_greeter_connect_finish (greeter, result, &error))
+ {
+ status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
+ exit_code = EXIT_FAILURE;
+ g_main_loop_quit (loop);
+ return;
+ }
+
+ status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
+
++ notify_hints (greeter);
+}
+
int
main (int argc, char **argv)
{