67 lines
2.1 KiB
Lua
67 lines
2.1 KiB
Lua
local paths = require("default.hypr.paths")
|
|
|
|
-- Same terminal tag test as clipboard.lua.
|
|
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
|
|
|
|
-- Read on demand so adding an engine in a live desktop needs no reload.
|
|
local function has_input_method()
|
|
local file = io.open(paths.config_home .. "/fcitx5/profile", "r")
|
|
if not file then return false end
|
|
local in_item, found = false, false
|
|
for line in file:lines() do
|
|
if line:match("^%[") then
|
|
in_item = line:match("^%[Groups/%d+/Items/%d+%]$") ~= nil
|
|
elseif in_item then
|
|
local name = line:match("^Name=(.+)$")
|
|
if name and not name:match("^keyboard%-") then found = true end
|
|
end
|
|
end
|
|
file:close()
|
|
return found
|
|
end
|
|
|
|
-- Preserve custom Ctrl + Space triggers. Without a
|
|
-- [Hotkey/TriggerKeys] list in the config, fcitx5 uses its default, which has
|
|
-- Ctrl + Space.
|
|
local function fcitx5_toggles_on_ctrl_space()
|
|
local file = io.open(paths.config_home .. "/fcitx5/config", "r")
|
|
if not file then
|
|
return true
|
|
end
|
|
|
|
local in_triggers, has_triggers, toggles = false, false, false
|
|
for line in file:lines() do
|
|
if line:match("^%[") then
|
|
in_triggers = line == "[Hotkey/TriggerKeys]"
|
|
has_triggers = has_triggers or in_triggers
|
|
elseif in_triggers and line:match("^%d+=Control%+space$") then
|
|
toggles = true
|
|
end
|
|
end
|
|
|
|
file:close()
|
|
return toggles or not has_triggers
|
|
end
|
|
|
|
-- Pass the tmux/Herdr prefix through and return to direct input, so the next
|
|
-- key reaches the multiplexer instead of the engine's composition.
|
|
o.bind("CTRL + SPACE", "Direct input for the terminal prefix", function()
|
|
if active_window_is_terminal() and has_input_method() and not fcitx5_toggles_on_ctrl_space() then
|
|
-- Wait for the local controller reply before dispatching the next key.
|
|
o.shell_succeeds("timeout 0.3 fcitx5-remote --check -c")
|
|
end
|
|
end, { non_consuming = true })
|