Files
mesh-catalog/modules/screen-lock/cmd/screen-lock-tools/main.go
T
jochen 04f3f66f4b screen-lock: the lock screen as a module, claiming node-lock-screen and serving lock (hq ADR 0208)
The distribution's i3lock behind a locker that releases xss-lock's sleep lock
once it is up; timeouts and xss-lock from the session's xinitrc slot, ending
with the session; i3lock-color and xscreensaver declared absent; Go tools lock,
idle, inhibit and locked.
2026-10-04 13:10:58 +02:00

79 lines
2.8 KiB
Go

// screen-lock's Go tools bundle (novox/hq ADR 0188, ADR 0193, ADR 0208): its implementation of
// node-lock-screen's verb `lock`, and its own tools for the idle timeouts, served by the node's
// runtime as the operator account.
package main
import (
"fmt"
"os"
stdio "git.novox.be/novox/mesh-sdk/go"
)
func main() {
if err := stdio.Serve("", tools()); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
func tools() []stdio.Tool {
return []stdio.Tool{
{
Name: "node-lock-screen.lock",
Description: "Lock the operator's session now. It goes through logind, so the one locker the " +
"session runs answers it, as the lock key and a closed lid do. Answers whether the screen is " +
"locked and since when.",
Run: func(map[string]any) (any, error) { return Lock() },
},
{
Name: "screen_lock_idle",
Description: "The screen's idle timeouts: after how long idle the session locks (the X screensaver) " +
"and when the displays go to standby, suspend and off (DPMS). Give any of them to change it for " +
"this session; the declared ones return at the next login.",
Input: map[string]any{
"lock_after_seconds": map[string]any{"type": "integer", "description": "idle time before the lock; 0 never"},
"standby_seconds": map[string]any{"type": "integer", "description": "DPMS standby; 0 never"},
"suspend_seconds": map[string]any{"type": "integer", "description": "DPMS suspend; 0 never"},
"off_seconds": map[string]any{"type": "integer", "description": "DPMS off; 0 never"},
},
Run: func(args map[string]any) (any, error) {
change, err := idleChangeOf(args)
if err != nil {
return nil, err
}
return Idle(change)
},
},
{
Name: "screen_lock_inhibit",
Description: "Keep the screen on and unlocked for a while — a presentation, a film, a long read: " +
"no idle lock and no display power-off for `minutes`, then the timeouts as they were. 0 ends an " +
"inhibition early. A lock asked for by hand, by the lid or before suspend still locks.",
Input: map[string]any{
"type": "object",
"properties": map[string]any{
"minutes": map[string]any{"type": "integer", "description": fmt.Sprintf("how long, 1-%d; 0 ends it now", mostInhibit)},
},
"required": []string{"minutes"},
},
Run: func(args map[string]any) (any, error) {
if _, given := args["minutes"]; !given {
return nil, fmt.Errorf("minutes is required")
}
minutes, err := whole(args, "minutes", 0, 0, mostInhibit)
if err != nil {
return nil, err
}
return Inhibit(minutes)
},
},
{
Name: "screen_lock_locked",
Description: "Is the operator's session locked now, and since when; whether the lock watcher " +
"(xss-lock) runs, and whether an inhibition is keeping the screen on.",
Run: func(map[string]any) (any, error) { return Locked() },
},
}
}