From ae4690a14c24f650b1663af44f3c5302b33b350c Mon Sep 17 00:00:00 2001 From: Sovego Date: Mon, 4 May 2026 10:58:09 +0700 Subject: [PATCH 1/5] feat: add clamshell plugin --- clamshell/.gitignore | 1 + clamshell/BarWidget.qml | 75 ++++ clamshell/CLAUDE.md | 105 ++++++ clamshell/ControlCenterWidget.qml | 27 ++ clamshell/Main.qml | 528 +++++++++++++++++++++++++++ clamshell/README.md | 58 +++ clamshell/Settings.qml | 142 +++++++ clamshell/i18n/en.json | 14 + clamshell/i18n/ru.json | 14 + clamshell/manifest.json | 33 ++ clamshell/noctalia-clamshell-spec.md | 398 ++++++++++++++++++++ clamshell/preview.png | Bin 0 -> 71588 bytes 12 files changed, 1395 insertions(+) create mode 100644 clamshell/.gitignore create mode 100644 clamshell/BarWidget.qml create mode 100644 clamshell/CLAUDE.md create mode 100644 clamshell/ControlCenterWidget.qml create mode 100644 clamshell/Main.qml create mode 100644 clamshell/README.md create mode 100644 clamshell/Settings.qml create mode 100644 clamshell/i18n/en.json create mode 100644 clamshell/i18n/ru.json create mode 100644 clamshell/manifest.json create mode 100644 clamshell/noctalia-clamshell-spec.md create mode 100644 clamshell/preview.png diff --git a/clamshell/.gitignore b/clamshell/.gitignore new file mode 100644 index 000000000..e458ed577 --- /dev/null +++ b/clamshell/.gitignore @@ -0,0 +1 @@ +.worktrees/ diff --git a/clamshell/BarWidget.qml b/clamshell/BarWidget.qml new file mode 100644 index 000000000..eb1af3381 --- /dev/null +++ b/clamshell/BarWidget.qml @@ -0,0 +1,75 @@ +import QtQuick +import Quickshell +import qs.Commons +import qs.Services.UI +import qs.Widgets + +NIconButton { + id: root + + property ShellScreen screen + property var pluginApi: null + property string widgetId: "" + property string section: "" + property int sectionWidgetIndex: -1 + property int sectionWidgetsCount: 0 + + readonly property var cfg: pluginApi?.pluginSettings || ({}) + readonly property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) + readonly property bool alwaysShowBarWidget: cfg.alwaysShowBarWidget !== undefined + ? cfg.alwaysShowBarWidget + : (defaults.alwaysShowBarWidget !== undefined ? defaults.alwaysShowBarWidget : false) + + readonly property var main: pluginApi ? pluginApi.mainInstance : null + readonly property bool isActive: !!main && main.enabled && main.externalPresent + readonly property bool isDisabled: !main || !main.enabled + readonly property string stateText: main?.stateLabel ? main.stateLabel() : (pluginApi?.tr("state.disabled") || "Off") + readonly property string outputsText: main?.outputSummary ? main.outputSummary() : "" + + visible: root.alwaysShowBarWidget || (!!main && main.inhibitorActive) + icon: root.alwaysShowBarWidget + ? (root.isActive ? "display" : (root.isDisabled ? "display-off" : "laptop")) + : "display" + tooltipText: outputsText ? stateText + "\n" + outputsText : stateText + tooltipDirection: BarService.getTooltipDirection(screen?.name) + baseSize: Style.getCapsuleHeightForScreen(screen?.name) + applyUiScale: false + customRadius: Style.radiusL + colorBg: Style.capsuleColor + colorFg: root.isActive ? Color.mPrimary : (root.isDisabled ? Color.mOnSurfaceVariant : Color.mSecondary) + + border.color: Style.capsuleBorderColor + border.width: Style.capsuleBorderWidth + + onClicked: { + if (root.main) { + root.main.toggle(); + } + } + + NPopupContextMenu { + id: contextMenu + + model: [ + { + "label": pluginApi?.tr("menu.settings") || "Settings", + "action": "settings", + "icon": "settings" + } + ] + + onTriggered: action => { + contextMenu.close(); + PanelService.closeContextMenu(screen); + if (action === "settings") { + BarService.openPluginSettings(root.screen, pluginApi.manifest); + } + } + } + + onRightClicked: { + if (pluginApi) { + PanelService.showContextMenu(contextMenu, root, screen); + } + } +} diff --git a/clamshell/CLAUDE.md b/clamshell/CLAUDE.md new file mode 100644 index 000000000..ab1cae2c9 --- /dev/null +++ b/clamshell/CLAUDE.md @@ -0,0 +1,105 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +A Noctalia Shell plugin (`clamshell`) that manages clamshell mode on laptops. When an external monitor is connected, it inhibits the lid-switch suspend via `systemd-inhibit`; when no external monitor is present, normal systemd behavior is restored. Full specification is in `noctalia-clamshell-spec.md`. + +**Target platform:** CachyOS (Arch-based), niri ≥ 0.1.9, Noctalia Shell ≥ 3.6.0, Quickshell (via `noctalia-qs`). + +**Install path:** `~/.config/noctalia/plugins/clamshell/` + +## Planned File Structure + +``` +clamshell/ +├── manifest.json +├── Main.qml # background logic: event-stream, inhibitor Process +├── ControlCenterWidget.qml # toggle button +├── BarWidget.qml # status icon +├── Settings.qml # settings UI +├── preview.png +├── README.md +└── i18n/ + ├── en.json + └── ru.json +``` + +## Architecture + +### State Model (three sources of truth) + +| Property | Type | Source | Description | +|---|---|---|---| +| `enabled` | bool rw | `pluginSettings` | UI toggle — is the plugin active? | +| `externalPresent` | bool ro | niri event-stream | Is at least one external monitor connected? | +| `inhibitorActive` | bool derived | `enabled && externalPresent` | Is the systemd-inhibit process running? | + +Any change to `enabled` or `externalPresent` triggers a recalculation and starts/stops the inhibitor process. + +### Main.qml is the single source of logic + +Widgets get all state via `pluginApi.mainInstance.*`. Widgets must **not** spawn their own `niri msg` processes or duplicate JSON parsing logic. + +`Main.qml` must export via `pluginApi.mainInstance`: +- Properties: `enabled` (rw), `externalPresent` (ro), `inhibitorActive` (ro), `outputs` (ro, list) +- Signal: `stateChanged()` +- Methods: `toggle()`, `enable()`, `disable()`, `refresh()`, `status()` + +### Event-stream (niri monitor detection) + +Use `Quickshell.Io.Process` to run `niri msg --json event-stream`. Read stdout line-by-line — each line is a JSON event. The stream sends full current state upfront, so a separate `niri msg --json outputs` call at startup is **not needed**. + +On any output-related event: call `niri msg --json outputs`, filter by `internalConnectorRegex` (default `^(eDP|LVDS|DSI)`), set `externalPresent`. Unknown event types must be silently ignored (niri documents this explicitly). + +Reconnect strategy on crash: wait 2 s, retry with exponential backoff up to 30 s. Do **not** kill the inhibitor during stream downtime. + +### Inhibitor process lifecycle + +Command: +```sh +systemd-inhibit --what=handle-lid-switch --who= \ + --why="Clamshell mode — external display in use" --mode=block \ + sleep infinity +``` + +Bind `Process.running = inhibitorActive` declaratively. Verify cleanup in `Component.onDestruction`. If `systemd-inhibit` is missing from PATH: log error, show UI error, treat plugin as permanently `enabled=false`. + +### IPC target: `plugin:clamshell` + +Functions: `enable`, `disable`, `toggle`, `status`, `refresh`. +`status` returns JSON — see spec §3.5 for schema. + +## Key Implementation Rules + +- **No polling** — `niri msg outputs` is called reactively from event-stream only, never on a timer. +- **No logind.conf changes** — the plugin must not modify `/etc/systemd/logind.conf`. +- **Single inhibitor process** — at most one `systemd-inhibit` process at any time (`pgrep -f noctalia-clamshell` should return ≤ 1 result). +- **Logging** — use `qs.Commons.Logger`, never `console.log` in production code. +- **No duplicate processes** — test for leaks by connect/disconnect cycling 10× and checking `pgrep`. + +## Development & Testing + +There is no build step. The plugin is loaded directly by Noctalia Shell from the install path. + +**Manual IPC testing:** +```sh +qs -c noctalia-shell ipc call plugin:clamshell status +qs -c noctalia-shell ipc call plugin:clamshell toggle +systemd-inhibit --list # verify inhibitor presence/absence +``` + +**Log inspection:** +```sh +journalctl --user -u noctalia* -f +``` + +**Acceptance scenarios** are fully defined in spec §9. The plugin is done when all 18 criteria pass. + +## Key References + +- niri IPC events/outputs: https://yalter.github.io/niri/IPC.html and https://docs.rs/niri-ipc/ +- Noctalia plugin docs: https://docs.noctalia.dev/development/plugins/overview/ +- Hello-world plugin example: https://github.com/noctalia-dev/noctalia-plugins (`hello-world/`) +- `man systemd-inhibit` — especially `--what=handle-lid-switch` and `--mode=block` diff --git a/clamshell/ControlCenterWidget.qml b/clamshell/ControlCenterWidget.qml new file mode 100644 index 000000000..8c2f564e3 --- /dev/null +++ b/clamshell/ControlCenterWidget.qml @@ -0,0 +1,27 @@ +import QtQuick +import Quickshell +import qs.Commons +import qs.Widgets + +NIconButtonHot { + id: root + + property ShellScreen screen + property var pluginApi: null + + readonly property var main: pluginApi ? pluginApi.mainInstance : null + readonly property bool isActive: !!main && main.enabled && main.externalPresent + readonly property bool isStandby: !!main && main.enabled && !main.externalPresent + readonly property bool isDisabled: !main || !main.enabled + readonly property string stateText: main?.stateLabel ? main.stateLabel() : (pluginApi?.tr("state.disabled") || "Off") + readonly property string outputsText: main?.outputSummary ? main.outputSummary() : "" + + icon: isActive ? "display" : (isDisabled ? "display-off" : "laptop") + tooltipText: outputsText ? stateText + "\n" + outputsText : stateText + + onClicked: { + if (root.main) { + root.main.toggle(); + } + } +} diff --git a/clamshell/Main.qml b/clamshell/Main.qml new file mode 100644 index 000000000..6cf82d220 --- /dev/null +++ b/clamshell/Main.qml @@ -0,0 +1,528 @@ +// Main.qml — clamshell plugin background logic. +// +// Responsibilities: +// - Watch niri's `event-stream` for output-related events. +// - On any output-related event, query `niri msg --json outputs` and recompute +// `externalPresent` against `internalConnectorRegex`. +// - Maintain reconnection with exponential backoff if the event-stream dies. +// - Detect at startup whether `systemd-inhibit` is available on PATH. +// - Own the single `systemd-inhibit` Process and plugin IPC target. +// - Expose state to widgets through Noctalia's pluginApi.mainInstance. +import QtQuick +import Quickshell +import Quickshell.Io +import qs.Commons + +Item { + id: root + + // ───── Plugin API injection ────────────────────────────────────────── + // Noctalia's PluginService injects this. Settings are read with the + // standard cfg/defaults fallback chain documented in AGENTS.md. + property var pluginApi: null + + readonly property var cfg: pluginApi?.pluginSettings || ({}) + readonly property var defaults: pluginApi?.manifest?.metadata?.defaultSettings + || pluginApi?.manifest?.defaultSettings + || ({}) + + readonly property string internalConnectorRegex: cfg.internalConnectorRegex + ?? defaults.internalConnectorRegex + ?? "^(eDP|LVDS|DSI)" + readonly property bool notifyEnabled: cfg.notify !== undefined + ? cfg.notify + : (defaults.notify !== undefined ? defaults.notify : true) + readonly property string inhibitorWho: cfg.inhibitorWho + ?? defaults.inhibitorWho + ?? "noctalia-clamshell" + + // ───── Public state (consumed by widgets via mainInstance) ─────────── + // `enabled` is the user-facing toggle. Writes are immediately persisted + // because widgets and IPC mutate this property directly. + property bool enabled: (cfg.enabled !== undefined) + ? cfg.enabled + : (defaults.enabled !== undefined ? defaults.enabled : true) + + // `externalPresent` reflects whether at least one non-internal output is + // physically connected (modes array non-empty), regardless of whether + // the user has disabled it via `niri msg output ... off`. + property bool externalPresent: false + + readonly property bool inhibitorActive: inhibitorProc.running + + // `inhibitorAvailable` is set by the `which systemd-inhibit` probe + // below. While the probe is in flight we optimistically assume true. + property bool inhibitorAvailable: true + + // `outputs` is the canonical, deduplicated list of monitor descriptors + // that the IPC `status` call (Task 4) and Settings UI consume. Each + // entry is { name, internal, connected, active }. + property var outputs: [] + property var lastOutputsPayload: null + + readonly property int inhibitorPid: inhibitorProc.processId ? Number(inhibitorProc.processId) : 0 + property bool componentReady: false + + // Emitted whenever any of the three primary state-bools change. This is + // part of the public mainInstance contract (spec §8). + signal stateChanged + + onEnabledChanged: { + persistEnabled(); + stateChanged(); + } + onExternalPresentChanged: stateChanged() + onInhibitorActiveChanged: stateChanged() + + // ───── Backoff state for event-stream reconnection ─────────────────── + // We start at 2 s and double up to 30 s; reset to 2 s on any successful + // connect (i.e. when the process emits `started`). During downtime we + // deliberately preserve the last-known `externalPresent` so that a + // transient niri restart doesn't drop the inhibitor (spec §4.4). + readonly property int backoffMinMs: 2000 + readonly property int backoffMaxMs: 30000 + property int currentBackoffMs: backoffMinMs + + // ───── Logging tag ─────────────────────────────────────────────────── + readonly property string logTag: "Clamshell" + + // ───────────────────────────────────────────────────────────────────── + // Public methods (spec §8). + function enable() { + if (!root.inhibitorAvailable) { + root.enabled = false; + return "error:no-systemd-inhibit"; + } + root.enabled = true; + return "ok"; + } + + function disable() { + root.enabled = false; + return "ok"; + } + + function toggle() { + if (root.enabled) { + root.disable(); + } else { + root.enable(); + } + return root.enabled ? "on" : "off"; + } + + function refresh() { + fetchOutputs(); + return "ok"; + } + + function applySettings() { + root.enabled = (cfg.enabled !== undefined) + ? cfg.enabled + : (defaults.enabled !== undefined ? defaults.enabled : true); + if (root.lastOutputsPayload) { + classifyOutputs(root.lastOutputsPayload); + } + } + + function persistEnabled() { + if (!pluginApi || !pluginApi.pluginSettings) return; + if (pluginApi.pluginSettings.enabled === root.enabled) return; + pluginApi.pluginSettings.enabled = root.enabled; + pluginApi.saveSettings(); + } + + function status() { + var out = []; + for (var i = 0; i < root.outputs.length; ++i) { + var o = root.outputs[i]; + out.push({ + name: o.name, + internal: !!o.internal, + active: !!o.active + }); + } + return JSON.stringify({ + enabled: root.enabled, + externalPresent: root.externalPresent, + inhibitorActive: root.inhibitorActive, + inhibitorAvailable: root.inhibitorAvailable, + inhibitorPid: root.inhibitorPid, + outputs: out + }); + } + + function stateLabel() { + if (!root.enabled) return pluginApi?.tr("state.disabled") || "Off"; + if (root.externalPresent) return pluginApi?.tr("state.active") || "On - external display detected"; + return pluginApi?.tr("state.standby") || "Auto - no external display"; + } + + function outputSummary() { + var parts = []; + for (var i = 0; i < root.outputs.length; ++i) { + var o = root.outputs[i]; + parts.push(o.name + (o.internal ? " (internal)" : " (external)")); + } + return parts.join(", "); + } + + IpcHandler { + target: "plugin:clamshell" + + function enable() { + return root.enable(); + } + + function disable() { + return root.disable(); + } + + function toggle() { + return root.toggle(); + } + + function refresh() { + return root.refresh(); + } + + function status() { + return root.status(); + } + } + + // ───────────────────────────────────────────────────────────────────── + // Output classification. + // + // niri's `Outputs` response is a JSON object keyed by output name + // (HashMap in niri-ipc). Each Output has at minimum: + // { name, modes: [...], current_mode: int|null, ... } + // + // Connected: a monitor is physically present iff `modes` is a non-empty + // array. Disabled-by-user (`niri msg output X off`) yields current_mode + // = null but modes is still populated. + // + // External: name does not match the internalConnectorRegex. We compile + // the regex once per fetch (cheap, and accounts for Settings changes). + function classifyOutputs(outputsObj) { + root.lastOutputsPayload = outputsObj; + + var rx; + try { + rx = new RegExp(root.internalConnectorRegex); + } catch (e) { + Logger.w(root.logTag, "Invalid internalConnectorRegex:", root.internalConnectorRegex, "— treating all outputs as external. Error:", e); + rx = null; + } + + var list = []; + var hasExternal = false; + + // Outputs response may legally be either an object map (current + // niri-ipc) or an array (older niri builds / fixtures). Handle both. + if (Array.isArray(outputsObj)) { + for (var i = 0; i < outputsObj.length; ++i) { + var entry = outputsObj[i]; + if (!entry || typeof entry.name !== "string") continue; + var rec = makeOutputRecord(entry, entry.name, rx); + list.push(rec); + if (!rec.internal && rec.connected) hasExternal = true; + } + } else if (outputsObj && typeof outputsObj === "object") { + var names = Object.keys(outputsObj); + for (var j = 0; j < names.length; ++j) { + var name = names[j]; + var data = outputsObj[name] || {}; + var rec2 = makeOutputRecord(data, name, rx); + list.push(rec2); + if (!rec2.internal && rec2.connected) hasExternal = true; + } + } + + // Stable order — consumers (Settings UI) expect a deterministic list. + list.sort(function(a, b) { return a.name.localeCompare(b.name); }); + + root.outputs = list; + root.externalPresent = hasExternal; + } + + function makeOutputRecord(data, name, rx) { + var modes = Array.isArray(data.modes) ? data.modes : []; + var connected = modes.length > 0; + var active = data.current_mode !== null && data.current_mode !== undefined; + var internal = rx ? rx.test(name) : false; + return { + name: name, + internal: internal, + connected: connected, + active: active + }; + } + + // ───────────────────────────────────────────────────────────────────── + // niri-related processes. + // + // `outputsProc` — one-shot. Fetches the full outputs map; uses + // StdioCollector since the response is a single JSON document. + // + // `eventStreamProc` — long-lived. Each line is one Event JSON object; + // SplitParser delivers one signal per newline-delimited chunk. + // + // `inhibitProbeProc` — one-shot at startup, checks `which systemd-inhibit` + // and flips inhibitorAvailable based on exit code. + + function fetchOutputs() { + if (outputsProc.running) { + // Coalesce: a fetch is already in flight. The active fetch will + // reflect the most recent state once it returns. niri events are + // edge-triggered and we always re-query on the next event anyway. + return; + } + outputsProc.running = true; + } + + Process { + id: outputsProc + command: ["niri", "msg", "--json", "outputs"] + + stdout: StdioCollector { + onStreamFinished: { + var raw = this.text; + if (!raw) { + Logger.w(root.logTag, "niri outputs returned empty payload"); + return; + } + try { + var parsed = JSON.parse(raw); + classifyOutputs(parsed); + Logger.d(root.logTag, "Outputs refreshed; externalPresent=" + root.externalPresent + ", count=" + root.outputs.length); + } catch (e) { + Logger.w(root.logTag, "Failed to parse niri outputs JSON:", e, "raw[0..200]=", raw.substring(0, 200)); + } + } + } + + onExited: (exitCode, exitStatus) => { + if (exitCode !== 0) { + Logger.w(root.logTag, "niri msg outputs exited with code", exitCode); + } + } + } + + // ───── Event-stream consumer ───────────────────────────────────────── + // niri-ipc Event variants of interest are anything containing "Output" + // in the top-level key (see niri-ipc::Event). Unknown event variants + // are silently ignored — niri documents that consumers must tolerate + // future additions. + Process { + id: eventStreamProc + command: ["niri", "msg", "--json", "event-stream"] + + // Don't auto-start: Component.onCompleted starts it after the + // inhibitor-availability probe schedules so that startup ordering + // is deterministic. + running: false + + stdout: SplitParser { + splitMarker: "\n" + onRead: data => root.handleEventLine(data) + } + + stderr: SplitParser { + splitMarker: "\n" + onRead: data => { + if (data && data.length > 0) { + Logger.w(root.logTag, "event-stream stderr:", data); + } + } + } + + onStarted: { + Logger.i(root.logTag, "niri event-stream connected"); + // Successful connect — reset backoff and refresh outputs. + // We don't trust the stream's initial frames to carry output + // state (current niri-ipc has no Outputs* event), so we always + // do an explicit one-shot fetch on (re)connect. + root.currentBackoffMs = root.backoffMinMs; + root.fetchOutputs(); + } + + onExited: (exitCode, exitStatus) => { + if (!root.componentReady) { + return; + } + Logger.w(root.logTag, "niri event-stream exited; code=" + exitCode + " status=" + exitStatus + " — reconnect in " + root.currentBackoffMs + "ms"); + // Preserve last-known externalPresent during downtime — see + // spec §4.4: do NOT drop the inhibitor on a transient stream + // failure. + backoffTimer.interval = root.currentBackoffMs; + backoffTimer.restart(); + // Double the next delay (clamped). Reset happens in onStarted. + root.currentBackoffMs = Math.min(root.currentBackoffMs * 2, root.backoffMaxMs); + } + } + + function handleEventLine(line) { + var trimmed = (line || "").trim(); + if (!trimmed) return; + + var parsed; + try { + parsed = JSON.parse(trimmed); + } catch (e) { + Logger.w(root.logTag, "Failed to parse event-stream line:", e, "raw=", trimmed.substring(0, 200)); + return; + } + if (!parsed || typeof parsed !== "object") return; + + var keys = Object.keys(parsed); + for (var i = 0; i < keys.length; ++i) { + if (keys[i].indexOf("Output") !== -1) { + // Fast path: known output-related event — fetch immediately. + Logger.d(root.logTag, "Output-related event:", keys[i]); + root.fetchOutputs(); + return; + } + } + + // §4.2 fallback: niri-ipc currently has no Output* Event variants. + // Re-fetch outputs on any event so real-time hotplug is detected + // (niri generates WorkspacesChanged etc. when monitor topology changes). + // The debounce timer coalesces rapid bursts into a single fetch. + outputsDebounce.restart(); + } + + Timer { + id: backoffTimer + repeat: false + interval: root.backoffMinMs + onTriggered: { + if (!eventStreamProc.running) { + Logger.i(root.logTag, "Reconnecting niri event-stream..."); + eventStreamProc.running = true; + } + } + } + + // Debounce timer for the §4.2 fallback: any niri event triggers an + // outputs re-fetch, but we batch rapid bursts to avoid spawning a + // subprocess per event. 300 ms is long enough to coalesce a burst but + // short enough to feel responsive on hotplug. + Timer { + id: outputsDebounce + repeat: false + interval: 300 + onTriggered: root.fetchOutputs() + } + + // ───── systemd-inhibit availability probe ──────────────────────────── + // Runs once at startup. If `which systemd-inhibit` exits non-zero we + // flip `inhibitorAvailable` to false and the UI/widgets will treat the + // plugin as permanently inert (spec §5.3). + Process { + id: inhibitProbeProc + command: ["which", "systemd-inhibit"] + // StdioCollector silences stdout — we only care about the exit code. + stdout: StdioCollector {} + stderr: StdioCollector {} + onExited: (exitCode, exitStatus) => { + if (exitCode === 0) { + root.inhibitorAvailable = true; + Logger.d(root.logTag, "systemd-inhibit found"); + } else { + root.inhibitorAvailable = false; + root.enabled = false; + Logger.w(root.logTag, "systemd-inhibit not found in PATH (which exit=" + exitCode + ") — clamshell inhibition disabled"); + } + } + } + + // ───── systemd-inhibit lifecycle ──────────────────────────────────── + // Quickshell sends SIGTERM when Process.running becomes false and kills + // tracked children when the shell exits. Binding `running` keeps the + // process count at zero or one. + Process { + id: inhibitorProc + running: root.enabled && root.externalPresent && root.inhibitorAvailable + command: [ + "systemd-inhibit", + "--what=handle-lid-switch", + "--who=" + root.inhibitorWho, + "--why=Clamshell mode - external display in use", + "--mode=block", + "sleep", "infinity" + ] + + stdout: StdioCollector {} + stderr: SplitParser { + splitMarker: "\n" + onRead: data => { + if (data && data.length > 0) { + Logger.w(root.logTag, "systemd-inhibit stderr:", data); + } + } + } + + onStarted: { + Logger.i(root.logTag, "systemd-inhibit started; pid=" + root.inhibitorPid); + root.notifyInhibitorChange(true); + } + + onExited: (exitCode, exitStatus) => { + Logger.i(root.logTag, "systemd-inhibit exited; code=" + exitCode + " status=" + exitStatus); + root.notifyInhibitorChange(false); + } + } + + function notifyInhibitorChange(active) { + if (!root.componentReady || !root.notifyEnabled) return; + + var msg = active + ? (pluginApi?.tr("notify.on") || "Clamshell ON - lid switch inhibited") + : (pluginApi?.tr("notify.off") || "Clamshell OFF - normal lid behavior"); + var icon = active ? "display" : "laptop"; + + notifyProc.exec([ + "notify-send", + "--app-name=noctalia-clamshell", + "--icon=" + icon, + msg + ]); + } + + Process { + id: notifyProc + stdout: StdioCollector {} + stderr: StdioCollector {} + } + + // ───────────────────────────────────────────────────────────────────── + Component.onCompleted: { + root.componentReady = true; + Logger.i(root.logTag, "Main.qml initialised; internalConnectorRegex=" + root.internalConnectorRegex); + // Probe systemd-inhibit availability first (cheap, async). + inhibitProbeProc.running = true; + // Start the event stream. Initial outputs fetch happens in + // eventStreamProc.onStarted so we always have a fresh snapshot + // immediately after the stream comes up. + eventStreamProc.running = true; + } + + Component.onDestruction: { + root.componentReady = false; + // Stop the long-lived stream cleanly so we don't leak processes + // across Noctalia reloads. Quickshell's Process should SIGTERM on + // running=false, but we stop the backoff timer too so a queued + // reconnect can't race with destruction. + backoffTimer.stop(); + if (eventStreamProc.running) { + eventStreamProc.running = false; + } + if (inhibitorProc.running) { + inhibitorProc.running = false; + } + if (notifyProc.running) { + notifyProc.running = false; + } + } +} diff --git a/clamshell/README.md b/clamshell/README.md new file mode 100644 index 000000000..38124b6e2 --- /dev/null +++ b/clamshell/README.md @@ -0,0 +1,58 @@ +# Clamshell Mode Plugin for Noctalia Shell + +Automatically inhibits lid-switch suspend when an external monitor is connected. +When the lid is closed with an external display active, niri turns off the +internal screen while the system stays awake. + +## Requirements + +- Noctalia Shell 3.6.0 or newer +- niri 0.1.9 or newer +- systemd with `systemd-inhibit` +- Quickshell through `noctalia-qs` + +## Installation + +Place this directory at: + +```sh +~/.config/noctalia/plugins/clamshell/ +``` + +Register and enable the plugin in Noctalia, then add the bar widget or control +center widget from Noctalia settings. + +## IPC + +```sh +qs -c noctalia-shell ipc call plugin:clamshell status +qs -c noctalia-shell ipc call plugin:clamshell toggle +qs -c noctalia-shell ipc call plugin:clamshell enable +qs -c noctalia-shell ipc call plugin:clamshell disable +qs -c noctalia-shell ipc call plugin:clamshell refresh +``` + +`status` returns JSON with `enabled`, `externalPresent`, `inhibitorActive`, the +inhibitor PID, and the detected outputs. + +## niri Keybinding + +Add a binding like this to `~/.config/niri/config.kdl`: + +```kdl +binds { + Mod+Shift+L { spawn "sh" "-c" "qs -c noctalia-shell ipc call plugin:clamshell toggle"; } +} +``` + +## logind.conf + +Leave `/etc/systemd/logind.conf` at the normal lid-switch behavior, typically +`HandleLidSwitch=suspend`. This plugin does not edit system configuration; it +uses `systemd-inhibit --mode=block` only while clamshell mode is active. + +## Known Limitation + +If the lid is already closed when the last external monitor is disconnected, +logind will not receive another lid-close event until the lid is opened and +closed again. diff --git a/clamshell/Settings.qml b/clamshell/Settings.qml new file mode 100644 index 000000000..deecbfc64 --- /dev/null +++ b/clamshell/Settings.qml @@ -0,0 +1,142 @@ +import QtQuick +import QtQuick.Layouts +import qs.Commons +import qs.Widgets + +ColumnLayout { + id: root + + property var pluginApi: null + readonly property var main: pluginApi ? pluginApi.mainInstance || ({}) : ({}) + readonly property var cfg: pluginApi?.pluginSettings || ({}) + readonly property var defaults: pluginApi?.manifest?.metadata?.defaultSettings || ({}) + + property bool editEnabled: cfg.enabled !== undefined + ? cfg.enabled + : (defaults.enabled !== undefined ? defaults.enabled : true) + property bool editAlwaysShowBarWidget: cfg.alwaysShowBarWidget !== undefined + ? cfg.alwaysShowBarWidget + : (defaults.alwaysShowBarWidget !== undefined ? defaults.alwaysShowBarWidget : false) + property bool editNotify: cfg.notify !== undefined + ? cfg.notify + : (defaults.notify !== undefined ? defaults.notify : true) + property string editInternalConnectorRegex: cfg.internalConnectorRegex + ?? defaults.internalConnectorRegex + ?? "^(eDP|LVDS|DSI)" + property string editInhibitorWho: cfg.inhibitorWho + ?? defaults.inhibitorWho + ?? "noctalia-clamshell" + + spacing: Style.marginL + + Component.onCompleted: { + Logger.d("Clamshell", "Settings UI loaded"); + } + + ColumnLayout { + spacing: Style.marginM + Layout.fillWidth: true + + NToggle { + label: pluginApi?.tr("settings.enabled") || "Enable clamshell mode" + checked: root.editEnabled + onToggled: checked => root.editEnabled = checked + } + + NToggle { + label: pluginApi?.tr("settings.alwaysShowBarWidget") || "Always show bar icon" + checked: root.editAlwaysShowBarWidget + onToggled: checked => root.editAlwaysShowBarWidget = checked + } + + NToggle { + label: pluginApi?.tr("settings.notify") || "Show notifications" + checked: root.editNotify + onToggled: checked => root.editNotify = checked + } + + NTextInput { + Layout.fillWidth: true + label: pluginApi?.tr("settings.internalConnectorRegex") || "Internal connector pattern" + placeholderText: "^(eDP|LVDS|DSI)" + text: root.editInternalConnectorRegex + onTextChanged: root.editInternalConnectorRegex = text + } + + NTextInput { + Layout.fillWidth: true + label: pluginApi?.tr("settings.inhibitorWho") || "Inhibitor identifier" + placeholderText: "noctalia-clamshell" + text: root.editInhibitorWho + onTextChanged: root.editInhibitorWho = text + } + } + + NText { + visible: root.main.inhibitorAvailable === false + Layout.fillWidth: true + text: pluginApi?.tr("error.noInhibit") || "systemd-inhibit not found - plugin disabled" + color: Color.mError + pointSize: Style.fontSizeM + wrapMode: Text.WordWrap + } + + ColumnLayout { + spacing: Style.marginS + Layout.fillWidth: true + + NText { + text: "Status" + color: Color.mOnSurface + pointSize: Style.fontSizeL + font.weight: Font.DemiBold + } + + NText { + Layout.fillWidth: true + text: "State: " + (root.main.stateLabel ? root.main.stateLabel() : "Unknown") + color: Color.mOnSurfaceVariant + wrapMode: Text.WordWrap + } + + NText { + Layout.fillWidth: true + text: "Inhibitor PID: " + (root.main.inhibitorPid > 0 ? String(root.main.inhibitorPid) : "-") + color: Color.mOnSurfaceVariant + wrapMode: Text.WordWrap + } + + Repeater { + model: root.main.outputs || [] + + NText { + Layout.fillWidth: true + text: modelData.name + ": " + + (modelData.internal ? "internal" : "external") + + ", " + + (modelData.active ? "active" : (modelData.connected ? "connected" : "disconnected")) + color: Color.mOnSurfaceVariant + wrapMode: Text.WordWrap + } + } + } + + function saveSettings() { + if (!pluginApi) { + Logger.e("Clamshell", "Cannot save settings: pluginApi is null"); + return; + } + + pluginApi.pluginSettings.enabled = root.editEnabled; + pluginApi.pluginSettings.alwaysShowBarWidget = root.editAlwaysShowBarWidget; + pluginApi.pluginSettings.notify = root.editNotify; + pluginApi.pluginSettings.internalConnectorRegex = root.editInternalConnectorRegex; + pluginApi.pluginSettings.inhibitorWho = root.editInhibitorWho; + pluginApi.saveSettings(); + + if (root.main.applySettings) { + root.main.applySettings(); + } + Logger.i("Clamshell", "Settings saved successfully"); + } +} diff --git a/clamshell/i18n/en.json b/clamshell/i18n/en.json new file mode 100644 index 000000000..c020b9111 --- /dev/null +++ b/clamshell/i18n/en.json @@ -0,0 +1,14 @@ +{ + "state.active": "On — external display detected", + "state.standby": "Auto — no external display", + "state.disabled": "Off", + "notify.on": "Clamshell ON — lid switch inhibited", + "notify.off": "Clamshell OFF — normal lid behavior", + "settings.enabled": "Enable clamshell mode", + "settings.alwaysShowBarWidget": "Always show bar icon", + "settings.notify": "Show notifications", + "settings.internalConnectorRegex": "Internal connector pattern", + "settings.inhibitorWho": "Inhibitor identifier", + "error.noInhibit": "systemd-inhibit not found — plugin disabled", + "error.noSocket": "niri socket unavailable" +} diff --git a/clamshell/i18n/ru.json b/clamshell/i18n/ru.json new file mode 100644 index 000000000..ba59f9424 --- /dev/null +++ b/clamshell/i18n/ru.json @@ -0,0 +1,14 @@ +{ + "state.active": "Вкл — внешний монитор подключён", + "state.standby": "Авто — внешний монитор не обнаружен", + "state.disabled": "Выкл", + "notify.on": "Clamshell ВКЛ — подавление крышки активно", + "notify.off": "Clamshell ВЫКЛ — штатное поведение крышки", + "settings.enabled": "Включить clamshell-режим", + "settings.alwaysShowBarWidget": "Всегда показывать иконку в баре", + "settings.notify": "Показывать уведомления", + "settings.internalConnectorRegex": "Паттерн внутренних коннекторов", + "settings.inhibitorWho": "Идентификатор инхибитора", + "error.noInhibit": "systemd-inhibit не найден — плагин отключён", + "error.noSocket": "niri socket недоступен" +} diff --git a/clamshell/manifest.json b/clamshell/manifest.json new file mode 100644 index 000000000..ce5fb7532 --- /dev/null +++ b/clamshell/manifest.json @@ -0,0 +1,33 @@ +{ + "id": "clamshell", + "name": "Clamshell Mode", + "description": "Auto clamshell on external display, with manual override", + "version": "0.1.0", + "author": "Sovego", + "license": "MIT", + "repository": "https://github.com/noctalia-dev/noctalia-plugins", + "minNoctaliaVersion": "3.6.0", + "tags": ["Bar", "System", "Utility", "Niri"], + "entryPoints": { + "main": "Main.qml", + "controlCenterWidget": "ControlCenterWidget.qml", + "barWidget": "BarWidget.qml", + "settings": "Settings.qml" + }, + "dependencies": { + "plugins": [] + }, + "metadata": { + "defaultSettings": { + "enabled": true, + "alwaysShowBarWidget": false, + "notify": true, + "internalConnectorRegex": "^(eDP|LVDS|DSI)", + "inhibitorWho": "noctalia-clamshell" + }, + "ipc": { + "target": "plugin:clamshell", + "functions": ["enable", "disable", "toggle", "status", "refresh"] + } + } +} diff --git a/clamshell/noctalia-clamshell-spec.md b/clamshell/noctalia-clamshell-spec.md new file mode 100644 index 000000000..ec62ba0f8 --- /dev/null +++ b/clamshell/noctalia-clamshell-spec.md @@ -0,0 +1,398 @@ +# ТЗ: Noctalia plugin `clamshell` + +## 1. Контекст и цель + +Реализовать плагин для Noctalia Shell (Quickshell/QML), который автоматически +управляет clamshell-режимом ноутбука: при подключённом внешнем мониторе крышка +ноутбука перестаёт триггерить suspend (внутренний экран niri гасит сам), при +отключённом — лид-свич работает штатно. + +Дополнительно — кнопка для принудительного отключения авто-поведения и +возврата к нему. + +**Целевая платформа:** CachyOS (Arch-based), niri ≥ 0.1.9, Noctalia Shell +≥ 3.6.0, systemd, Quickshell (через noctalia-qs). + +**Где живёт плагин:** `~/.config/noctalia/plugins/clamshell/`. + +## 2. Принцип работы (high-level) + +- Мониторим состояние выводов через `niri msg --json event-stream` (event-driven, + без polling). +- Когда детектится хотя бы один внешний монитор и плагин не выключен пользователем + — поднимаем долгоживущий процесс + `systemd-inhibit --what=handle-lid-switch ... sleep infinity`. Пока он жив, + logind игнорирует лид-свич; niri продолжает гасить внутренний экран по + событию крышки. +- Когда внешних мониторов нет, или пользователь нажал «Disable» — процесс + убивается, поведение возвращается к системному дефолту. +- Никаких изменений в `/etc/systemd/logind.conf` плагин **не делает**. + +## 3. Функциональные требования + +### 3.1. Состояния плагина + +Плагин оперирует тремя независимыми источниками истины: + +| Имя | Тип | Источник | Описание | +|-----------------|--------|-----------------------|-------------------------------------------------| +| `enabled` | bool | `pluginSettings` | Включён ли вообще плагин (UI-toggle) | +| `externalPresent` | bool | niri event-stream | Есть ли хоть один внешний монитор в системе | +| `inhibitorActive` | bool | derived (read-only) | Запущен ли сейчас systemd-inhibit | + +Производное состояние: + +``` +inhibitorActive = enabled && externalPresent +``` + +Любое изменение `enabled` или `externalPresent` триггерит пересчёт и +старт/стоп процесса. + +### 3.2. UI-кнопка (Control Center widget) + +- Один тогл-баттон в Control Center. +- Визуальные состояния: + - **Active** (`enabled && externalPresent`): подсвечен акцентным цветом, + подпись «On — external display detected». + - **Standby** (`enabled && !externalPresent`): обычный, подпись «Auto — + no external display». + - **Disabled** (`!enabled`): затемнён/outlined, подпись «Off». +- Клик переключает `enabled`. `externalPresent` остаётся как есть. + +### 3.3. Bar widget (опциональный) + +- Компактная иконка в баре. По умолчанию **показывается только когда + `inhibitorActive == true`** (т.е. сейчас реально активен инхибитор). +- Пользователь может в Settings выбрать «всегда показывать» + (`alwaysShowBarWidget`). При `alwaysShow=true` иконка отражает все три + состояния (3 разных цвета/иконки). +- Клик на иконке = тогл `enabled`. +- Hover-tooltip: показывает текущее состояние и список детектированных + выводов («eDP-1, DP-3 (external)»). + +### 3.4. Settings UI + +Минимальная панель настроек, рендерится в стандартный Noctalia Settings: + +- `enabled` (bool, default `true`) — включён ли плагин. +- `alwaysShowBarWidget` (bool, default `false`). +- `notify` (bool, default `true`) — слать ли desktop-нотификации при + изменении `inhibitorActive`. +- `internalConnectorRegex` (string, default `"^(eDP|LVDS|DSI)"`) — паттерн + имён внутренних коннекторов; всё, что не матчится, считается внешним. +- `inhibitorWho` (string, default `"noctalia-clamshell"`) — значение + `--who=` для systemd-inhibit (полезно для диагностики). +- Read-only блок: текущее состояние, список выводов с пометкой + internal/external, PID активного inhibitor (если есть). + +### 3.5. IPC + +Плагин регистрирует IPC target `plugin:clamshell` со следующими функциями: + +| Функция | Аргументы | Возврат | Эффект | +|-------------|-----------|-----------------|-----------------------------------------------------| +| `enable` | — | `"ok"` | `enabled = true` | +| `disable` | — | `"ok"` | `enabled = false` | +| `toggle` | — | `"on"`/`"off"` | Инвертирует `enabled`, возвращает новое значение | +| `status` | — | JSON-строка | См. ниже | +| `refresh` | — | `"ok"` | Принудительно перечитывает niri outputs | + +`status` возвращает JSON: + +```json +{ + "enabled": true, + "externalPresent": true, + "inhibitorActive": true, + "outputs": [ + {"name": "eDP-1", "internal": true, "active": false}, + {"name": "DP-3", "internal": false, "active": true} + ] +} +``` + +Это нужно для биндов в niri (`spawn-sh "qs -c noctalia-shell ipc call +plugin:clamshell toggle"`) и интеграции со скриптами. + +## 4. Авто-детект внешнего монитора + +### 4.1. Источник событий + +Использовать `niri msg --json event-stream` через `Quickshell.Io.Process`, +читать stdout построчно (каждое событие — JSON на отдельной строке). + +niri event-stream спроектирован так, что присылает **полное текущее +состояние upfront**, а потом атомарные апдейты. То есть отдельный начальный +запрос `niri msg --json outputs` не нужен — первый пакет событий из стрима +уже содержит исходное состояние. + +### 4.2. Релевантные события + +Нас интересуют события об изменении конфигурации выводов. На момент +написания ТЗ это (точные имена варианта проверить в `niri-ipc` enum +`Event`, могут отличаться по версии): + +- `OverviewOpenedOrClosed` — игнор. +- Любые `*Output*` / `*Outputs*` события — триггер пересчёта. +- Если конкретного output-события нет, fallback — на любое изменение + считать `outputs` переменной и перечитывать список командой + `niri msg --json outputs`. + +**Реализация должна быть устойчива к появлению новых неизвестных +вариантов событий** (документация niri явно говорит об этом). Парсер +неизвестные ключи игнорирует. + +### 4.3. Алгоритм детекции + +``` +on event: + if event relates to outputs: + outputs = niri msg --json outputs + externals = [o for o in outputs + if not regex_match(internalConnectorRegex, o.name) + and o is connected] + externalPresent = len(externals) > 0 +``` + +«connected» = вывод физически присутствует. В niri JSON-схеме это +проверяется по наличию режимов (`modes` непусто) или статусу — уточнить +по факту в реализации; **отключённый пользователем (`niri msg output X +off`) внутренний дисплей всё равно считается присутствующим**, важна +именно физическая connectivity. + +### 4.4. Восстановление при падении event-stream + +Если процесс event-stream умер (niri рестартанул, и т.п.): + +1. Логируем warning. +2. Ждём 2 секунды. +3. Перезапускаем процесс. +4. Повторно — exponential backoff до 30 секунд. + +В период даунтайма event-stream `externalPresent` сохраняет последнее +известное значение. **Inhibitor не убиваем** только из-за падения +стрима — это бы привело к нежелательному suspend при простой ошибке +коммуникации. + +## 5. Inhibitor: жизненный цикл процесса + +### 5.1. Команда + +``` +systemd-inhibit \ + --what=handle-lid-switch \ + --who= \ + --why= \ + --mode=block \ + sleep infinity +``` + +### 5.2. Запуск + +`Process.running = inhibitorActive` — связать декларативно. QML сам +запустит/убьёт процесс при изменении свойства. + +### 5.3. Корректное завершение + +- При `inhibitorActive` → `false`: послать SIGTERM. `sleep infinity` + завершается мгновенно, systemd-inhibit отпускает блокировку. +- При выгрузке плагина (Noctalia disable / shutdown): обязательно + убить процесс. Quickshell `Process` должен делать это автоматически, + но **верифицировать** в реализации — в Component.onDestruction. +- Если systemd-inhibit отсутствует в PATH — лог error, нотификация + пользователю, плагин ведёт себя как `enabled=false` без возможности + включения, в Settings UI показывается ошибка. + +### 5.4. Уведомления + +При каждом переходе `inhibitorActive` (при `notify=true`): + +- `false → true`: notify-send «Clamshell ON — lid switch inhibited». +- `true → false`: notify-send «Clamshell OFF — normal lid behavior». + +Иконка — `display`/`laptop` в зависимости от состояния. App ID — +`noctalia-clamshell`, чтобы пользователь мог отдельно настроить правила +DnD. + +## 6. Структура файлов + +``` +clamshell/ +├── manifest.json +├── preview.png +├── README.md +├── Main.qml # фоновая логика, event-stream, Process +├── ControlCenterWidget.qml # тогл-баттон +├── BarWidget.qml # индикатор +├── Settings.qml # UI настроек +└── i18n/ + ├── en.json + └── ru.json +``` + +## 7. Контракт `manifest.json` + +```json +{ + "id": "clamshell", + "name": "Clamshell Mode", + "description": "Auto clamshell on external display, with manual override", + "version": "0.1.0", + "author": "<автор>", + "license": "MIT", + "minNoctaliaVersion": "3.6.0", + "components": { + "main": "Main.qml", + "controlCenterWidget": "ControlCenterWidget.qml", + "barWidget": "BarWidget.qml", + "settings": "Settings.qml" + }, + "defaultSettings": { + "enabled": true, + "alwaysShowBarWidget": false, + "notify": true, + "internalConnectorRegex": "^(eDP|LVDS|DSI)", + "inhibitorWho": "noctalia-clamshell" + }, + "ipc": { + "target": "plugin:clamshell", + "functions": ["enable", "disable", "toggle", "status", "refresh"] + } +} +``` + +## 8. Архитектура `Main.qml` (skeleton-контракт) + +Модуль `Main.qml` обязан экспортировать через `pluginApi.mainInstance`: + +- свойства: `enabled` (rw), `externalPresent` (ro), `inhibitorActive` (ro), + `outputs` (ro, list). +- сигналы: `stateChanged()` (любое изменение трёх state-bool). +- методы: `toggle()`, `enable()`, `disable()`, `refresh()`, `status()`. + +Виджеты получают эти данные через `pluginApi.mainInstance.*`. Виджеты +**не должны** дублировать логику парсинга niri JSON или запускать свои +процессы. + +## 9. Acceptance criteria + +Плагин считается готовым, когда выполнены все пункты: + +### 9.1. Авто-сценарий + +1. Ноут без внешнего экрана, `enabled=true` → `inhibitorActive=false`, + `systemd-inhibit --list | grep noctalia-clamshell` пусто. +2. Подключаем HDMI/DP → в течение **<1 секунды** `inhibitorActive=true`, + `systemd-inhibit --list` показывает запись с `--who=noctalia-clamshell`. +3. Отключаем кабель → в течение **<1 секунды** inhibitor снят. +4. Закрытие крышки в состоянии (2): laptop **не** уходит в suspend, + `eDP-1` гаснет. +5. Закрытие крышки в состоянии (1): laptop уходит в suspend как обычно. + +### 9.2. Override-сценарий + +6. В состоянии (2) кликнули кнопку Control Center → `enabled=false`, + inhibitor моментально снят. +7. В этом же состоянии закрытие крышки → suspend (несмотря на + подключённый внешний). +8. Повторный клик → `enabled=true`, при подключённом внешнем inhibitor + восстанавливается. + +### 9.3. IPC + +9. `qs -c noctalia-shell ipc call plugin:clamshell toggle` инвертирует + `enabled`, возвращает новое значение. +10. `qs -c noctalia-shell ipc call plugin:clamshell status` возвращает + валидный JSON по схеме из 3.5. +11. Привязка хоткея в niri (`Mod+Shift+L`) на toggle работает идентично + клику в UI. + +### 9.4. Устойчивость + +12. Перезапуск Noctalia: `enabled` восстанавливается из настроек, + inhibitor поднимается заново если `externalPresent`. +13. `pkill niri` (имитация падения compositor): после рестарта niri + плагин восстанавливает event-stream без вмешательства пользователя. +14. Удаление systemd-inhibit бинарника: плагин не падает, выдаёт + видимую ошибку в UI. +15. Подключение/отключение мониторов 10 раз подряд: нет утечек + процессов (`pgrep -f noctalia-clamshell` показывает не более одного). + +### 9.5. Качество + +16. Никаких лишних опросов (`niri msg outputs` вызывается только + реактивно из event-stream, не по таймеру). +17. Inhibitor процесс корректно закрывается при выгрузке плагина + (проверка: `qs ipc plugin:clamshell disable` + `pgrep -f + "noctalia-clamshell"` пусто). +18. Логирование через `qs.Commons.Logger`, без `console.log` в + проде. + +## 10. Граничные случаи и решения + +| Случай | Решение | +|--------|---------| +| Лид закрыт ДО старта плагина, внешний есть | niri уже погасил eDP, `externalPresent=true`, поднимаем inhibitor — корректно | +| Лид закрыт, внешний отключают | inhibitor снимается, **но крышка УЖЕ закрыта** → следующий лид-эвент случится только при открытии. logind в этом момент уже не в clamshell-режиме. Считаем это user error, документируем в README | +| Внешний — это второй встроенный экран (DSI на конвертах) | regex `internalConnectorRegex` настраивается пользователем | +| Несколько внешних подряд: HDMI вытыкают, DP всё ещё есть | `externalPresent` остаётся `true`, inhibitor не дёргается | +| Suspend/resume цикл | event-stream может выжить или умереть, см. 4.4. После resume — niri в любом случае шлёт фуллстейт через стрим | +| Hibernate | После hibernate ситуация идентична resume | +| Multi-seat / multi-user | Out of scope. Inhibitor работает в рамках сессии текущего пользователя | + +## 11. Что НЕ входит в скоуп + +- Lock-screen при закрытии крышки (это задача niri `switch-events` или + swayidle, не плагина). +- Управление DPMS / brightness внешнего экрана. +- Ручной выбор какие именно мониторы триггерят clamshell (всё или + ничего). +- Hot-plug audio (sink switching) — это другой плагин. +- Откат `HandleLidSwitchDocked=ignore` если он был выставлен ранее — + только упомянуть в README, что для корректной работы плагина в + `logind.conf` должно быть значение по умолчанию (`suspend`). + +## 12. Тест-план + +Помимо acceptance criteria выше, перед мержем прогнать: + +1. **Unit-уровень (вручную, без фреймворка):** запустить плагин, дёргать + IPC `enable`/`disable`/`toggle`/`status` → сверить с + `systemd-inhibit --list`. +2. **Имитация event-stream:** подменить `niri` фиктивным скриптом, + эмулирующим события подключения/отключения — проверить реакцию. +3. **Запись лога:** прогнать сценарии 9.1–9.4, в `journalctl --user -u + noctalia*` не должно быть ошибок (warning от backoff допустимы). +4. **Память:** оставить плагин на 24 часа с периодическим + plug/unplug — RSS Quickshell не должен расти линейно. + +## 13. Полезные ссылки для реализации + +- niri IPC: +- niri-ipc Rust crate (полные определения событий и outputs): + +- Noctalia plugin docs: + +- Hello-world пример (всё включено): + → `hello-world/` +- systemd-inhibit man: `man systemd-inhibit`, особенно секция о + `--what=handle-lid-switch` и `--mode=block`. + +## 14. Вопросы открытые на усмотрение реализатора + +- Конкретный набор событий event-stream, на которые подписываться + (зависит от версии niri-ipc, проверить в crate). +- Какую именно иконку использовать для bar widget — на выбор из + доступных в Noctalia icon set. +- Структура read-only Settings блока (таблица vs список). +- Использовать ли direct UNIX socket к `$NIRI_SOCKET` вместо запуска + `niri msg` процесса (производительнее, но усложняет код). Допустимо + оба варианта; для начала — через `Process` с `niri msg`. + +--- + +**Definition of Done:** все 18 acceptance criteria выполнены, +README с примером настройки niri-биндинга и одной картинкой preview.png +лежит в репозитории, плагин ставится через стандартный механизм +Noctalia Plugin Registry (или из локальной папки). diff --git a/clamshell/preview.png b/clamshell/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..574a269afae8b1fedbb1cbff0e2716743f224521 GIT binary patch literal 71588 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 literal 0 HcmV?d00001 From 05212dcf0199a77b31373e7b809bece07b3d9a68 Mon Sep 17 00:00:00 2001 From: Sovego Date: Mon, 4 May 2026 11:23:32 +0700 Subject: [PATCH 2/5] fix: text in settings. Icon in notification --- clamshell/BarWidget.qml | 4 +--- clamshell/ControlCenterWidget.qml | 2 +- clamshell/Main.qml | 19 ++-------------- clamshell/i18n/en.json | 35 ++++++++++++++++++++---------- clamshell/i18n/ru.json | 35 ++++++++++++++++++++---------- clamshell/preview.png | Bin 71588 -> 0 bytes 6 files changed, 50 insertions(+), 45 deletions(-) delete mode 100644 clamshell/preview.png diff --git a/clamshell/BarWidget.qml b/clamshell/BarWidget.qml index eb1af3381..8109a441b 100644 --- a/clamshell/BarWidget.qml +++ b/clamshell/BarWidget.qml @@ -27,9 +27,7 @@ NIconButton { readonly property string outputsText: main?.outputSummary ? main.outputSummary() : "" visible: root.alwaysShowBarWidget || (!!main && main.inhibitorActive) - icon: root.alwaysShowBarWidget - ? (root.isActive ? "display" : (root.isDisabled ? "display-off" : "laptop")) - : "display" + icon: "device-desktop" tooltipText: outputsText ? stateText + "\n" + outputsText : stateText tooltipDirection: BarService.getTooltipDirection(screen?.name) baseSize: Style.getCapsuleHeightForScreen(screen?.name) diff --git a/clamshell/ControlCenterWidget.qml b/clamshell/ControlCenterWidget.qml index 8c2f564e3..dae0a82ab 100644 --- a/clamshell/ControlCenterWidget.qml +++ b/clamshell/ControlCenterWidget.qml @@ -16,7 +16,7 @@ NIconButtonHot { readonly property string stateText: main?.stateLabel ? main.stateLabel() : (pluginApi?.tr("state.disabled") || "Off") readonly property string outputsText: main?.outputSummary ? main.outputSummary() : "" - icon: isActive ? "display" : (isDisabled ? "display-off" : "laptop") + icon: "device-desktop" tooltipText: outputsText ? stateText + "\n" + outputsText : stateText onClicked: { diff --git a/clamshell/Main.qml b/clamshell/Main.qml index 6cf82d220..ae143b176 100644 --- a/clamshell/Main.qml +++ b/clamshell/Main.qml @@ -12,6 +12,7 @@ import QtQuick import Quickshell import Quickshell.Io import qs.Commons +import qs.Services.UI Item { id: root @@ -480,20 +481,7 @@ Item { var msg = active ? (pluginApi?.tr("notify.on") || "Clamshell ON - lid switch inhibited") : (pluginApi?.tr("notify.off") || "Clamshell OFF - normal lid behavior"); - var icon = active ? "display" : "laptop"; - - notifyProc.exec([ - "notify-send", - "--app-name=noctalia-clamshell", - "--icon=" + icon, - msg - ]); - } - - Process { - id: notifyProc - stdout: StdioCollector {} - stderr: StdioCollector {} + ToastService.showNotice("Clamshell Mode", msg, "device-desktop"); } // ───────────────────────────────────────────────────────────────────── @@ -521,8 +509,5 @@ Item { if (inhibitorProc.running) { inhibitorProc.running = false; } - if (notifyProc.running) { - notifyProc.running = false; - } } } diff --git a/clamshell/i18n/en.json b/clamshell/i18n/en.json index c020b9111..ca8f11764 100644 --- a/clamshell/i18n/en.json +++ b/clamshell/i18n/en.json @@ -1,14 +1,25 @@ { - "state.active": "On — external display detected", - "state.standby": "Auto — no external display", - "state.disabled": "Off", - "notify.on": "Clamshell ON — lid switch inhibited", - "notify.off": "Clamshell OFF — normal lid behavior", - "settings.enabled": "Enable clamshell mode", - "settings.alwaysShowBarWidget": "Always show bar icon", - "settings.notify": "Show notifications", - "settings.internalConnectorRegex": "Internal connector pattern", - "settings.inhibitorWho": "Inhibitor identifier", - "error.noInhibit": "systemd-inhibit not found — plugin disabled", - "error.noSocket": "niri socket unavailable" + "state": { + "active": "On - external display detected", + "standby": "Auto - no external display", + "disabled": "Off" + }, + "notify": { + "on": "Clamshell ON - lid switch inhibited", + "off": "Clamshell OFF - normal lid behavior" + }, + "settings": { + "enabled": "Enable clamshell mode", + "alwaysShowBarWidget": "Always show bar icon", + "notify": "Show notifications", + "internalConnectorRegex": "Internal connector pattern", + "inhibitorWho": "Inhibitor identifier" + }, + "error": { + "noInhibit": "systemd-inhibit not found - plugin disabled", + "noSocket": "niri socket unavailable" + }, + "menu": { + "settings": "Settings" + } } diff --git a/clamshell/i18n/ru.json b/clamshell/i18n/ru.json index ba59f9424..95b6d82e6 100644 --- a/clamshell/i18n/ru.json +++ b/clamshell/i18n/ru.json @@ -1,14 +1,25 @@ { - "state.active": "Вкл — внешний монитор подключён", - "state.standby": "Авто — внешний монитор не обнаружен", - "state.disabled": "Выкл", - "notify.on": "Clamshell ВКЛ — подавление крышки активно", - "notify.off": "Clamshell ВЫКЛ — штатное поведение крышки", - "settings.enabled": "Включить clamshell-режим", - "settings.alwaysShowBarWidget": "Всегда показывать иконку в баре", - "settings.notify": "Показывать уведомления", - "settings.internalConnectorRegex": "Паттерн внутренних коннекторов", - "settings.inhibitorWho": "Идентификатор инхибитора", - "error.noInhibit": "systemd-inhibit не найден — плагин отключён", - "error.noSocket": "niri socket недоступен" + "state": { + "active": "Вкл - внешний монитор подключён", + "standby": "Авто - внешний монитор не обнаружен", + "disabled": "Выкл" + }, + "notify": { + "on": "Clamshell ВКЛ - подавление крышки активно", + "off": "Clamshell ВЫКЛ - штатное поведение крышки" + }, + "settings": { + "enabled": "Включить clamshell-режим", + "alwaysShowBarWidget": "Всегда показывать иконку в баре", + "notify": "Показывать уведомления", + "internalConnectorRegex": "Паттерн внутренних коннекторов", + "inhibitorWho": "Идентификатор инхибитора" + }, + "error": { + "noInhibit": "systemd-inhibit не найден - плагин отключён", + "noSocket": "niri socket недоступен" + }, + "menu": { + "settings": "Настройки" + } } diff --git a/clamshell/preview.png b/clamshell/preview.png deleted file mode 100644 index 574a269afae8b1fedbb1cbff0e2716743f224521..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71588 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 From fea8688b4081057d0a7790f36d63f0d60fbc81fe Mon Sep 17 00:00:00 2001 From: Sovego Date: Mon, 4 May 2026 11:47:28 +0700 Subject: [PATCH 3/5] chore: change preview image --- clamshell/preview.png | Bin 0 -> 73309 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 clamshell/preview.png diff --git a/clamshell/preview.png b/clamshell/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..1083af9cd00b6e44fe1c7f12018c53076bc00a0c GIT binary patch literal 73309 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 Date: Mon, 4 May 2026 11:49:24 +0700 Subject: [PATCH 4/5] del: delete claude specs file --- clamshell/noctalia-clamshell-spec.md | 398 --------------------------- 1 file changed, 398 deletions(-) delete mode 100644 clamshell/noctalia-clamshell-spec.md diff --git a/clamshell/noctalia-clamshell-spec.md b/clamshell/noctalia-clamshell-spec.md deleted file mode 100644 index ec62ba0f8..000000000 --- a/clamshell/noctalia-clamshell-spec.md +++ /dev/null @@ -1,398 +0,0 @@ -# ТЗ: Noctalia plugin `clamshell` - -## 1. Контекст и цель - -Реализовать плагин для Noctalia Shell (Quickshell/QML), который автоматически -управляет clamshell-режимом ноутбука: при подключённом внешнем мониторе крышка -ноутбука перестаёт триггерить suspend (внутренний экран niri гасит сам), при -отключённом — лид-свич работает штатно. - -Дополнительно — кнопка для принудительного отключения авто-поведения и -возврата к нему. - -**Целевая платформа:** CachyOS (Arch-based), niri ≥ 0.1.9, Noctalia Shell -≥ 3.6.0, systemd, Quickshell (через noctalia-qs). - -**Где живёт плагин:** `~/.config/noctalia/plugins/clamshell/`. - -## 2. Принцип работы (high-level) - -- Мониторим состояние выводов через `niri msg --json event-stream` (event-driven, - без polling). -- Когда детектится хотя бы один внешний монитор и плагин не выключен пользователем - — поднимаем долгоживущий процесс - `systemd-inhibit --what=handle-lid-switch ... sleep infinity`. Пока он жив, - logind игнорирует лид-свич; niri продолжает гасить внутренний экран по - событию крышки. -- Когда внешних мониторов нет, или пользователь нажал «Disable» — процесс - убивается, поведение возвращается к системному дефолту. -- Никаких изменений в `/etc/systemd/logind.conf` плагин **не делает**. - -## 3. Функциональные требования - -### 3.1. Состояния плагина - -Плагин оперирует тремя независимыми источниками истины: - -| Имя | Тип | Источник | Описание | -|-----------------|--------|-----------------------|-------------------------------------------------| -| `enabled` | bool | `pluginSettings` | Включён ли вообще плагин (UI-toggle) | -| `externalPresent` | bool | niri event-stream | Есть ли хоть один внешний монитор в системе | -| `inhibitorActive` | bool | derived (read-only) | Запущен ли сейчас systemd-inhibit | - -Производное состояние: - -``` -inhibitorActive = enabled && externalPresent -``` - -Любое изменение `enabled` или `externalPresent` триггерит пересчёт и -старт/стоп процесса. - -### 3.2. UI-кнопка (Control Center widget) - -- Один тогл-баттон в Control Center. -- Визуальные состояния: - - **Active** (`enabled && externalPresent`): подсвечен акцентным цветом, - подпись «On — external display detected». - - **Standby** (`enabled && !externalPresent`): обычный, подпись «Auto — - no external display». - - **Disabled** (`!enabled`): затемнён/outlined, подпись «Off». -- Клик переключает `enabled`. `externalPresent` остаётся как есть. - -### 3.3. Bar widget (опциональный) - -- Компактная иконка в баре. По умолчанию **показывается только когда - `inhibitorActive == true`** (т.е. сейчас реально активен инхибитор). -- Пользователь может в Settings выбрать «всегда показывать» - (`alwaysShowBarWidget`). При `alwaysShow=true` иконка отражает все три - состояния (3 разных цвета/иконки). -- Клик на иконке = тогл `enabled`. -- Hover-tooltip: показывает текущее состояние и список детектированных - выводов («eDP-1, DP-3 (external)»). - -### 3.4. Settings UI - -Минимальная панель настроек, рендерится в стандартный Noctalia Settings: - -- `enabled` (bool, default `true`) — включён ли плагин. -- `alwaysShowBarWidget` (bool, default `false`). -- `notify` (bool, default `true`) — слать ли desktop-нотификации при - изменении `inhibitorActive`. -- `internalConnectorRegex` (string, default `"^(eDP|LVDS|DSI)"`) — паттерн - имён внутренних коннекторов; всё, что не матчится, считается внешним. -- `inhibitorWho` (string, default `"noctalia-clamshell"`) — значение - `--who=` для systemd-inhibit (полезно для диагностики). -- Read-only блок: текущее состояние, список выводов с пометкой - internal/external, PID активного inhibitor (если есть). - -### 3.5. IPC - -Плагин регистрирует IPC target `plugin:clamshell` со следующими функциями: - -| Функция | Аргументы | Возврат | Эффект | -|-------------|-----------|-----------------|-----------------------------------------------------| -| `enable` | — | `"ok"` | `enabled = true` | -| `disable` | — | `"ok"` | `enabled = false` | -| `toggle` | — | `"on"`/`"off"` | Инвертирует `enabled`, возвращает новое значение | -| `status` | — | JSON-строка | См. ниже | -| `refresh` | — | `"ok"` | Принудительно перечитывает niri outputs | - -`status` возвращает JSON: - -```json -{ - "enabled": true, - "externalPresent": true, - "inhibitorActive": true, - "outputs": [ - {"name": "eDP-1", "internal": true, "active": false}, - {"name": "DP-3", "internal": false, "active": true} - ] -} -``` - -Это нужно для биндов в niri (`spawn-sh "qs -c noctalia-shell ipc call -plugin:clamshell toggle"`) и интеграции со скриптами. - -## 4. Авто-детект внешнего монитора - -### 4.1. Источник событий - -Использовать `niri msg --json event-stream` через `Quickshell.Io.Process`, -читать stdout построчно (каждое событие — JSON на отдельной строке). - -niri event-stream спроектирован так, что присылает **полное текущее -состояние upfront**, а потом атомарные апдейты. То есть отдельный начальный -запрос `niri msg --json outputs` не нужен — первый пакет событий из стрима -уже содержит исходное состояние. - -### 4.2. Релевантные события - -Нас интересуют события об изменении конфигурации выводов. На момент -написания ТЗ это (точные имена варианта проверить в `niri-ipc` enum -`Event`, могут отличаться по версии): - -- `OverviewOpenedOrClosed` — игнор. -- Любые `*Output*` / `*Outputs*` события — триггер пересчёта. -- Если конкретного output-события нет, fallback — на любое изменение - считать `outputs` переменной и перечитывать список командой - `niri msg --json outputs`. - -**Реализация должна быть устойчива к появлению новых неизвестных -вариантов событий** (документация niri явно говорит об этом). Парсер -неизвестные ключи игнорирует. - -### 4.3. Алгоритм детекции - -``` -on event: - if event relates to outputs: - outputs = niri msg --json outputs - externals = [o for o in outputs - if not regex_match(internalConnectorRegex, o.name) - and o is connected] - externalPresent = len(externals) > 0 -``` - -«connected» = вывод физически присутствует. В niri JSON-схеме это -проверяется по наличию режимов (`modes` непусто) или статусу — уточнить -по факту в реализации; **отключённый пользователем (`niri msg output X -off`) внутренний дисплей всё равно считается присутствующим**, важна -именно физическая connectivity. - -### 4.4. Восстановление при падении event-stream - -Если процесс event-stream умер (niri рестартанул, и т.п.): - -1. Логируем warning. -2. Ждём 2 секунды. -3. Перезапускаем процесс. -4. Повторно — exponential backoff до 30 секунд. - -В период даунтайма event-stream `externalPresent` сохраняет последнее -известное значение. **Inhibitor не убиваем** только из-за падения -стрима — это бы привело к нежелательному suspend при простой ошибке -коммуникации. - -## 5. Inhibitor: жизненный цикл процесса - -### 5.1. Команда - -``` -systemd-inhibit \ - --what=handle-lid-switch \ - --who= \ - --why= \ - --mode=block \ - sleep infinity -``` - -### 5.2. Запуск - -`Process.running = inhibitorActive` — связать декларативно. QML сам -запустит/убьёт процесс при изменении свойства. - -### 5.3. Корректное завершение - -- При `inhibitorActive` → `false`: послать SIGTERM. `sleep infinity` - завершается мгновенно, systemd-inhibit отпускает блокировку. -- При выгрузке плагина (Noctalia disable / shutdown): обязательно - убить процесс. Quickshell `Process` должен делать это автоматически, - но **верифицировать** в реализации — в Component.onDestruction. -- Если systemd-inhibit отсутствует в PATH — лог error, нотификация - пользователю, плагин ведёт себя как `enabled=false` без возможности - включения, в Settings UI показывается ошибка. - -### 5.4. Уведомления - -При каждом переходе `inhibitorActive` (при `notify=true`): - -- `false → true`: notify-send «Clamshell ON — lid switch inhibited». -- `true → false`: notify-send «Clamshell OFF — normal lid behavior». - -Иконка — `display`/`laptop` в зависимости от состояния. App ID — -`noctalia-clamshell`, чтобы пользователь мог отдельно настроить правила -DnD. - -## 6. Структура файлов - -``` -clamshell/ -├── manifest.json -├── preview.png -├── README.md -├── Main.qml # фоновая логика, event-stream, Process -├── ControlCenterWidget.qml # тогл-баттон -├── BarWidget.qml # индикатор -├── Settings.qml # UI настроек -└── i18n/ - ├── en.json - └── ru.json -``` - -## 7. Контракт `manifest.json` - -```json -{ - "id": "clamshell", - "name": "Clamshell Mode", - "description": "Auto clamshell on external display, with manual override", - "version": "0.1.0", - "author": "<автор>", - "license": "MIT", - "minNoctaliaVersion": "3.6.0", - "components": { - "main": "Main.qml", - "controlCenterWidget": "ControlCenterWidget.qml", - "barWidget": "BarWidget.qml", - "settings": "Settings.qml" - }, - "defaultSettings": { - "enabled": true, - "alwaysShowBarWidget": false, - "notify": true, - "internalConnectorRegex": "^(eDP|LVDS|DSI)", - "inhibitorWho": "noctalia-clamshell" - }, - "ipc": { - "target": "plugin:clamshell", - "functions": ["enable", "disable", "toggle", "status", "refresh"] - } -} -``` - -## 8. Архитектура `Main.qml` (skeleton-контракт) - -Модуль `Main.qml` обязан экспортировать через `pluginApi.mainInstance`: - -- свойства: `enabled` (rw), `externalPresent` (ro), `inhibitorActive` (ro), - `outputs` (ro, list). -- сигналы: `stateChanged()` (любое изменение трёх state-bool). -- методы: `toggle()`, `enable()`, `disable()`, `refresh()`, `status()`. - -Виджеты получают эти данные через `pluginApi.mainInstance.*`. Виджеты -**не должны** дублировать логику парсинга niri JSON или запускать свои -процессы. - -## 9. Acceptance criteria - -Плагин считается готовым, когда выполнены все пункты: - -### 9.1. Авто-сценарий - -1. Ноут без внешнего экрана, `enabled=true` → `inhibitorActive=false`, - `systemd-inhibit --list | grep noctalia-clamshell` пусто. -2. Подключаем HDMI/DP → в течение **<1 секунды** `inhibitorActive=true`, - `systemd-inhibit --list` показывает запись с `--who=noctalia-clamshell`. -3. Отключаем кабель → в течение **<1 секунды** inhibitor снят. -4. Закрытие крышки в состоянии (2): laptop **не** уходит в suspend, - `eDP-1` гаснет. -5. Закрытие крышки в состоянии (1): laptop уходит в suspend как обычно. - -### 9.2. Override-сценарий - -6. В состоянии (2) кликнули кнопку Control Center → `enabled=false`, - inhibitor моментально снят. -7. В этом же состоянии закрытие крышки → suspend (несмотря на - подключённый внешний). -8. Повторный клик → `enabled=true`, при подключённом внешнем inhibitor - восстанавливается. - -### 9.3. IPC - -9. `qs -c noctalia-shell ipc call plugin:clamshell toggle` инвертирует - `enabled`, возвращает новое значение. -10. `qs -c noctalia-shell ipc call plugin:clamshell status` возвращает - валидный JSON по схеме из 3.5. -11. Привязка хоткея в niri (`Mod+Shift+L`) на toggle работает идентично - клику в UI. - -### 9.4. Устойчивость - -12. Перезапуск Noctalia: `enabled` восстанавливается из настроек, - inhibitor поднимается заново если `externalPresent`. -13. `pkill niri` (имитация падения compositor): после рестарта niri - плагин восстанавливает event-stream без вмешательства пользователя. -14. Удаление systemd-inhibit бинарника: плагин не падает, выдаёт - видимую ошибку в UI. -15. Подключение/отключение мониторов 10 раз подряд: нет утечек - процессов (`pgrep -f noctalia-clamshell` показывает не более одного). - -### 9.5. Качество - -16. Никаких лишних опросов (`niri msg outputs` вызывается только - реактивно из event-stream, не по таймеру). -17. Inhibitor процесс корректно закрывается при выгрузке плагина - (проверка: `qs ipc plugin:clamshell disable` + `pgrep -f - "noctalia-clamshell"` пусто). -18. Логирование через `qs.Commons.Logger`, без `console.log` в - проде. - -## 10. Граничные случаи и решения - -| Случай | Решение | -|--------|---------| -| Лид закрыт ДО старта плагина, внешний есть | niri уже погасил eDP, `externalPresent=true`, поднимаем inhibitor — корректно | -| Лид закрыт, внешний отключают | inhibitor снимается, **но крышка УЖЕ закрыта** → следующий лид-эвент случится только при открытии. logind в этом момент уже не в clamshell-режиме. Считаем это user error, документируем в README | -| Внешний — это второй встроенный экран (DSI на конвертах) | regex `internalConnectorRegex` настраивается пользователем | -| Несколько внешних подряд: HDMI вытыкают, DP всё ещё есть | `externalPresent` остаётся `true`, inhibitor не дёргается | -| Suspend/resume цикл | event-stream может выжить или умереть, см. 4.4. После resume — niri в любом случае шлёт фуллстейт через стрим | -| Hibernate | После hibernate ситуация идентична resume | -| Multi-seat / multi-user | Out of scope. Inhibitor работает в рамках сессии текущего пользователя | - -## 11. Что НЕ входит в скоуп - -- Lock-screen при закрытии крышки (это задача niri `switch-events` или - swayidle, не плагина). -- Управление DPMS / brightness внешнего экрана. -- Ручной выбор какие именно мониторы триггерят clamshell (всё или - ничего). -- Hot-plug audio (sink switching) — это другой плагин. -- Откат `HandleLidSwitchDocked=ignore` если он был выставлен ранее — - только упомянуть в README, что для корректной работы плагина в - `logind.conf` должно быть значение по умолчанию (`suspend`). - -## 12. Тест-план - -Помимо acceptance criteria выше, перед мержем прогнать: - -1. **Unit-уровень (вручную, без фреймворка):** запустить плагин, дёргать - IPC `enable`/`disable`/`toggle`/`status` → сверить с - `systemd-inhibit --list`. -2. **Имитация event-stream:** подменить `niri` фиктивным скриптом, - эмулирующим события подключения/отключения — проверить реакцию. -3. **Запись лога:** прогнать сценарии 9.1–9.4, в `journalctl --user -u - noctalia*` не должно быть ошибок (warning от backoff допустимы). -4. **Память:** оставить плагин на 24 часа с периодическим - plug/unplug — RSS Quickshell не должен расти линейно. - -## 13. Полезные ссылки для реализации - -- niri IPC: -- niri-ipc Rust crate (полные определения событий и outputs): - -- Noctalia plugin docs: - -- Hello-world пример (всё включено): - → `hello-world/` -- systemd-inhibit man: `man systemd-inhibit`, особенно секция о - `--what=handle-lid-switch` и `--mode=block`. - -## 14. Вопросы открытые на усмотрение реализатора - -- Конкретный набор событий event-stream, на которые подписываться - (зависит от версии niri-ipc, проверить в crate). -- Какую именно иконку использовать для bar widget — на выбор из - доступных в Noctalia icon set. -- Структура read-only Settings блока (таблица vs список). -- Использовать ли direct UNIX socket к `$NIRI_SOCKET` вместо запуска - `niri msg` процесса (производительнее, но усложняет код). Допустимо - оба варианта; для начала — через `Process` с `niri msg`. - ---- - -**Definition of Done:** все 18 acceptance criteria выполнены, -README с примером настройки niri-биндинга и одной картинкой preview.png -лежит в репозитории, плагин ставится через стандартный механизм -Noctalia Plugin Registry (или из локальной папки). From a8b1b2cbb53bde462aa497c41a2b4f1045d6a3be Mon Sep 17 00:00:00 2001 From: Sovego Date: Mon, 4 May 2026 13:27:48 +0700 Subject: [PATCH 5/5] fix: address clamshell translation review --- clamshell/BarWidget.qml | 4 ++-- clamshell/ControlCenterWidget.qml | 2 +- clamshell/Main.qml | 10 +++++----- clamshell/Settings.qml | 22 +++++++++++++--------- clamshell/i18n/en.json | 6 ++++++ clamshell/i18n/ru.json | 6 ++++++ 6 files changed, 33 insertions(+), 17 deletions(-) diff --git a/clamshell/BarWidget.qml b/clamshell/BarWidget.qml index 8109a441b..1b04978d9 100644 --- a/clamshell/BarWidget.qml +++ b/clamshell/BarWidget.qml @@ -23,7 +23,7 @@ NIconButton { readonly property var main: pluginApi ? pluginApi.mainInstance : null readonly property bool isActive: !!main && main.enabled && main.externalPresent readonly property bool isDisabled: !main || !main.enabled - readonly property string stateText: main?.stateLabel ? main.stateLabel() : (pluginApi?.tr("state.disabled") || "Off") + readonly property string stateText: main?.stateLabel ? main.stateLabel() : pluginApi?.tr("state.disabled") readonly property string outputsText: main?.outputSummary ? main.outputSummary() : "" visible: root.alwaysShowBarWidget || (!!main && main.inhibitorActive) @@ -50,7 +50,7 @@ NIconButton { model: [ { - "label": pluginApi?.tr("menu.settings") || "Settings", + "label": pluginApi?.tr("menu.settings"), "action": "settings", "icon": "settings" } diff --git a/clamshell/ControlCenterWidget.qml b/clamshell/ControlCenterWidget.qml index dae0a82ab..dde237b75 100644 --- a/clamshell/ControlCenterWidget.qml +++ b/clamshell/ControlCenterWidget.qml @@ -13,7 +13,7 @@ NIconButtonHot { readonly property bool isActive: !!main && main.enabled && main.externalPresent readonly property bool isStandby: !!main && main.enabled && !main.externalPresent readonly property bool isDisabled: !main || !main.enabled - readonly property string stateText: main?.stateLabel ? main.stateLabel() : (pluginApi?.tr("state.disabled") || "Off") + readonly property string stateText: main?.stateLabel ? main.stateLabel() : pluginApi?.tr("state.disabled") readonly property string outputsText: main?.outputSummary ? main.outputSummary() : "" icon: "device-desktop" diff --git a/clamshell/Main.qml b/clamshell/Main.qml index ae143b176..c08509f0b 100644 --- a/clamshell/Main.qml +++ b/clamshell/Main.qml @@ -154,9 +154,9 @@ Item { } function stateLabel() { - if (!root.enabled) return pluginApi?.tr("state.disabled") || "Off"; - if (root.externalPresent) return pluginApi?.tr("state.active") || "On - external display detected"; - return pluginApi?.tr("state.standby") || "Auto - no external display"; + if (!root.enabled) return pluginApi?.tr("state.disabled"); + if (root.externalPresent) return pluginApi?.tr("state.active"); + return pluginApi?.tr("state.standby"); } function outputSummary() { @@ -479,8 +479,8 @@ Item { if (!root.componentReady || !root.notifyEnabled) return; var msg = active - ? (pluginApi?.tr("notify.on") || "Clamshell ON - lid switch inhibited") - : (pluginApi?.tr("notify.off") || "Clamshell OFF - normal lid behavior"); + ? pluginApi?.tr("notify.on") + : pluginApi?.tr("notify.off"); ToastService.showNotice("Clamshell Mode", msg, "device-desktop"); } diff --git a/clamshell/Settings.qml b/clamshell/Settings.qml index deecbfc64..b027f1e98 100644 --- a/clamshell/Settings.qml +++ b/clamshell/Settings.qml @@ -38,26 +38,26 @@ ColumnLayout { Layout.fillWidth: true NToggle { - label: pluginApi?.tr("settings.enabled") || "Enable clamshell mode" + label: pluginApi?.tr("settings.enabled") checked: root.editEnabled onToggled: checked => root.editEnabled = checked } NToggle { - label: pluginApi?.tr("settings.alwaysShowBarWidget") || "Always show bar icon" + label: pluginApi?.tr("settings.alwaysShowBarWidget") checked: root.editAlwaysShowBarWidget onToggled: checked => root.editAlwaysShowBarWidget = checked } NToggle { - label: pluginApi?.tr("settings.notify") || "Show notifications" + label: pluginApi?.tr("settings.notify") checked: root.editNotify onToggled: checked => root.editNotify = checked } NTextInput { Layout.fillWidth: true - label: pluginApi?.tr("settings.internalConnectorRegex") || "Internal connector pattern" + label: pluginApi?.tr("settings.internalConnectorRegex") placeholderText: "^(eDP|LVDS|DSI)" text: root.editInternalConnectorRegex onTextChanged: root.editInternalConnectorRegex = text @@ -65,7 +65,7 @@ ColumnLayout { NTextInput { Layout.fillWidth: true - label: pluginApi?.tr("settings.inhibitorWho") || "Inhibitor identifier" + label: pluginApi?.tr("settings.inhibitorWho") placeholderText: "noctalia-clamshell" text: root.editInhibitorWho onTextChanged: root.editInhibitorWho = text @@ -75,7 +75,7 @@ ColumnLayout { NText { visible: root.main.inhibitorAvailable === false Layout.fillWidth: true - text: pluginApi?.tr("error.noInhibit") || "systemd-inhibit not found - plugin disabled" + text: pluginApi?.tr("error.noInhibit") color: Color.mError pointSize: Style.fontSizeM wrapMode: Text.WordWrap @@ -86,7 +86,7 @@ ColumnLayout { Layout.fillWidth: true NText { - text: "Status" + text: pluginApi?.tr("status.title") color: Color.mOnSurface pointSize: Style.fontSizeL font.weight: Font.DemiBold @@ -94,14 +94,18 @@ ColumnLayout { NText { Layout.fillWidth: true - text: "State: " + (root.main.stateLabel ? root.main.stateLabel() : "Unknown") + text: pluginApi?.tr("status.state", { + "value": root.main.stateLabel ? root.main.stateLabel() : pluginApi?.tr("status.unknown") + }) color: Color.mOnSurfaceVariant wrapMode: Text.WordWrap } NText { Layout.fillWidth: true - text: "Inhibitor PID: " + (root.main.inhibitorPid > 0 ? String(root.main.inhibitorPid) : "-") + text: pluginApi?.tr("status.inhibitorPid", { + "value": root.main.inhibitorPid > 0 ? String(root.main.inhibitorPid) : "-" + }) color: Color.mOnSurfaceVariant wrapMode: Text.WordWrap } diff --git a/clamshell/i18n/en.json b/clamshell/i18n/en.json index ca8f11764..5e6427827 100644 --- a/clamshell/i18n/en.json +++ b/clamshell/i18n/en.json @@ -15,6 +15,12 @@ "internalConnectorRegex": "Internal connector pattern", "inhibitorWho": "Inhibitor identifier" }, + "status": { + "title": "Status", + "state": "State: {value}", + "inhibitorPid": "Inhibitor PID: {value}", + "unknown": "Unknown" + }, "error": { "noInhibit": "systemd-inhibit not found - plugin disabled", "noSocket": "niri socket unavailable" diff --git a/clamshell/i18n/ru.json b/clamshell/i18n/ru.json index 95b6d82e6..a28e648e5 100644 --- a/clamshell/i18n/ru.json +++ b/clamshell/i18n/ru.json @@ -15,6 +15,12 @@ "internalConnectorRegex": "Паттерн внутренних коннекторов", "inhibitorWho": "Идентификатор инхибитора" }, + "status": { + "title": "Статус", + "state": "Состояние: {value}", + "inhibitorPid": "PID инхибитора: {value}", + "unknown": "Неизвестно" + }, "error": { "noInhibit": "systemd-inhibit не найден - плагин отключён", "noSocket": "niri socket недоступен"