2 * Copyright (C) 2010 Robert Ancell.
3 * Author: Robert Ancell <robert.ancell@canonical.com>
5 * This program is free software: you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License as published by the Free Software
7 * Foundation, either version 3 of the License, or (at your option) any later
8 * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
15 #include <dbus/dbus-glib.h>
16 #include <security/pam_appl.h>
17 #include <libxklavier/xklavier.h>
29 PROP_TIMED_LOGIN_USER,
30 PROP_TIMED_LOGIN_DELAY,
31 PROP_IS_AUTHENTICATED,
42 AUTHENTICATION_COMPLETE,
47 static guint signals[LAST_SIGNAL] = { 0 };
49 struct _LdmGreeterPrivate
51 DBusGConnection *lightdm_bus;
53 DBusGConnection *system_bus;
55 DBusGProxy *display_proxy, *session_proxy, *user_proxy;
62 XklEngine *xkl_engine;
63 XklConfigRec *xkl_config;
64 gboolean have_layouts;
68 gboolean have_sessions;
72 gboolean is_authenticated;
79 G_DEFINE_TYPE (LdmGreeter, ldm_greeter, G_TYPE_OBJECT);
84 * Create a new greeter.
86 * Return value: the new #LdmGreeter
91 return g_object_new (LDM_TYPE_GREETER, NULL);
95 timed_login_cb (gpointer data)
97 LdmGreeter *greeter = data;
99 g_signal_emit (G_OBJECT (greeter), signals[TIMED_LOGIN], 0, greeter->priv->timed_user);
105 * ldm_greeter_connect:
106 * @greeter: The greeter to connect
108 * Connects the greeter to the display manager.
110 * Return value: TRUE if successfully connected
113 ldm_greeter_connect (LdmGreeter *greeter)
116 GError *error = NULL;
118 result = dbus_g_proxy_call (greeter->priv->display_proxy, "Connect", &error,
120 G_TYPE_STRING, &greeter->priv->session,
121 G_TYPE_STRING, &greeter->priv->timed_user,
122 G_TYPE_INT, &greeter->priv->login_delay,
126 g_warning ("Failed to connect to display manager: %s", error->message);
127 g_clear_error (&error);
131 /* Set timeout for default login */
132 if (greeter->priv->timed_user[0] != '\0' && greeter->priv->login_delay > 0)
134 g_debug ("Logging in as %s in %d seconds", greeter->priv->timed_user, greeter->priv->login_delay);
135 greeter->priv->login_timeout = g_timeout_add (greeter->priv->login_delay * 1000, timed_login_cb, greeter);
141 #define TYPE_USER dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INVALID)
142 #define TYPE_USER_LIST dbus_g_type_get_collection ("GPtrArray", TYPE_USER)
145 update_users (LdmGreeter *greeter)
150 GError *error = NULL;
152 if (greeter->priv->have_users)
155 result = dbus_g_proxy_call (greeter->priv->user_proxy, "GetUsers", &error,
157 TYPE_USER_LIST, &users,
160 g_warning ("Failed to get users: %s", error->message);
161 g_clear_error (&error);
166 for (i = 0; i < users->len; i++)
168 GValue value = { 0 };
170 gchar *name, *real_name, *image;
173 g_value_init (&value, TYPE_USER);
174 g_value_set_static_boxed (&value, users->pdata[i]);
175 dbus_g_type_struct_get (&value, 0, &name, 1, &real_name, 2, &image, 3, &logged_in, G_MAXUINT);
176 g_value_unset (&value);
178 user = ldm_user_new (name, real_name, image, logged_in);
183 greeter->priv->users = g_list_append (greeter->priv->users, user);
186 g_ptr_array_free (users, TRUE);
188 greeter->priv->have_users = TRUE;
192 * ldm_greeter_get_num_users:
193 * @greeter: a #LdmGreeter
195 * Return value: The number of users able to log in
198 ldm_greeter_get_num_users (LdmGreeter *greeter)
200 update_users (greeter);
201 return g_list_length (greeter->priv->users);
205 * ldm_greeter_get_users:
206 * @greeter: A #LdmGreeter
208 * Get a list of users to present to the user. This list may be a subset of the
209 * available users and may be empty depending on the server configuration.
211 * Return value: A list of #LdmUser that should be presented to the user.
214 ldm_greeter_get_users (LdmGreeter *greeter)
216 update_users (greeter);
217 return greeter->priv->users;
221 layout_cb (XklConfigRegistry *config,
222 const XklConfigItem *item,
225 LdmGreeter *greeter = data;
228 layout = ldm_layout_new (item->name, item->short_description, item->description);
229 greeter->priv->layouts = g_list_append (greeter->priv->layouts, layout);
233 setup_display (LdmGreeter *greeter)
235 if (!greeter->priv->display)
236 greeter->priv->display = XOpenDisplay (NULL);
240 setup_xkl (LdmGreeter *greeter)
242 setup_display (greeter);
243 greeter->priv->xkl_engine = xkl_engine_get_instance (greeter->priv->display);
244 greeter->priv->xkl_config = xkl_config_rec_new ();
245 if (!xkl_config_rec_get_from_server (greeter->priv->xkl_config, greeter->priv->xkl_engine))
246 g_warning ("Failed to get Xkl configuration from server");
247 greeter->priv->layout = g_strdup (greeter->priv->xkl_config->layouts[0]);
251 * ldm_greeter_get_layouts:
252 * @greeter: A #LdmGreeter
254 * Get a list of keyboard layouts to present to the user.
256 * Return value: A list of #LdmLayout that should be presented to the user.
259 ldm_greeter_get_layouts (LdmGreeter *greeter)
261 XklConfigRegistry *registry;
263 if (greeter->priv->have_layouts)
264 return greeter->priv->layouts;
268 registry = xkl_config_registry_get_instance (greeter->priv->xkl_engine);
269 xkl_config_registry_load (registry, FALSE);
270 xkl_config_registry_foreach_layout (registry, layout_cb, greeter);
271 g_object_unref (registry);
272 greeter->priv->have_layouts = TRUE;
274 return greeter->priv->layouts;
278 * ldm_greeter_set_layout:
279 * @greeter: A #LdmGreeter
280 * @layout: The layout to use
282 * Set the layout for this session.
285 ldm_greeter_set_layout (LdmGreeter *greeter, const gchar *layout)
287 XklConfigRec *config;
291 config = xkl_config_rec_new ();
292 config->layouts = g_malloc (sizeof (gchar *) * 2);
293 config->model = g_strdup (greeter->priv->xkl_config->model);
294 config->layouts[0] = g_strdup (layout);
295 config->layouts[1] = NULL;
296 if (!xkl_config_rec_activate (config, greeter->priv->xkl_engine))
297 g_warning ("Failed to activate XKL config");
299 greeter->priv->layout = g_strdup (layout);
300 g_object_unref (config);
304 * ldm_greeter_get_layout:
305 * @greeter: A #LdmGreeter
307 * Get the current keyboard layout.
309 * Return value: The currently active layout for this user.
312 ldm_greeter_get_layout (LdmGreeter *greeter)
315 return greeter->priv->layout;
318 #define TYPE_SESSION dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID)
319 #define TYPE_SESSION_LIST dbus_g_type_get_collection ("GPtrArray", TYPE_SESSION)
322 update_sessions (LdmGreeter *greeter)
327 GError *error = NULL;
329 if (greeter->priv->have_sessions)
332 result = dbus_g_proxy_call (greeter->priv->session_proxy, "GetSessions", &error,
334 TYPE_SESSION_LIST, &sessions,
337 g_warning ("Failed to get sessions: %s", error->message);
338 g_clear_error (&error);
343 for (i = 0; i < sessions->len; i++)
345 GValue value = { 0 };
347 gchar *key, *name, *comment;
349 g_value_init (&value, TYPE_SESSION);
350 g_value_set_static_boxed (&value, sessions->pdata[i]);
351 dbus_g_type_struct_get (&value, 0, &key, 1, &name, 2, &comment, G_MAXUINT);
352 g_value_unset (&value);
354 session = ldm_session_new (key, name, comment);
359 greeter->priv->sessions = g_list_append (greeter->priv->sessions, session);
362 g_ptr_array_free (sessions, TRUE);
364 greeter->priv->have_sessions = TRUE;
368 * ldm_greeter_get_sessions:
369 * @greeter: A #LdmGreeter
371 * Get the available sessions.
373 * Return value: A list of #LdmSession
376 ldm_greeter_get_sessions (LdmGreeter *greeter)
378 update_sessions (greeter);
379 return greeter->priv->sessions;
383 * ldm_greeter_set_session:
384 * @greeter: A #LdmGreeter
385 * @session: A session name.
387 * Set the session to log into.
390 ldm_greeter_set_session (LdmGreeter *greeter, const gchar *session)
392 GError *error = NULL;
394 if (!dbus_g_proxy_call (greeter->priv->display_proxy, "SetSession", &error,
395 G_TYPE_STRING, session,
398 g_warning ("Failed to set session: %s", error->message);
401 g_free (greeter->priv->session);
402 greeter->priv->session = g_strdup (session);
404 g_clear_error (&error);
408 * ldm_greeter_get_session:
409 * @greeter: A #LdmGreeter
411 * Get the session that will be logged into.
413 * Return value: The session name
416 ldm_greeter_get_session (LdmGreeter *greeter)
418 return greeter->priv->session;
422 * ldm_greeter_get_timed_login_user:
423 * @greeter: A #LdmGreeter
425 * Get the user to log in by as default.
427 * Return value: A username
430 ldm_greeter_get_timed_login_user (LdmGreeter *greeter)
432 return greeter->priv->timed_user;
436 * ldm_greeter_get_timed_login_delay:
437 * @greeter: A #LdmGreeter
439 * Get the number of seconds to wait until logging in as the default user.
441 * Return value: The number of seconds before logging in as the default user
444 ldm_greeter_get_timed_login_delay (LdmGreeter *greeter)
446 return greeter->priv->login_delay;
450 * ldm_greeter_cancel_timed_login:
451 * @greeter: A #LdmGreeter
453 * Cancel the login as the default user.
456 ldm_greeter_cancel_timed_login (LdmGreeter *greeter)
458 if (greeter->priv->login_timeout)
459 g_source_remove (greeter->priv->login_timeout);
460 greeter->priv->login_timeout = 0;
463 #define TYPE_MESSAGE dbus_g_type_get_struct ("GValueArray", G_TYPE_INT, G_TYPE_STRING, G_TYPE_INVALID)
464 #define TYPE_MESSAGE_LIST dbus_g_type_get_collection ("GPtrArray", TYPE_MESSAGE)
467 auth_response_cb (DBusGProxy *proxy, DBusGProxyCall *call, gpointer userdata)
469 LdmGreeter *greeter = userdata;
471 GError *error = NULL;
476 result = dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INT, &return_code, TYPE_MESSAGE_LIST, &array, G_TYPE_INVALID);
478 g_warning ("Failed to complete D-Bus call: %s", error->message);
479 g_clear_error (&error);
483 for (i = 0; i < array->len; i++)
485 GValue value = { 0 };
489 g_value_init (&value, TYPE_MESSAGE);
490 g_value_set_static_boxed (&value, array->pdata[i]);
491 dbus_g_type_struct_get (&value, 0, &msg_style, 1, &msg, G_MAXUINT);
493 // FIXME: Should stop on prompts?
496 case PAM_PROMPT_ECHO_OFF:
497 case PAM_PROMPT_ECHO_ON:
498 g_signal_emit (G_OBJECT (greeter), signals[SHOW_PROMPT], 0, msg);
501 g_signal_emit (G_OBJECT (greeter), signals[SHOW_ERROR], 0, msg);
504 g_signal_emit (G_OBJECT (greeter), signals[SHOW_MESSAGE], 0, msg);
510 g_value_unset (&value);
515 greeter->priv->is_authenticated = (return_code == 0);
516 g_signal_emit (G_OBJECT (greeter), signals[AUTHENTICATION_COMPLETE], 0);
519 g_ptr_array_unref (array);
523 * ldm_greeter_start_authentication:
524 * @greeter: A #LdmGreeter
525 * @username: A username
527 * Starts the authentication procedure for a user.
530 ldm_greeter_start_authentication (LdmGreeter *greeter, const char *username)
532 dbus_g_proxy_begin_call (greeter->priv->display_proxy, "StartAuthentication", auth_response_cb, greeter, NULL, G_TYPE_STRING, username, G_TYPE_INVALID);
536 * ldm_greeter_provide_secret:
537 * @greeter: A #LdmGreeter
538 * @secret: Response to a prompt
540 * Provide secret information from a prompt.
543 ldm_greeter_provide_secret (LdmGreeter *greeter, const gchar *secret)
547 // FIXME: Could be multiple secrets required
548 secrets = g_malloc (sizeof (char *) * 2);
549 secrets[0] = g_strdup (secret);
551 dbus_g_proxy_begin_call (greeter->priv->display_proxy, "ContinueAuthentication", auth_response_cb, greeter, NULL, G_TYPE_STRV, secrets, G_TYPE_INVALID);
555 * ldm_greeter_cancel_authentication:
556 * @greeter: A #LdmGreeter
558 * Cancel the current user authentication.
561 ldm_greeter_cancel_authentication (LdmGreeter *greeter)
566 * ldm_greeter_get_is_authenticated:
567 * @greeter: A #LdmGreeter
569 * Checks if the greeter has successfully authenticated.
571 * Return value: TRUE if the greeter is authenticated for login.
574 ldm_greeter_get_is_authenticated (LdmGreeter *greeter)
576 return greeter->priv->is_authenticated;
581 * @greeter: A #LdmGreeter
583 * Login with the currently authenticated user.
586 ldm_greeter_login (LdmGreeter *greeter)
588 /* Quitting the greeter will cause the login to occur */
589 g_signal_emit (G_OBJECT (greeter), signals[QUIT], 0);
593 * ldm_greeter_get_can_suspend:
594 * @greeter: A #LdmGreeter
596 * Checks if the greeter is authorized to do a system suspend.
598 * Return value: TRUE if the greeter can suspend the system
601 ldm_greeter_get_can_suspend (LdmGreeter *greeter)
604 gboolean result = FALSE;
605 GError *error = NULL;
607 proxy = dbus_g_proxy_new_for_name (greeter->priv->system_bus,
608 "org.freedesktop.UPower",
609 "/org/freedesktop/UPower",
610 "org.freedesktop.UPower");
611 if (!dbus_g_proxy_call (proxy, "SuspendAllowed", &error, G_TYPE_INVALID, G_TYPE_BOOLEAN, &result, G_TYPE_INVALID))
612 g_warning ("Error checking for suspend authority: %s", error->message);
613 g_clear_error (&error);
615 g_object_unref (proxy);
621 * ldm_greeter_suspend:
622 * @greeter: A #LdmGreeter
624 * Triggers a system suspend.
627 ldm_greeter_suspend (LdmGreeter *greeter)
630 GError *error = NULL;
632 proxy = dbus_g_proxy_new_for_name (greeter->priv->system_bus,
633 "org.freedesktop.UPower",
634 "/org/freedesktop/UPower",
635 "org.freedesktop.UPower");
636 if (!dbus_g_proxy_call (proxy, "Suspend", &error, G_TYPE_INVALID, G_TYPE_INVALID))
637 g_warning ("Failed to hibernate: %s", error->message);
638 g_clear_error (&error);
640 g_object_unref (proxy);
644 * ldm_greeter_get_can_hibernate:
645 * @greeter: A #LdmGreeter
647 * Checks if the greeter is authorized to do a system hibernate.
649 * Return value: TRUE if the greeter can hibernate the system
652 ldm_greeter_get_can_hibernate (LdmGreeter *greeter)
655 gboolean result = FALSE;
656 GError *error = NULL;
658 proxy = dbus_g_proxy_new_for_name (greeter->priv->system_bus,
659 "org.freedesktop.UPower",
660 "/org/freedesktop/UPower",
661 "org.freedesktop.UPower");
662 if (!dbus_g_proxy_call (proxy, "HibernateAllowed", &error, G_TYPE_INVALID, G_TYPE_BOOLEAN, &result, G_TYPE_INVALID))
663 g_warning ("Error checking for hibernate authority: %s", error->message);
664 g_clear_error (&error);
666 g_object_unref (proxy);
672 * ldm_greeter_hibernate:
673 * @greeter: A #LdmGreeter
675 * Triggers a system hibernate.
678 ldm_greeter_hibernate (LdmGreeter *greeter)
681 GError *error = NULL;
683 proxy = dbus_g_proxy_new_for_name (greeter->priv->system_bus,
684 "org.freedesktop.UPower",
685 "/org/freedesktop/UPower",
686 "org.freedesktop.UPower");
687 if (!dbus_g_proxy_call (proxy, "Hibernate", &error, G_TYPE_INVALID, G_TYPE_INVALID))
688 g_warning ("Failed to hibernate: %s", error->message);
689 g_clear_error (&error);
691 g_object_unref (proxy);
695 * ldm_greeter_get_can_restart:
696 * @greeter: A #LdmGreeter
698 * Checks if the greeter is authorized to do a system restart.
700 * Return value: TRUE if the greeter can restart the system
703 ldm_greeter_get_can_restart (LdmGreeter *greeter)
706 gboolean result = FALSE;
707 GError *error = NULL;
709 proxy = dbus_g_proxy_new_for_name (greeter->priv->system_bus,
710 "org.freedesktop.ConsoleKit",
711 "/org/freedesktop/ConsoleKit/Manager",
712 "org.freedesktop.ConsoleKit.Manager");
713 if (!dbus_g_proxy_call (proxy, "CanRestart", &error, G_TYPE_INVALID, G_TYPE_BOOLEAN, &result, G_TYPE_INVALID))
714 g_warning ("Error checking for restart authority: %s", error->message);
715 g_clear_error (&error);
717 g_object_unref (proxy);
723 * ldm_greeter_restart:
724 * @greeter: A #LdmGreeter
726 * Triggers a system restart.
729 ldm_greeter_restart (LdmGreeter *greeter)
732 GError *error = NULL;
734 proxy = dbus_g_proxy_new_for_name (greeter->priv->system_bus,
735 "org.freedesktop.ConsoleKit",
736 "/org/freedesktop/ConsoleKit/Manager",
737 "org.freedesktop.ConsoleKit.Manager");
738 if (!dbus_g_proxy_call (proxy, "Restart", &error, G_TYPE_INVALID, G_TYPE_INVALID))
739 g_warning ("Failed to restart: %s", error->message);
740 g_clear_error (&error);
742 g_object_unref (proxy);
746 * ldm_greeter_get_can_shutdown:
747 * @greeter: A #LdmGreeter
749 * Checks if the greeter is authorized to do a system shutdown.
751 * Return value: TRUE if the greeter can shutdown the system
754 ldm_greeter_get_can_shutdown (LdmGreeter *greeter)
757 gboolean result = FALSE;
758 GError *error = NULL;
760 proxy = dbus_g_proxy_new_for_name (greeter->priv->system_bus,
761 "org.freedesktop.ConsoleKit",
762 "/org/freedesktop/ConsoleKit/Manager",
763 "org.freedesktop.ConsoleKit.Manager");
764 if (!dbus_g_proxy_call (proxy, "CanStop", &error, G_TYPE_INVALID, G_TYPE_BOOLEAN, &result, G_TYPE_INVALID))
765 g_warning ("Error checking for shutdown authority: %s", error->message);
766 g_clear_error (&error);
768 g_object_unref (proxy);
774 * ldm_greeter_shutdown:
775 * @greeter: A #LdmGreeter
777 * Triggers a system shutdown.
780 ldm_greeter_shutdown (LdmGreeter *greeter)
783 GError *error = NULL;
785 proxy = dbus_g_proxy_new_for_name (greeter->priv->system_bus,
786 "org.freedesktop.ConsoleKit",
787 "/org/freedesktop/ConsoleKit/Manager",
788 "org.freedesktop.ConsoleKit.Manager");
789 if (!dbus_g_proxy_call (proxy, "Stop", &error, G_TYPE_INVALID, G_TYPE_INVALID))
790 g_warning ("Failed to shutdown: %s", error->message);
791 g_clear_error (&error);
793 g_object_unref (proxy);
797 ldm_greeter_init (LdmGreeter *greeter)
799 GError *error = NULL;
800 const gchar *bus_address, *object;
801 DBusBusType bus_type = DBUS_BUS_SYSTEM;
803 greeter->priv = G_TYPE_INSTANCE_GET_PRIVATE (greeter, LDM_TYPE_GREETER, LdmGreeterPrivate);
805 greeter->priv->system_bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
806 if (!greeter->priv->system_bus)
807 g_error ("Failed to connect to system bus: %s", error->message);
808 g_clear_error (&error);
810 bus_address = getenv ("LDM_BUS");
811 if (bus_address && strcmp (bus_address, "SESSION") == 0)
812 bus_type = DBUS_BUS_SESSION;
814 greeter->priv->lightdm_bus = dbus_g_bus_get (bus_type, &error);
815 if (!greeter->priv->lightdm_bus)
816 g_error ("Failed to connect to LightDM bus: %s", error->message);
817 g_clear_error (&error);
819 object = getenv ("LDM_DISPLAY");
821 g_error ("No LDM_DISPLAY enviroment variable");
823 greeter->priv->display_proxy = dbus_g_proxy_new_for_name (greeter->priv->lightdm_bus,
824 "org.gnome.LightDisplayManager",
826 "org.gnome.LightDisplayManager.Greeter");
827 greeter->priv->session_proxy = dbus_g_proxy_new_for_name (greeter->priv->lightdm_bus,
828 "org.gnome.LightDisplayManager",
829 "/org/gnome/LightDisplayManager/Session",
830 "org.gnome.LightDisplayManager.Session");
831 greeter->priv->user_proxy = dbus_g_proxy_new_for_name (greeter->priv->lightdm_bus,
832 "org.gnome.LightDisplayManager",
833 "/org/gnome/LightDisplayManager/Users",
834 "org.gnome.LightDisplayManager.Users");
838 ldm_greeter_set_property(GObject *object,
846 self = LDM_GREETER (object);
850 ldm_greeter_set_layout(self, g_value_get_string (value));
853 ldm_greeter_set_session(self, g_value_get_string (value));
856 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
862 ldm_greeter_get_property(GObject *object,
869 self = LDM_GREETER (object);
873 g_value_set_int (value, ldm_greeter_get_num_users (self));
880 g_value_set_string (value, ldm_greeter_get_layout (self));
885 g_value_set_string (value, ldm_greeter_get_session (self));
887 case PROP_TIMED_LOGIN_USER:
888 g_value_set_string (value, ldm_greeter_get_timed_login_user (self));
890 case PROP_TIMED_LOGIN_DELAY:
891 g_value_set_int (value, ldm_greeter_get_timed_login_delay (self));
893 case PROP_IS_AUTHENTICATED:
894 g_value_set_boolean (value, ldm_greeter_get_is_authenticated (self));
896 case PROP_CAN_SUSPEND:
897 g_value_set_boolean (value, ldm_greeter_get_can_suspend (self));
899 case PROP_CAN_HIBERNATE:
900 g_value_set_boolean (value, ldm_greeter_get_can_hibernate (self));
902 case PROP_CAN_RESTART:
903 g_value_set_boolean (value, ldm_greeter_get_can_restart (self));
905 case PROP_CAN_SHUTDOWN:
906 g_value_set_boolean (value, ldm_greeter_get_can_shutdown (self));
909 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
915 ldm_greeter_class_init (LdmGreeterClass *klass)
917 GObjectClass *object_class = G_OBJECT_CLASS (klass);
919 g_type_class_add_private (klass, sizeof (LdmGreeterPrivate));
921 object_class->set_property = ldm_greeter_set_property;
922 object_class->get_property = ldm_greeter_get_property;
924 g_object_class_install_property(object_class,
926 g_param_spec_int("num-users",
928 "Number of login users",
931 /*g_object_class_install_property(object_class,
933 g_param_spec_list("users",
935 "Users that can login"));
936 g_object_class_install_property(object_class,
938 g_param_spec_list("layouts",
940 "Available keyboard layouts"));*/
941 g_object_class_install_property(object_class,
943 g_param_spec_string("layout",
945 "Current keyboard layout",
948 /*g_object_class_install_property(object_class,
950 g_param_spec_list("sessions",
952 "Available sessions"));*/
953 g_object_class_install_property(object_class,
955 g_param_spec_string("session",
960 g_object_class_install_property(object_class,
961 PROP_TIMED_LOGIN_USER,
962 g_param_spec_string("timed-login-user",
964 "User to login as when timed expires",
967 g_object_class_install_property(object_class,
968 PROP_TIMED_LOGIN_DELAY,
969 g_param_spec_int("login-delay",
971 "Number of seconds until logging in as default user",
972 G_MININT, G_MAXINT, 0,
974 g_object_class_install_property(object_class,
975 PROP_IS_AUTHENTICATED,
976 g_param_spec_boolean("is-authenticated",
978 "TRUE if the selected user is authenticated",
981 g_object_class_install_property(object_class,
983 g_param_spec_boolean("can-suspend",
985 "TRUE if allowed to suspend the system",
988 g_object_class_install_property(object_class,
990 g_param_spec_boolean("can-hibernate",
992 "TRUE if allowed to hibernate the system",
995 g_object_class_install_property(object_class,
997 g_param_spec_boolean("can-restart",
999 "TRUE if allowed to restart the system",
1002 g_object_class_install_property(object_class,
1004 g_param_spec_boolean("can-shutdown",
1006 "TRUE if allowed to shutdown the system",
1011 * LdmGreeter::show-prompt:
1012 * @greeter: A #LdmGreeter
1013 * @text: Prompt text
1015 * The ::show-prompt signal gets emitted when the greeter should show a
1016 * prompt to the user. The given text should be displayed and an input
1017 * field for the user to provide a response.
1019 * Call ldm_greeter_provide_secret() with the resultant input or
1020 * ldm_greeter_cancel_authentication() to abort the authentication.
1022 signals[SHOW_PROMPT] =
1023 g_signal_new ("show-prompt",
1024 G_TYPE_FROM_CLASS (klass),
1026 G_STRUCT_OFFSET (LdmGreeterClass, show_prompt),
1028 g_cclosure_marshal_VOID__STRING,
1029 G_TYPE_NONE, 1, G_TYPE_STRING);
1032 * LdmGreeter::show-message:
1033 * @greeter: A #LdmGreeter
1034 * @text: Message text
1036 * The ::show-message signal gets emitted when the greeter
1037 * should show an informational message to the user.
1039 signals[SHOW_MESSAGE] =
1040 g_signal_new ("show-message",
1041 G_TYPE_FROM_CLASS (klass),
1043 G_STRUCT_OFFSET (LdmGreeterClass, show_message),
1045 g_cclosure_marshal_VOID__STRING,
1046 G_TYPE_NONE, 1, G_TYPE_STRING);
1049 * LdmGreeter::show-error:
1050 * @greeter: A #LdmGreeter
1051 * @text: Message text
1053 * The ::show-error signal gets emitted when the greeter
1054 * should show an error message to the user.
1056 signals[SHOW_ERROR] =
1057 g_signal_new ("show-error",
1058 G_TYPE_FROM_CLASS (klass),
1060 G_STRUCT_OFFSET (LdmGreeterClass, show_error),
1062 g_cclosure_marshal_VOID__STRING,
1063 G_TYPE_NONE, 1, G_TYPE_STRING);
1066 * LdmGreeter::authentication-complete:
1067 * @greeter: A #LdmGreeter
1069 * The ::authentication-complete signal gets emitted when the greeter
1070 * has completed authentication.
1072 * Call ldm_greeter_get_is_authenticated() to check if the authentication
1075 signals[AUTHENTICATION_COMPLETE] =
1076 g_signal_new ("authentication-complete",
1077 G_TYPE_FROM_CLASS (klass),
1079 G_STRUCT_OFFSET (LdmGreeterClass, authentication_complete),
1081 g_cclosure_marshal_VOID__VOID,
1085 * LdmGreeter::timed-login:
1086 * @greeter: A #LdmGreeter
1087 * @username: A username
1089 * The ::timed-login signal gets emitted when the default user timer
1092 signals[TIMED_LOGIN] =
1093 g_signal_new ("timed-login",
1094 G_TYPE_FROM_CLASS (klass),
1096 G_STRUCT_OFFSET (LdmGreeterClass, timed_login),
1098 g_cclosure_marshal_VOID__STRING,
1099 G_TYPE_NONE, 1, G_TYPE_STRING);
1103 * @greeter: A #LdmGreeter
1105 * The ::quit signal gets emitted when the greeter should exit.
1108 g_signal_new ("quit",
1109 G_TYPE_FROM_CLASS (klass),
1111 G_STRUCT_OFFSET (LdmGreeterClass, quit),
1113 g_cclosure_marshal_VOID__VOID,