From 339e39d4962d5bdc9c38a9334a9c50e7b4d2184f Mon Sep 17 00:00:00 2001 From: ebits Date: Thu, 9 Oct 2025 18:48:46 +0200 Subject: [PATCH] Adding the battery status for the top bar alongside brightness controls (closes #821) (#826) Reviewed-on: https://codeberg.org/fairyglade/ly/pulls/826 Reviewed-by: AnErrupTion Co-authored-by: ebits Co-committed-by: ebits --- res/config.ini | 4 ++++ res/lang/ar.ini | 1 + res/lang/cat.ini | 1 + res/lang/cs.ini | 1 + res/lang/de.ini | 1 + res/lang/en.ini | 1 + res/lang/es.ini | 1 + res/lang/fr.ini | 1 + res/lang/it.ini | 1 + res/lang/ja_JP.ini | 1 + res/lang/pl.ini | 1 + res/lang/pt.ini | 1 + res/lang/pt_BR.ini | 1 + res/lang/ro.ini | 1 + res/lang/ru.ini | 1 + res/lang/sr.ini | 1 + res/lang/sv.ini | 1 + res/lang/tr.ini | 1 + res/lang/uk.ini | 1 + res/lang/zh_CN.ini | 1 + src/config/Config.zig | 1 + src/config/Lang.zig | 1 + src/main.zig | 32 ++++++++++++++++++++++++++++++++ 23 files changed, 57 insertions(+) diff --git a/res/config.ini b/res/config.ini index d4d1e6c..5d2d03e 100644 --- a/res/config.ini +++ b/res/config.ini @@ -189,6 +189,10 @@ hide_version_string = false # Remove power management command hints hide_key_hints = false +# Set to null to disable battery status display +# Default is BAT0, the typical identifier for the primary battery +battery_id = null + # Initial text to show on the info line # If set to null, the info line defaults to the hostname initial_info_text = null diff --git a/res/lang/ar.ini b/res/lang/ar.ini index 6e1f3f5..78d9e93 100644 --- a/res/lang/ar.ini +++ b/res/lang/ar.ini @@ -43,6 +43,7 @@ err_perm_user = فشل في تخفيض صلاحيات المستخدم (User per err_pwnam = فشل في جلب معلومات المستخدم err_sleep = فشل في تنفيذ أمر sleep + err_tty_ctrl = فشل في نقل تحكم الطرفية (TTY) err_user_gid = فشل في تعيين معرّف المجموعة (GID) للمستخدم diff --git a/res/lang/cat.ini b/res/lang/cat.ini index c736153..fb829a6 100644 --- a/res/lang/cat.ini +++ b/res/lang/cat.ini @@ -45,6 +45,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 diff --git a/res/lang/cs.ini b/res/lang/cs.ini index d9b9ae8..c1206fe 100644 --- a/res/lang/cs.ini +++ b/res/lang/cs.ini @@ -45,6 +45,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 diff --git a/res/lang/de.ini b/res/lang/de.ini index 7d5e405..5512d5e 100644 --- a/res/lang/de.ini +++ b/res/lang/de.ini @@ -43,6 +43,7 @@ err_perm_user = Fehler beim Heruntersetzen der Nutzerberechtigungen err_pwnam = Abrufen der Benutzerinformationen fehlgeschlagen err_sleep = Sleep-Befehl fehlgeschlagen + err_tty_ctrl = Fehler bei der TTY-Uebergabe err_user_gid = Fehler beim Setzen der Gruppen-ID diff --git a/res/lang/en.ini b/res/lang/en.ini index dfe60f3..1a8c16c 100644 --- a/res/lang/en.ini +++ b/res/lang/en.ini @@ -42,6 +42,7 @@ 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 err_no_users = no users found diff --git a/res/lang/es.ini b/res/lang/es.ini index c249c20..776c998 100644 --- a/res/lang/es.ini +++ b/res/lang/es.ini @@ -45,6 +45,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 diff --git a/res/lang/fr.ini b/res/lang/fr.ini index 1a5faba..87b7a93 100644 --- a/res/lang/fr.ini +++ b/res/lang/fr.ini @@ -42,6 +42,7 @@ 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_switch_tty = échec du changement de terminal err_tty_ctrl = échec du transfert de contrôle du terminal err_no_users = aucun utilisateur trouvé diff --git a/res/lang/it.ini b/res/lang/it.ini index b366c4f..4ba807c 100644 --- a/res/lang/it.ini +++ b/res/lang/it.ini @@ -45,6 +45,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 diff --git a/res/lang/ja_JP.ini b/res/lang/ja_JP.ini index 9a9555e..200422a 100644 --- a/res/lang/ja_JP.ini +++ b/res/lang/ja_JP.ini @@ -43,6 +43,7 @@ err_perm_user = ユーザー権限のダウングレードに失敗しました err_pwnam = ユーザー情報の取得に失敗しました err_sleep = スリープコマンドの実行に失敗しました + err_tty_ctrl = TTY制御の転送に失敗しました err_user_gid = ユーザーGIDの設定に失敗しました diff --git a/res/lang/pl.ini b/res/lang/pl.ini index 7bf0a33..065fb22 100644 --- a/res/lang/pl.ini +++ b/res/lang/pl.ini @@ -43,6 +43,7 @@ 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_tty_ctrl = nie udało się przekazać kontroli tty err_user_gid = nie udało się ustawić GID użytkownika diff --git a/res/lang/pt.ini b/res/lang/pt.ini index f8c9bd7..a1951fd 100644 --- a/res/lang/pt.ini +++ b/res/lang/pt.ini @@ -45,6 +45,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 diff --git a/res/lang/pt_BR.ini b/res/lang/pt_BR.ini index 0c64ca4..f886816 100644 --- a/res/lang/pt_BR.ini +++ b/res/lang/pt_BR.ini @@ -45,6 +45,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 diff --git a/res/lang/ro.ini b/res/lang/ro.ini index a90c54d..8503245 100644 --- a/res/lang/ro.ini +++ b/res/lang/ro.ini @@ -53,6 +53,7 @@ err_perm_user = nu s-a putut face downgrade permisiunilor de utilizator + login = utilizator logout = opreşte sesiunea diff --git a/res/lang/ru.ini b/res/lang/ru.ini index 95116f1..dab497c 100644 --- a/res/lang/ru.ini +++ b/res/lang/ru.ini @@ -42,6 +42,7 @@ err_perm_group = не удалось понизить права доступа err_perm_user = не удалось понизить права доступа пользователя err_pwnam = не удалось получить информацию о пользователе err_sleep = не удалось выполнить команду sleep + err_switch_tty = не удалось переключить tty err_tty_ctrl = передача управления tty не удалась err_no_users = пользователи не найдены diff --git a/res/lang/sr.ini b/res/lang/sr.ini index c99bf9e..1e3c6f7 100644 --- a/res/lang/sr.ini +++ b/res/lang/sr.ini @@ -45,6 +45,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 diff --git a/res/lang/sv.ini b/res/lang/sv.ini index 81233fe..3fc2bfd 100644 --- a/res/lang/sv.ini +++ b/res/lang/sv.ini @@ -45,6 +45,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 diff --git a/res/lang/tr.ini b/res/lang/tr.ini index 6759701..78de8c3 100644 --- a/res/lang/tr.ini +++ b/res/lang/tr.ini @@ -45,6 +45,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 diff --git a/res/lang/uk.ini b/res/lang/uk.ini index af96e1f..de41076 100644 --- a/res/lang/uk.ini +++ b/res/lang/uk.ini @@ -45,6 +45,7 @@ err_pwnam = не вдалося отримати дані користувача + err_user_gid = не вдалося змінити GID користувача err_user_init = не вдалося ініціалізувати користувача err_user_uid = не вдалося змінити UID користувача diff --git a/res/lang/zh_CN.ini b/res/lang/zh_CN.ini index 2d70f3f..5e77f8e 100644 --- a/res/lang/zh_CN.ini +++ b/res/lang/zh_CN.ini @@ -45,6 +45,7 @@ err_pwnam = 获取用户信息失败 + err_user_gid = 设置用户GID失败 err_user_init = 初始化用户失败 err_user_uid = 设置用户UID失败 diff --git a/src/config/Config.zig b/src/config/Config.zig index 296a9c7..4dfab4d 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -49,6 +49,7 @@ gameoflife_initial_density: f32 = 0.4, hide_borders: bool = false, hide_version_string: bool = false, hide_key_hints: bool = false, +battery_id: ?[]const u8 = "BAT0", initial_info_text: ?[]const u8 = null, input_len: u8 = 34, lang: []const u8 = "en", diff --git a/src/config/Lang.zig b/src/config/Lang.zig index 0e9b840..886644d 100644 --- a/src/config/Lang.zig +++ b/src/config/Lang.zig @@ -47,6 +47,7 @@ err_perm_group: []const u8 = "failed to downgrade group permissions", err_perm_user: []const u8 = "failed to downgrade user permissions", err_pwnam: []const u8 = "failed to get user info", err_sleep: []const u8 = "failed to execute sleep command", +err_battery: []const u8 = "failed to load battery status", err_switch_tty: []const u8 = "failed to switch tty", err_tty_ctrl: []const u8 = "tty control transfer failed", err_no_users: []const u8 = "no users found", diff --git a/src/main.zig b/src/main.zig index fff3857..3b71540 100644 --- a/src/main.zig +++ b/src/main.zig @@ -572,6 +572,22 @@ pub fn main() !void { length += ly_top_str.len + 1; } + var battery_bar_shown = false; + if (config.battery_id) |id| draw_battery: { + const battery_percentage = getBatteryPercentage(id) catch |err| { + try log_writer.print("failed to get battery percentage: {s}\n", .{@errorName(err)}); + try info_line.addMessage(lang.err_battery, config.error_bg, config.error_fg); + break :draw_battery; + }; + + var battery_buf: [16:0]u8 = undefined; + const battery_str = std.fmt.bufPrintZ(&battery_buf, "BAT: {d}%", .{battery_percentage}) catch break :draw_battery; + + const battery_y: usize = 1; + buffer.drawLabel(battery_str, 0, battery_y); + battery_bar_shown = true; + } + if (config.bigclock != .none and buffer.box_height + (bigclock.HEIGHT + 2) * 2 < buffer.height) { var format_buf: [16:0]u8 = undefined; var clock_buf: [32:0]u8 = undefined; @@ -1162,6 +1178,22 @@ fn adjustBrightness(allocator: std.mem.Allocator, cmd: []const u8) !void { } } +fn getBatteryPercentage(battery_id: []const u8) !u8 { + const path = try std.fmt.allocPrint(temporary_allocator, "/sys/class/power_supply/{s}/capacity", .{battery_id}); + defer temporary_allocator.free(path); + + const battery_file = try std.fs.cwd().openFile(path, .{}); + defer battery_file.close(); + + var buffer: [8]u8 = undefined; + const bytes_read = try battery_file.read(&buffer); + const capacity_str = buffer[0..bytes_read]; + + const trimmed = std.mem.trimRight(u8, capacity_str, "\n\r"); + + return try std.fmt.parseInt(u8, trimmed, 10); +} + fn getAuthErrorMsg(err: anyerror, lang: Lang) []const u8 { return switch (err) { error.GetPasswordNameFailed => lang.err_pwnam,