diff options
Diffstat (limited to 'src/login')
-rw-r--r-- | src/login/71-seat.rules.in | 5 | ||||
-rw-r--r-- | src/login/logind-dbus.c | 30 | ||||
-rw-r--r-- | src/login/logind.c | 6 | ||||
-rw-r--r-- | src/login/logind.h | 2 |
4 files changed, 36 insertions, 7 deletions
diff --git a/src/login/71-seat.rules.in b/src/login/71-seat.rules.in index ab7b66f651..47d68b85fb 100644 --- a/src/login/71-seat.rules.in +++ b/src/login/71-seat.rules.in @@ -17,6 +17,11 @@ SUBSYSTEM=="usb", ATTR{bDeviceClass}=="09", TAG+="seat" # 'Plugable' USB hub, sound, network, graphics adapter SUBSYSTEM=="usb", ATTR{idVendor}=="2230", ATTR{idProduct}=="000[13]", ENV{ID_AUTOSEAT}="1" +# qemu (version 2.4+) has a PCI-PCI bridge (-device pci-bridge-seat) to group +# evices belonging to one seat. See: +# http://git.qemu.org/?p=qemu.git;a=blob;f=docs/multiseat.txt +SUBSYSTEM=="pci", ATTR{vendor}=="0x1b36", ATTR{device}=="0x000a", TAG+="seat", ENV{ID_AUTOSEAT}="1" + # Mimo 720, with integrated USB hub, displaylink graphics, and e2i # touchscreen. This device carries no proper VID/PID in the USB hub, # but it does carry good ID data in the graphics component, hence we diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index 8ebcd3f5ca..659ce18a48 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -690,6 +690,8 @@ static int method_create_session(sd_bus_message *message, void *userdata, sd_bus } manager_get_session_by_pid(m, leader, &session); + if (!session && vtnr > 0) + session = (vtnr < m->seat0->position_count) ? m->seat0->positions[vtnr] : NULL; if (session) { _cleanup_free_ char *path = NULL; _cleanup_close_ int fifo_fd = -1; @@ -1486,18 +1488,13 @@ static int execute_shutdown_or_sleep( return 0; } -static int manager_inhibit_timeout_handler( - sd_event_source *s, - uint64_t usec, - void *userdata) { +int manager_dispatch_delayed(Manager *manager, bool timeout) { _cleanup_bus_error_free_ sd_bus_error error = SD_BUS_ERROR_NULL; Inhibitor *offending = NULL; - Manager *manager = userdata; int r; assert(manager); - assert(manager->inhibit_timeout_source == s); if (manager->action_what == 0 || manager->action_job) return 0; @@ -1505,6 +1502,9 @@ static int manager_inhibit_timeout_handler( if (manager_is_inhibited(manager, manager->action_what, INHIBIT_DELAY, NULL, false, false, 0, &offending)) { _cleanup_free_ char *comm = NULL, *u = NULL; + if (!timeout) + return 0; + (void) get_process_comm(offending->pid, &comm); u = uid_to_name(offending->uid); @@ -1520,9 +1520,25 @@ static int manager_inhibit_timeout_handler( manager->action_unit = NULL; manager->action_what = 0; + return r; } - return 0; + return 1; +} + +static int manager_inhibit_timeout_handler( + sd_event_source *s, + uint64_t usec, + void *userdata) { + + Manager *manager = userdata; + int r; + + assert(manager); + assert(manager->inhibit_timeout_source == s); + + r = manager_dispatch_delayed(manager, true); + return (r < 0) ? r : 0; } static int delay_shutdown_or_sleep( diff --git a/src/login/logind.c b/src/login/logind.c index 01f7cd9ee0..e2fb496289 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -1109,6 +1109,12 @@ static int manager_run(Manager *m) { manager_gc(m, true); + r = manager_dispatch_delayed(m, false); + if (r < 0) + return r; + if (r > 0) + continue; + r = sd_event_run(m->event, (uint64_t) -1); if (r < 0) return r; diff --git a/src/login/logind.h b/src/login/logind.h index feb381d0b1..ad437b72cb 100644 --- a/src/login/logind.h +++ b/src/login/logind.h @@ -194,3 +194,5 @@ int manager_get_seat_from_creds(Manager *m, sd_bus_message *message, const char int manager_setup_wall_message_timer(Manager *m); bool logind_wall_tty_filter(const char *tty, void *userdata); + +int manager_dispatch_delayed(Manager *manager, bool timeout); |