2 * Copyright (C) 2010 Robert Ancell.
3 * Author: Robert Ancell <robert.ancell@canonical.com>
5 * This library is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU Lesser General Public License as published by the Free
7 * Software Foundation; either version 3 of the License, or (at your option) any
8 * later version. See http://www.gnu.org/copyleft/lgpl.html the full text of the
18 #include <sys/utsname.h>
20 #include <gio/gdesktopappinfo.h>
21 #include <security/pam_appl.h>
22 #include <libxklavier/xklavier.h>
24 #include "lightdm/greeter.h"
29 PROP_DEFAULT_LANGUAGE,
33 PROP_DEFAULT_SESSION_HINT,
35 PROP_HAS_GUEST_ACCOUNT_HINT,
36 PROP_SELECT_USER_HINT,
37 PROP_SELECT_GUEST_HINT,
38 PROP_AUTOLOGIN_USER_HINT,
39 PROP_AUTOLOGIN_GUEST_HINT,
40 PROP_AUTOLOGIN_TIMEOUT_HINT,
41 PROP_AUTHENTICATION_USER,
42 PROP_IN_AUTHENTICATION,
43 PROP_IS_AUTHENTICATED,
54 AUTHENTICATION_COMPLETE,
56 AUTOLOGIN_TIMER_EXPIRED,
60 static guint signals[LAST_SIGNAL] = { 0 };
64 GDBusConnection *system_bus;
66 GIOChannel *to_server_channel, *from_server_channel;
74 LightDMUserList *user_list;
76 gboolean have_languages;
79 XklEngine *xkl_engine;
80 XklConfigRec *xkl_config;
81 gboolean have_layouts;
85 gboolean have_sessions;
88 gchar *authentication_user;
89 gboolean in_authentication;
90 gboolean is_authenticated;
91 guint32 authenticate_sequence_number;
92 gboolean cancelling_authentication;
97 } LightDMGreeterPrivate;
99 G_DEFINE_TYPE (LightDMGreeter, lightdm_greeter, G_TYPE_OBJECT);
101 #define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_GREETER, LightDMGreeterPrivate)
103 #define HEADER_SIZE 8
104 #define MAX_MESSAGE_LENGTH 1024
106 /* Messages from the greeter to the server */
109 GREETER_MESSAGE_CONNECT = 0,
110 GREETER_MESSAGE_LOGIN,
111 GREETER_MESSAGE_LOGIN_AS_GUEST,
112 GREETER_MESSAGE_CONTINUE_AUTHENTICATION,
113 GREETER_MESSAGE_START_SESSION,
114 GREETER_MESSAGE_CANCEL_AUTHENTICATION
117 /* Messages from the server to the greeter */
120 SERVER_MESSAGE_CONNECTED = 0,
122 SERVER_MESSAGE_PROMPT_AUTHENTICATION,
123 SERVER_MESSAGE_END_AUTHENTICATION,
124 SERVER_MESSAGE_SESSION_FAILED,
128 * lightdm_greeter_new:
130 * Create a new greeter.
132 * Return value: the new #LightDMGreeter
135 lightdm_greeter_new ()
137 return g_object_new (LIGHTDM_TYPE_GREETER, NULL);
141 timed_login_cb (gpointer data)
143 LightDMGreeter *greeter = data;
144 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
146 priv->login_timeout = 0;
147 g_signal_emit (G_OBJECT (greeter), signals[AUTOLOGIN_TIMER_EXPIRED], 0);
159 write_message (LightDMGreeter *greeter, guint8 *message, gsize message_length)
161 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
162 GError *error = NULL;
164 if (g_io_channel_write_chars (priv->to_server_channel, (gchar *) message, message_length, NULL, NULL) != G_IO_STATUS_NORMAL)
165 g_warning ("Error writing to daemon: %s", error->message);
167 g_debug ("Wrote %zi bytes to daemon", message_length);
168 g_clear_error (&error);
169 g_io_channel_flush (priv->to_server_channel, NULL);
173 write_int (guint8 *buffer, gint buffer_length, guint32 value, gsize *offset)
175 if (*offset + 4 >= buffer_length)
177 buffer[*offset] = value >> 24;
178 buffer[*offset+1] = (value >> 16) & 0xFF;
179 buffer[*offset+2] = (value >> 8) & 0xFF;
180 buffer[*offset+3] = value & 0xFF;
185 write_string (guint8 *buffer, gint buffer_length, const gchar *value, gsize *offset)
187 gint length = strlen (value);
188 write_int (buffer, buffer_length, length, offset);
189 if (*offset + length >= buffer_length)
191 memcpy (buffer + *offset, value, length);
196 read_int (LightDMGreeter *greeter, gsize *offset)
198 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
202 if (priv->n_read - *offset < int_length ())
204 g_warning ("Not enough space for int, need %i, got %zi", int_length (), priv->n_read - *offset);
208 buffer = priv->read_buffer + *offset;
209 value = buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3];
210 *offset += int_length ();
216 read_string (LightDMGreeter *greeter, gsize *offset)
218 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
222 length = read_int (greeter, offset);
223 if (priv->n_read - *offset < length)
225 g_warning ("Not enough space for string, need %u, got %zu", length, priv->n_read - *offset);
226 return g_strdup ("");
229 value = g_malloc (sizeof (gchar) * (length + 1));
230 memcpy (value, priv->read_buffer + *offset, length);
231 value[length] = '\0';
238 string_length (const gchar *value)
240 return int_length () + strlen (value);
244 write_header (guint8 *buffer, gint buffer_length, guint32 id, guint32 length, gsize *offset)
246 write_int (buffer, buffer_length, id, offset);
247 write_int (buffer, buffer_length, length, offset);
250 static guint32 get_packet_length (LightDMGreeter *greeter)
253 return read_int (greeter, &offset);
257 handle_connected (LightDMGreeter *greeter, guint32 length, gsize *offset)
259 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
261 GString *hint_string;
264 version = read_string (greeter, offset);
265 hint_string = g_string_new ("");
266 while (*offset < length)
270 name = read_string (greeter, offset);
271 value = read_string (greeter, offset);
272 g_hash_table_insert (priv->hints, name, value);
273 g_string_append_printf (hint_string, " %s=%s", name, value);
276 g_debug ("Connected version=%s%s", version, hint_string->str);
278 g_string_free (hint_string, TRUE);
280 /* Set timeout for default login */
281 timeout = lightdm_greeter_get_autologin_timeout_hint (greeter);
284 g_debug ("Setting autologin timer for %d seconds", timeout);
285 priv->login_timeout = g_timeout_add (timeout * 1000, timed_login_cb, greeter);
287 g_signal_emit (G_OBJECT (greeter), signals[CONNECTED], 0);
291 handle_prompt_authentication (LightDMGreeter *greeter, gsize *offset)
293 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
294 guint32 sequence_number, n_messages, i;
296 sequence_number = read_int (greeter, offset);
297 if (sequence_number != priv->authenticate_sequence_number)
299 g_debug ("Ignoring prompt authentication with invalid sequence number %d", sequence_number);
303 if (priv->cancelling_authentication)
305 g_debug ("Ignoring prompt authentication as waiting for it to cancel");
309 n_messages = read_int (greeter, offset);
310 g_debug ("Prompt user with %d message(s)", n_messages);
312 for (i = 0; i < n_messages; i++)
317 msg_style = read_int (greeter, offset);
318 msg = read_string (greeter, offset);
320 // FIXME: Should stop on prompts?
323 case PAM_PROMPT_ECHO_OFF:
324 g_signal_emit (G_OBJECT (greeter), signals[SHOW_PROMPT], 0, msg, LIGHTDM_PROMPT_TYPE_SECRET);
326 case PAM_PROMPT_ECHO_ON:
327 g_signal_emit (G_OBJECT (greeter), signals[SHOW_PROMPT], 0, msg, LIGHTDM_PROMPT_TYPE_QUESTION);
330 g_signal_emit (G_OBJECT (greeter), signals[SHOW_MESSAGE], 0, msg, LIGHTDM_MESSAGE_TYPE_ERROR);
333 g_signal_emit (G_OBJECT (greeter), signals[SHOW_MESSAGE], 0, msg, LIGHTDM_MESSAGE_TYPE_INFO);
342 handle_end_authentication (LightDMGreeter *greeter, gsize *offset)
344 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
345 guint32 sequence_number, return_code;
347 sequence_number = read_int (greeter, offset);
348 return_code = read_int (greeter, offset);
350 if (sequence_number != priv->authenticate_sequence_number)
352 g_debug ("Ignoring end authentication with invalid sequence number %d", sequence_number);
356 g_debug ("Authentication complete with return code %d", return_code);
357 priv->cancelling_authentication = FALSE;
358 priv->is_authenticated = (return_code == 0);
359 if (!priv->is_authenticated)
361 g_free (priv->authentication_user);
362 priv->authentication_user = NULL;
364 g_signal_emit (G_OBJECT (greeter), signals[AUTHENTICATION_COMPLETE], 0);
365 priv->in_authentication = FALSE;
369 handle_session_failed (LightDMGreeter *greeter, gsize *offset)
371 g_debug ("Session failed to start");
372 g_signal_emit (G_OBJECT (greeter), signals[SESSION_FAILED], 0);
376 handle_quit (LightDMGreeter *greeter, gsize *offset)
378 g_debug ("Got quit request from server");
379 g_signal_emit (G_OBJECT (greeter), signals[QUIT], 0);
383 read_packet (LightDMGreeter *greeter, gboolean block)
385 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
386 gsize n_to_read, n_read;
387 GError *error = NULL;
389 /* Read the header, or the whole packet if we already have that */
390 n_to_read = HEADER_SIZE;
391 if (priv->n_read >= HEADER_SIZE)
392 n_to_read += get_packet_length (greeter);
397 status = g_io_channel_read_chars (priv->from_server_channel,
398 (gchar *) priv->read_buffer + priv->n_read,
399 n_to_read - priv->n_read,
402 if (status == G_IO_STATUS_ERROR)
403 g_warning ("Error reading from server: %s", error->message);
404 g_clear_error (&error);
405 if (status != G_IO_STATUS_NORMAL)
408 g_debug ("Read %zi bytes from daemon", n_read);
410 priv->n_read += n_read;
411 } while (priv->n_read < n_to_read && block);
413 /* Stop if haven't got all the data we want */
414 if (priv->n_read != n_to_read)
417 /* If have header, rerun for content */
418 if (priv->n_read == HEADER_SIZE)
420 n_to_read = get_packet_length (greeter);
423 priv->read_buffer = g_realloc (priv->read_buffer, HEADER_SIZE + n_to_read);
424 return read_packet (greeter, block);
432 from_server_cb (GIOChannel *source, GIOCondition condition, gpointer data)
434 LightDMGreeter *greeter = data;
435 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
439 if (!read_packet (greeter, FALSE))
443 id = read_int (greeter, &offset);
444 length = read_int (greeter, &offset);
447 case SERVER_MESSAGE_CONNECTED:
448 handle_connected (greeter, length, &offset);
450 case SERVER_MESSAGE_PROMPT_AUTHENTICATION:
451 handle_prompt_authentication (greeter, &offset);
453 case SERVER_MESSAGE_END_AUTHENTICATION:
454 handle_end_authentication (greeter, &offset);
456 case SERVER_MESSAGE_SESSION_FAILED:
457 handle_session_failed (greeter, &offset);
459 case SERVER_MESSAGE_QUIT:
460 handle_quit (greeter, &offset);
463 g_warning ("Unknown message from server: %d", id);
473 * lightdm_greeter_connect_to_server:
474 * @greeter: The greeter to connect
476 * Connects the greeter to the display manager.
478 * Return value: #TRUE if successfully connected
481 lightdm_greeter_connect_to_server (LightDMGreeter *greeter)
483 LightDMGreeterPrivate *priv;
484 GError *error = NULL;
486 guint8 message[MAX_MESSAGE_LENGTH];
489 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
491 priv = GET_PRIVATE (greeter);
493 priv->system_bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
494 if (!priv->system_bus)
495 g_warning ("Failed to connect to system bus: %s", error->message);
496 g_clear_error (&error);
498 fd = getenv ("LIGHTDM_TO_SERVER_FD");
501 g_warning ("No LIGHTDM_TO_SERVER_FD environment variable");
504 priv->to_server_channel = g_io_channel_unix_new (atoi (fd));
505 g_io_channel_set_encoding (priv->to_server_channel, NULL, NULL);
507 fd = getenv ("LIGHTDM_FROM_SERVER_FD");
510 g_warning ("No LIGHTDM_FROM_SERVER_FD environment variable");
513 priv->from_server_channel = g_io_channel_unix_new (atoi (fd));
514 g_io_channel_set_encoding (priv->from_server_channel, NULL, NULL);
515 g_io_add_watch (priv->from_server_channel, G_IO_IN, from_server_cb, greeter);
517 g_debug ("Connecting to display manager...");
518 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECT, string_length (VERSION), &offset);
519 write_string (message, MAX_MESSAGE_LENGTH, VERSION, &offset);
520 write_message (greeter, message, offset);
526 * lightdm_greeter_get_hostname:
527 * @greeter: a #LightDMGreeter
529 * Return value: The host this greeter is displaying
532 lightdm_greeter_get_hostname (LightDMGreeter *greeter)
534 LightDMGreeterPrivate *priv;
536 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
538 priv = GET_PRIVATE (greeter);
544 priv->hostname = g_strdup (info.nodename);
547 return priv->hostname;
551 update_languages (LightDMGreeter *greeter)
553 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
554 gchar *stdout_text = NULL, *stderr_text = NULL;
557 GError *error = NULL;
559 if (priv->have_languages)
562 result = g_spawn_command_line_sync ("locale -a", &stdout_text, &stderr_text, &exit_status, &error);
563 if (!result || exit_status != 0)
564 g_warning ("Failed to get languages, locale -a returned %d: %s", exit_status, error->message);
570 tokens = g_strsplit_set (stdout_text, "\n\r", -1);
571 for (i = 0; tokens[i]; i++)
573 LightDMLanguage *language;
576 code = g_strchug (tokens[i]);
580 /* Ignore the non-interesting languages */
581 if (strcmp (code, "C") == 0 || strcmp (code, "POSIX") == 0)
584 language = g_object_new (LIGHTDM_TYPE_LANGUAGE, "code", code, NULL);
585 priv->languages = g_list_append (priv->languages, language);
591 g_clear_error (&error);
592 g_free (stdout_text);
593 g_free (stderr_text);
595 priv->have_languages = TRUE;
599 * lightdm_greeter_get_default_language:
600 * @greeter: A #LightDMGreeter
602 * Get the default language.
604 * Return value: The default language.
607 lightdm_greeter_get_default_language (LightDMGreeter *greeter)
610 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
611 lang = getenv ("LANG");
619 * lightdm_greeter_get_languages:
620 * @greeter: A #LightDMGreeter
622 * Get a list of languages to present to the user.
624 * Return value: (element-type LightDMLanguage) (transfer none): A list of #LightDMLanguage that should be presented to the user.
627 lightdm_greeter_get_languages (LightDMGreeter *greeter)
629 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
630 update_languages (greeter);
631 return GET_PRIVATE (greeter)->languages;
635 layout_cb (XklConfigRegistry *config,
636 const XklConfigItem *item,
639 LightDMGreeter *greeter = data;
640 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
641 LightDMLayout *layout;
643 layout = g_object_new (LIGHTDM_TYPE_LAYOUT, "name", item->name, "short-description", item->short_description, "description", item->description, NULL);
644 priv->layouts = g_list_append (priv->layouts, layout);
648 setup_display (LightDMGreeter *greeter)
650 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
652 priv->display = XOpenDisplay (NULL);
656 setup_xkl (LightDMGreeter *greeter)
658 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
660 setup_display (greeter);
662 priv->xkl_engine = xkl_engine_get_instance (priv->display);
663 priv->xkl_config = xkl_config_rec_new ();
664 if (!xkl_config_rec_get_from_server (priv->xkl_config, priv->xkl_engine))
665 g_warning ("Failed to get Xkl configuration from server");
666 priv->layout = g_strdup (priv->xkl_config->layouts[0]);
670 * lightdm_greeter_get_layouts:
671 * @greeter: A #LightDMGreeter
673 * Get a list of keyboard layouts to present to the user.
675 * Return value: (element-type LightDMLayout) (transfer none): A list of #LightDMLayout that should be presented to the user.
678 lightdm_greeter_get_layouts (LightDMGreeter *greeter)
680 LightDMGreeterPrivate *priv;
681 XklConfigRegistry *registry;
683 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
685 priv = GET_PRIVATE (greeter);
687 if (priv->have_layouts)
688 return priv->layouts;
692 registry = xkl_config_registry_get_instance (priv->xkl_engine);
693 xkl_config_registry_load (registry, FALSE);
694 xkl_config_registry_foreach_layout (registry, layout_cb, greeter);
695 g_object_unref (registry);
696 priv->have_layouts = TRUE;
698 return priv->layouts;
702 * lightdm_greeter_set_layout:
703 * @greeter: A #LightDMGreeter
704 * @layout: The layout to use
706 * Set the layout for this session.
709 lightdm_greeter_set_layout (LightDMGreeter *greeter, const gchar *layout)
711 LightDMGreeterPrivate *priv;
712 XklConfigRec *config;
714 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
715 g_return_if_fail (layout != NULL);
717 priv = GET_PRIVATE (greeter);
719 g_debug ("Setting keyboard layout to %s", layout);
723 config = xkl_config_rec_new ();
724 config->layouts = g_malloc (sizeof (gchar *) * 2);
725 config->model = g_strdup (priv->xkl_config->model);
726 config->layouts[0] = g_strdup (layout);
727 config->layouts[1] = NULL;
728 if (!xkl_config_rec_activate (config, priv->xkl_engine))
729 g_warning ("Failed to activate XKL config");
731 priv->layout = g_strdup (layout);
732 g_object_unref (config);
736 * lightdm_greeter_get_layout:
737 * @greeter: A #LightDMGreeter
739 * Get the current keyboard layout.
741 * Return value: The currently active layout for this user.
744 lightdm_greeter_get_layout (LightDMGreeter *greeter)
746 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
748 return GET_PRIVATE (greeter)->layout;
752 update_sessions (LightDMGreeter *greeter)
754 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
756 GError *error = NULL;
758 if (priv->have_sessions)
761 directory = g_dir_open (XSESSIONS_DIR, 0, &error);
763 g_warning ("Failed to open sessions directory: %s", error->message);
764 g_clear_error (&error);
770 const gchar *filename;
775 filename = g_dir_read_name (directory);
776 if (filename == NULL)
779 if (!g_str_has_suffix (filename, ".desktop"))
782 key = g_strndup (filename, strlen (filename) - strlen (".desktop"));
783 path = g_build_filename (XSESSIONS_DIR, filename, NULL);
784 g_debug ("Loading session %s", path);
786 key_file = g_key_file_new ();
787 result = g_key_file_load_from_file (key_file, path, G_KEY_FILE_NONE, &error);
789 g_warning ("Failed to load session file %s: %s:", path, error->message);
790 g_clear_error (&error);
792 if (result && !g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, NULL))
794 gchar *domain, *name, *comment;
796 #ifdef G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN
797 domain = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN, NULL);
799 domain = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "X-GNOME-Gettext-Domain", NULL);
801 name = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NAME, domain, NULL);
802 comment = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_COMMENT, domain, NULL);
804 comment = g_strdup ("");
807 g_debug ("Loaded session %s (%s, %s)", key, name, comment);
808 priv->sessions = g_list_append (priv->sessions, g_object_new (LIGHTDM_TYPE_SESSION, "key", key, "name", name, "comment", comment, NULL));
811 g_warning ("Invalid session %s: %s", path, error->message);
819 g_key_file_free (key_file);
822 g_dir_close (directory);
824 priv->have_sessions = TRUE;
828 * lightdm_greeter_get_sessions:
829 * @greeter: A #LightDMGreeter
831 * Get the available sessions.
833 * Return value: (element-type LightDMSession) (transfer none): A list of #LightDMSession
836 lightdm_greeter_get_sessions (LightDMGreeter *greeter)
838 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
839 update_sessions (greeter);
840 return GET_PRIVATE (greeter)->sessions;
844 * lightdm_greeter_get_hint:
845 * @greeter: A #LightDMGreeter
846 * @name: The hint name to query.
850 * Return value: The value for this hint or #NULL if not set.
853 lightdm_greeter_get_hint (LightDMGreeter *greeter, const gchar *name)
855 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
856 return g_hash_table_lookup (GET_PRIVATE (greeter)->hints, name);
860 * lightdm_greeter_get_default_session_hint:
861 * @greeter: A #LightDMGreeter
863 * Get the default session to use.
865 * Return value: The session name
868 lightdm_greeter_get_default_session_hint (LightDMGreeter *greeter)
870 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
871 return lightdm_greeter_get_hint (greeter, "default-session");
875 * lightdm_greeter_get_hide_users_hint:
876 * @greeter: A #LightDMGreeter
878 * Check if user accounts should be shown.
880 * Return value: #TRUE if the available users should not be shown.
883 lightdm_greeter_get_hide_users_hint (LightDMGreeter *greeter)
887 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
888 value = lightdm_greeter_get_hint (greeter, "hide-users");
890 return g_strcmp0 (value, "true") == 0;
894 * lightdm_greeter_get_has_guest_account_hint:
895 * @greeter: A #LightDMGreeter
897 * Check if guest sessions are supported.
899 * Return value: #TRUE if guest sessions are supported.
902 lightdm_greeter_get_has_guest_account_hint (LightDMGreeter *greeter)
906 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
907 value = lightdm_greeter_get_hint (greeter, "has-guest-account");
909 return g_strcmp0 (value, "true") == 0;
913 * lightdm_greeter_get_select_user_hint:
914 * @greeter: A #LightDMGreeter
916 * Get the user to select by default.
918 * Return value: A username
921 lightdm_greeter_get_select_user_hint (LightDMGreeter *greeter)
923 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
924 return lightdm_greeter_get_hint (greeter, "select-user");
928 * lightdm_greeter_get_select_guest_hint:
929 * @greeter: A #LightDMGreeter
931 * Check if the guest account should be selected by default.
933 * Return value: #TRUE if the guest account should be selected by default.
936 lightdm_greeter_get_select_guest_hint (LightDMGreeter *greeter)
940 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
941 value = lightdm_greeter_get_hint (greeter, "select-guest");
943 return g_strcmp0 (value, "true") == 0;
947 * lightdm_greeter_get_autologin_user_hint:
948 * @greeter: A #LightDMGreeter
950 * Get the user account to automatically logg into when the timer expires.
952 * Return value: The user account to automatically log into.
955 lightdm_greeter_get_autologin_user_hint (LightDMGreeter *greeter)
957 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
958 return lightdm_greeter_get_hint (greeter, "autologin-user");
962 * lightdm_greeter_get_autologin_guest_hint:
963 * @greeter: A #LightDMGreeter
965 * Check if the guest account should be automatically logged into when the timer expires.
967 * Return value: #TRUE if the guest account should be automatically logged into.
970 lightdm_greeter_get_autologin_guest_hint (LightDMGreeter *greeter)
974 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
975 value = lightdm_greeter_get_hint (greeter, "autologin-guest");
977 return g_strcmp0 (value, "true") == 0;
981 * lightdm_greeter_get_autologin_timeout_hint:
982 * @greeter: A #LightDMGreeter
984 * Get the number of seconds to wait before automaitcally logging in.
986 * Return value: The number of seconds to wait before automatically logging in or 0 for no timeout.
989 lightdm_greeter_get_autologin_timeout_hint (LightDMGreeter *greeter)
994 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
995 value = lightdm_greeter_get_hint (greeter, "autologin-timeout");
997 timeout = atoi (value);
1005 * lightdm_greeter_cancel_timed_login:
1006 * @greeter: A #LightDMGreeter
1008 * Cancel the login as the default user.
1011 lightdm_greeter_cancel_timed_login (LightDMGreeter *greeter)
1013 LightDMGreeterPrivate *priv;
1015 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1017 priv = GET_PRIVATE (greeter);
1019 if (priv->login_timeout)
1020 g_source_remove (priv->login_timeout);
1021 priv->login_timeout = 0;
1025 * lightdm_greeter_login:
1026 * @greeter: A #LightDMGreeter
1027 * @username: (allow-none): A username or #NULL to prompt for a username.
1029 * Starts the authentication procedure for a user.
1032 lightdm_greeter_login (LightDMGreeter *greeter, const char *username)
1034 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
1035 guint8 message[MAX_MESSAGE_LENGTH];
1038 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1043 priv->cancelling_authentication = FALSE;
1044 priv->authenticate_sequence_number++;
1045 priv->in_authentication = TRUE;
1046 priv->is_authenticated = FALSE;
1047 g_free (priv->authentication_user);
1048 priv->authentication_user = g_strdup (username);
1050 g_debug ("Starting authentication for user %s...", username);
1051 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_LOGIN, int_length () + string_length (username), &offset);
1052 write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);
1053 write_string (message, MAX_MESSAGE_LENGTH, username, &offset);
1054 write_message (greeter, message, offset);
1058 * lightdm_greeter_login_with_user_prompt:
1059 * @greeter: A #LightDMGreeter
1061 * Starts the authentication procedure, prompting the greeter for a username.
1064 lightdm_greeter_login_with_user_prompt (LightDMGreeter *greeter)
1066 lightdm_greeter_login (greeter, NULL);
1070 * lightdm_greeter_login_as_guest:
1071 * @greeter: A #LightDMGreeter
1073 * Starts the authentication procedure for the guest user.
1076 lightdm_greeter_login_as_guest (LightDMGreeter *greeter)
1078 LightDMGreeterPrivate *priv;
1079 guint8 message[MAX_MESSAGE_LENGTH];
1082 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1084 priv = GET_PRIVATE (greeter);
1086 priv->cancelling_authentication = FALSE;
1087 priv->authenticate_sequence_number++;
1088 priv->in_authentication = TRUE;
1089 priv->is_authenticated = FALSE;
1090 g_free (priv->authentication_user);
1091 priv->authentication_user = NULL;
1093 g_debug ("Starting authentication for guest account...");
1094 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_LOGIN_AS_GUEST, int_length (), &offset);
1095 write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);
1096 write_message (greeter, message, offset);
1100 * lightdm_greeter_respond:
1101 * @greeter: A #LightDMGreeter
1102 * @response: Response to a prompt
1104 * Provide response to a prompt.
1107 lightdm_greeter_respond (LightDMGreeter *greeter, const gchar *response)
1109 guint8 message[MAX_MESSAGE_LENGTH];
1112 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1113 g_return_if_fail (response != NULL);
1115 g_debug ("Providing response to display manager");
1116 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONTINUE_AUTHENTICATION, int_length () + string_length (response), &offset);
1117 // FIXME: Could be multiple responses required
1118 write_int (message, MAX_MESSAGE_LENGTH, 1, &offset);
1119 write_string (message, MAX_MESSAGE_LENGTH, response, &offset);
1120 write_message (greeter, message, offset);
1124 * lightdm_greeter_cancel_authentication:
1125 * @greeter: A #LightDMGreeter
1127 * Cancel the current user authentication.
1130 lightdm_greeter_cancel_authentication (LightDMGreeter *greeter)
1132 LightDMGreeterPrivate *priv;
1133 guint8 message[MAX_MESSAGE_LENGTH];
1136 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1138 priv = GET_PRIVATE (greeter);
1140 priv->cancelling_authentication = TRUE;
1141 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CANCEL_AUTHENTICATION, 0, &offset);
1142 write_message (greeter, message, offset);
1146 * lightdm_greeter_get_in_authentication:
1147 * @greeter: A #LightDMGreeter
1149 * Checks if the greeter is in the process of authenticating.
1151 * Return value: #TRUE if the greeter is authenticating a user.
1154 lightdm_greeter_get_in_authentication (LightDMGreeter *greeter)
1156 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1157 return GET_PRIVATE (greeter)->in_authentication;
1161 * lightdm_greeter_get_is_authenticated:
1162 * @greeter: A #LightDMGreeter
1164 * Checks if the greeter has successfully authenticated.
1166 * Return value: #TRUE if the greeter is authenticated for login.
1169 lightdm_greeter_get_is_authenticated (LightDMGreeter *greeter)
1171 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1172 return GET_PRIVATE (greeter)->is_authenticated;
1176 * lightdm_greeter_get_authentication_user:
1177 * @greeter: A #LightDMGreeter
1179 * Get the user that is being authenticated.
1181 * Return value: The username of the authentication user being authenticated or #NULL if no authentication in progress.
1184 lightdm_greeter_get_authentication_user (LightDMGreeter *greeter)
1186 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
1187 return GET_PRIVATE (greeter)->authentication_user;
1191 * lightdm_greeter_start_session:
1192 * @greeter: A #LightDMGreeter
1193 * @session: (allow-none): The session to log into or #NULL to use the default
1195 * Start a session for the logged in user.
1198 lightdm_greeter_start_session (LightDMGreeter *greeter, const gchar *session)
1200 guint8 message[MAX_MESSAGE_LENGTH];
1203 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1208 g_debug ("Starting session %s", session);
1209 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_START_SESSION, string_length (session), &offset);
1210 write_string (message, MAX_MESSAGE_LENGTH, session, &offset);
1211 write_message (greeter, message, offset);
1215 * lightdm_greeter_start_session_with_defaults:
1216 * @greeter: A #LightDMGreeter
1218 * Login a user to a session using default settings for that user.
1221 lightdm_greeter_start_default_session (LightDMGreeter *greeter)
1223 lightdm_greeter_start_session (greeter, NULL);
1227 upower_call_function (LightDMGreeter *greeter, const gchar *function, gboolean has_result)
1229 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
1232 GError *error = NULL;
1233 gboolean function_result = FALSE;
1235 if (!priv->system_bus)
1238 proxy = g_dbus_proxy_new_sync (priv->system_bus,
1239 G_DBUS_PROXY_FLAGS_NONE,
1241 "org.freedesktop.UPower",
1242 "/org/freedesktop/UPower",
1243 "org.freedesktop.UPower",
1245 result = g_dbus_proxy_call_sync (proxy,
1248 G_DBUS_CALL_FLAGS_NONE,
1252 g_object_unref (proxy);
1255 g_warning ("Error calling UPower function %s: %s", function, error->message);
1256 g_clear_error (&error);
1260 if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)")))
1261 g_variant_get (result, "(b)", &function_result);
1263 g_variant_unref (result);
1264 return function_result;
1268 * lightdm_greeter_get_can_suspend:
1269 * @greeter: A #LightDMGreeter
1271 * Checks if the greeter is authorized to do a system suspend.
1273 * Return value: #TRUE if the greeter can suspend the system
1276 lightdm_greeter_get_can_suspend (LightDMGreeter *greeter)
1278 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1279 return upower_call_function (greeter, "SuspendAllowed", TRUE);
1283 * lightdm_greeter_suspend:
1284 * @greeter: A #LightDMGreeter
1286 * Triggers a system suspend.
1289 lightdm_greeter_suspend (LightDMGreeter *greeter)
1291 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1292 upower_call_function (greeter, "Suspend", FALSE);
1296 * lightdm_greeter_get_can_hibernate:
1297 * @greeter: A #LightDMGreeter
1299 * Checks if the greeter is authorized to do a system hibernate.
1301 * Return value: #TRUE if the greeter can hibernate the system
1304 lightdm_greeter_get_can_hibernate (LightDMGreeter *greeter)
1306 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1307 return upower_call_function (greeter, "HibernateAllowed", TRUE);
1311 * lightdm_greeter_hibernate:
1312 * @greeter: A #LightDMGreeter
1314 * Triggers a system hibernate.
1317 lightdm_greeter_hibernate (LightDMGreeter *greeter)
1319 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1320 upower_call_function (greeter, "Hibernate", FALSE);
1324 ck_call_function (LightDMGreeter *greeter, const gchar *function, gboolean has_result)
1326 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
1329 GError *error = NULL;
1330 gboolean function_result = FALSE;
1332 if (!priv->system_bus)
1335 proxy = g_dbus_proxy_new_sync (priv->system_bus,
1336 G_DBUS_PROXY_FLAGS_NONE,
1338 "org.freedesktop.ConsoleKit",
1339 "/org/freedesktop/ConsoleKit/Manager",
1340 "org.freedesktop.ConsoleKit.Manager",
1342 result = g_dbus_proxy_call_sync (proxy,
1345 G_DBUS_CALL_FLAGS_NONE,
1349 g_object_unref (proxy);
1352 g_warning ("Error calling ConsoleKit function %s: %s", function, error->message);
1353 g_clear_error (&error);
1357 if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)")))
1358 g_variant_get (result, "(b)", &function_result);
1360 g_variant_unref (result);
1361 return function_result;
1365 * lightdm_greeter_get_can_restart:
1366 * @greeter: A #LightDMGreeter
1368 * Checks if the greeter is authorized to do a system restart.
1370 * Return value: #TRUE if the greeter can restart the system
1373 lightdm_greeter_get_can_restart (LightDMGreeter *greeter)
1375 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1376 return ck_call_function (greeter, "CanRestart", TRUE);
1380 * lightdm_greeter_restart:
1381 * @greeter: A #LightDMGreeter
1383 * Triggers a system restart.
1386 lightdm_greeter_restart (LightDMGreeter *greeter)
1388 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1389 ck_call_function (greeter, "Restart", FALSE);
1393 * lightdm_greeter_get_can_shutdown:
1394 * @greeter: A #LightDMGreeter
1396 * Checks if the greeter is authorized to do a system shutdown.
1398 * Return value: #TRUE if the greeter can shutdown the system
1401 lightdm_greeter_get_can_shutdown (LightDMGreeter *greeter)
1403 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1404 return ck_call_function (greeter, "CanStop", TRUE);
1408 * lightdm_greeter_shutdown:
1409 * @greeter: A #LightDMGreeter
1411 * Triggers a system shutdown.
1414 lightdm_greeter_shutdown (LightDMGreeter *greeter)
1416 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1417 ck_call_function (greeter, "Stop", FALSE);
1421 lightdm_greeter_init (LightDMGreeter *greeter)
1423 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
1425 priv->read_buffer = g_malloc (HEADER_SIZE);
1426 priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
1430 lightdm_greeter_set_property (GObject *object,
1432 const GValue *value,
1435 LightDMGreeter *self;
1437 self = LIGHTDM_GREETER (object);
1441 lightdm_greeter_set_layout(self, g_value_get_string (value));
1444 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1450 lightdm_greeter_get_property (GObject *object,
1455 LightDMGreeter *self;
1457 self = LIGHTDM_GREETER (object);
1461 g_value_set_string (value, lightdm_greeter_get_hostname (self));
1463 case PROP_DEFAULT_LANGUAGE:
1464 g_value_set_string (value, lightdm_greeter_get_default_language (self));
1469 g_value_set_string (value, lightdm_greeter_get_layout (self));
1473 case PROP_DEFAULT_SESSION_HINT:
1474 g_value_set_string (value, lightdm_greeter_get_default_session_hint (self));
1476 case PROP_HIDE_USERS_HINT:
1477 g_value_set_boolean (value, lightdm_greeter_get_hide_users_hint (self));
1479 case PROP_HAS_GUEST_ACCOUNT_HINT:
1480 g_value_set_boolean (value, lightdm_greeter_get_has_guest_account_hint (self));
1482 case PROP_SELECT_USER_HINT:
1483 g_value_set_string (value, lightdm_greeter_get_select_user_hint (self));
1485 case PROP_SELECT_GUEST_HINT:
1486 g_value_set_boolean (value, lightdm_greeter_get_select_guest_hint (self));
1488 case PROP_AUTOLOGIN_USER_HINT:
1489 g_value_set_string (value, lightdm_greeter_get_autologin_user_hint (self));
1491 case PROP_AUTOLOGIN_GUEST_HINT:
1492 g_value_set_boolean (value, lightdm_greeter_get_autologin_guest_hint (self));
1494 case PROP_AUTOLOGIN_TIMEOUT_HINT:
1495 g_value_set_int (value, lightdm_greeter_get_autologin_timeout_hint (self));
1497 case PROP_AUTHENTICATION_USER:
1498 g_value_set_string (value, lightdm_greeter_get_authentication_user (self));
1500 case PROP_IN_AUTHENTICATION:
1501 g_value_set_boolean (value, lightdm_greeter_get_in_authentication (self));
1503 case PROP_IS_AUTHENTICATED:
1504 g_value_set_boolean (value, lightdm_greeter_get_is_authenticated (self));
1506 case PROP_CAN_SUSPEND:
1507 g_value_set_boolean (value, lightdm_greeter_get_can_suspend (self));
1509 case PROP_CAN_HIBERNATE:
1510 g_value_set_boolean (value, lightdm_greeter_get_can_hibernate (self));
1512 case PROP_CAN_RESTART:
1513 g_value_set_boolean (value, lightdm_greeter_get_can_restart (self));
1515 case PROP_CAN_SHUTDOWN:
1516 g_value_set_boolean (value, lightdm_greeter_get_can_shutdown (self));
1519 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1525 marshal_VOID__STRING_INT (GClosure *closure,
1526 GValue *return_value G_GNUC_UNUSED,
1527 guint n_param_values,
1528 const GValue *param_values,
1529 gpointer invocation_hint G_GNUC_UNUSED,
1530 gpointer marshal_data)
1532 typedef void (*GMarshalFunc_VOID__STRING_INT) (gpointer data1,
1536 register GMarshalFunc_VOID__STRING_INT callback;
1537 register GCClosure *cc = (GCClosure*) closure;
1538 register gpointer data1, data2;
1540 g_return_if_fail (n_param_values == 3);
1542 if (G_CCLOSURE_SWAP_DATA (closure))
1544 data1 = closure->data;
1545 data2 = g_value_peek_pointer (param_values + 0);
1549 data1 = g_value_peek_pointer (param_values + 0);
1550 data2 = closure->data;
1552 callback = (GMarshalFunc_VOID__STRING_INT) (marshal_data ? marshal_data : cc->callback);
1555 (param_values + 1)->data[0].v_pointer,
1556 (param_values + 2)->data[0].v_int,
1561 lightdm_greeter_finalize (GObject *object)
1563 LightDMGreeter *self = LIGHTDM_GREETER (object);
1564 LightDMGreeterPrivate *priv = GET_PRIVATE (self);
1566 if (priv->system_bus)
1567 g_object_unref (priv->system_bus);
1568 if (priv->to_server_channel)
1569 g_io_channel_unref (priv->to_server_channel);
1570 if (priv->from_server_channel)
1571 g_io_channel_unref (priv->from_server_channel);
1573 XCloseDisplay (priv->display);
1574 g_free (priv->hostname);
1575 if (priv->user_list)
1576 g_object_unref (priv->user_list);
1577 g_list_free_full (priv->languages, g_object_unref);
1578 if (priv->xkl_engine)
1579 g_object_unref (priv->xkl_engine);
1580 if (priv->xkl_config)
1581 g_object_unref (priv->xkl_config);
1582 g_list_free_full (priv->layouts, g_object_unref);
1583 g_free (priv->layout);
1584 g_list_free_full (priv->sessions, g_object_unref);
1585 g_free (priv->authentication_user);
1586 g_hash_table_unref (priv->hints);
1588 G_OBJECT_CLASS (lightdm_greeter_parent_class)->finalize (object);
1592 lightdm_greeter_class_init (LightDMGreeterClass *klass)
1594 GObjectClass *object_class = G_OBJECT_CLASS (klass);
1596 g_type_class_add_private (klass, sizeof (LightDMGreeterPrivate));
1598 object_class->set_property = lightdm_greeter_set_property;
1599 object_class->get_property = lightdm_greeter_get_property;
1600 object_class->finalize = lightdm_greeter_finalize;
1602 g_object_class_install_property (object_class,
1604 g_param_spec_string ("hostname",
1606 "Hostname displaying greeter for",
1609 g_object_class_install_property (object_class,
1610 PROP_DEFAULT_LANGUAGE,
1611 g_param_spec_string ("default-language",
1615 G_PARAM_READWRITE));
1616 /*g_object_class_install_property (object_class,
1618 g_param_spec_list ("layouts",
1620 "Available keyboard layouts"));*/
1621 g_object_class_install_property (object_class,
1623 g_param_spec_string ("layout",
1625 "Current keyboard layout",
1627 G_PARAM_READWRITE));
1628 /*g_object_class_install_property (object_class,
1630 g_param_spec_list ("sessions",
1632 "Available sessions"));*/
1633 g_object_class_install_property (object_class,
1634 PROP_DEFAULT_SESSION_HINT,
1635 g_param_spec_string ("default-session-hint",
1636 "default-session-hint",
1637 "Default session hint",
1639 G_PARAM_READWRITE));
1641 g_object_class_install_property (object_class,
1642 PROP_HIDE_USERS_HINT,
1643 g_param_spec_boolean ("hide-users-hint",
1649 g_object_class_install_property (object_class,
1650 PROP_HAS_GUEST_ACCOUNT_HINT,
1651 g_param_spec_boolean ("has-guest-account-hint",
1652 "has-guest-account-hint",
1653 "Has guest account hint",
1657 g_object_class_install_property (object_class,
1658 PROP_SELECT_USER_HINT,
1659 g_param_spec_string ("select-user-hint",
1665 g_object_class_install_property (object_class,
1666 PROP_SELECT_GUEST_HINT,
1667 g_param_spec_boolean ("select-guest-hint",
1668 "select-guest-hint",
1669 "Select guest account hint",
1673 g_object_class_install_property (object_class,
1674 PROP_AUTOLOGIN_USER_HINT,
1675 g_param_spec_string ("autologin-user-hint",
1676 "autologin-user-hint",
1677 "Autologin user hint",
1681 g_object_class_install_property (object_class,
1682 PROP_AUTOLOGIN_GUEST_HINT,
1683 g_param_spec_boolean ("autologin-guest-hint",
1684 "autologin-guest-hint",
1685 "Autologin guest account hint",
1689 g_object_class_install_property (object_class,
1690 PROP_AUTOLOGIN_TIMEOUT_HINT,
1691 g_param_spec_int ("autologin-timeout-hint",
1692 "autologin-timeout-hint",
1693 "Autologin timeout hint",
1697 g_object_class_install_property (object_class,
1698 PROP_AUTHENTICATION_USER,
1699 g_param_spec_string ("authentication-user",
1700 "authentication-user",
1701 "The user being authenticated",
1704 g_object_class_install_property (object_class,
1705 PROP_IN_AUTHENTICATION,
1706 g_param_spec_boolean ("in-authentication",
1707 "in-authentication",
1708 "TRUE if a user is being authenticated",
1711 g_object_class_install_property (object_class,
1712 PROP_IS_AUTHENTICATED,
1713 g_param_spec_boolean ("is-authenticated",
1715 "TRUE if the selected user is authenticated",
1718 g_object_class_install_property (object_class,
1720 g_param_spec_boolean ("can-suspend",
1722 "TRUE if allowed to suspend the system",
1725 g_object_class_install_property (object_class,
1727 g_param_spec_boolean ("can-hibernate",
1729 "TRUE if allowed to hibernate the system",
1732 g_object_class_install_property (object_class,
1734 g_param_spec_boolean ("can-restart",
1736 "TRUE if allowed to restart the system",
1739 g_object_class_install_property (object_class,
1741 g_param_spec_boolean ("can-shutdown",
1743 "TRUE if allowed to shutdown the system",
1748 * LightDMGreeter::connected:
1749 * @greeter: A #LightDMGreeter
1751 * The ::connected signal gets emitted when the greeter connects to the
1754 signals[CONNECTED] =
1755 g_signal_new ("connected",
1756 G_TYPE_FROM_CLASS (klass),
1758 G_STRUCT_OFFSET (LightDMGreeterClass, connected),
1760 g_cclosure_marshal_VOID__VOID,
1764 * LightDMGreeter::show-prompt:
1765 * @greeter: A #LightDMGreeter
1766 * @text: Prompt text
1767 * @type: Prompt type
1769 * The ::show-prompt signal gets emitted when the greeter should show a
1770 * prompt to the user. The given text should be displayed and an input
1771 * field for the user to provide a response.
1773 * Call lightdm_greeter_respond() with the resultant input or
1774 * lightdm_greeter_cancel_authentication() to abort the authentication.
1776 signals[SHOW_PROMPT] =
1777 g_signal_new ("show-prompt",
1778 G_TYPE_FROM_CLASS (klass),
1780 G_STRUCT_OFFSET (LightDMGreeterClass, show_prompt),
1782 marshal_VOID__STRING_INT,
1783 G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT);
1786 * LightDMGreeter::show-message:
1787 * @greeter: A #LightDMGreeter
1788 * @text: Message text
1789 * @type: Message type
1791 * The ::show-message signal gets emitted when the greeter
1792 * should show a message to the user.
1794 signals[SHOW_MESSAGE] =
1795 g_signal_new ("show-message",
1796 G_TYPE_FROM_CLASS (klass),
1798 G_STRUCT_OFFSET (LightDMGreeterClass, show_message),
1800 marshal_VOID__STRING_INT,
1801 G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_INT);
1804 * LightDMGreeter::authentication-complete:
1805 * @greeter: A #LightDMGreeter
1807 * The ::authentication-complete signal gets emitted when the greeter
1808 * has completed authentication.
1810 * Call lightdm_greeter_get_is_authenticated() to check if the authentication
1813 signals[AUTHENTICATION_COMPLETE] =
1814 g_signal_new ("authentication-complete",
1815 G_TYPE_FROM_CLASS (klass),
1817 G_STRUCT_OFFSET (LightDMGreeterClass, authentication_complete),
1819 g_cclosure_marshal_VOID__VOID,
1823 * LightDMGreeter::session-failed:
1824 * @greeter: A #LightDMGreeter
1826 * The ::session-failed signal gets emitted when the deamon has failed
1827 * to start the requested session.
1829 signals[SESSION_FAILED] =
1830 g_signal_new ("session-failed",
1831 G_TYPE_FROM_CLASS (klass),
1833 G_STRUCT_OFFSET (LightDMGreeterClass, session_failed),
1835 g_cclosure_marshal_VOID__VOID,
1839 * LightDMGreeter::autologin-timer-expired:
1840 * @greeter: A #LightDMGreeter
1842 * The ::timed-login signal gets emitted when the automatic login timer has expired.
1843 * The application should then call lightdm_greeter_login().
1845 signals[AUTOLOGIN_TIMER_EXPIRED] =
1846 g_signal_new ("autologin-timer-expired",
1847 G_TYPE_FROM_CLASS (klass),
1849 G_STRUCT_OFFSET (LightDMGreeterClass, autologin_timer_expired),
1851 g_cclosure_marshal_VOID__VOID,
1855 * LightDMGreeter::quit:
1856 * @greeter: A #LightDMGreeter
1858 * The ::quit signal gets emitted when the greeter should exit.
1861 g_signal_new ("quit",
1862 G_TYPE_FROM_CLASS (klass),
1864 G_STRUCT_OFFSET (LightDMGreeterClass, quit),
1866 g_cclosure_marshal_VOID__VOID,