From 1980b2e479dd06ca270096b6ad98ac3b5b8d24ee Mon Sep 17 00:00:00 2001 From: ebits Date: Fri, 28 Nov 2025 19:05:17 +0100 Subject: [PATCH] Feature: Added option for hibernate between sleep and brightness down (#867) (closes #866) Reviewed-on: https://codeberg.org/fairyglade/ly/pulls/867 Reviewed-by: AnErrupTion Co-authored-by: ebits Co-committed-by: ebits --- res/config.ini | 6 ++++++ res/lang/ar.ini | 2 ++ res/lang/cat.ini | 2 ++ res/lang/cs.ini | 2 ++ res/lang/de.ini | 2 ++ res/lang/en.ini | 4 +++- res/lang/es.ini | 2 ++ res/lang/fr.ini | 2 ++ res/lang/it.ini | 2 ++ res/lang/ja_JP.ini | 2 ++ res/lang/lv.ini | 2 ++ res/lang/pl.ini | 2 ++ res/lang/pt.ini | 2 ++ res/lang/pt_BR.ini | 2 ++ res/lang/ro.ini | 2 ++ res/lang/ru.ini | 2 ++ res/lang/sr.ini | 2 ++ res/lang/sv.ini | 2 ++ res/lang/tr.ini | 2 ++ res/lang/uk.ini | 2 ++ res/lang/zh_CN.ini | 2 ++ src/config/Config.zig | 2 ++ src/config/Lang.zig | 2 ++ src/main.zig | 27 +++++++++++++++++++++++++++ 24 files changed, 78 insertions(+), 1 deletion(-) diff --git a/res/config.ini b/res/config.ini index f090397..1757303 100644 --- a/res/config.ini +++ b/res/config.ini @@ -212,6 +212,12 @@ gameoflife_frame_delay = 6 # 0.7+ -> Dense, chaotic patterns gameoflife_initial_density = 0.4 +# Command executed when pressing hibernate key (can be null) +hibernate_cmd = null + +# Specifies the key used for hibernate (F1-F12) +hibernate_key = F4 + # Remove main box borders hide_borders = false diff --git a/res/lang/ar.ini b/res/lang/ar.ini index 9b371f8..b70dbe0 100644 --- a/res/lang/ar.ini +++ b/res/lang/ar.ini @@ -42,6 +42,7 @@ err_perm_dir = فشل في تغيير المجلد الحالي err_perm_group = فشل في تخفيض صلاحيات المجموعة (Group permissions) err_perm_user = فشل في تخفيض صلاحيات المستخدم (User permissions) err_pwnam = فشل في جلب معلومات المستخدم + err_sleep = فشل في تنفيذ أمر sleep @@ -66,6 +67,7 @@ restart = اعادة التشغيل shell = shell shutdown = ايقاف التشغيل sleep = وضع السكون + wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/cat.ini b/res/lang/cat.ini index 284b14a..302ddbd 100644 --- a/res/lang/cat.ini +++ b/res/lang/cat.ini @@ -47,6 +47,7 @@ err_pwnam = error en obtenir la informació de l'usuari + err_user_gid = error en establir el GID de l'usuari err_user_init = error en inicialitzar usuari err_user_uid = error en establir l'UID de l'usuari @@ -66,6 +67,7 @@ restart = reiniciar shell = shell shutdown = aturar sleep = suspendre + wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/cs.ini b/res/lang/cs.ini index cac7884..50af836 100644 --- a/res/lang/cs.ini +++ b/res/lang/cs.ini @@ -47,6 +47,7 @@ err_pwnam = nelze získat informace o uživateli + err_user_gid = nastavení GID uživatele selhalo err_user_init = inicializace uživatele selhala err_user_uid = nastavení UID uživateli selhalo @@ -66,6 +67,7 @@ restart = restartovat shell = příkazový řádek shutdown = vypnout + wayland = wayland xinitrc = xinitrc diff --git a/res/lang/de.ini b/res/lang/de.ini index 12cce5f..68cc4a6 100644 --- a/res/lang/de.ini +++ b/res/lang/de.ini @@ -42,6 +42,7 @@ err_perm_dir = Ordnerwechsel fehlgeschlagen err_perm_group = Fehler beim Heruntersetzen der Gruppenberechtigungen err_perm_user = Fehler beim Heruntersetzen der Nutzerberechtigungen err_pwnam = Abrufen der Benutzerinformationen fehlgeschlagen + err_sleep = Sleep-Befehl fehlgeschlagen @@ -66,6 +67,7 @@ restart = Neustarten shell = Shell shutdown = Herunterfahren sleep = Sleep + wayland = wayland x11 = X11 xinitrc = xinitrc diff --git a/res/lang/en.ini b/res/lang/en.ini index 7c95a09..513ee72 100644 --- a/res/lang/en.ini +++ b/res/lang/en.ini @@ -42,7 +42,8 @@ err_perm_dir = failed to change current directory err_perm_group = failed to downgrade group permissions err_perm_user = failed to downgrade user permissions err_pwnam = failed to get user info -err_sleep = failed to execute sleep command + + err_battery = failed to load battery status err_switch_tty = failed to switch tty err_tty_ctrl = tty control transfer failed @@ -66,6 +67,7 @@ restart = reboot shell = shell shutdown = shutdown sleep = sleep + wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/es.ini b/res/lang/es.ini index 0878bf2..a00d866 100644 --- a/res/lang/es.ini +++ b/res/lang/es.ini @@ -47,6 +47,7 @@ err_pwnam = error al obtener la información del usuario + err_user_gid = error al establecer el GID del usuario err_user_init = error al inicializar usuario err_user_uid = error al establecer el UID del usuario @@ -66,6 +67,7 @@ restart = reiniciar shell = shell shutdown = apagar sleep = suspender + wayland = wayland xinitrc = xinitrc diff --git a/res/lang/fr.ini b/res/lang/fr.ini index 7774a16..82083c7 100644 --- a/res/lang/fr.ini +++ b/res/lang/fr.ini @@ -42,6 +42,7 @@ err_perm_dir = échec de changement de répertoire err_perm_group = échec du déclassement des permissions de groupe err_perm_user = échec du déclassement des permissions utilisateur err_pwnam = échec de lecture des infos utilisateur + err_sleep = échec de l'exécution de la commande de veille err_battery = échec de lecture de l'état de la batterie err_switch_tty = échec du changement de terminal @@ -66,6 +67,7 @@ restart = redémarrer shell = shell shutdown = éteindre sleep = veille + wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/it.ini b/res/lang/it.ini index 84d0d39..35dcb6a 100644 --- a/res/lang/it.ini +++ b/res/lang/it.ini @@ -47,6 +47,7 @@ err_pwnam = impossibile ottenere dati utente + err_user_gid = impossibile impostare GID utente err_user_init = impossibile inizializzare utente err_user_uid = impossible impostare UID utente @@ -66,6 +67,7 @@ restart = riavvio shell = shell shutdown = arresto + wayland = wayland xinitrc = xinitrc diff --git a/res/lang/ja_JP.ini b/res/lang/ja_JP.ini index 0f4c34a..ef126d6 100644 --- a/res/lang/ja_JP.ini +++ b/res/lang/ja_JP.ini @@ -42,6 +42,7 @@ err_perm_dir = カレントディレクトリの変更に失敗しました err_perm_group = グループ権限のダウングレードに失敗しました err_perm_user = ユーザー権限のダウングレードに失敗しました err_pwnam = ユーザー情報の取得に失敗しました + err_sleep = スリープコマンドの実行に失敗しました @@ -66,6 +67,7 @@ restart = 再起動 shell = シェル shutdown = シャットダウン sleep = スリープ + wayland = Wayland x11 = X11 xinitrc = xinitrc diff --git a/res/lang/lv.ini b/res/lang/lv.ini index 024b130..40992bc 100644 --- a/res/lang/lv.ini +++ b/res/lang/lv.ini @@ -42,6 +42,7 @@ err_perm_dir = neizdevās mainīt pašreizējo mapi err_perm_group = neizdevās pazemināt grupas atļaujas err_perm_user = neizdevās pazemināt lietotāja atļaujas err_pwnam = neizdevās iegūt lietotāja informāciju + err_sleep = neizdevās izpildīt miega komandu err_battery = neizdevās ielādēt akumulatora stāvokli err_switch_tty = neizdevās pārslēgt tty @@ -66,6 +67,7 @@ restart = restartēt shell = terminālis shutdown = izslēgt sleep = snauda + wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/pl.ini b/res/lang/pl.ini index f48d38f..791b968 100644 --- a/res/lang/pl.ini +++ b/res/lang/pl.ini @@ -42,6 +42,7 @@ err_perm_dir = nie udało się zmienić obecnego katalogu err_perm_group = nie udało się obniżyć uprawnień grupy err_perm_user = nie udało się obniżyć uprawnień użytkownika err_pwnam = nie udało się uzyskać informacji o użytkowniku + err_sleep = nie udało się wykonać polecenia sleep err_battery = nie udało się sprawdzić statusu baterii err_switch_tty = nie można przełączyć tty @@ -66,6 +67,7 @@ restart = uruchom ponownie shell = powłoka shutdown = wyłącz sleep = uśpij + wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/pt.ini b/res/lang/pt.ini index d47112c..25d3690 100644 --- a/res/lang/pt.ini +++ b/res/lang/pt.ini @@ -47,6 +47,7 @@ err_pwnam = erro ao obter informação do utilizador + err_user_gid = erro ao definir o GID do utilizador err_user_init = erro ao iniciar o utilizador err_user_uid = erro ao definir o UID do utilizador @@ -66,6 +67,7 @@ restart = reiniciar shell = shell shutdown = encerrar + wayland = wayland xinitrc = xinitrc diff --git a/res/lang/pt_BR.ini b/res/lang/pt_BR.ini index 94312fd..144e26f 100644 --- a/res/lang/pt_BR.ini +++ b/res/lang/pt_BR.ini @@ -47,6 +47,7 @@ err_pwnam = não foi possível obter informações do usuário + err_user_gid = não foi possível definir o GID do usuário err_user_init = não foi possível iniciar o usuário err_user_uid = não foi possível definir o UID do usuário @@ -66,6 +67,7 @@ restart = reiniciar shell = shell shutdown = desligar + wayland = wayland xinitrc = xinitrc diff --git a/res/lang/ro.ini b/res/lang/ro.ini index 78ffcc0..0dd5ab7 100644 --- a/res/lang/ro.ini +++ b/res/lang/ro.ini @@ -55,6 +55,7 @@ err_perm_user = nu s-a putut face downgrade permisiunilor de utilizator + login = utilizator logout = opreşte sesiunea @@ -66,6 +67,7 @@ restart = resetează shell = shell shutdown = opreşte sistemul + wayland = wayland xinitrc = xinitrc diff --git a/res/lang/ru.ini b/res/lang/ru.ini index 63d0824..46e7d98 100644 --- a/res/lang/ru.ini +++ b/res/lang/ru.ini @@ -42,6 +42,7 @@ err_perm_dir = не удалось изменить текущий катало err_perm_group = не удалось понизить права доступа группы err_perm_user = не удалось понизить права доступа пользователя err_pwnam = не удалось получить информацию о пользователе + err_sleep = не удалось выполнить команду sleep err_battery = не удалось получить статус батареи err_switch_tty = не удалось переключить tty @@ -66,6 +67,7 @@ restart = перезагрузить shell = оболочка shutdown = выключить sleep = сон + wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/sr.ini b/res/lang/sr.ini index 6f8be10..236803c 100644 --- a/res/lang/sr.ini +++ b/res/lang/sr.ini @@ -47,6 +47,7 @@ err_pwnam = neuspijesno skupljanje informacija o korisniku + err_user_gid = neuspijesno postavljanje korisničkog GID-a err_user_init = neuspijensa inicijalizacija korisnika err_user_uid = neuspijesno postavljanje UID-a korisnika @@ -66,6 +67,7 @@ restart = ponovo pokreni shell = shell shutdown = ugasi + wayland = wayland xinitrc = xinitrc diff --git a/res/lang/sv.ini b/res/lang/sv.ini index 030a66a..1b2efb6 100644 --- a/res/lang/sv.ini +++ b/res/lang/sv.ini @@ -47,6 +47,7 @@ err_pwnam = misslyckades att hämta användarinfo + err_user_gid = misslyckades att ställa in användar-GID err_user_init = misslyckades att initialisera användaren err_user_uid = misslyckades att ställa in användar-UID @@ -66,6 +67,7 @@ restart = starta om shell = skal shutdown = stäng av + wayland = wayland xinitrc = xinitrc diff --git a/res/lang/tr.ini b/res/lang/tr.ini index 0722574..07ef320 100644 --- a/res/lang/tr.ini +++ b/res/lang/tr.ini @@ -47,6 +47,7 @@ err_pwnam = kullanici bilgileri alinamadi + err_user_gid = kullanici icin GID ayarlanamadi err_user_init = kullanici oturumu baslatilamadi err_user_uid = kullanici icin UID ayarlanamadi @@ -66,6 +67,7 @@ restart = yeniden baslat shell = shell shutdown = makineyi kapat + wayland = wayland xinitrc = xinitrc diff --git a/res/lang/uk.ini b/res/lang/uk.ini index bbc6993..09320cd 100644 --- a/res/lang/uk.ini +++ b/res/lang/uk.ini @@ -47,6 +47,7 @@ err_pwnam = не вдалося отримати дані користувача + err_user_gid = не вдалося змінити GID користувача err_user_init = не вдалося ініціалізувати користувача err_user_uid = не вдалося змінити UID користувача @@ -66,6 +67,7 @@ restart = перезавантажити shell = оболонка shutdown = вимкнути + wayland = wayland xinitrc = xinitrc diff --git a/res/lang/zh_CN.ini b/res/lang/zh_CN.ini index 0c4e79e..9f2c0a8 100644 --- a/res/lang/zh_CN.ini +++ b/res/lang/zh_CN.ini @@ -47,6 +47,7 @@ err_pwnam = 获取用户信息失败 + err_user_gid = 设置用户GID失败 err_user_init = 初始化用户失败 err_user_uid = 设置用户UID失败 @@ -66,6 +67,7 @@ password = 密码 shell = shell + wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/src/config/Config.zig b/src/config/Config.zig index fc1a07f..5ddfe80 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -51,6 +51,8 @@ gameoflife_fg: u32 = 0x0000FF00, gameoflife_entropy_interval: usize = 10, gameoflife_frame_delay: usize = 6, gameoflife_initial_density: f32 = 0.4, +hibernate_cmd: ?[]const u8 = null, +hibernate_key: []const u8 = "F4", hide_borders: bool = false, hide_key_hints: bool = false, hide_keyboard_locks: bool = false, diff --git a/src/config/Lang.zig b/src/config/Lang.zig index 359feec..ba391b4 100644 --- a/src/config/Lang.zig +++ b/src/config/Lang.zig @@ -20,6 +20,7 @@ err_domain: []const u8 = "invalid domain", err_empty_password: []const u8 = "empty password not allowed", err_envlist: []const u8 = "failed to get envlist", err_get_active_tty: []const u8 = "failed to get active tty", +err_hibernate: []const u8 = "failed to execute hibernate command", err_hostname: []const u8 = "failed to get hostname", err_lock_state: []const u8 = "failed to get lock state", err_log: []const u8 = "failed to open log file", @@ -59,6 +60,7 @@ err_xauth: []const u8 = "xauth command failed", err_xcb_conn: []const u8 = "xcb connection failed", err_xsessions_dir: []const u8 = "failed to find sessions folder", err_xsessions_open: []const u8 = "failed to open sessions folder", +hibernate: []const u8 = "hibernate", insert: []const u8 = "insert", login: []const u8 = "login", logout: []const u8 = "logged out", diff --git a/src/main.zig b/src/main.zig index cc69921..28bbdca 100644 --- a/src/main.zig +++ b/src/main.zig @@ -540,6 +540,8 @@ pub fn main() !void { const restart_len = try TerminalBuffer.strWidth(lang.restart); const sleep_key = try std.fmt.parseInt(u8, config.sleep_key[1..], 10); const sleep_len = try TerminalBuffer.strWidth(lang.sleep); + const hibernate_key = try std.fmt.parseInt(u8, config.hibernate_key[1..], 10); + const hibernate_len = try TerminalBuffer.strWidth(lang.hibernate); const brightness_down_key = if (config.brightness_down_key) |key| try std.fmt.parseInt(u8, key[1..], 10) else null; const brightness_down_len = try TerminalBuffer.strWidth(lang.brightness_down); const brightness_up_key = if (config.brightness_up_key) |key| try std.fmt.parseInt(u8, key[1..], 10) else null; @@ -727,6 +729,15 @@ pub fn main() !void { length += sleep_len + 1; } + if (config.hibernate_cmd != null) { + buffer.drawLabel(config.hibernate_key, length, config.edge_margin); + length += config.hibernate_key.len + 1; + buffer.drawLabel(" ", length - 1, config.edge_margin); + + buffer.drawLabel(lang.hibernate, length, config.edge_margin); + length += hibernate_len + 1; + } + if (config.brightness_down_key) |key| { buffer.drawLabel(key, length, config.edge_margin); length += key.len + 1; @@ -857,6 +868,22 @@ pub fn main() !void { } } } + } else if (pressed_key == hibernate_key) { + if (config.hibernate_cmd) |hibernate_cmd| { + var hibernate = std.process.Child.init(&[_][]const u8{ "/bin/sh", "-c", hibernate_cmd }, allocator); + hibernate.stdout_behavior = .Ignore; + hibernate.stderr_behavior = .Ignore; + + handle_hibernate_cmd: { + const process_result = hibernate.spawnAndWait() catch { + break :handle_hibernate_cmd; + }; + if (process_result.Exited != 0) { + try info_line.addMessage(lang.err_hibernate, config.error_bg, config.error_fg); + try log_writer.print("failed to execute hibernate command: exit code {d}\n", .{process_result.Exited}); + } + } + } } else if (brightness_down_key != null and pressed_key == brightness_down_key.?) { adjustBrightness(allocator, config.brightness_down_cmd) catch |err| { try info_line.addMessage(lang.err_brightness_change, config.error_bg, config.error_fg);