diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2013-07-12 22:09:07 +1200 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2013-07-12 22:09:07 +1200 |
commit | a25875f629a516e3d396c4eb36fecce248a3aa6f (patch) | |
tree | 5e515149269c67d9ac7bfe58f14aa131b6617b63 /src | |
parent | 849a3682059b2697e23e821766fa2236c561763e (diff) | |
download | lightdm-a25875f629a516e3d396c4eb36fecce248a3aa6f.tar.gz |
Compiling
Diffstat (limited to 'src')
-rw-r--r-- | src/seat-unity.c | 31 | ||||
-rw-r--r-- | src/seat-xlocal.c | 22 | ||||
-rw-r--r-- | src/seat.c | 373 | ||||
-rw-r--r-- | src/session.c | 7 | ||||
-rw-r--r-- | src/session.h | 2 |
5 files changed, 54 insertions, 381 deletions
diff --git a/src/seat-unity.c b/src/seat-unity.c index 736bccad..f995ebf9 100644 --- a/src/seat-unity.c +++ b/src/seat-unity.c @@ -501,15 +501,15 @@ seat_unity_set_active_session (Seat *seat, Session *session) if (vt >= 0) vt_set_active (vt); - SEAT_CLASS (seat_unity_parent_class)->set_active_display (seat, display); + SEAT_CLASS (seat_unity_parent_class)->set_active_session (seat, session); return; } - if (display == SEAT_UNITY (seat)->priv->active_display) + if (session == SEAT_UNITY (seat)->priv->active_session) return; SEAT_UNITY (seat)->priv->active_session = session; - xserver = XSERVER_LOCAL (display_get_display_server (display)); + xserver = XSERVER_LOCAL (session_get_display_server (session)); id = xserver_local_get_mir_id (xserver); g_debug ("Switching to Mir session %s", id); @@ -551,7 +551,7 @@ seat_unity_run_script (Seat *seat, DisplayServer *display_server, Process *scrip const gchar *path; XServerLocal *xserver; - xserver = XSERVER_LOCAL (display_get_display_server (display)); + xserver = XSERVER_LOCAL (display_server); path = xserver_local_get_authority_file_path (xserver); process_set_env (script, "DISPLAY", xserver_get_address (XSERVER (xserver))); process_set_env (script, "XAUTHORITY", path); @@ -573,28 +573,6 @@ seat_unity_stop (Seat *seat) } static void -seat_unity_display_removed (Seat *seat, Display *display) -{ - if (seat_get_is_stopping (seat)) - return; - - /* If this is the only display and it failed to start then stop this seat */ - if (g_list_length (seat_get_displays (seat)) == 0 && !display_get_is_ready (display)) - { - g_debug ("Stopping Unity seat, failed to start a display"); - seat_stop (seat); - return; - } - - /* Show a new greeter */ - if (display == seat_get_active_display (seat)) - { - g_debug ("Active display stopped, switching to greeter"); - seat_switch_to_greeter (seat); - } -} - -static void seat_unity_init (SeatUnity *seat) { seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_UNITY_TYPE, SeatUnityPrivate); @@ -637,7 +615,6 @@ seat_unity_class_init (SeatUnityClass *klass) seat_class->get_active_session = seat_unity_get_active_session; seat_class->run_script = seat_unity_run_script; seat_class->stop = seat_unity_stop; - seat_class->display_removed = seat_unity_display_removed; g_type_class_add_private (klass, sizeof (SeatUnityPrivate)); } diff --git a/src/seat-xlocal.c b/src/seat-xlocal.c index 8ecce204..ca2726bd 100644 --- a/src/seat-xlocal.c +++ b/src/seat-xlocal.c @@ -129,17 +129,17 @@ seat_xlocal_create_session (Seat *seat, DisplayServer *display_server) } static void -seat_xlocal_set_active_display_server (Seat *seat, DisplayServer) +seat_xlocal_set_active_session (Seat *seat, Session *session) { - gint vt = xserver_local_get_vt (XSERVER_LOCAL (display_server)); + gint vt = xserver_local_get_vt (XSERVER_LOCAL (session_get_display_server (session))); if (vt >= 0) vt_set_active (vt); - SEAT_CLASS (seat_xlocal_parent_class)->set_active_display_server (seat, display_server); + SEAT_CLASS (seat_xlocal_parent_class)->set_active_session (seat, session); } -static DisplayServer * -seat_xlocal_get_active_display_server (Seat *seat) +static Session * +seat_xlocal_get_active_session (Seat *seat) { gint vt; GList *link; @@ -148,14 +148,14 @@ seat_xlocal_get_active_display_server (Seat *seat) if (vt < 0) return NULL; - for (link = seat_get_display_servers (seat); link; link = link->next) + for (link = seat_get_sessions (seat); link; link = link->next) { - DisplayServer *display_server = link->data; + Session *session = link->data; XServerLocal *xserver; - xserver = XSERVER_LOCAL (display_server); + xserver = XSERVER_LOCAL (session_get_display_server (session)); if (xserver_local_get_vt (xserver) == vt) - return display_server; + return session; } return NULL; @@ -188,7 +188,7 @@ seat_xlocal_class_init (SeatXLocalClass *klass) seat_class->setup = seat_xlocal_setup; seat_class->create_display_server = seat_xlocal_create_display_server; seat_class->create_session = seat_xlocal_create_session; - seat_class->set_active_display = seat_xlocal_set_active_display; - seat_class->get_active_display = seat_xlocal_get_active_display; + seat_class->set_active_session = seat_xlocal_set_active_session; + seat_class->get_active_session = seat_xlocal_get_active_session; seat_class->run_script = seat_xlocal_run_script; } @@ -203,57 +203,12 @@ switch_to_user (Seat *seat, const gchar *username, gboolean unlock) GList *link; /* Switch to active display if it exists */ - for (link = seat->priv->sessions; link; link = link->next) - { - Session *session = link->data; - - if (display_get_is_stopped (display)) - continue; - - /* If already logged in, then switch to that display */ - if (g_strcmp0 (display_get_username (display), username) == 0) - { - if (username) - g_debug ("Switching to existing session for user %s", username); - else - g_debug ("Switching to existing greeter"); - if (unlock) - display_unlock (display); - seat_set_active_display (seat, display); - return TRUE; - } - } + // FIXME return FALSE; } static gboolean -display_switch_to_user_cb (Display *display, User *user, Seat *seat) -{ - return switch_to_user (seat, user_get_name (user), TRUE); -} - -static gboolean -display_switch_to_guest_cb (Display *display, Seat *seat) -{ - /* No guest account */ - if (!seat->priv->guest_username) - return FALSE; - - return switch_to_user (seat, seat->priv->guest_username, TRUE); -} - -static const gchar * -display_get_guest_username_cb (Display *display, Seat *seat) -{ - if (seat->priv->guest_username) - return seat->priv->guest_username; - - seat->priv->guest_username = guest_account_setup (); - return g_strdup (seat->priv->guest_username); -} - -static gboolean run_script (Seat *seat, DisplayServer *display_server, const gchar *script_name, User *user) { Process *script; @@ -325,57 +280,6 @@ emit_upstart_signal (const gchar *signal) g_free (cmd); } -static gboolean -display_display_server_ready_cb (Display *display, Seat *seat) -{ - const gchar *script; - - /* Run setup script */ - script = seat_get_string_property (seat, "display-setup-script"); - if (script && !run_script (seat, display, script, NULL)) - return FALSE; - - emit_upstart_signal ("login-session-start"); - - return TRUE; -} - -static Session * -display_create_session_cb (Display *display, Seat *seat) -{ - return SEAT_GET_CLASS (seat)->create_session (seat, display); -} - -static gboolean -display_start_greeter_cb (Display *display, Seat *seat) -{ - Session *session; - const gchar *script; - - session = display_get_session (display); - - script = seat_get_string_property (seat, "greeter-setup-script"); - if (script) - return !run_script (seat, display, script, session_get_user (session)); - else - return FALSE; -} - -static gboolean -display_start_session_cb (Display *display, Seat *seat) -{ - Session *session; - const gchar *script; - - session = display_get_session (display); - - script = seat_get_string_property (seat, "session-setup-script"); - if (script) - return !run_script (seat, display, script, session_get_user (session)); - else - return FALSE; -} - static void session_stopped_cb (Session *session, Seat *seat) { @@ -394,42 +298,13 @@ session_stopped_cb (Session *session, Seat *seat) } } -static gboolean -display_session_started_cb (Display *display, Seat *seat) -{ - g_signal_connect (display_get_session (display), "stopped", G_CALLBACK (session_stopped_cb), seat); - emit_upstart_signal ("desktop-session-start"); - return FALSE; -} - -static void -display_ready_cb (Display *display, Seat *seat) -{ - /* Switch to this new display */ - g_debug ("New display ready, switching to it"); - SEAT_GET_CLASS (seat)->set_active_display (seat, display); -} - -static Display * -display_create_display_cb (Display *display, Session *session, Seat *seat) -{ - Display *d; - - d = create_display (seat); - g_signal_connect (d, "ready", G_CALLBACK (display_ready_cb), seat); - g_signal_emit (seat, signals[SESSION_ADDED], 0, d); - - display_start_with_session (d, session); - - return g_object_ref (d); -} - static void check_stopped (Seat *seat) { if (seat->priv->stopping && !seat->priv->stopped && - g_list_length (seat->priv->displays) == 0) + g_list_length (seat->priv->display_servers) == 0 && + g_list_length (seat->priv->sessions) == 0) { seat->priv->stopped = TRUE; g_debug ("Seat stopped"); @@ -437,128 +312,27 @@ check_stopped (Seat *seat) } } -static void -display_stopped_cb (Display *display, Seat *seat) -{ - gboolean is_active; - - is_active = display == seat_get_active_display (seat); - - g_signal_handlers_disconnect_matched (display, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); - seat->priv->displays = g_list_remove (seat->priv->displays, display); - - g_signal_emit (seat, signals[SESSION_REMOVED], 0, display); - - /* If no more displays running either start a greeter or stop the seat */ - if (!seat->priv->stopping) - { - if (g_list_length (seat->priv->displays) == 0) - { - /* If failed to start then stop this seat */ - if (!display_get_is_ready (display)) - { - g_debug ("Stopping seat, failed to start a display"); - seat_stop (seat); - } - /* Attempt to start a greeter */ - else if (!seat->priv->can_switch) - { - g_debug ("Stopping seat, display stopped"); - seat_stop (seat); - } - - else if (!seat_switch_to_greeter (seat)) - { - g_debug ("Stopping seat, unable to start greeter"); - seat_stop (seat); - } - } - else if (is_active) - { - g_debug ("Active display stopped, switching to greeter"); - if (!seat_switch_to_greeter (seat)) - { - g_debug ("Stopping seat, unable to start greeter"); - seat_stop (seat); - } - } - } - - g_object_unref (display); - - check_stopped (seat); -} - -static Display * -create_display (Seat *seat) +static DisplayServer * +create_display_server (Seat *seat) { - Display *display; - DisplayServer *display_server; - - display_server = SEAT_GET_CLASS (seat)->create_display_server (seat); - display = display_new (display_server); - g_object_unref (display_server); - - g_signal_connect (display, "display-server-ready", G_CALLBACK (display_display_server_ready_cb), seat); - g_signal_connect (display, "switch-to-user", G_CALLBACK (display_switch_to_user_cb), seat); - g_signal_connect (display, "switch-to-guest", G_CALLBACK (display_switch_to_guest_cb), seat); - g_signal_connect (display, "get-guest-username", G_CALLBACK (display_get_guest_username_cb), seat); - g_signal_connect (display, "create-session", G_CALLBACK (display_create_session_cb), seat); - g_signal_connect (display, "start-greeter", G_CALLBACK (display_start_greeter_cb), seat); - g_signal_connect (display, "start-session", G_CALLBACK (display_start_session_cb), seat); - g_signal_connect_after (display, "start-session", G_CALLBACK (display_session_started_cb), seat); - g_signal_connect (display, "create-display", G_CALLBACK (display_create_display_cb), seat); - g_signal_connect (display, "stopped", G_CALLBACK (display_stopped_cb), seat); - display_set_greeter_session (display, seat_get_string_property (seat, "greeter-session")); - display_set_session_wrapper (display, seat_get_string_property (seat, "session-wrapper")); - display_set_greeter_wrapper (display, seat_get_string_property (seat, "greeter-wrapper")); - display_set_hide_users_hint (display, seat_get_boolean_property (seat, "greeter-hide-users")); - display_set_show_manual_login_hint (display, seat_get_boolean_property (seat, "greeter-show-manual-login")); - display_set_show_remote_login_hint (display, seat_get_boolean_property (seat, "greeter-show-remote-login")); - display_set_allow_guest (display, seat_get_allow_guest (seat)); - display_set_greeter_allow_guest (display, seat_get_greeter_allow_guest (seat)); - display_set_user_session (display, SESSION_TYPE_LOCAL, seat_get_string_property (seat, "user-session")); - display_set_share_display_server (display, seat->priv->share_display_server); - - seat->priv->displays = g_list_append (seat->priv->displays, display); - - return display; -} - -static gboolean -start_display (Seat *seat, Display *display) -{ - g_signal_emit (seat, signals[SESSION_ADDED], 0, display); - - /* Switch to this display if currently not looking at anything */ - if (seat_get_active_display (seat) == NULL) - seat_set_active_display (seat, display); - - return display_start (display); + return SEAT_GET_CLASS (seat)->create_display_server (seat); } gboolean seat_switch_to_greeter (Seat *seat) { - Display *display; + DisplayServer *display_server; g_return_val_if_fail (seat != NULL, FALSE); if (!seat->priv->can_switch) return FALSE; - g_debug ("Switching to greeter"); - /* Switch to greeter if one open (shouldn't be though) */ if (switch_to_user (seat, NULL, FALSE)) return TRUE; - g_debug ("Starting new display for greeter"); - - display = create_display (seat); - g_signal_connect (display, "ready", G_CALLBACK (display_ready_cb), seat); - - return start_display (seat, display); + // FIXME } gboolean @@ -576,18 +350,9 @@ seat_switch_to_user (Seat *seat, const gchar *username, const gchar *session_nam if (switch_to_user (seat, username, FALSE)) return TRUE; - if (username) - g_debug ("Starting new display for greeter with user %s selected", username); - else - g_debug ("Starting new display for greeter"); - - display = create_display (seat); - g_signal_connect (display, "ready", G_CALLBACK (display_ready_cb), seat); - display_set_select_user_hint (display, username, FALSE, TRUE); - if (session_name != NULL) - display_set_user_session (display, SESSION_TYPE_LOCAL, session_name); + // FIXME - return start_display (seat, display); + return FALSE; } gboolean @@ -605,15 +370,9 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name) return switch_to_user (seat, seat->priv->guest_username, FALSE); } - g_debug ("Starting new display for automatic guest login"); + // FIXME - display = create_display (seat); - g_signal_connect (display, "ready", G_CALLBACK (display_ready_cb), seat); - display_set_autologin_user (display, NULL, TRUE, 0); - if (session_name != NULL) - display_set_user_session (display, SESSION_TYPE_LOCAL, session_name); - - return start_display (seat, display); + return FALSE; } gboolean @@ -630,14 +389,9 @@ seat_lock (Seat *seat, const gchar *username) if (switch_to_user (seat, NULL, FALSE)) return TRUE; - g_debug ("Starting new display for greeter (lock screen)"); - - display = create_display (seat); - g_signal_connect (display, "ready", G_CALLBACK (display_ready_cb), seat); - display_set_lock_hint (display, TRUE); - display_set_select_user_hint (display, username, FALSE, FALSE); + // FIXME - return start_display (seat, display); + return FALSE; } void @@ -665,32 +419,6 @@ seat_real_setup (Seat *seat) { } -static void -autologin_greeter_ready_cb (Display *display, Seat *seat) -{ - const gchar *autologin_username; - gboolean autologin_guest; - Display *autologin_display; - - g_debug ("Greeter ready, starting autologin session"); - - /* Get autologin settings */ - autologin_username = seat_get_string_property (seat, "autologin-user"); - if (g_strcmp0 (autologin_username, "") == 0) - autologin_username = NULL; - autologin_guest = seat_get_boolean_property (seat, "autologin-guest"); - - if (autologin_guest) - g_debug ("Starting new display for automatic guest login"); - else if (autologin_username) - g_debug ("Starting new display for automatic login as user %s", autologin_username); - - autologin_display = create_display (seat); - display_set_autologin_user (autologin_display, autologin_username, autologin_guest, 0); - - start_display (seat, autologin_display); -} - static gboolean seat_real_start (Seat *seat) { @@ -702,61 +430,12 @@ seat_real_start (Seat *seat) g_debug ("Starting seat"); - /* Get autologin settings */ - autologin_username = seat_get_string_property (seat, "autologin-user"); - if (g_strcmp0 (autologin_username, "") == 0) - autologin_username = NULL; - autologin_timeout = seat_get_integer_property (seat, "autologin-user-timeout"); - autologin_guest = seat_get_boolean_property (seat, "autologin-guest"); - autologin_in_background = seat_get_boolean_property (seat, "autologin-in-background"); - do_autologin = autologin_username != NULL || autologin_guest; - - /* Background automatic logins need the greeter showing first */ - if (do_autologin && autologin_in_background && !switch_to_user (seat, NULL, FALSE)) - { - g_debug ("Autologin in background, opening greeter first"); - display = create_display (seat); - g_signal_connect (display, "ready", G_CALLBACK (autologin_greeter_ready_cb), seat); - if (autologin_timeout > 0) - display_set_autologin_user (display, autologin_username, autologin_guest, autologin_timeout); - return start_display (seat, display); - } - - if (autologin_guest) - g_debug ("Starting new display for automatic guest login"); - else if (autologin_username) - g_debug ("Starting new display for automatic login as user %s", autologin_username); - else - g_debug ("Starting new display for greeter"); - - display = create_display (seat); - g_signal_connect (display, "ready", G_CALLBACK (display_ready_cb), seat); - display_set_autologin_user (display, autologin_username, autologin_guest, autologin_timeout); - - return start_display (seat, display); + // FIXME } static void seat_real_set_active_session (Seat *seat, Session *session) { - GList *link; - - for (link = seat->priv->displays; link; link = link->next) - { - Display *d = link->data; - - if (d == display) - continue; - - /* Stop any greeters and lock any other sessions */ - if (!display_get_username (d)) - { - g_debug ("Stopping background greeter"); - display_stop (d); - } - else - display_lock (d); - } } static Session * @@ -768,20 +447,28 @@ seat_real_get_active_session (Seat *seat) static void seat_real_stop (Seat *seat) { - GList *displays, *link; + GList *list, *link; check_stopped (seat); if (seat->priv->stopped) return; - /* Stop all the displays on the seat. Copy the list as it might be modified if a display stops during this loop */ - displays = g_list_copy (seat->priv->displays); - for (link = displays; link; link = link->next) + /* Stop all the display servers and sessions on the seat. Copy the list as + * it might be modified if a display server / session stops during this loop */ + list = g_list_copy (seat->priv->display_servers); + for (link = list; link; link = link->next) { - Display *display = link->data; - display_stop (display); + DisplayServer *display_server = link->data; + display_server_stop (display_server); + } + g_list_free (list); + list = g_list_copy (seat->priv->sessions); + for (link = list; link; link = link->next) + { + Session *session = link->data; + session_stop (session); } - g_list_free (displays); + g_list_free (list); } static void diff --git a/src/session.c b/src/session.c index 839769bb..d974705f 100644 --- a/src/session.c +++ b/src/session.c @@ -133,6 +133,13 @@ session_set_display_server (Session *session, DisplayServer *display_server) SESSION_GET_CLASS (session)->set_display_server (session, display_server); } +DisplayServer * +session_get_display_server (Session *session) +{ + g_return_val_if_fail (session != NULL, NULL); + return session->priv->display_server; +} + void session_set_tty (Session *session, const gchar *tty) { diff --git a/src/session.h b/src/session.h index 6d5640c9..31367a7e 100644 --- a/src/session.h +++ b/src/session.h @@ -63,6 +63,8 @@ void session_set_class (Session *session, const gchar *class); void session_set_display_server (Session *session, DisplayServer *display_server); +DisplayServer *session_get_display_server (Session *session); + void session_set_tty (Session *session, const gchar *tty); void session_set_xdisplay (Session *session, const gchar *xdisplay); |