X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flogin%2Flogind-seat.c;h=9b6ceb31af09a76bc7976de0b129d16cf14dc34b;hp=755f20c03a8eb3658df78114a078aab871c45c17;hb=92432fcc7f3a0320c07e99c5d395568a3aa216b6;hpb=d2e54fae5ca7a0f71b5ac8b356a589ff0a09ea0a diff --git a/src/login/logind-seat.c b/src/login/logind-seat.c index 755f20c03..9b6ceb31a 100644 --- a/src/login/logind-seat.c +++ b/src/login/logind-seat.c @@ -27,6 +27,8 @@ #include #include +#include "systemd/sd-id128.h" +#include "systemd/sd-messages.h" #include "logind-seat.h" #include "logind-acl.h" #include "util.h" @@ -103,10 +105,14 @@ int seat_save(Seat *s) { fprintf(f, "# This is private data. Do not parse.\n" - "IS_VTCONSOLE=%i\n" - "CAN_MULTI_SESSION=%i\n", - seat_is_vtconsole(s), - seat_can_multi_session(s)); + "IS_SEAT0=%i\n" + "CAN_MULTI_SESSION=%i\n" + "CAN_TTY=%i\n" + "CAN_GRAPHICAL=%i\n", + seat_is_seat0(s), + seat_can_multi_session(s), + seat_can_tty(s), + seat_can_graphical(s)); if (s->active) { assert(s->active->user); @@ -257,7 +263,8 @@ int seat_set_active(Seat *s, Session *session) { if (old_active) { session_save(old_active); - user_save(old_active->user); + if (!session || session->user != old_active->user) + user_save(old_active->user); } return 0; @@ -333,7 +340,11 @@ int seat_start(Seat *s) { if (s->started) return 0; - log_info("New seat %s.", s->id); + log_struct(LOG_INFO, + MESSAGE_ID(SD_MESSAGE_SEAT_START), + "SEAT_ID=%s", s->id, + "MESSAGE=New seat %s.", s->id, + NULL); /* Initialize VT magic stuff */ seat_preallocate_vts(s); @@ -357,7 +368,11 @@ int seat_stop(Seat *s) { assert(s); if (s->started) - log_info("Removed seat %s.", s->id); + log_struct(LOG_INFO, + MESSAGE_ID(SD_MESSAGE_SEAT_STOP), + "SEAT_ID=%s", s->id, + "MESSAGE=Removed seat %s.", s->id, + NULL); seat_stop_sessions(s); @@ -409,16 +424,16 @@ int seat_attach_session(Seat *s, Session *session) { return 0; } -bool seat_is_vtconsole(Seat *s) { +bool seat_is_seat0(Seat *s) { assert(s); - return s->manager->vtconsole == s; + return s->manager->seat0 == s; } bool seat_can_multi_session(Seat *s) { assert(s); - if (!seat_is_vtconsole(s)) + if (!seat_is_seat0(s)) return false; /* If we can't watch which VT is in the foreground, we don't @@ -427,6 +442,25 @@ bool seat_can_multi_session(Seat *s) { return s->manager->console_active_fd >= 0; } +bool seat_can_tty(Seat *s) { + assert(s); + + return seat_is_seat0(s); +} + +bool seat_has_master_device(Seat *s) { + assert(s); + + /* device list is ordered by "master" flag */ + return !!s->devices && s->devices->master; +} + +bool seat_can_graphical(Seat *s) { + assert(s); + + return seat_has_master_device(s); +} + int seat_get_idle_hint(Seat *s, dual_timestamp *t) { Session *session; bool idle_hint = true; @@ -444,7 +478,7 @@ int seat_get_idle_hint(Seat *s, dual_timestamp *t) { if (!ih) { if (!idle_hint) { - if (k.monotonic < ts.monotonic) + if (k.monotonic > ts.monotonic) ts = k; } else { idle_hint = false; @@ -469,10 +503,10 @@ int seat_check_gc(Seat *s, bool drop_not_started) { if (drop_not_started && !s->started) return 0; - if (seat_is_vtconsole(s)) + if (seat_is_seat0(s)) return 1; - return !!s->devices; + return seat_has_master_device(s); } void seat_add_to_gc_queue(Seat *s) {