diff options
author | Yegor Alexeyev <yegor.alexeyev@gmail.com> | 2021-07-25 15:08:41 +0300 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2021-07-28 17:34:31 +0200 |
commit | caf8c6ea3f3baa5f6c0b69554c4ad68c8011fc8e (patch) | |
tree | 1925508b02dcce1035c785fcf751c7e5dcdf6771 /src/login/logind-button.c | |
parent | f238549b5abb412ef9564d6d5ba00886f66b2a2f (diff) | |
download | systemd-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.c | 44 |
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) { |