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"
36
static guint signals[LAST_SIGNAL] = { 0 };
41
DisplayServer *display_server;
44
gchar *greeter_session;
46
/* TRUE if the user list should be shown */
47
gboolean greeter_hide_users;
49
/* TRUE if a manual login option should be shown */
50
gboolean greeter_show_manual_login;
52
/* TRUE if a remote login option should be shown */
53
gboolean greeter_show_remote_login;
55
/* TRUE if the greeter is a lock screen */
56
gboolean greeter_is_lock;
58
/* Session requested to log into */
59
SessionType user_session_type;
62
/* Program to run sessions through */
63
gchar *session_wrapper;
65
/* TRUE if in a user session */
66
gboolean in_user_session;
68
/* TRUE if have got an X server / started a greeter */
74
/* Communication link to greeter */
77
/* User that should be automatically logged in */
78
gchar *autologin_user;
79
gboolean autologin_guest;
80
gint autologin_timeout;
82
/* TRUE if start greeter if fail to login */
83
gboolean start_greeter_if_fail;
85
/* Hint to select user in greeter */
86
gchar *select_user_hint;
87
gboolean select_guest_hint;
88
gboolean select_user_attempt_login;
90
/* TRUE if allowed to log into guest account */
93
/* TRUE if greeter is to show the guest account */
94
gboolean greeter_allow_guest;
96
/* TRUE if stopping the display (waiting for dispaly server, greeter and session to stop) */
103
/* PAM services to use */
104
#define GREETER_SERVICE "lightdm-greeter"
105
#define USER_SERVICE "lightdm"
106
#define AUTOLOGIN_SERVICE "lightdm-autologin"
108
G_DEFINE_TYPE (Display, display, G_TYPE_OBJECT);
110
static void greeter_session_stopped_cb (Session *session, Display *display);
111
static void user_session_stopped_cb (Session *session, Display *display);
114
display_new (DisplayServer *display_server)
118
g_return_val_if_fail (display_server != NULL, NULL);
120
display = g_object_new (DISPLAY_TYPE, NULL);
121
display->priv->display_server = g_object_ref (display_server);
127
display_get_display_server (Display *display)
129
g_return_val_if_fail (display != NULL, NULL);
130
return display->priv->display_server;
134
display_get_username (Display *display)
136
g_return_val_if_fail (display != NULL, NULL);
138
if (!display->priv->session || !display->priv->in_user_session)
141
return session_get_username (display->priv->session);
145
display_get_session (Display *display)
147
g_return_val_if_fail (display != NULL, NULL);
148
return display->priv->session;
152
display_set_greeter_session (Display *display, const gchar *greeter_session)
154
g_return_if_fail (display != NULL);
155
g_free (display->priv->greeter_session);
156
display->priv->greeter_session = g_strdup (greeter_session);
160
display_set_session_wrapper (Display *display, const gchar *session_wrapper)
162
g_return_if_fail (display != NULL);
163
g_free (display->priv->session_wrapper);
164
display->priv->session_wrapper = g_strdup (session_wrapper);
168
display_set_allow_guest (Display *display, gboolean allow_guest)
170
g_return_if_fail (display != NULL);
171
display->priv->allow_guest = allow_guest;
175
display_set_greeter_allow_guest (Display *display, gboolean greeter_allow_guest)
177
g_return_if_fail (display != NULL);
178
display->priv->greeter_allow_guest = greeter_allow_guest;
182
display_set_autologin_user (Display *display, const gchar *username, gboolean is_guest, gint timeout)
184
g_return_if_fail (display != NULL);
185
g_free (display->priv->autologin_user);
186
display->priv->autologin_user = g_strdup (username);
187
display->priv->autologin_guest = is_guest;
188
display->priv->autologin_timeout = timeout;
192
display_set_select_user_hint (Display *display, const gchar *username, gboolean is_guest, gboolean attempt_login)
194
g_return_if_fail (display != NULL);
195
g_free (display->priv->select_user_hint);
196
display->priv->select_user_hint = g_strdup (username);
197
display->priv->select_guest_hint = is_guest;
198
display->priv->select_user_attempt_login = attempt_login;
202
display_set_hide_users_hint (Display *display, gboolean hide_users)
204
g_return_if_fail (display != NULL);
205
display->priv->greeter_hide_users = hide_users;
209
display_set_show_manual_login_hint (Display *display, gboolean show_manual_login)
211
g_return_if_fail (display != NULL);
212
display->priv->greeter_show_manual_login = show_manual_login;
216
display_set_show_remote_login_hint (Display *display, gboolean show_remote_login)
218
g_return_if_fail (display != NULL);
219
display->priv->greeter_show_remote_login = show_remote_login;
223
display_set_lock_hint (Display *display, gboolean is_lock)
225
g_return_if_fail (display != NULL);
226
display->priv->greeter_is_lock = is_lock;
230
display_set_user_session (Display *display, SessionType type, const gchar *session_name)
232
g_return_if_fail (display != NULL);
233
g_free (display->priv->user_session);
234
display->priv->user_session_type = type;
235
display->priv->user_session = g_strdup (session_name);
239
display_set_is_ready (Display *display)
241
if (display->priv->is_ready)
244
display->priv->is_ready = TRUE;
245
g_signal_emit (display, signals[READY], 0);
249
switch_to_user (Display *display, User *user)
252
g_signal_emit (display, signals[SWITCH_TO_USER], 0, user, &result);
257
switch_to_guest (Display *display)
260
g_signal_emit (display, signals[SWITCH_TO_GUEST], 0, &result);
265
get_guest_username (Display *display)
268
g_signal_emit (display, signals[GET_GUEST_USERNAME], 0, &username);
273
create_session (Display *display)
277
g_signal_emit (display, signals[CREATE_SESSION], 0, &session);
281
/* Connect using the session bus */
284
if (g_getenv ("DBUS_SESSION_BUS_ADDRESS"))
285
session_set_env (session, "DBUS_SESSION_BUS_ADDRESS", g_getenv ("DBUS_SESSION_BUS_ADDRESS"));
286
session_set_env (session, "LDM_BUS", "SESSION");
287
if (g_getenv ("LD_PRELOAD"))
288
session_set_env (session, "LD_PRELOAD", g_getenv ("LD_PRELOAD"));
289
if (g_getenv ("LD_LIBRARY_PATH"))
290
session_set_env (session, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH"));
291
if (g_getenv ("PATH"))
292
session_set_env (session, "PATH", g_getenv ("PATH"));
295
/* Variables required for regression tests */
296
if (g_getenv ("LIGHTDM_TEST_ROOT"))
298
session_set_env (session, "LIGHTDM_TEST_ROOT", g_getenv ("LIGHTDM_TEST_ROOT"));
299
session_set_env (session, "DBUS_SYSTEM_BUS_ADDRESS", g_getenv ("DBUS_SYSTEM_BUS_ADDRESS"));
300
session_set_env (session, "DBUS_SESSION_BUS_ADDRESS", g_getenv ("DBUS_SESSION_BUS_ADDRESS"));
301
session_set_env (session, "LD_PRELOAD", g_getenv ("LD_PRELOAD"));
302
session_set_env (session, "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH"));
303
session_set_env (session, "GI_TYPELIB_PATH", g_getenv ("GI_TYPELIB_PATH"));
310
destroy_session (Display *display)
312
if (!display->priv->session)
315
g_signal_handlers_disconnect_matched (display->priv->session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
316
session_stop (display->priv->session);
317
g_object_unref (display->priv->session);
318
display->priv->session = NULL;
322
greeter_authentication_complete_cb (Session *session, Display *display)
324
gboolean result = FALSE;
326
if (display->priv->stopping)
329
if (session_get_is_authenticated (session))
331
g_debug ("Greeter authorized");
332
g_signal_emit (display, signals[START_GREETER], 0, &result);
336
g_debug ("Greeter failed authentication");
340
g_debug ("Greeter failed to start");
341
display_stop (display);
346
greeter_connected_cb (Greeter *greeter, Display *display)
348
// FIXME: Should wait for greeter to signal completely ready if it supports it
349
g_debug ("Greeter connected, display is ready");
350
display_set_is_ready (display);
354
greeter_start_authentication_cb (Greeter *greeter, const gchar *username, Display *display)
356
return create_session (display);
360
greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *session_name, Display *display)
362
/* If no session requested, use the previous one */
363
if (!session_name && !greeter_get_guest_authenticated (greeter))
367
user = session_get_user (greeter_get_authentication_session (greeter));
368
type = SESSION_TYPE_LOCAL;
369
session_name = user_get_xsession (user);
372
/* If a session was requested, override the default */
375
g_debug ("Using session %s", session_name);
376
display_set_user_session (display, type, session_name);
379
/* Stop this display if that session already exists and can switch to it */
380
if (greeter_get_guest_authenticated (greeter))
382
if (switch_to_guest (display))
385
/* Set to login as guest */
386
display_set_autologin_user (display, NULL, TRUE, 0);
390
if (switch_to_user (display, session_get_user (greeter_get_authentication_session (display->priv->greeter))))
394
/* Stop the greeter, the session will start when the greeter has quit */
395
g_debug ("Stopping greeter");
396
session_stop (display->priv->session);
402
start_greeter (Display *display)
407
destroy_session (display);
408
display->priv->session = create_session (display);
409
session_set_class (display->priv->session, XDG_SESSION_CLASS_GREETER);
410
g_signal_connect (display->priv->session, "authentication-complete", G_CALLBACK (greeter_authentication_complete_cb), display);
412
/* Make communication link to greeter that will run on this session */
413
display->priv->greeter = greeter_new (display->priv->session, USER_SERVICE, AUTOLOGIN_SERVICE);
414
g_signal_connect (G_OBJECT (display->priv->greeter), "connected", G_CALLBACK (greeter_connected_cb), display);
415
g_signal_connect (G_OBJECT (display->priv->greeter), "start-authentication", G_CALLBACK (greeter_start_authentication_cb), display);
416
g_signal_connect (G_OBJECT (display->priv->greeter), "start-session", G_CALLBACK (greeter_start_session_cb), display);
417
if (display->priv->autologin_timeout)
419
gchar *value = g_strdup_printf ("%d", display->priv->autologin_timeout);
420
greeter_set_hint (display->priv->greeter, "autologin-timeout", value);
422
if (display->priv->autologin_user)
423
greeter_set_hint (display->priv->greeter, "autologin-user", display->priv->autologin_user);
424
else if (display->priv->autologin_guest)
425
greeter_set_hint (display->priv->greeter, "autologin-guest", "true");
427
if (display->priv->select_user_hint)
428
greeter_set_hint (display->priv->greeter, "select-user", display->priv->select_user_hint);
429
else if (display->priv->select_guest_hint)
430
greeter_set_hint (display->priv->greeter, "select-guest", "true");
431
greeter_set_hint (display->priv->greeter, "default-session", display->priv->user_session);
432
greeter_set_allow_guest (display->priv->greeter, display->priv->allow_guest);
433
greeter_set_hint (display->priv->greeter, "has-guest-account", (display->priv->allow_guest && display->priv->greeter_allow_guest) ? "true" : "false");
434
greeter_set_hint (display->priv->greeter, "hide-users", display->priv->greeter_hide_users ? "true" : "false");
435
greeter_set_hint (display->priv->greeter, "show-manual-login", display->priv->greeter_show_manual_login ? "true" : "false");
436
greeter_set_hint (display->priv->greeter, "show-remote-login", display->priv->greeter_show_remote_login ? "true" : "false");
437
if (display->priv->greeter_is_lock)
438
greeter_set_hint (display->priv->greeter, "lock-screen", "true");
440
/* Run greeter as unprivileged user */
444
user = accounts_get_current_user ();
445
greeter_user = g_strdup (user_get_name (user));
446
g_object_unref (user);
450
greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user");
453
g_warning ("Greeter must not be run as root");
454
display_stop (display);
459
g_signal_connect_after (display->priv->session, "stopped", G_CALLBACK (greeter_session_stopped_cb), display);
460
result = greeter_start (display->priv->greeter, GREETER_SERVICE, greeter_user);
461
g_free (greeter_user);
464
display_stop (display);
470
autologin_authentication_complete_cb (Session *session, Display *display)
472
gboolean result = FALSE;
474
if (display->priv->stopping)
477
if (session_get_is_authenticated (session))
479
const gchar *session_name;
481
g_debug ("Autologin user %s authorized", session_get_username (session));
483
session_name = user_get_xsession (session_get_user (session));
486
g_debug ("Autologin using session %s", session_name);
487
display_set_user_session (display, SESSION_TYPE_LOCAL, session_name);
490
g_signal_emit (display, signals[START_SESSION], 0, &result);
494
g_debug ("Autologin failed authentication");
498
if (display->priv->start_greeter_if_fail)
499
start_greeter (display);
501
display_stop (display);
506
autologin (Display *display, const gchar *username, const gchar *service, gboolean start_greeter_if_fail, gboolean is_guest)
508
display->priv->start_greeter_if_fail = start_greeter_if_fail;
510
display->priv->in_user_session = TRUE;
511
destroy_session (display);
512
display->priv->session = create_session (display);
513
g_signal_connect (display->priv->session, "authentication-complete", G_CALLBACK (autologin_authentication_complete_cb), display);
514
g_signal_connect_after (display->priv->session, "stopped", G_CALLBACK (user_session_stopped_cb), display);
515
return session_start (display->priv->session, service, username, TRUE, FALSE, is_guest);
519
autologin_guest (Display *display, const gchar *service, gboolean start_greeter_if_fail)
524
username = get_guest_username (display);
527
g_debug ("Can't autologin guest, no guest account");
531
result = autologin (display, username, service, start_greeter_if_fail, TRUE);
538
get_session_command (const gchar *filename, const gchar *session_wrapper)
540
GKeyFile *session_desktop_file;
543
gchar *command = NULL, **argv, *path;
544
GError *error = NULL;
546
/* Read the command from the .desktop file */
547
session_desktop_file = g_key_file_new ();
548
result = g_key_file_load_from_file (session_desktop_file, filename, G_KEY_FILE_NONE, &error);
550
g_debug ("Failed to load session file %s: %s", filename, error->message);
551
g_clear_error (&error);
554
command = g_key_file_get_string (session_desktop_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_EXEC, NULL);
556
g_debug ("No command in session file %s", filename);
558
g_key_file_free (session_desktop_file);
563
/* If configured, run sessions through a wrapper */
566
argv = g_malloc (sizeof (gchar *) * 3);
567
path = g_find_program_in_path (session_wrapper);
568
argv[0] = path ? path : g_strdup (session_wrapper);
574
/* Split command into an array listing and make command absolute */
575
result = g_shell_parse_argv (command, &argc, &argv, &error);
577
g_debug ("Invalid session command '%s': %s", command, error->message);
578
g_clear_error (&error);
582
path = g_find_program_in_path (argv[0]);
593
greeter_session_stopped_cb (Session *session, Display *display)
595
gboolean result = FALSE;
597
g_debug ("Greeter quit");
599
destroy_session (display);
601
if (display->priv->stopping)
603
display_stop (display);
607
if (display_server_get_is_stopped (display->priv->display_server))
610
/* Start the session for the authenticated user */
611
if (greeter_get_start_session (display->priv->greeter))
613
/* If guest, then start a new autologin guest session (so can setup account) */
614
if (greeter_get_guest_authenticated (display->priv->greeter))
615
result = autologin_guest (display, AUTOLOGIN_SERVICE, FALSE);
616
/* Otherwise, use the session the greeter has authenticated */
619
destroy_session (display);
620
display->priv->session = g_object_ref (greeter_get_authentication_session (display->priv->greeter));
621
g_signal_connect_after (display->priv->session, "stopped", G_CALLBACK (user_session_stopped_cb), display);
622
display->priv->in_user_session = TRUE;
623
g_signal_emit (display, signals[START_SESSION], 0, &result);
628
/* Destroy the greeter */
629
g_signal_handlers_disconnect_matched (display->priv->greeter, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
630
g_object_unref (display->priv->greeter);
631
display->priv->greeter = NULL;
635
g_debug ("Failed to start greeter");
636
display_stop (display);
641
display_start_greeter (Display *display)
643
gchar *log_dir, *filename, *log_filename, *sessions_dir, *path;
646
/* Log the output of the greeter to a system location */
647
log_dir = config_get_string (config_get_instance (), "LightDM", "log-directory");
648
filename = g_strdup_printf ("%s-greeter.log", display_server_get_name (display->priv->display_server));
649
log_filename = g_build_filename (log_dir, filename, NULL);
652
g_debug ("Logging to %s", log_filename);
653
session_set_log_file (display->priv->session, log_filename);
654
g_free (log_filename);
656
/* Load the greeter session information */
657
sessions_dir = config_get_string (config_get_instance (), "LightDM", "xgreeters-directory");
658
filename = g_strdup_printf ("%s.desktop", display->priv->greeter_session);
659
path = g_build_filename (sessions_dir, filename, NULL);
660
g_free (sessions_dir);
662
argv = get_session_command (path, NULL);
667
session_run (display->priv->session, argv);
673
user_session_stopped_cb (Session *session, Display *display)
675
g_debug ("User session quit");
677
destroy_session (display);
679
/* This display has ended */
680
display_stop (display);
684
prepend_argv (gchar ***argv, const gchar *value)
686
gchar **old_argv, **new_argv;
690
new_argv = g_malloc (sizeof (gchar *) * (g_strv_length (*argv) + 2));
691
new_argv[0] = g_strdup (value);
692
for (i = 0; old_argv[i]; i++)
693
new_argv[i + 1] = old_argv[i];
694
new_argv[i + 1] = NULL;
701
display_start_session (Display *display)
704
gchar *filename, *sessions_dir, *path;
706
gboolean disable_guest_wrapper;
708
user = session_get_user (display->priv->session);
710
/* Find the command to run for the selected session */
711
if (display->priv->user_session_type == SESSION_TYPE_LOCAL)
713
sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
715
/* Store this session name so we automatically use it next time */
716
user_set_xsession (user, display->priv->user_session);
719
sessions_dir = config_get_string (config_get_instance (), "LightDM", "remote-sessions-directory");
720
filename = g_strdup_printf ("%s.desktop", display->priv->user_session);
721
path = g_build_filename (sessions_dir, filename, NULL);
722
g_free (sessions_dir);
724
argv = get_session_command (path, display->priv->session_wrapper);
729
session_set_env (display->priv->session, "DESKTOP_SESSION", display->priv->user_session); // FIXME: Apparently deprecated?
730
session_set_env (display->priv->session, "GDMSESSION", display->priv->user_session); // FIXME: Not cross-desktop
732
/* Run a guest session through the wrapper covered by MAC */
733
disable_guest_wrapper = config_get_boolean (config_get_instance (), "LightDM", "disable-guest-wrapper");
734
if (display->priv->autologin_guest && !disable_guest_wrapper)
736
gchar *wrapper = g_build_filename (PKGLIBEXEC_DIR, "lightdm-guest-session-wrapper", NULL);
737
g_debug ("Running guest session through wrapper: %s", wrapper);
738
prepend_argv (&argv, wrapper);
742
g_debug ("Starting session %s as user %s", display->priv->user_session, session_get_username (display->priv->session));
744
session_run (display->priv->session, argv);
747
// FIXME: Wait for session to indicate it is ready (maybe)
748
display_set_is_ready (display);
754
display_server_stopped_cb (DisplayServer *server, Display *display)
756
g_debug ("Display server stopped");
758
/* Stop this display, it will be restarted by the seat if necessary */
759
display_stop (display);
763
display_server_ready_cb (DisplayServer *display_server, Display *display)
765
gboolean result = FALSE;
767
g_signal_emit (display, signals[DISPLAY_SERVER_READY], 0, &result);
770
display_stop (display);
774
/* Don't run any sessions on local terminals */
775
if (!display_server_get_start_local_sessions (display_server))
778
/* Automatically start requested user session */
780
if (display->priv->autologin_timeout == 0 && display->priv->autologin_guest)
782
g_debug ("Automatically logging in as guest");
783
result = autologin_guest (display, AUTOLOGIN_SERVICE, TRUE);
785
else if (display->priv->autologin_timeout == 0 && display->priv->autologin_user)
787
g_debug ("Automatically logging in user %s", display->priv->autologin_user);
788
result = autologin (display, display->priv->autologin_user, AUTOLOGIN_SERVICE, TRUE, FALSE);
790
else if (display->priv->select_user_hint && display->priv->select_user_attempt_login)
792
g_debug ("Logging in user %s", display->priv->select_user_hint);
793
result = autologin (display, display->priv->select_user_hint, USER_SERVICE, TRUE, FALSE);
796
/* If no session started, start a greeter */
799
g_debug ("Starting greeter");
800
result = start_greeter (display);
803
/* If nothing started, then the display can't work */
805
display_stop (display);
809
display_start (Display *display)
811
g_return_val_if_fail (display != NULL, FALSE);
813
g_signal_connect (G_OBJECT (display->priv->display_server), "ready", G_CALLBACK (display_server_ready_cb), display);
814
g_signal_connect (G_OBJECT (display->priv->display_server), "stopped", G_CALLBACK (display_server_stopped_cb), display);
816
if (!display_server_start (display->priv->display_server))
823
display_get_is_ready (Display *display)
825
g_return_val_if_fail (display != NULL, FALSE);
827
return display->priv->is_ready;
831
display_lock (Display *display)
833
g_return_if_fail (display != NULL);
835
if (!display->priv->session)
838
g_debug ("Locking display");
840
session_lock (display->priv->session);
844
display_unlock (Display *display)
846
g_return_if_fail (display != NULL);
848
if (!display->priv->session)
851
g_debug ("Unlocking display");
853
session_unlock (display->priv->session);
857
display_stop (Display *display)
859
g_return_if_fail (display != NULL);
861
if (display->priv->stopped)
864
if (!display->priv->stopping)
866
g_debug ("Stopping display");
867
display->priv->stopping = TRUE;
870
/* Stop the session first */
871
if (display->priv->session)
873
session_stop (display->priv->session);
877
/* Stop the display server after that */
878
if (!display_server_get_is_stopped (display->priv->display_server))
880
display_server_stop (display->priv->display_server);
884
display->priv->stopped = TRUE;
885
g_signal_emit (display, signals[STOPPED], 0);
889
display_get_is_stopped (Display *display)
891
g_return_val_if_fail (display != NULL, FALSE);
892
return display->priv->stopped;
896
display_real_switch_to_user (Display *display, User *user)
902
display_real_switch_to_guest (Display *display)
908
display_real_get_guest_username (Display *display)
914
display_init (Display *display)
916
display->priv = G_TYPE_INSTANCE_GET_PRIVATE (display, DISPLAY_TYPE, DisplayPrivate);
920
display_finalize (GObject *object)
924
self = DISPLAY (object);
926
g_signal_handlers_disconnect_matched (self->priv->display_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self);
927
g_object_unref (self->priv->display_server);
928
g_free (self->priv->greeter_session);
929
if (self->priv->greeter)
931
g_signal_handlers_disconnect_matched (self->priv->greeter, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self);
932
g_object_unref (self->priv->greeter);
934
g_free (self->priv->session_wrapper);
935
if (self->priv->session)
937
g_signal_handlers_disconnect_matched (self->priv->session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self);
938
g_object_unref (self->priv->session);
940
g_free (self->priv->autologin_user);
941
g_free (self->priv->select_user_hint);
942
g_free (self->priv->user_session);
944
G_OBJECT_CLASS (display_parent_class)->finalize (object);
948
display_class_init (DisplayClass *klass)
950
GObjectClass *object_class = G_OBJECT_CLASS (klass);
952
klass->switch_to_user = display_real_switch_to_user;
953
klass->switch_to_guest = display_real_switch_to_guest;
954
klass->get_guest_username = display_real_get_guest_username;
955
klass->start_greeter = display_start_greeter;
956
klass->start_session = display_start_session;
957
object_class->finalize = display_finalize;
959
g_type_class_add_private (klass, sizeof (DisplayPrivate));
961
signals[CREATE_SESSION] =
962
g_signal_new ("create-session",
963
G_TYPE_FROM_CLASS (klass),
965
G_STRUCT_OFFSET (DisplayClass, create_session),
967
ldm_marshal_OBJECT__VOID,
970
g_signal_new ("ready",
971
G_TYPE_FROM_CLASS (klass),
973
G_STRUCT_OFFSET (DisplayClass, ready),
975
g_cclosure_marshal_VOID__VOID,
977
signals[SWITCH_TO_USER] =
978
g_signal_new ("switch-to-user",
979
G_TYPE_FROM_CLASS (klass),
981
G_STRUCT_OFFSET (DisplayClass, switch_to_user),
982
g_signal_accumulator_true_handled,
984
ldm_marshal_BOOLEAN__OBJECT,
985
G_TYPE_BOOLEAN, 1, USER_TYPE);
986
signals[SWITCH_TO_GUEST] =
987
g_signal_new ("switch-to-guest",
988
G_TYPE_FROM_CLASS (klass),
990
G_STRUCT_OFFSET (DisplayClass, switch_to_guest),
991
g_signal_accumulator_true_handled,
993
ldm_marshal_BOOLEAN__VOID,
995
signals[GET_GUEST_USERNAME] =
996
g_signal_new ("get-guest-username",
997
G_TYPE_FROM_CLASS (klass),
999
G_STRUCT_OFFSET (DisplayClass, get_guest_username),
1000
g_signal_accumulator_first_wins,
1002
ldm_marshal_STRING__VOID,
1004
signals[DISPLAY_SERVER_READY] =
1005
g_signal_new ("display-server-ready",
1006
G_TYPE_FROM_CLASS (klass),
1008
G_STRUCT_OFFSET (DisplayClass, display_server_ready),
1010
ldm_marshal_BOOLEAN__VOID,
1012
signals[START_GREETER] =
1013
g_signal_new ("start-greeter",
1014
G_TYPE_FROM_CLASS (klass),
1016
G_STRUCT_OFFSET (DisplayClass, start_greeter),
1017
g_signal_accumulator_true_handled, NULL,
1018
ldm_marshal_BOOLEAN__VOID,
1020
signals[START_SESSION] =
1021
g_signal_new ("start-session",
1022
G_TYPE_FROM_CLASS (klass),
1024
G_STRUCT_OFFSET (DisplayClass, start_session),
1025
g_signal_accumulator_true_handled, NULL,
1026
ldm_marshal_BOOLEAN__VOID,
1029
g_signal_new ("stopped",
1030
G_TYPE_FROM_CLASS (klass),
1032
G_STRUCT_OFFSET (DisplayClass, stopped),
1034
g_cclosure_marshal_VOID__VOID,