From: Lennart Poettering Date: Sun, 28 Oct 2012 11:29:27 +0000 (+0100) Subject: logind: add 'lock' as possible choice for handling hw keys X-Git-Tag: v196~193 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=7654b2c2593f4d106bc01be2662c1ab8339c90e1 logind: add 'lock' as possible choice for handling hw keys --- diff --git a/man/logind.conf.xml b/man/logind.conf.xml index af842b5d5..df15d51b5 100644 --- a/man/logind.conf.xml +++ b/man/logind.conf.xml @@ -213,13 +213,16 @@ halt, kexec, suspend, - hibernate, and - hybrid-sleep. If + hibernate, + hybrid-sleep and + lock. If ignore logind will - never handle these keys. Otherwise the - specified action will be taken in the - respective event. Only input devices - with the + never handle these keys. If + lock all running + sessions will be screen + locked. Otherwise the specified action + will be taken in the respective + event. Only input devices with the power-switch udev tag will be watched for key/lid switch events. HandlePowerKey= diff --git a/src/login/logind-button.c b/src/login/logind-button.c index 753d95454..5fadadede 100644 --- a/src/login/logind-button.c +++ b/src/login/logind-button.c @@ -150,6 +150,18 @@ fail: return r; } +static int lock_sessions(Manager *m) { + Iterator i; + Session *session; + + log_info("Locking sessions..."); + + HASHMAP_FOREACH(session, m->sessions, i) + session_send_lock(session, true); + + return 1; +} + static int button_handle( Button *b, InhibitWhat inhibit_key, @@ -164,7 +176,7 @@ static int button_handle( [HANDLE_KEXEC] = "Rebooting via kexec...", [HANDLE_SUSPEND] = "Suspending...", [HANDLE_HIBERNATE] = "Hibernating...", - [HANDLE_HYBRID_SLEEP] = "Hibernating and suspend...", + [HANDLE_HYBRID_SLEEP] = "Hibernating and suspend..." }; static const char * const target_table[_HANDLE_BUTTON_MAX] = { @@ -195,6 +207,10 @@ static int button_handle( return 0; } + /* Locking is handled differently from the rest. */ + if (handle == HANDLE_LOCK) + return lock_sessions(b->manager); + inhibit_operation = handle == HANDLE_SUSPEND || handle == HANDLE_HIBERNATE || handle == HANDLE_HYBRID_SLEEP ? INHIBIT_SLEEP : INHIBIT_SHUTDOWN; /* If the actual operation is inhibited, warn and fail */ @@ -309,6 +325,7 @@ static const char* const handle_button_table[_HANDLE_BUTTON_MAX] = { [HANDLE_SUSPEND] = "suspend", [HANDLE_HIBERNATE] = "hibernate", [HANDLE_HYBRID_SLEEP] = "hybrid-sleep", + [HANDLE_LOCK] = "lock" }; DEFINE_STRING_TABLE_LOOKUP(handle_button, HandleButton); DEFINE_CONFIG_PARSE_ENUM(config_parse_handle_button, handle_button, HandleButton, "Failed to parse handle button setting"); diff --git a/src/login/logind-button.h b/src/login/logind-button.h index 827a03e46..b76ca32c0 100644 --- a/src/login/logind-button.h +++ b/src/login/logind-button.h @@ -33,6 +33,7 @@ typedef enum HandleButton { HANDLE_SUSPEND, HANDLE_HIBERNATE, HANDLE_HYBRID_SLEEP, + HANDLE_LOCK, _HANDLE_BUTTON_MAX, _HANDLE_BUTTON_INVALID = -1 } HandleButton;