From 7102e59dc5fd22d144bcc3f1ef3f2c94d42046bd Mon Sep 17 00:00:00 2001 From: Jeena Date: Tue, 15 Sep 2026 08:36:08 +0900 Subject: [PATCH] hypr: guard whisrs hold-to-talk binds with daemon state Long holds occasionally dropped the release event in Hyprland, leaving whisrs recording until its silence auto-stop, and any stray toggle (key repeat, re-fired press) could invert the state so that pressing stopped and releasing started. The press and release binds now go through tiny scripts that check the daemon status first, making the toggle pair idempotent: start only when idle, stop only when recording. Also a note-to-self: Hyprland auto-reloads when files under the config symlink change, so a git rebase in this repo can transiently drop newly added binds; run hyprctl reload after git operations. --- hypr/keybindings.lua | 7 ++++--- hypr/scripts/whisrs-hold-start.sh | 4 ++++ hypr/scripts/whisrs-hold-stop.sh | 4 ++++ 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100755 hypr/scripts/whisrs-hold-start.sh create mode 100755 hypr/scripts/whisrs-hold-stop.sh diff --git a/hypr/keybindings.lua b/hypr/keybindings.lua index b2288ca..7469d95 100644 --- a/hypr/keybindings.lua +++ b/hypr/keybindings.lua @@ -38,6 +38,7 @@ hl.bind("F1", hl.dsp.pass({ window = "class:^(com.obsproject.Studio)$" })) hl.bind("F2", hl.dsp.pass({ window = "class:^(com.obsproject.Studio)$" })) -- Copilot key (sends SUPER+SHIFT+F23): hold-to-talk voice dictation via whisrs --- press = start recording, release = stop and transcribe -hl.bind("SUPER + SHIFT + F23", hl.dsp.exec_cmd("whisrs toggle")) -hl.bind("SUPER + SHIFT + F23", hl.dsp.exec_cmd("whisrs toggle"), { release = true }) +-- press = start recording, release = stop and transcribe. The scripts check the +-- daemon state so stray toggles (key repeat, missed release) can't invert it. +hl.bind("SUPER + SHIFT + F23", hl.dsp.exec_cmd("~/.config/hypr/scripts/whisrs-hold-start.sh")) +hl.bind("SUPER + SHIFT + F23", hl.dsp.exec_cmd("~/.config/hypr/scripts/whisrs-hold-stop.sh"), { release = true }) diff --git a/hypr/scripts/whisrs-hold-start.sh b/hypr/scripts/whisrs-hold-start.sh new file mode 100755 index 0000000..bd54b4d --- /dev/null +++ b/hypr/scripts/whisrs-hold-start.sh @@ -0,0 +1,4 @@ +#!/bin/sh +# Start dictation only when the daemon is idle. Guards against stray toggle +# events (key repeat, re-fired press binds) inverting the recording state. +[ "$(whisrs status 2>/dev/null)" = "idle" ] && exec whisrs toggle \ No newline at end of file diff --git a/hypr/scripts/whisrs-hold-stop.sh b/hypr/scripts/whisrs-hold-stop.sh new file mode 100755 index 0000000..a2f491f --- /dev/null +++ b/hypr/scripts/whisrs-hold-stop.sh @@ -0,0 +1,4 @@ +#!/bin/sh +# Stop dictation only when actually recording. If the release bind never +# fires, whisrs' own silence auto-stop (2s) ends the recording instead. +[ "$(whisrs status 2>/dev/null)" = "recording" ] && exec whisrs toggle \ No newline at end of file