From 5dc0808725199d704a4537cab476a5a78ea09403 Mon Sep 17 00:00:00 2001 From: ImJustDoingMyPart <132678351+ImJustDoingMyPart@users.noreply.github.com> Date: Mon, 3 Aug 2026 00:09:10 -0300 Subject: [PATCH] Add niri-animations plugin (#223) Animation preset picker for niri: choose a .kdl preset, set the global slowdown factor, or turn animations off. Ships a floating and a bar-attached panel plus a control-center tile. Co-authored-by: Claude Opus 5 --- niri-animations/README.md | 105 ++++++++++++++ niri-animations/panel.luau | 203 +++++++++++++++++++++++++++ niri-animations/plugin.toml | 75 ++++++++++ niri-animations/shortcut.luau | 36 +++++ niri-animations/thumbnail.webp | Bin 0 -> 48072 bytes niri-animations/translations/en.json | 34 +++++ niri-animations/translations/es.json | 34 +++++ 7 files changed, 487 insertions(+) create mode 100644 niri-animations/README.md create mode 100644 niri-animations/panel.luau create mode 100644 niri-animations/plugin.toml create mode 100644 niri-animations/shortcut.luau create mode 100644 niri-animations/thumbnail.webp create mode 100644 niri-animations/translations/en.json create mode 100644 niri-animations/translations/es.json diff --git a/niri-animations/README.md b/niri-animations/README.md new file mode 100644 index 0000000..003b210 --- /dev/null +++ b/niri-animations/README.md @@ -0,0 +1,105 @@ +# Niri Animations + +Pick a [niri](https://github.com/YaLTeR/niri) animation preset, tune the global animation +speed, or switch animations off — from a Noctalia panel, instead of editing config by hand +and reloading the compositor yourself. + +## Plugin + +| Field | Value | +| --- | --- | +| ID | `imjustdoingmypart/niri-animations` | +| Entries | Panels: `picker` (floating), `docked` (attached to the bar); shortcut: `toggle` | + +## Requirements + +- The `niri` command on `PATH` — used to reload the compositor config after a change. +- A niri config that `include`s the plugin's target file **after** your base animations. + The plugin owns that file; point it at one dedicated to this, not at your `config.kdl`: + + ```kdl + include "./cfg/animation.kdl" // your base / fallback animations + // ... + include "./animations.kdl" // managed by this plugin, included last + ``` + +- A folder of `.kdl` animation presets. Any file niri can `include` works; collections such + as [nirimation](https://github.com/XansiVA/nirimation) drop straight in. + +## Usage + +Open the picker floating, or attached to the bar: + +```sh +noctalia msg panel-toggle imjustdoingmypart/niri-animations:picker # floating, centered +noctalia msg panel-toggle imjustdoingmypart/niri-animations:docked # attached to the bar +``` + +Bind one of those to a key in your compositor. The **Animations** tile, added from +Settings → Control Center → Shortcuts, opens the attached variant and stays highlighted +while animations are enabled. + +Both panel ids run the same script. They exist as separate entries because `placement` and +`position` are host-owned — the host reads them from the manifest at load time, so a plugin +cannot change its own placement at runtime and there is no user-facing key to override a +plugin panel's placement. Shipping both variants is the only way to offer the choice. + +In the panel: + +- **Preset** — a dropdown of every `.kdl` in the presets directory, plus *No preset (base + pack)*, which drops the `include` and falls back to your base animations. +- **Animations toggle** — writes `animations { off }`. +- **Speed** — the global `slowdown` factor, 0.25×–3.00×. Above 1 is slower. +- **Random** — picks a random preset. + +Every change is written and applied immediately; there is no Apply button. + +Presets are listed by **filename**, deliberately. Preset headers carry a `Desc:` field, but +it is free-form text written by each preset author — often just "imported from https://…" — +and it gets worse with presets a user imported themselves. Surfacing it makes the plugin +look broken when the problem is somebody else's metadata. + +## Settings + +| Setting | Type | Default | Description | +| --- | --- | --- | --- | +| `presets_dir` | `string` | `~/.config/niri/animations` | Folder scanned for `.kdl` presets. Non-`.kdl` files are ignored. | +| `target_file` | `string` | `~/.config/niri/animations.kdl` | File rewritten with the selection. **Rewritten whole** — treat it as owned by the plugin. | +| `include_prefix` | `string` | `./animations` | Path prefix written in the `include` line, relative to `target_file`. | +| `reload_command` | `string` | `niri msg action load-config-file` | Run after each write so the compositor picks up the change. | + +## Notes + +**What the plugin writes.** `target_file` gets an `include` line for the chosen preset and an +`animations` block carrying the speed: + +```kdl +include "./animations/prism_fold.kdl" + +animations { + slowdown 1.50 +} +``` + +`off` and `slowdown` are direct fields of `animations`, not subsections, which is why the +speed applies on top of a preset that sets its own `slowdown`. niri's includes are positional +and merge field by field, so a target file included last wins over the base animations. +See [Configuration: Animations](https://github.com/YaLTeR/niri/wiki/Configuration:-Animations) +and [Configuration: Include](https://github.com/YaLTeR/niri/wiki/Configuration:-Include). + +**Side effects.** + +| | | +| --- | --- | +| Network | None. | +| Files read | `presets_dir` (directory listing) and `target_file` (to restore panel state on open). | +| Files written | `target_file` only. Nothing else on disk is modified. | +| Processes spawned | `reload_command` after each write, and `noctalia msg panel-toggle …` when the control-center tile is clicked. | + +**Other compositors.** The logic is compositor-agnostic — it writes an `include` line and runs +a reload command — but the generated `animations { }` block is niri syntax, so only niri is +supported today. + +## License + +MIT diff --git a/niri-animations/panel.luau b/niri-animations/panel.luau new file mode 100644 index 0000000..275c6b7 --- /dev/null +++ b/niri-animations/panel.luau @@ -0,0 +1,203 @@ +--!nonstrict +-- Animation preset picker for niri. +-- +-- Rewrites the target file (default ~/.config/niri/animations.kdl) with two things: an +-- `include` for the chosen preset and an `animations` block carrying the global speed. +-- Then it asks niri to reload its config. +-- +-- Why rewriting it whole is safe: that file exists only for this. Your niri config.kdl is +-- expected to include it LAST, after the base animations — niri's includes are positional +-- and merge field by field, so whatever lands here wins. +-- +-- `off` and `slowdown` are direct fields of `animations`, not subsections, which is why the +-- speed override applies on top of a preset that sets its own slowdown: +-- https://github.com/YaLTeR/niri/wiki/Configuration:-Animations +-- +-- Presets are listed by FILENAME on purpose. Their headers carry a `Desc:` field, but it is +-- free-form text written by each preset author (often just "imported from https://…"), and +-- it gets worse with presets the user imported themselves. Surfacing it makes the plugin +-- look broken when the problem is somebody else's metadata. A filename always matches what +-- the user sees in the folder. + +local PLUGIN_ID = "imjustdoingmypart/niri-animations" + +local function cfg(key: string, fallback: string): string + local v = noctalia.getConfig(key) + if v == nil or v == "" then return fallback end + return v +end + +local PRESETS_DIR = cfg("presets_dir", "~/.config/niri/animations") +local TARGET = cfg("target_file", "~/.config/niri/animations.kdl") +local PREFIX = cfg("include_prefix", "./animations") +local RELOAD = cfg("reload_command", "niri msg action load-config-file") + +local presets: { any } = {} -- { { file = "bloom.kdl", name = "bloom" } } +local activeFile: string? = nil +local slowdown = 1.0 +local animationsOff = false +local status = "" + +local function loadPresets() + presets = {} + local entries, err = noctalia.listDir(PRESETS_DIR) + if entries == nil then + status = `{noctalia.tr("status_read_error")} {PRESETS_DIR}: {err or "?"}` + return + end + table.sort(entries) + for _, name in ipairs(entries) do + if string.sub(name, -4) == ".kdl" then + table.insert(presets, { file = name, name = string.sub(name, 1, #name - 4) }) + end + end +end + +-- Re-read state from the target file so the panel always opens reflecting reality, even if +-- the file was edited by hand or changed from somewhere else. +local function loadCurrent() + activeFile = nil + slowdown = 1.0 + animationsOff = false + + local text = noctalia.readFile(TARGET) + if text == nil then return end + + activeFile = string.match(text, 'include%s+"[^"]*[/\\]([^"/\\]+%.kdl)"') + or string.match(text, 'include%s+"([^"/\\]+%.kdl)"') + + slowdown = tonumber(string.match(text, "slowdown%s+([%d%.]+)") or "") or 1.0 + animationsOff = string.match(text, "\n%s*off%s*[\n\r]") ~= nil +end + +local function apply() + local out = { + `// Generated by the Noctalia plugin "{PLUGIN_ID}". Do not edit by hand: this file is`, + "// rewritten whole whenever a preset is picked or the speed changes.", + "// Your base/fallback animations belong in a file included BEFORE this one.", + "", + } + + if activeFile ~= nil and not animationsOff then + table.insert(out, `include "{PREFIX}/{activeFile}"`) + table.insert(out, "") + end + + table.insert(out, "animations {") + if animationsOff then + table.insert(out, " off") + else + table.insert(out, ` slowdown {string.format("%.2f", slowdown)}`) + end + table.insert(out, "}") + table.insert(out, "") + + local _, err = noctalia.writeFile(TARGET, table.concat(out, "\n")) + if err ~= nil then + status = `{noctalia.tr("status_write_error")} {TARGET}: {err}` + noctalia.notify(noctalia.tr("title"), status) + return + end + + noctalia.runAsync(RELOAD) + + local speed = `{string.format("%.2f", slowdown)}×` + if animationsOff then + status = noctalia.tr("status_off") + elseif activeFile == nil then + status = `{noctalia.tr("status_base_pack")} — {speed}` + else + status = `{string.sub(activeFile, 1, #activeFile - 4)} — {speed}` + end +end + +-- Index 0 of the dropdown is "no preset"; real presets start at 1. +local function options(): { string } + local opts = { noctalia.tr("no_preset") } + for _, p in ipairs(presets) do + table.insert(opts, p.name) + end + return opts +end + +local function selectedIndex(): number + if activeFile == nil then return 0 end + for i, p in ipairs(presets) do + if p.file == activeFile then return i end + end + return 0 +end + +local function render() + panel.render(ui.column({ flexGrow = 1, gap = 16, align = "stretch" }, { + -- No close button on purpose: on a keyboard-driven WM the panel is dismissed with Esc + -- or by pressing the shortcut again, so the button is dead weight. + ui.label({ text = noctalia.tr("title"), fontSize = 16, fontWeight = "bold", color = "on_surface" }), + + ui.row({ gap = 12, align = "center" }, { + ui.toggle({ checked = not animationsOff, onChange = "onToggleAnimations" }), + ui.label({ + text = animationsOff and noctalia.tr("animations_off") or noctalia.tr("animations_on"), + flexGrow = 1, + }), + ui.button({ text = noctalia.tr("random"), onClick = "onRandom" }), + }), + + ui.column({ gap = 6, align = "stretch" }, { + ui.label({ text = noctalia.tr("preset"), color = "on_surface_variant" }), + ui.select({ options = options(), selectedIndex = selectedIndex(), onChange = "onPreset" }), + }), + + ui.column({ gap = 6, align = "stretch" }, { + ui.label({ + text = `{noctalia.tr("speed")} — {string.format("%.2f", slowdown)}× ({noctalia.tr("speed_hint")})`, + color = "on_surface_variant", + }), + ui.slider({ min = 0.25, max = 3.0, step = 0.05, value = slowdown, onChange = "onSlowdown" }), + }), + + ui.label({ text = status, color = "primary" }), + })) +end + +function onOpen(_context) + loadPresets() + loadCurrent() + if status == "" then + status = `{#presets} {noctalia.tr("status_presets_found")} {PRESETS_DIR}` + end + render() +end + +function onPreset(index, _text) + local i = tonumber(index) or 0 + if i <= 0 then + activeFile = nil + else + local p = presets[i] + activeFile = p and p.file or nil + end + animationsOff = false + apply() + render() +end + +function onToggleAnimations(value) + animationsOff = not (value == "true") + apply() + render() +end + +function onSlowdown(value) + slowdown = tonumber(value) or 1.0 + apply() + render() +end + +function onRandom() + if #presets == 0 then return end + activeFile = presets[math.random(1, #presets)].file + animationsOff = false + apply() + render() +end diff --git a/niri-animations/plugin.toml b/niri-animations/plugin.toml new file mode 100644 index 0000000..8df5b34 --- /dev/null +++ b/niri-animations/plugin.toml @@ -0,0 +1,75 @@ +# Animation preset picker for niri, with a global speed control. +# +# Writes one file (an `include` line plus an `animations` block) and reloads niri's config. +# It never touches config.kdl — that file is expected to include the target file last. + +id = "imjustdoingmypart/niri-animations" +name = "Niri Animations" +version = "0.2.0" +plugin_api = 9 +author = "ImJustDoingMyPart" +license = "MIT" +dependencies = ["niri"] +tags = ["niri", "animation", "panel", "shortcut"] +icon = "movie" +description = "Pick a niri animation preset, tune global speed, or turn animations off." + +# Root-level settings: these seed EVERY entry (panels and shortcut alike). They live here +# rather than under [[panel.setting]] because [[shortcut]] entries do not receive entry-level +# settings, and the tile needs target_file to know whether animations are currently on. + +[[setting]] +key = "presets_dir" +type = "string" +label_key = "settings.presets_dir.label" +description_key = "settings.presets_dir.description" +default = "~/.config/niri/animations" + +[[setting]] +key = "target_file" +type = "string" +label_key = "settings.target_file.label" +description_key = "settings.target_file.description" +default = "~/.config/niri/animations.kdl" + +[[setting]] +key = "include_prefix" +type = "string" +label_key = "settings.include_prefix.label" +description_key = "settings.include_prefix.description" +default = "./animations" + +[[setting]] +key = "reload_command" +type = "string" +label_key = "settings.reload_command.label" +description_key = "settings.reload_command.description" +default = "niri msg action load-config-file" + +# Two entries, same script, different anchoring. placement/position are host-owned: the host +# reads them from this manifest at load time, so a plugin cannot change its own placement at +# runtime and there is no user-facing key to override a plugin panel's placement. Shipping +# both variants is the only way to offer the choice. +# +# noctalia msg panel-toggle imjustdoingmypart/niri-animations:picker (floating, centered) +# noctalia msg panel-toggle imjustdoingmypart/niri-animations:docked (attached to the bar) + +[[panel]] +id = "picker" +entry = "panel.luau" +width = 420 +height = 300 +placement = "floating" +position = "center" + +[[panel]] +id = "docked" +entry = "panel.luau" +width = 420 +height = 300 +placement = "attached" + +# Control-center tile; opens the attached variant. +[[shortcut]] +id = "toggle" +entry = "shortcut.luau" diff --git a/niri-animations/shortcut.luau b/niri-animations/shortcut.luau new file mode 100644 index 0000000..a792086 --- /dev/null +++ b/niri-animations/shortcut.luau @@ -0,0 +1,36 @@ +--!nonstrict +-- Control-center tile: opens the picker panel, and lights up while animations are enabled. +-- +-- shortcut.setLabel(text) +-- shortcut.setIcon(on [, off]) +-- shortcut.setActive(bool) +-- shortcut.setEnabled(bool) + +-- target_file is declared as a root-level [[setting]], which seeds every entry. Shortcuts do +-- NOT receive entry-level ([[panel.setting]]) values, so keeping the fallback here is what +-- makes this file survive someone moving that setting back under an entry. +local TARGET = noctalia.getConfig("target_file") or "~/.config/niri/animations.kdl" + +local function animationsOn(): boolean + local text = noctalia.readFile(TARGET) + if text == nil then return true end + return string.match(text, "\n%s*off%s*[\n\r]") == nil +end + +local function render() + local on = animationsOn() + shortcut.setLabel(noctalia.tr("shortcut_label")) + shortcut.setIcon("movie") + shortcut.setActive(on) + shortcut.setEnabled(true) +end + +render() + +-- The tile opens the ATTACHED variant: it is pressed from the control center, which already +-- sits against the bar, so a panel floating in the middle of the screen would feel detached. +-- Bind the `picker` entry to a key for the floating one. +function onClick() + noctalia.runAsync("noctalia msg panel-toggle imjustdoingmypart/niri-animations:docked") + render() +end diff --git a/niri-animations/thumbnail.webp b/niri-animations/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..5923ce119709a1a5fb3d26d9c981bc39ac1de7fa GIT binary patch literal 48072 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 t(H|U{aGzJX1~dbi&3^OG!lIL;=R4_ JLIwr~1^|)3pDX|X literal 0 HcmV?d00001 diff --git a/niri-animations/translations/en.json b/niri-animations/translations/en.json new file mode 100644 index 0000000..868e042 --- /dev/null +++ b/niri-animations/translations/en.json @@ -0,0 +1,34 @@ +{ + "title": "Niri Animations", + "preset": "Preset", + "no_preset": "No preset (base pack)", + "animations_on": "Animations on", + "animations_off": "Animations off", + "random": "Random", + "speed": "Speed", + "speed_hint": "above 1 is slower", + "shortcut_label": "Animations", + "status_presets_found": "presets in", + "status_base_pack": "Base pack", + "status_off": "Animations disabled.", + "status_read_error": "Could not read", + "status_write_error": "Could not write", + "settings": { + "presets_dir": { + "label": "Presets directory", + "description": "Folder scanned for .kdl animation presets" + }, + "target_file": { + "label": "Target file", + "description": "File rewritten with the chosen preset and speed. Your niri config must include it after the base animations." + }, + "include_prefix": { + "label": "Include prefix", + "description": "Path prefix written in the include line, relative to the target file" + }, + "reload_command": { + "label": "Reload command", + "description": "Run after writing, so the compositor picks up the change" + } + } +} diff --git a/niri-animations/translations/es.json b/niri-animations/translations/es.json new file mode 100644 index 0000000..790ce6d --- /dev/null +++ b/niri-animations/translations/es.json @@ -0,0 +1,34 @@ +{ + "title": "Niri Animations", + "preset": "Preset", + "no_preset": "Sin preset (pack base)", + "animations_on": "Animaciones activas", + "animations_off": "Animaciones apagadas", + "random": "Al azar", + "speed": "Velocidad", + "speed_hint": "arriba de 1 es más lento", + "shortcut_label": "Animaciones", + "status_presets_found": "presets en", + "status_base_pack": "Pack base", + "status_off": "Animaciones desactivadas.", + "status_read_error": "No pude leer", + "status_write_error": "No pude escribir", + "settings": { + "presets_dir": { + "label": "Carpeta de presets", + "description": "Carpeta donde se buscan los presets .kdl de animación" + }, + "target_file": { + "label": "Archivo destino", + "description": "Archivo que se reescribe con el preset y la velocidad elegidos. Tu config de niri tiene que incluirlo después de las animaciones base." + }, + "include_prefix": { + "label": "Prefijo del include", + "description": "Prefijo de ruta que se escribe en la línea include, relativo al archivo destino" + }, + "reload_command": { + "label": "Comando de recarga", + "description": "Se ejecuta después de escribir, para que el compositor tome el cambio" + } + } +}