diff --git a/shelly/README.md b/shelly/README.md index e7c3fabc..6da17036 100644 --- a/shelly/README.md +++ b/shelly/README.md @@ -4,36 +4,41 @@ Shelly is a plugin that uses the [Shelly Arch Package Manager](https://github.co ## Plugin -| Field | Value | -| ------- | --------------------------------------- | -| ID | `joshuaslate/shelly` | +| Field | Value | +| ------- | ---------------------------------------------- | +| ID | `joshuaslate/shelly` | | Entries | Service: `update_poller`; bar widget: `shelly` | ## Requirements -Install the Shelly Arch Package Manager from the [AUR](https://aur.archlinux.org/packages/shelly). The `shelly` +Install the Shelly Arch Package Manager (>= v3.0.0) from the [AUR](https://aur.archlinux.org/packages/shelly). The `shelly` command must be available on `PATH`. -Test that it works by running `shelly check-updates` in a terminal. If it returns a list of packages, then it is working correctly. +Verify the correct version is installed by running `shelly --version` in a terminal. It should return a version number >= 3.0.0. + +Test that it works by running `shelly list updates all` in a terminal. If it returns a list of packages, then it is working correctly. ## Usage Add the `shelly` widget from Noctalia's widget picker. It periodically checks for available Arch package updates and shows their count and names in the bar tooltip. Click behavior is configurable: open Shelly's graphical interface, -run `shelly upgrade-all` in a terminal, or do nothing. +run `shelly upgrade all` in a terminal, or do nothing. The `update_poller` service owns the periodic checks and can notify you when new updates become available. ## Settings -| Setting | Type | Default | Description | -| ---------------------- | -------- | ------------ | -------------------------------------------------------------------------------------------------- | -| `interval` | `int` | `300` | The interval (in seconds) between update checks | -| `notify` | `bool` | `false` | Whether or not you want to receive notifications when there are new package updates available | -| `color` | `color` | `on_surface` | The text color for the bar widget | -| `glyph_color` | `color` | `on_surface` | The color of the glyph on the bar widget | -| `glyph` | `glyph` | `package` | Bar widget icon. | -| `click_action` | `select` | `open_gui` | The action to perform when the bar widget is clicked. Options: `open_gui`, `open_updater`, `none`. | -| `hide_when_up_to_date` | `bool` | `false` | Whether or not to hide the bar widget when there are no package updates available | +| Setting | Type | Default | Description | +| ---------------------- | -------- | ----------------- | -------------------------------------------------------------------------------------------------------- | +| `interval` | `int` | `300` | The interval (in seconds) between update checks | +| `notify` | `bool` | `false` | Whether or not you want to receive notifications when there are new package updates available | +| `color` | `color` | `on_surface` | The text color for the bar widget | +| `bar_label` | `select` | `count_and_label` | The label to display in the bar widget when there are updates. Options: `count_only`, `count_and_label`. | +| `bar_font_size` | `int` | `14` | The size of the font displayed in the bar widget | +| `glyph_color` | `color` | `on_surface` | The color of the glyph on the bar widget | +| `glyph` | `glyph` | `package` | Bar widget icon | +| `glyph_size` | `int` | `14` | The size of the glyph in the bar widget | +| `click_action` | `select` | `open_gui` | The action to perform when the bar widget is clicked. Options: `open_gui`, `open_updater`, `none`. | +| `hide_when_up_to_date` | `bool` | `false` | Whether or not to hide the bar widget when there are no package updates available | diff --git a/shelly/plugin.toml b/shelly/plugin.toml index f0cf9e85..567cd989 100644 --- a/shelly/plugin.toml +++ b/shelly/plugin.toml @@ -1,7 +1,7 @@ id = "joshuaslate/shelly" name = "Shelly" icon = "package" -version = "1.0.1" +version = "2.0.0" plugin_api = 3 license = "MIT" author = "joshuaslate" @@ -47,6 +47,24 @@ entry = "widget.luau" description_key = "settings.color.description" default = "on_surface" + [[widget.setting]] + key = "bar_label" + type = "select" + label_key = "settings.bar_label.label" + description_key = "settings.bar_label.description" + default = "count_and_label" + options = [ + { value = "count_and_label", label_key = "settings.bar_label.options.count_and_label" }, + { value = "count_only", label_key = "settings.bar_label.options.count_only" } + ] + + [[widget.setting]] + key = "bar_font_size" + type = "int" + label_key = "settings.bar_font_size.label" + description_key = "settings.bar_font_size.description" + default = 14 + [[widget.setting]] key = "glyph" type = "glyph" @@ -61,6 +79,13 @@ entry = "widget.luau" description_key = "settings.glyph_color.description" default = "on_surface" + [[widget.setting]] + key = "glyph_size" + type = "int" + label_key = "settings.glyph_size.label" + description_key = "settings.glyph_size.description" + default = 14 + [[widget.setting]] key = "click_action" type = "select" diff --git a/shelly/poller.luau b/shelly/poller.luau index fdfd0894..b4f9486b 100644 --- a/shelly/poller.luau +++ b/shelly/poller.luau @@ -18,7 +18,7 @@ noctalia.setUpdateInterval(updateInterval) function refresh() isPolling = true - noctalia.runAsync("shelly check-updates --json", function(result) + noctalia.runAsync("shelly list-updates all --json", function(result) isPolling = false if result.exitCode ~= 0 then @@ -28,7 +28,14 @@ function refresh() return end - local decoded = noctalia.json.decode(result.stdout) + local stdout = result.stdout + + -- Shelly's JSON output may leak stderr into stdout. Remove stderr value to ensure valid JSON. + if result.stderr ~= "" then + stdout = stdout:gsub(result.stderr, "") + end + + local decoded = noctalia.json.decode(stdout) if type(decoded) ~= "table" then updateError = noctalia.tr("bar.tooltip.error.decode_json") noctalia.state.set("update_error", updateError) diff --git a/shelly/translations/en.json b/shelly/translations/en.json index ac9f5a6a..442d18e1 100644 --- a/shelly/translations/en.json +++ b/shelly/translations/en.json @@ -16,7 +16,7 @@ "tooltip": { "aur_title": "AUR", "error": { - "decode_json": "Failed to decode output from `shelly check-updates --json`" + "decode_json": "Failed to decode output from `shelly list-updates all --json`" }, "flatpak_title": "Flatpak", "no_updates": "System is up to date", @@ -30,6 +30,18 @@ } }, "settings": { + "bar_font_size": { + "description": "The font size of the bar text.", + "label": "Bar Font Size" + }, + "bar_label": { + "description": "Label to display in the bar.", + "label": "Bar Label", + "options": { + "count_only": "Count Only (e.g., 5)", + "count_and_label": "Count and Label (e.g., 5 Updates)" + } + }, "click_action": { "description": "What happens when you click on the bar.", "label": "Click Action", @@ -51,6 +63,10 @@ "description": "The color of the glyph.", "label": "Glyph Color" }, + "glyph_size": { + "description": "The size of the glyph.", + "label": "Glyph Size" + }, "hide_when_up_to_date": { "description": "Whether to hide the bar when there are no updates available.", "label": "Hide When Up-to-Date" diff --git a/shelly/widget.luau b/shelly/widget.luau index 2d793f7b..1542556d 100644 --- a/shelly/widget.luau +++ b/shelly/widget.luau @@ -2,10 +2,13 @@ local glyph = noctalia.getConfig("glyph") local color = noctalia.getConfig("color") or "on_surface" local glyphColor = noctalia.getConfig("glyph_color") or color +local glyphSize = noctalia.getConfig("glyph_size") or 14 local updateError = noctalia.state.get("update_error") local notifyOnNewUpdates = noctalia.getConfig("notify") local hideWhenUpToDate = noctalia.getConfig("hide_when_up_to_date") local click_action = noctalia.getConfig("click_action") or "open_gui" +local barLabelType = noctalia.getConfig("bar_label") or "count_and_label" +local barFontSize = noctalia.getConfig("bar_font_size") or 14 local updates = noctalia.state.get("updates") or { Packages = {}, Aur = {}, Flatpak = {} } local function countUpdates(scopedUpdates) @@ -71,8 +74,8 @@ local function render() local count = countUpdates(updates) barWidget.render(container({ gap = 6, align = "center", visible = not hideWhenUpToDate or count > 0 }, { - ui.glyph({ name = glyph, size = 14, color = glyphColor, visible = glyph ~= "" }), - ui.label({ text = noctalia.trp("bar.text.updates", count), color = color }), + ui.glyph({ name = glyph, size = glyphSize, color = glyphColor, visible = glyph ~= "" }), + ui.label({ text = barLabelType == "count_only" and string.format("%d", count) or noctalia.trp("bar.text.updates", count), color = color, fontSize = barFontSize }), })) updateTooltip(count) @@ -109,7 +112,7 @@ function onClick() return end - noctalia.runInTerminal(cmd .. " upgrade-all") + noctalia.runInTerminal(cmd .. " upgrade all") end end