summaryrefslogtreecommitdiff
path: root/src/login/logind-button.c
diff options
context:
space:
mode:
authorYegor Alexeyev <yegor.alexeyev@gmail.com>2021-07-25 15:08:41 +0300
committerLennart Poettering <lennart@poettering.net>2021-07-28 17:34:31 +0200
commitcaf8c6ea3f3baa5f6c0b69554c4ad68c8011fc8e (patch)
tree1925508b02dcce1035c785fcf751c7e5dcdf6771 /src/login/logind-button.c
parentf238549b5abb412ef9564d6d5ba00886f66b2a2f (diff)
downloadsystemd-caf8c6ea3f3baa5f6c0b69554c4ad68c8011fc8e.tar.gz
added missing handling of button release events
Diffstat (limited to 'src/login/logind-button.c')
-rw-r--r--src/login/logind-button.c44
1 files changed, 42 insertions, 2 deletions
diff --git a/src/login/logind-button.c b/src/login/logind-button.c
index a2eb4c5269..7fb8114639 100644
--- a/src/login/logind-button.c
+++ b/src/login/logind-button.c
@@ -279,13 +279,29 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
}
} else if (ev.type == EV_KEY && ev.value == 0) {
- if (ev.code == KEY_RESTART) {
- if (b->manager->reboot_key_long_press_event_source) {
+
+ switch (ev.code) {
+
+ case KEY_POWER:
+ case KEY_POWER2:
+ if (b->manager->power_key_long_press_event_source) {
/* Long press event timer is still pending and key release
event happened. This means that key press duration was
insufficient to trigger a long press event
*/
log_struct(LOG_INFO,
+ LOG_MESSAGE("Power key pressed short."),
+ "MESSAGE_ID=" SD_MESSAGE_POWER_KEY_STR);
+
+ b->manager->power_key_long_press_event_source = sd_event_source_unref(b->manager->power_key_long_press_event_source);
+
+ manager_handle_action(b->manager, INHIBIT_HANDLE_POWER_KEY, b->manager->handle_power_key, b->manager->power_key_ignore_inhibited, true);
+ }
+ break;
+
+ case KEY_RESTART:
+ if (b->manager->reboot_key_long_press_event_source) {
+ log_struct(LOG_INFO,
LOG_MESSAGE("Reboot key pressed short."),
"MESSAGE_ID=" SD_MESSAGE_REBOOT_KEY_STR);
@@ -293,6 +309,30 @@ static int button_dispatch(sd_event_source *s, int fd, uint32_t revents, void *u
manager_handle_action(b->manager, INHIBIT_HANDLE_REBOOT_KEY, b->manager->handle_reboot_key, b->manager->reboot_key_ignore_inhibited, true);
}
+ break;
+
+ case KEY_SLEEP:
+ if (b->manager->suspend_key_long_press_event_source) {
+ log_struct(LOG_INFO,
+ LOG_MESSAGE("Suspend key pressed short."),
+ "MESSAGE_ID=" SD_MESSAGE_SUSPEND_KEY_STR);
+
+ b->manager->suspend_key_long_press_event_source = sd_event_source_unref(b->manager->suspend_key_long_press_event_source);
+
+ manager_handle_action(b->manager, INHIBIT_HANDLE_SUSPEND_KEY, b->manager->handle_suspend_key, b->manager->suspend_key_ignore_inhibited, true);
+ }
+ break;
+ case KEY_SUSPEND:
+ if (b->manager->hibernate_key_long_press_event_source) {
+ log_struct(LOG_INFO,
+ LOG_MESSAGE("Hibernate key pressed short."),
+ "MESSAGE_ID=" SD_MESSAGE_HIBERNATE_KEY_STR);
+
+ b->manager->hibernate_key_long_press_event_source = sd_event_source_unref(b->manager->hibernate_key_long_press_event_source);
+
+ manager_handle_action(b->manager, INHIBIT_HANDLE_HIBERNATE_KEY, b->manager->handle_hibernate_key, b->manager->hibernate_key_ignore_inhibited, true);
+ }
+ break;
}
} else if (ev.type == EV_SW && ev.value > 0) {