1 /* -*- Mode: C; indent-tabs-mode: nil; tab-width: 4 -*-
3 * Copyright (C) 2010-2011 Robert Ancell.
4 * Author: Robert Ancell <robert.ancell@canonical.com>
6 * This program is free software: you can redistribute it and/or modify it under
7 * the terms of the GNU General Public License as published by the Free Software
8 * Foundation, either version 3 of the License, or (at your option) any later
9 * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
16 #include <gio/gdesktopappinfo.h>
19 #include "configuration.h"
20 #include "ldm-marshal.h"
21 #include "pam-session.h"
36 static guint signals[LAST_SIGNAL] = { 0 };
41 SESSION_GREETER_PRE_CONNECT,
43 SESSION_GREETER_AUTHENTICATED,
50 DisplayServer *display_server;
53 gchar *greeter_session;
55 /* TRUE if the user list should be shown */
56 gboolean greeter_hide_users;
58 /* Session requested to log into */
61 /* Program to run sessions through */
62 gchar *session_wrapper;
64 /* PAM service to authenticate against */
67 /* PAM service to authenticate against for automatic logins */
68 gchar *pam_autologin_service;
70 /* TRUE if a session should be started on greeter quit */
71 gboolean start_session_on_greeter_quit;
73 /* TRUE if in a user session */
74 gboolean in_user_session;
76 /* TRUE if have got an X server / started a greeter */
82 /* Communication link to greeter */
85 /* User that should be automatically logged in */
86 gchar *autologin_user;
87 gboolean autologin_guest;
88 gint autologin_timeout;
90 /* TRUE if start greeter if fail to login */
91 gboolean start_greeter_if_fail;
93 /* Hint to select user in greeter */
94 gchar *select_user_hint;
95 gboolean select_guest_hint;
97 /* TRUE if allowed to log into guest account */
100 /* TRUE if stopping the display (waiting for dispaly server, greeter and session to stop) */
103 /* TRUE if stopped */
107 G_DEFINE_TYPE (Display, display, G_TYPE_OBJECT);
109 static gboolean start_greeter_session (Display *display);
110 static gboolean start_user_session (Display *display, PAMSession *authentication);
113 display_new (DisplayServer *display_server)
115 Display *display = g_object_new (DISPLAY_TYPE, NULL);
117 display->priv->display_server = g_object_ref (display_server);
123 display_get_display_server (Display *display)
125 g_return_val_if_fail (display != NULL, NULL);
126 return display->priv->display_server;
130 display_get_username (Display *display)
132 g_return_val_if_fail (display != NULL, NULL);
134 if (!display->priv->session || !display->priv->in_user_session)
137 return user_get_name (session_get_user (display->priv->session));
141 display_get_session (Display *display)
143 g_return_val_if_fail (display != NULL, NULL);
144 return display->priv->session;
148 display_set_greeter_session (Display *display, const gchar *greeter_session)
150 g_return_if_fail (display != NULL);
151 g_free (display->priv->greeter_session);
152 display->priv->greeter_session = g_strdup (greeter_session);
156 display_set_session_wrapper (Display *display, const gchar *session_wrapper)
158 g_return_if_fail (display != NULL);
159 g_free (display->priv->session_wrapper);
160 display->priv->session_wrapper = g_strdup (session_wrapper);
164 display_set_allow_guest (Display *display, gboolean allow_guest)
166 g_return_if_fail (display != NULL);
167 display->priv->allow_guest = allow_guest;
171 display_set_autologin_user (Display *display, const gchar *username, gboolean is_guest, gint timeout)
173 g_return_if_fail (display != NULL);
174 g_free (display->priv->autologin_user);
175 display->priv->autologin_user = g_strdup (username);
176 display->priv->autologin_guest = is_guest;
177 display->priv->autologin_timeout = timeout;
181 display_set_select_user_hint (Display *display, const gchar *username, gboolean is_guest)
183 g_return_if_fail (display != NULL);
184 g_free (display->priv->select_user_hint);
185 display->priv->select_user_hint = g_strdup (username);
186 display->priv->select_guest_hint = is_guest;
190 display_set_hide_users_hint (Display *display, gboolean hide_users)
192 g_return_if_fail (display != NULL);
193 display->priv->greeter_hide_users = hide_users;
197 display_set_user_session (Display *display, const gchar *session_name)
199 g_return_if_fail (display != NULL);
200 g_free (display->priv->user_session);
201 display->priv->user_session = g_strdup (session_name);
205 switch_to_user (Display *display, User *user)
208 g_signal_emit (display, signals[SWITCH_TO_USER], 0, user, &result);
213 switch_to_guest (Display *display)
216 g_signal_emit (display, signals[SWITCH_TO_GUEST], 0, &result);
221 get_guest_username (Display *display)
224 g_signal_emit (display, signals[GET_GUEST_USERNAME], 0, &username);
229 check_stopped (Display *display)
231 if (display->priv->stopping &&
232 !display->priv->stopped &&
233 display->priv->display_server == NULL &&
234 display->priv->session == NULL)
236 display->priv->stopped = TRUE;
237 g_debug ("Display stopped");
238 g_signal_emit (display, signals[STOPPED], 0);
243 autologin_authentication_result_cb (PAMSession *authentication, int result, Display *display)
245 g_signal_handlers_disconnect_matched (authentication, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
246 if (display->priv->stopping)
249 gboolean started_session = FALSE;
251 if (result == PAM_SUCCESS)
253 g_debug ("User %s authorized", pam_session_get_username (authentication));
254 started_session = start_user_session (display, authentication);
255 if (!started_session)
256 g_debug ("Failed to start autologin session");
259 g_debug ("Autologin failed authentication");
261 if (!started_session && display->priv->start_greeter_if_fail)
263 display_set_autologin_user (display, NULL, FALSE, 0);
264 if (display->priv->autologin_user)
265 display_set_select_user_hint (display, display->priv->autologin_user, FALSE);
266 started_session = start_greeter_session (display);
269 if (!started_session)
270 display_stop (display);
274 autologin (Display *display, const gchar *username, const gchar *service, gboolean start_greeter_if_fail)
277 PAMSession *authentication;
278 GError *error = NULL;
280 display->priv->start_greeter_if_fail = start_greeter_if_fail;
282 display->priv->in_user_session = TRUE;
283 authentication = pam_session_new (service, username);
284 pam_session_set_interactive (authentication, FALSE);
285 g_signal_connect (authentication, "authentication-result", G_CALLBACK (autologin_authentication_result_cb), display);
287 result = pam_session_authenticate (authentication, &error);
289 g_debug ("Failed to start autologin session for %s: %s", username, error->message);
292 g_signal_handlers_disconnect_matched (authentication, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
293 g_object_unref (authentication);
295 g_clear_error (&error);
301 autologin_guest (Display *display, const gchar *service, gboolean start_greeter_if_fail)
306 username = get_guest_username (display);
309 g_debug ("Can't autologin guest, no guest account");
313 result = autologin (display, username, service, start_greeter_if_fail);
320 cleanup_after_session (Display *display)
322 g_signal_handlers_disconnect_matched (display->priv->session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
323 g_object_unref (display->priv->session);
324 display->priv->session = NULL;
326 if (display->priv->stopping)
328 check_stopped (display);
336 greeter_session_stopped_cb (Session *session, Display *display)
338 gboolean started_session = FALSE;
340 g_debug ("Greeter quit");
342 if (cleanup_after_session (display))
345 if (!display->priv->display_server)
348 /* Start the session for the authenticated user */
349 if (display->priv->start_session_on_greeter_quit)
351 if (greeter_get_guest_authenticated (display->priv->greeter))
353 started_session = autologin_guest (display, display->priv->pam_autologin_service, FALSE);
354 if (!started_session)
355 g_debug ("Failed to start guest session");
359 display->priv->in_user_session = TRUE;
360 started_session = start_user_session (display, greeter_get_authentication (display->priv->greeter));
361 if (!started_session)
362 g_debug ("Failed to start user session");
366 g_signal_handlers_disconnect_matched (display->priv->greeter, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
367 g_object_unref (display->priv->greeter);
368 display->priv->greeter = NULL;
370 if (!started_session)
371 display_stop (display);
375 user_session_stopped_cb (Session *session, Display *display)
377 g_debug ("User session quit");
379 if (cleanup_after_session (display))
382 /* This display has ended */
383 display_stop (display);
387 create_session (Display *display, PAMSession *authentication, const gchar *session_name, gboolean is_greeter, const gchar *log_filename)
389 gchar *sessions_dir, *filename, *path, *command = NULL;
390 GKeyFile *session_desktop_file;
393 GError *error = NULL;
395 g_debug ("Starting session %s as user %s logging to %s", session_name, pam_session_get_username (authentication), log_filename);
397 // FIXME: This is X specific, move into xsession.c
399 sessions_dir = config_get_string (config_get_instance (), "LightDM", "xgreeters-directory");
401 sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
402 filename = g_strdup_printf ("%s.desktop", session_name);
403 path = g_build_filename (sessions_dir, filename, NULL);
404 g_free (sessions_dir);
407 session_desktop_file = g_key_file_new ();
408 result = g_key_file_load_from_file (session_desktop_file, path, G_KEY_FILE_NONE, &error);
410 g_debug ("Failed to load session file %s: %s:", path, error->message);
411 g_clear_error (&error);
414 command = g_key_file_get_string (session_desktop_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL);
416 g_debug ("No command in session file %s", path);
418 g_key_file_free (session_desktop_file);
422 if (display->priv->session_wrapper && !is_greeter)
426 wrapper = g_find_program_in_path (display->priv->session_wrapper);
430 command = g_strdup_printf ("%s '%s'", wrapper, command);
436 g_signal_emit (display, signals[CREATE_SESSION], 0, &session);
437 g_return_val_if_fail (session != NULL, NULL);
440 g_signal_connect_after (session, "stopped", G_CALLBACK (greeter_session_stopped_cb), display);
442 g_signal_connect_after (session, "stopped", G_CALLBACK (user_session_stopped_cb), display);
443 session_set_is_greeter (session, is_greeter);
444 session_set_authentication (session, authentication);
445 session_set_command (session, command);
447 session_set_env (session, "DESKTOP_SESSION", session_name); // FIXME: Apparently deprecated?
448 session_set_env (session, "GDMSESSION", session_name); // FIXME: Not cross-desktop
450 session_set_log_file (session, log_filename);
452 /* Connect using the session bus */
455 if (g_getenv ("DBUS_SESSION_BUS_ADDRESS"))
456 session_set_env (session, "DBUS_SESSION_BUS_ADDRESS", g_getenv ("DBUS_SESSION_BUS_ADDRESS"));
457 session_set_env (session, "LDM_BUS", "SESSION");
458 if (g_getenv ("LD_PRELOAD"))
459 session_set_env (session, "LD_PRELOAD", g_getenv ("LD_PRELOAD"));
460 if (g_getenv ("LD_LIBRARY_PATH"))
461 session_set_env (session, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH"));
462 if (g_getenv ("PATH"))
463 session_set_env (session, "PATH", g_getenv ("PATH"));
466 /* Variables required for regression tests */
467 if (g_getenv ("LIGHTDM_TEST_STATUS_SOCKET"))
469 session_set_env (session, "LIGHTDM_TEST_STATUS_SOCKET", g_getenv ("LIGHTDM_TEST_STATUS_SOCKET"));
470 session_set_env (session, "LIGHTDM_TEST_CONFIG", g_getenv ("LIGHTDM_TEST_CONFIG"));
471 session_set_env (session, "LIGHTDM_TEST_HOME_DIR", g_getenv ("LIGHTDM_TEST_HOME_DIR"));
472 session_set_env (session, "LD_PRELOAD", g_getenv ("LD_PRELOAD"));
473 session_set_env (session, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH"));
480 display_set_is_ready (Display *display)
482 if (display->priv->is_ready)
485 display->priv->is_ready = TRUE;
486 g_signal_emit (display, signals[READY], 0);
490 greeter_connected_cb (Greeter *greeter, Display *display)
492 // FIXME: Should wait for greeter to signal completely ready if it supports it
493 g_debug ("Greeter connected, display is ready");
494 display_set_is_ready (display);
498 greeter_start_authentication_cb (Greeter *greeter, const gchar *username, Display *display)
500 return pam_session_new (display->priv->pam_service, username);
504 greeter_start_session_cb (Greeter *greeter, const gchar *session_name, Display *display)
506 /* Store the session to use, use the default if none was requested */
509 g_free (display->priv->user_session);
510 display->priv->user_session = g_strdup (session_name);
513 /* Stop this display if that session already exists and can switch to it */
514 if (greeter_get_guest_authenticated (greeter))
516 if (switch_to_guest (display))
519 /* Set to login as guest */
520 display_set_autologin_user (display, NULL, TRUE, 0);
524 if (switch_to_user (display, pam_session_get_user (greeter_get_authentication (display->priv->greeter))))
528 /* Stop the greeter, the session will start when the greeter has quit */
529 g_debug ("Stopping greeter");
530 display->priv->start_session_on_greeter_quit = TRUE;
531 session_stop (display->priv->session);
537 greeter_authentication_result_cb (PAMSession *authentication, int result, Display *display)
539 gboolean start_result = FALSE;
541 if (result == PAM_SUCCESS)
542 g_signal_emit (display, signals[START_GREETER], 0, &start_result);
544 g_debug ("Greeter user failed authentication");
547 display_stop (display);
551 start_greeter_session (Display *display)
554 gchar *log_dir, *filename, *log_filename;
555 PAMSession *authentication;
557 GError *error = NULL;
559 g_debug ("Starting greeter session");
562 user = accounts_get_current_user ();
567 greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user");
570 g_warning ("Greeter must not be run as root");
574 user = accounts_get_user_by_name (greeter_user);
576 g_debug ("Unable to start greeter, user %s does not exist", greeter_user);
577 g_free (greeter_user);
581 display->priv->in_user_session = FALSE;
583 log_dir = config_get_string (config_get_instance (), "LightDM", "log-directory");
584 filename = g_strdup_printf ("%s-greeter.log", display_server_get_name (display->priv->display_server));
585 log_filename = g_build_filename (log_dir, filename, NULL);
589 /* Authenticate as the requested user */
590 authentication = pam_session_new (display->priv->pam_autologin_service, user_get_name (user));
591 pam_session_set_interactive (authentication, FALSE);
592 g_signal_connect (G_OBJECT (authentication), "authentication-result", G_CALLBACK (greeter_authentication_result_cb), display);
593 g_object_unref (user);
595 display->priv->session = create_session (display, authentication, display->priv->greeter_session, TRUE, log_filename);
596 g_object_unref (authentication);
597 g_free (log_filename);
599 if (!display->priv->session)
602 display->priv->greeter = greeter_new (display->priv->session);
603 g_signal_connect (G_OBJECT (display->priv->greeter), "connected", G_CALLBACK (greeter_connected_cb), display);
604 g_signal_connect (G_OBJECT (display->priv->greeter), "start-authentication", G_CALLBACK (greeter_start_authentication_cb), display);
605 g_signal_connect (G_OBJECT (display->priv->greeter), "start-session", G_CALLBACK (greeter_start_session_cb), display);
606 if (display->priv->autologin_timeout)
608 gchar *value = g_strdup_printf ("%d", display->priv->autologin_timeout);
609 greeter_set_hint (display->priv->greeter, "autologin-timeout", value);
611 if (display->priv->autologin_user)
612 greeter_set_hint (display->priv->greeter, "autologin-user", display->priv->autologin_user);
613 else if (display->priv->autologin_guest)
614 greeter_set_hint (display->priv->greeter, "autologin-guest", "true");
616 if (display->priv->select_user_hint)
617 greeter_set_hint (display->priv->greeter, "select-user", display->priv->select_user_hint);
618 else if (display->priv->select_guest_hint)
619 greeter_set_hint (display->priv->greeter, "select-guest", "true");
620 greeter_set_hint (display->priv->greeter, "default-session", display->priv->user_session);
621 greeter_set_allow_guest (display->priv->greeter, display->priv->allow_guest);
622 greeter_set_hint (display->priv->greeter, "has-guest-account", display->priv->allow_guest ? "true" : "false");
623 greeter_set_hint (display->priv->greeter, "hide-users", display->priv->greeter_hide_users ? "true" : "false");
625 result = pam_session_authenticate (session_get_authentication (display->priv->session), &error);
627 g_debug ("Error authenticating greeter user: %s", error->message);
628 g_clear_error (&error);
634 display_start_greeter (Display *display)
636 if (!greeter_start (display->priv->greeter))
638 g_debug ("Failed to start greeter protocol");
640 g_signal_handlers_disconnect_matched (display->priv->greeter, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
641 g_object_unref (display->priv->greeter);
642 display->priv->greeter = NULL;
647 if (!session_start (SESSION (display->priv->session)))
649 g_debug ("Failed to start greeter session");
657 start_user_session (Display *display, PAMSession *authentication)
663 g_debug ("Starting user session");
665 user = pam_session_get_user (authentication);
667 /* Update user's xsession setting */
668 user_set_xsession (user, display->priv->user_session);
670 // FIXME: Copy old error file
671 log_filename = g_build_filename (user_get_home_directory (user), ".xsession-errors", NULL);
673 display->priv->session = create_session (display, authentication, display->priv->user_session, FALSE, log_filename);
674 g_free (log_filename);
676 if (!display->priv->session)
679 g_signal_emit (display, signals[START_SESSION], 0, &result);
685 display_start_session (Display *display)
687 if (!session_start (SESSION (display->priv->session)))
690 // FIXME: Wait for session to indicate it is ready (maybe)
691 display_set_is_ready (display);
697 display_server_stopped_cb (DisplayServer *server, Display *display)
699 g_debug ("Display server stopped");
701 g_signal_handlers_disconnect_matched (display->priv->display_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
702 g_object_unref (display->priv->display_server);
703 display->priv->display_server = NULL;
705 /* Stop this display, it will be restarted by the seat if necessary */
706 display_stop (display);
710 display_server_ready_cb (DisplayServer *display_server, Display *display)
713 gboolean started_session = FALSE;
715 g_signal_emit (display, signals[DISPLAY_SERVER_READY], 0, &result);
718 display_stop (display);
722 /* Don't run any sessions on local terminals */
723 if (!display_server_get_start_local_sessions (display_server))
726 /* Automatically log in */
727 if (display->priv->autologin_guest)
729 g_debug ("Automatically logging in as guest");
730 started_session = autologin_guest (display, display->priv->pam_autologin_service, TRUE);
731 if (!started_session)
732 g_debug ("Failed to autologin as guest");
734 else if (display->priv->autologin_user)
736 g_debug ("Automatically logging in user %s", display->priv->autologin_user);
737 started_session = autologin (display, display->priv->autologin_user, display->priv->pam_autologin_service, TRUE);
738 if (!started_session)
739 g_debug ("Failed to autologin user %s", display->priv->autologin_user);
741 else if (display->priv->select_user_hint)
743 g_debug ("Logging in user %s", display->priv->select_user_hint);
744 started_session = autologin (display, display->priv->select_user_hint, display->priv->pam_service, TRUE);
745 if (!started_session)
746 g_debug ("Failed to login user %s", display->priv->select_user_hint);
748 else if (display->priv->select_guest_hint)
750 g_debug ("Logging in as guest");
751 started_session = autologin_guest (display, display->priv->pam_service, TRUE);
752 if (!started_session)
753 g_debug ("Failed login as guest");
756 /* Finally start a greeter */
757 if (!started_session)
759 started_session = start_greeter_session (display);
760 if (!started_session)
761 g_debug ("Failed to start greeter");
764 if (!started_session)
765 display_stop (display);
769 display_start (Display *display)
771 g_return_val_if_fail (display != NULL, FALSE);
773 g_signal_connect (G_OBJECT (display->priv->display_server), "ready", G_CALLBACK (display_server_ready_cb), display);
774 g_signal_connect (G_OBJECT (display->priv->display_server), "stopped", G_CALLBACK (display_server_stopped_cb), display);
776 if (!display_server_start (display->priv->display_server))
783 display_stop (Display *display)
785 g_return_if_fail (display != NULL);
787 if (!display->priv->stopping)
789 g_debug ("Stopping display");
791 display->priv->stopping = TRUE;
793 if (display->priv->display_server)
794 display_server_stop (display->priv->display_server);
795 if (display->priv->session)
797 if (session_stop (display->priv->session))
799 g_object_unref (display->priv->session);
800 display->priv->session = NULL;
805 check_stopped (display);
809 display_get_is_ready (Display *display)
811 g_return_val_if_fail (display != NULL, FALSE);
813 return display->priv->is_ready;
817 display_unlock (Display *display)
819 g_return_if_fail (display != NULL);
821 if (!display->priv->session)
824 g_debug ("Unlocking display");
826 session_unlock (display->priv->session);
830 display_real_switch_to_user (Display *display, User *user)
836 display_real_switch_to_guest (Display *display)
842 display_real_get_guest_username (Display *display)
848 display_init (Display *display)
850 display->priv = G_TYPE_INSTANCE_GET_PRIVATE (display, DISPLAY_TYPE, DisplayPrivate);
851 display->priv->pam_service = g_strdup ("lightdm");
852 display->priv->pam_autologin_service = g_strdup ("lightdm-autologin");
856 display_finalize (GObject *object)
860 self = DISPLAY (object);
862 if (self->priv->display_server)
863 g_object_unref (self->priv->display_server);
864 g_free (self->priv->greeter_session);
865 if (self->priv->greeter)
866 g_object_unref (self->priv->greeter);
867 g_free (self->priv->session_wrapper);
868 g_free (self->priv->pam_service);
869 g_free (self->priv->pam_autologin_service);
870 if (self->priv->session)
871 g_object_unref (self->priv->session);
872 g_free (self->priv->autologin_user);
873 g_free (self->priv->select_user_hint);
874 g_free (self->priv->user_session);
876 G_OBJECT_CLASS (display_parent_class)->finalize (object);
880 display_class_init (DisplayClass *klass)
882 GObjectClass *object_class = G_OBJECT_CLASS (klass);
884 klass->switch_to_user = display_real_switch_to_user;
885 klass->switch_to_guest = display_real_switch_to_guest;
886 klass->get_guest_username = display_real_get_guest_username;
887 klass->start_greeter = display_start_greeter;
888 klass->start_session = display_start_session;
889 object_class->finalize = display_finalize;
891 g_type_class_add_private (klass, sizeof (DisplayPrivate));
893 signals[CREATE_SESSION] =
894 g_signal_new ("create-session",
895 G_TYPE_FROM_CLASS (klass),
897 G_STRUCT_OFFSET (DisplayClass, create_session),
899 ldm_marshal_OBJECT__VOID,
902 g_signal_new ("ready",
903 G_TYPE_FROM_CLASS (klass),
905 G_STRUCT_OFFSET (DisplayClass, ready),
907 g_cclosure_marshal_VOID__VOID,
909 signals[SWITCH_TO_USER] =
910 g_signal_new ("switch-to-user",
911 G_TYPE_FROM_CLASS (klass),
913 G_STRUCT_OFFSET (DisplayClass, switch_to_user),
914 g_signal_accumulator_true_handled,
916 ldm_marshal_BOOLEAN__OBJECT,
917 G_TYPE_BOOLEAN, 1, USER_TYPE);
918 signals[SWITCH_TO_GUEST] =
919 g_signal_new ("switch-to-guest",
920 G_TYPE_FROM_CLASS (klass),
922 G_STRUCT_OFFSET (DisplayClass, switch_to_guest),
923 g_signal_accumulator_true_handled,
925 ldm_marshal_BOOLEAN__VOID,
927 signals[GET_GUEST_USERNAME] =
928 g_signal_new ("get-guest-username",
929 G_TYPE_FROM_CLASS (klass),
931 G_STRUCT_OFFSET (DisplayClass, get_guest_username),
932 g_signal_accumulator_first_wins,
934 ldm_marshal_STRING__VOID,
936 signals[DISPLAY_SERVER_READY] =
937 g_signal_new ("display-server-ready",
938 G_TYPE_FROM_CLASS (klass),
940 G_STRUCT_OFFSET (DisplayClass, display_server_ready),
942 ldm_marshal_BOOLEAN__VOID,
944 signals[START_GREETER] =
945 g_signal_new ("start-greeter",
946 G_TYPE_FROM_CLASS (klass),
948 G_STRUCT_OFFSET (DisplayClass, start_greeter),
949 g_signal_accumulator_true_handled, NULL,
950 ldm_marshal_BOOLEAN__VOID,
952 signals[START_SESSION] =
953 g_signal_new ("start-session",
954 G_TYPE_FROM_CLASS (klass),
956 G_STRUCT_OFFSET (DisplayClass, start_session),
957 g_signal_accumulator_true_handled, NULL,
958 ldm_marshal_BOOLEAN__VOID,
961 g_signal_new ("stopped",
962 G_TYPE_FROM_CLASS (klass),
964 G_STRUCT_OFFSET (DisplayClass, stopped),
966 g_cclosure_marshal_VOID__VOID,