* Apply the terminal tag to Omarchy's own terminal windows Omarchy launches TUIs and its own terminal windows under dedicated app-ids (org.omarchy.btop, org.omarchy.terminal, TUI.float, ...), so the class never matched the terminal that drew the window and those windows went untagged. Also drop the tag's opacity rule, which stripped default-opacity only to re-apply the identical value. Themes still override through the tag. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Match terminals by tag for universal clipboard shortcuts The binding kept its own list of terminal classes, so SUPER + C in a TUI window sent CTRL + C instead of CTRL + Insert. Read the terminal tag instead of duplicating the definition. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
49 lines
1.8 KiB
Lua
49 lines
1.8 KiB
Lua
-- Send with explicit mods to the focused surface by omitting the window target,
|
|
-- so universal clipboard shortcuts reach both normal windows and focused
|
|
-- 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)
|
|
return function()
|
|
hl.dispatch(hl.dsp.send_key_state({ mods = mods, key = key, state = "down" }))
|
|
|
|
hl.timer(function()
|
|
hl.dispatch(hl.dsp.send_key_state({ mods = mods, key = key, state = "up" }))
|
|
end, { timeout = 50, type = "oneshot" })
|
|
end
|
|
end
|
|
|
|
-- Lean on the terminal tag from default/hypr/apps/terminals.lua so there's one
|
|
-- definition of what counts as a terminal. Dynamic tags carry a trailing "*".
|
|
local function active_window_is_terminal()
|
|
local window = hl.get_active_window()
|
|
if not window then
|
|
return false
|
|
end
|
|
|
|
for _, tag in ipairs(window.tags or {}) do
|
|
if tag:gsub("%*$", "") == "terminal" then
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
local function universal_clipboard_shortcut(default_mods, default_key, terminal_mods, terminal_key)
|
|
return function()
|
|
if active_window_is_terminal() then
|
|
send_shortcut_once(terminal_mods, terminal_key)()
|
|
else
|
|
send_shortcut_once(default_mods, default_key)()
|
|
end
|
|
end
|
|
end
|
|
|
|
o.bind("SUPER + C", "Universal copy", universal_clipboard_shortcut("CTRL", "C", "CTRL", "Insert"))
|
|
o.bind("SUPER + V", "Universal paste", universal_clipboard_shortcut("CTRL", "V", "SHIFT", "Insert"))
|
|
o.bind("SUPER + X", "Universal cut", send_shortcut_once("CTRL", "X"))
|
|
o.bind("SUPER + CTRL + V", "Clipboard manager", "omarchy-shell shell toggle omarchy.clipboard")
|