From 6db8390fd5510208b61267979b024cef74367f74 Mon Sep 17 00:00:00 2001 From: Yocraft-2000 <304616174+Yocraft-2000@users.noreply.github.com> Date: Sat, 1 Aug 2026 05:15:04 +0200 Subject: [PATCH] Add Battery widget plugin (#178) * Init * fix: remove placeholder (weird bugs) * fix: README * fix: return if battery not found * fix: add "Not Charging" status * fix: insert in content table * feat: add error color when under 20% and discharging * feat: add warning color setting * fix(README): longer plugin description and settings descriptions * feat: add color and charging color * fix: default charging color --- battery-widget/README.md | 34 ++++++++ battery-widget/plugin.toml | 109 +++++++++++++++++++++++++ battery-widget/thumbnail.webp | Bin 0 -> 46442 bytes battery-widget/translations/en.json | 53 +++++++++++++ battery-widget/widget.luau | 119 ++++++++++++++++++++++++++++ 5 files changed, 315 insertions(+) create mode 100644 battery-widget/README.md create mode 100644 battery-widget/plugin.toml create mode 100644 battery-widget/thumbnail.webp create mode 100644 battery-widget/translations/en.json create mode 100644 battery-widget/widget.luau diff --git a/battery-widget/README.md b/battery-widget/README.md new file mode 100644 index 0000000..6212b91 --- /dev/null +++ b/battery-widget/README.md @@ -0,0 +1,34 @@ +# Battery Widget + +Desktop/lockscreen widget that displays the current battery level and charging status. + +## Plugin + +| Field | Value | +| --- | --- | +| ID | `yocraft/battery-widget` | +| Entries | Desktop widget: `widget` | + +## Usage + +Add it to your desktop/lockscreen widgets. + +## Settings + +| Setting | Type | Default | Description | +| --- | --- | --- | --- | +| `layout` | `select` | `horizontal` | Layout of the widget. | +| `show_glyph` | `bool` | `true` | Show the battery icon. | +| `show_label` | `bool` | `true` | Show text next to the icon. | +| `hide_plugged` | `bool` | `false` | Hide the battery widget when connected to AC power. | +| `hide_full` | `bool` | `false` | Hide the battery widget when fully charged. | +| `color` | `color` | `on_surface` | Color role for this widget's icon and label; fixed hex colors are also supported. | +| `warning_color` | `color` | `error` | Color applied when charge is at or below 20%. | +| `charging_color` | `color` | `on_surface` | Color applied when connected to AC power. | +| `battery` | `select` | `auto` | Detect the battery automatically or set a custom name. | +| `battery_name` | `string` | `BAT0` | Set a custom name for the battery. | +| `refresh_interval` | `int` | `60` | Controls how frequently the widget updates its content. (in seconds) | + +## Notes + +`hide_full` and `hide_plugged` do not hide the background due to plugin limitations. diff --git a/battery-widget/plugin.toml b/battery-widget/plugin.toml new file mode 100644 index 0000000..2cd49e0 --- /dev/null +++ b/battery-widget/plugin.toml @@ -0,0 +1,109 @@ +id = "yocraft/battery-widget" +name = "Battery Widget" +version = "1.0.0" +plugin_api = 19 +author = "yocraft" +license = "MIT" +deprecated = false +icon = "battery" +description = "Desktop/Lockscreen widget to show battery." +tags = [ "desktop", "hardware", "system", "utility" ] +dependencies = [] + +[[desktop_widget]] +id = "widget" +entry = "widget.luau" + +[[setting]] +key = "layout" +type = "select" +label_key = "settings.layout.label" +description_key = "settings.layout.description" +default = "horizontal" +options = [ + { value = "horizontal", label_key = "settings.layout.horizontal" }, + { value = "vertical", label_key = "settings.layout.vertical" }, +] + +[[setting]] +key = "show_glyph" +type = "bool" +label_key = "settings.show_glyph.label" +description_key = "settings.show_glyph.description" +default = true + +[[setting]] +key = "show_label" +type = "bool" +label_key = "settings.show_label.label" +description_key = "settings.show_label.description" +default = true + +[[setting]] +key = "hide_plugged" +type = "bool" +label_key = "settings.hide_plugged.label" +description_key = "settings.hide_plugged.description" +default = false + +[[setting]] +key = "hide_full" +type = "bool" +label_key = "settings.hide_full.label" +description_key = "settings.hide_full.description" +default = false + + +[[setting]] +key = "color" +type = "color" +label_key = "settings.color.label" +description_key = "settings.color.description" +default = "on_surface" +advanced = true + +[[setting]] +key = "warning_color" +type = "color" +label_key = "settings.warning_color.label" +description_key = "settings.warning_color.description" +default = "error" +advanced = true + +[[setting]] +key = "charging_color" +type = "color" +label_key = "settings.charging_color.label" +description_key = "settings.charging_color.description" +default = "on_surface" +advanced = true + + +[[setting]] +key = "battery" +type = "select" +label_key = "settings.battery.label" +description_key = "settings.battery.description" +default = "auto" +options = [ + { value = "auto", label_key = "settings.battery.auto" }, + { value = "bat0", label_key = "settings.battery.bat0" }, + { value = "custom", label_key = "settings.battery.custom" }, +] + +[[setting]] +key = "battery_name" +type = "string" +label_key = "settings.battery_name.label" +description_key = "settings.battery_name.description" +default = "BAT0" +visible_when = { key = "battery", values = ["custom"] } + +[[setting]] +key = "refresh_interval" +type = "int" +label_key = "settings.refresh_interval.label" +description_key = "settings.refresh_interval.description" +default = 60 +min = 1 +max = 600 diff --git a/battery-widget/thumbnail.webp b/battery-widget/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..5a409fc770e35d4355e5167ab9fa1a672ff41ec4 GIT binary patch literal 46442 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 literal 0 HcmV?d00001 diff --git a/battery-widget/translations/en.json b/battery-widget/translations/en.json new file mode 100644 index 0000000..8ac815e --- /dev/null +++ b/battery-widget/translations/en.json @@ -0,0 +1,53 @@ +{ + "settings": { + "layout": { + "label": "Layout", + "description": "Widget layout.", + "horizontal": "Horizontal", + "vertical": "Vertical" + }, + "show_label": { + "label": "Show Label", + "description": "Show text next to the icon." + }, + "show_glyph": { + "label": "Show Glyph", + "description": "Show the battery icon." + }, + "hide_plugged": { + "label": "Hide When Plugged In", + "description": "Hide the battery widget when connected to AC power." + }, + "hide_full": { + "label": "Hide When Full", + "description": "Hide the battery widget when fully charged." + }, + "color": { + "label": "Color", + "description": "Color role for this widget's icon and label; fixed hex colors are also supported." + }, + "warning_color": { + "label": "Warning Color", + "description": "Color applied when charge is at or below 20%." + }, + "charging_color": { + "label": "Charging Color", + "description": "Color applied when connected to AC power." + }, + "battery": { + "label": "Battery", + "description": "Detect the battery automatically or set a custom name.", + "auto": "Auto", + "bat0": "BAT0", + "custom": "Custom" + }, + "battery_name": { + "label": "Battery Name", + "description": "Name of the battery." + }, + "refresh_interval": { + "label": "Refresh Interval", + "description": "Controls how frequently the widget updates its content. (in seconds)" + } + } +} diff --git a/battery-widget/widget.luau b/battery-widget/widget.luau new file mode 100644 index 0000000..76a0560 --- /dev/null +++ b/battery-widget/widget.luau @@ -0,0 +1,119 @@ +noctalia.setUpdateInterval(noctalia.getConfig("refresh_interval") * 1000) + +local glyph +local color +local percent +local status + +local path = "/sys/class/power_supply/" +local batName + +local function getBatName() + local config = noctalia.getConfig("battery") + + if config == "bat0" then + return "BAT0" + elseif config == "custom" then + return noctalia.getConfig("battery_name") + end + + local folders = noctalia.listDir(path) + + if folders then + for _, name in ipairs(folders) do + if name:match("^BAT") then + return name + end + end + end + return nil +end + +local function getGlyph() + if status == "Charging" then + glyph = "battery-charging" + elseif status == "Full" or status == "Not Charging" then + glyph = "battery-plugged" + elseif status == "Unknown" then + glyph = "battery-exclamation" + else + glyph = percent >= 85 and "battery-4" + or percent >= 55 and "battery-3" + or percent >= 30 and "battery-2" + or percent >= 10 and "battery-1" + or "battery-0" + end +end + +local function getColor() + if status ~= "Charging" and percent <= 20 then + color = noctalia.getConfig("warning_color") + return + end + if status == "Charging" or status == "Full" or status == "Not Charging" then + color = noctalia.getConfig("charging_color") + return + end + color = noctalia.getConfig("color") +end + +local function render() + if (noctalia.getConfig("hide_plugged") and (status == "Charging" or status == "Not Charging")) + or (noctalia.getConfig("hide_full") and status == "Full") then + desktopWidget.render(ui.row()) + return + end + + local content = {} + if noctalia.getConfig("show_glyph") then + table.insert(content, ui.glyph({ name = glyph, color = color })) + end + if noctalia.getConfig("show_label") then + table.insert(content, ui.label({ text = percent .. "%", color = color })) + end + + local layout = noctalia.getConfig("layout") == "vertical" and ui.column or ui.row + + desktopWidget.render(layout({ gap = 4, align = "center" }, content)) +end + +local function refreshBattery() + noctalia.runAsync( + "cat " + .. path .. batName .. "/capacity " + .. path .. batName .. "/status", + function(result) + if result.exitCode ~= 0 then + noctalia.log("battery-widget: failed to read battery: " .. result.stderr) + return + end + + local lines = {} + for line in result.stdout:gmatch("[^\r\n]+") do + table.insert(lines, line) + end + + if not lines[1] or not lines[2] then + noctalia.log("battery-widget: invalid battery output") + return + end + + percent = tonumber(noctalia.string.trim(lines[1])) + status = noctalia.string.trim(lines[2]) + + getGlyph() + getColor() + render() + end + ) +end + +batName = getBatName() +if not batName then + noctalia.log("battery-widget: battery not found") + return +end + +function update() + refreshBattery() +end