Keep universal clipboard shortcuts working in terminals

Sending the shortcut through wtype's virtual keyboard let the physically
held SUPER merge into the injected chord, so terminals saw
SUPER+CTRL+Insert instead of CTRL+Insert, and injected CTRL+V could even
trigger the SUPER+CTRL+V clipboard manager bind. Send via send_key_state
with no window target instead: explicit mods go straight to the focused
surface, layer-shell panels included.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XnMDbwJXQA3fvW8o8Pwr97
This commit is contained in:
David Heinemeier Hansson
2026-07-23 18:08:31 -07:00
co-authored by Claude Fable 5
parent 63955e787f
commit a0e6d65ba8
2 changed files with 21 additions and 9 deletions
+12 -5
View File
@@ -1,10 +1,17 @@
-- Send through the virtual keyboard so universal clipboard shortcuts reach -- Send with explicit mods to the focused surface by omitting the window target,
-- both normal windows and focused layer-shell surfaces such as Omarchy panels. -- so universal clipboard shortcuts reach both normal windows and focused
-- Hyprland's send_key_state with window = "activewindow" cannot target layers. -- layer-shell surfaces such as Omarchy panels. A virtual keyboard (wtype) won't
-- do: the physically held SUPER merges into the injected chord at the seat.
-- The down/up split works around Hyprland send_shortcut sometimes leaving
-- synthetic key state stuck/repeating.
-- https://github.com/hyprwm/Hyprland/discussions/14099
local function send_shortcut_once(mods, key) local function send_shortcut_once(mods, key)
return function() return function()
local modifier = mods:lower() hl.dispatch(hl.dsp.send_key_state({ mods = mods, key = key, state = "down" }))
hl.dispatch(hl.dsp.exec_cmd("wtype -M " .. modifier .. " -k " .. key:lower() .. " -m " .. modifier))
hl.timer(function()
hl.dispatch(hl.dsp.send_key_state({ mods = mods, key = key, state = "up" }))
end, { timeout = 50, type = "oneshot" })
end end
end end
+9 -4
View File
@@ -105,15 +105,20 @@ grep -Fq $'SUPER + RETURN Terminal' <<<"$fresh_output" || fail "default applicat
grep -Fq $'SUPER + SHIFT + A ChatGPT' <<<"$fresh_output" || fail "default application bindings include preinstalled web apps" grep -Fq $'SUPER + SHIFT + A ChatGPT' <<<"$fresh_output" || fail "default application bindings include preinstalled web apps"
pass "default application bindings load from package defaults" pass "default application bindings load from package defaults"
grep -F 'hl.dsp.exec_cmd("wtype -M " .. modifier .. " -k " .. key:lower() .. " -m " .. modifier)' "$ROOT/default/hypr/bindings/clipboard.lua" >/dev/null || grep -F 'hl.dsp.send_key_state({ mods = mods, key = key, state = "down" })' "$ROOT/default/hypr/bindings/clipboard.lua" >/dev/null ||
fail "universal clipboard shortcuts use the virtual keyboard" fail "universal clipboard shortcuts send explicit mods to the focused surface"
pass "universal clipboard shortcuts reach focused layer-shell fields" pass "universal clipboard shortcuts send explicit mods to the focused surface"
if grep -F 'hl.dsp.send_key_state' "$ROOT/default/hypr/bindings/clipboard.lua" >/dev/null; then if grep -E 'send_key_state\(\{[^}]*window' "$ROOT/default/hypr/bindings/clipboard.lua" >/dev/null; then
fail "universal clipboard shortcuts do not target only normal windows" fail "universal clipboard shortcuts do not target only normal windows"
fi fi
pass "universal clipboard shortcuts do not exclude layer-shell fields" pass "universal clipboard shortcuts do not exclude layer-shell fields"
if grep -F 'wtype -M' "$ROOT/default/hypr/bindings/clipboard.lua" >/dev/null; then
fail "universal clipboard shortcuts avoid the virtual keyboard so held SUPER cannot merge in"
fi
pass "universal clipboard shortcuts avoid virtual keyboard modifier merging"
removed_home="$tmpdir/removed-home" removed_home="$tmpdir/removed-home"
mkdir -p "$removed_home/.local/state/omarchy" mkdir -p "$removed_home/.local/state/omarchy"
touch "$removed_home/.local/state/omarchy/preinstalls-removed" touch "$removed_home/.local/state/omarchy/preinstalls-removed"