feat(blankpad): desk.sh profile switcher, hotplug autoswitch daemon, keybinds doc generator + bats suite

- desk.sh: list/current/switch/cycle/match/capture over cfg/desk-*.kdl
  profiles; apply = relink display.kdl, niri validate (rollback on fail),
  load-config-file, noctalia notification; match scores // requires: lines
  (EDID long names) against live niri msg outputs
- desk-autoswitch.sh: watch niri msg --json event-stream for
  OutputsChanged, debounced desk.sh match --apply, reconnect loop
- blankpad-desk-autoswitch.service: ConditionHost=blankpad user unit
- gen-keybinds.sh: keybinds.kdl -> markdown cheat sheet (sections from
  // --- headers, hotkey-overlay-title preferred over action)
- tests/: 27 bats cases, all green (desk 16, gen-keybinds 6,
  niri-config 5 incl. real niri validate on the assembled tree with
  each desk profile active)
This commit is contained in:
Frank committed 2026-10-09 14:40:26 -07:00
1 parent 4ec47a5b7e
commit f63d11de85
10 files changed
+703

No files matched your search

@@ -0,0 +1,19 @@
[Unit]
Description=Desk Profile Auto-Switch for Blankpad
After=graphical-session.target
ConditionHost=blankpad
[Service]
Type=simple
User=%u
Group=%u
ExecStart=/usr/bin/env bash %h/.omp/scripts/desk-autoswitch.sh watch
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
Environment=DESK_NIRI=/usr/bin/niri
Environment=DESK_NOTIFY=noctalia msg notification-show
[Install]
WantedBy=default.target
+1
View File
@@ -0,0 +1 @@
../../../../scripts/desk.sh
@@ -0,0 +1,5 @@
# Handy Settings Template
This directory contains a template for Handy's settings store. The app rewrites the live store at `~/.local/share/com.pais.handy/settings_store.json`.
Keys that might contain sensitive information (e.g., API tokens, base URLs) should stay out of the repo.
@@ -0,0 +1,22 @@
{
"// template: Handy settings store, rewritten live by the app": true,
"// app rewrites live store: ~/.local/share/com.pais.handy/settings_store.json": true,
"// keys stay out of repo": true,
"autostart_enabled": false,
"post_process_enabled": true,
"provider": "custom",
"base_url": "http://192.168.0.143:7771/v1",
"model": "frank-secondary",
"prompt": "default_improve_transcriptions",
"push_to_talk": true,
"bindings": {
"transcribe": "ctrl+space",
"transcribe_with_post_process": "ctrl+shift+space",
"cancel": "escape"
},
"keyboard_implementation": "handy_keys",
"overlay_position": "bottom",
"overlay_style": "live",
"paste_method": "none",
"clipboard_handling": "copy_to_clipboard"
}