Remove update-right-status defer hack, call PromptInputLine directly
The real bug was the invalid initial_value field (fixed previously), not Enter bleed-through from InputSelector. The defer-via-status-tick workaround left a gap (up to the status update interval) between the InputSelector closing and the PromptInputLine actually capturing keyboard input -- during that gap the underlying shell was visible (the reported flash) and any keystrokes typed during it went to the shell instead of the field. This is especially damaging for the 3-step SSH domain flow, where hitting the gap on any step submits an empty line and the whole entry is silently cancelled without saving. Calling perform_action synchronously, as before the call_after/defer detour, removes the gap entirely. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
82
wezterm.lua
82
wezterm.lua
@@ -94,23 +94,7 @@ end)
|
|||||||
-- ------------------------------------------------------------
|
-- ------------------------------------------------------------
|
||||||
local pane_start_times = {}
|
local pane_start_times = {}
|
||||||
|
|
||||||
-- InputSelector 선택 콜백 안에서 바로 PromptInputLine을 열면, 선택을 확정한 Enter가
|
|
||||||
-- 새 입력창에도 흘러들어가 즉시 닫혀버린다 (wezterm.time.call_after가 없는 버전에서는
|
|
||||||
-- 그 호출 자체가 에러로 죽어서 아예 아무것도 안 뜨고 밑에 있던 셸이 그대로 보인다).
|
|
||||||
-- 어느 wezterm 버전에서도 이미 동작 중인 update-right-status 틱에 실행을 미뤄서 우회한다.
|
|
||||||
local pending_action = nil
|
|
||||||
|
|
||||||
local function defer(fn)
|
|
||||||
pending_action = fn
|
|
||||||
end
|
|
||||||
|
|
||||||
wezterm.on("update-right-status", function(window, pane)
|
wezterm.on("update-right-status", function(window, pane)
|
||||||
if pending_action then
|
|
||||||
local fn = pending_action
|
|
||||||
pending_action = nil
|
|
||||||
fn(window, pane)
|
|
||||||
end
|
|
||||||
|
|
||||||
window:set_left_status(wezterm.format({
|
window:set_left_status(wezterm.format({
|
||||||
{ Background = { Color = "#89b4fa" } },
|
{ Background = { Color = "#89b4fa" } },
|
||||||
{ Foreground = { Color = "#1e1e2e" } },
|
{ Foreground = { Color = "#1e1e2e" } },
|
||||||
@@ -222,21 +206,19 @@ local function set_config_value(window, pane, key, value)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function prompt_config_value(window, pane, title, key, initial_value, quote_string)
|
local function prompt_config_value(window, pane, title, key, initial_value, quote_string)
|
||||||
defer(function(inner_window, inner_pane)
|
window:perform_action(
|
||||||
inner_window:perform_action(
|
act.PromptInputLine({
|
||||||
act.PromptInputLine({
|
description = title .. " (현재: " .. tostring(initial_value) .. ")",
|
||||||
description = title .. " (현재: " .. tostring(initial_value) .. ")",
|
action = wezterm.action_callback(function(cb_window, cb_pane, line)
|
||||||
action = wezterm.action_callback(function(cb_window, cb_pane, line)
|
if not line or line == "" then
|
||||||
if not line or line == "" then
|
return
|
||||||
return
|
end
|
||||||
end
|
local value = quote_string and string.format("%q", line) or line
|
||||||
local value = quote_string and string.format("%q", line) or line
|
set_config_value(cb_window, cb_pane, key, value)
|
||||||
set_config_value(cb_window, cb_pane, key, value)
|
end),
|
||||||
end),
|
}),
|
||||||
}),
|
pane
|
||||||
inner_pane
|
)
|
||||||
)
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function show_font_settings(window, pane)
|
local function show_font_settings(window, pane)
|
||||||
@@ -303,28 +285,26 @@ local ssh_domain_steps = {
|
|||||||
local function prompt_ssh_domain_step(window, pane, step_index, data)
|
local function prompt_ssh_domain_step(window, pane, step_index, data)
|
||||||
local step = ssh_domain_steps[step_index]
|
local step = ssh_domain_steps[step_index]
|
||||||
|
|
||||||
defer(function(inner_window, inner_pane)
|
window:perform_action(
|
||||||
inner_window:perform_action(
|
act.PromptInputLine({
|
||||||
act.PromptInputLine({
|
description = step.title,
|
||||||
description = step.title,
|
action = wezterm.action_callback(function(cb_window, cb_pane, line)
|
||||||
action = wezterm.action_callback(function(cb_window, cb_pane, line)
|
if not line or line == "" then
|
||||||
if not line or line == "" then
|
notify(cb_window, "SSH 도메인 추가를 취소했습니다")
|
||||||
notify(cb_window, "SSH 도메인 추가를 취소했습니다")
|
return
|
||||||
return
|
end
|
||||||
end
|
|
||||||
|
|
||||||
data[step.field] = line
|
data[step.field] = line
|
||||||
|
|
||||||
if step_index < #ssh_domain_steps then
|
if step_index < #ssh_domain_steps then
|
||||||
prompt_ssh_domain_step(cb_window, cb_pane, step_index + 1, data)
|
prompt_ssh_domain_step(cb_window, cb_pane, step_index + 1, data)
|
||||||
else
|
else
|
||||||
append_ssh_domain(cb_window, cb_pane, data.name, data.remote_address, data.username)
|
append_ssh_domain(cb_window, cb_pane, data.name, data.remote_address, data.username)
|
||||||
end
|
end
|
||||||
end),
|
end),
|
||||||
}),
|
}),
|
||||||
inner_pane
|
pane
|
||||||
)
|
)
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function prompt_ssh_domain(window, pane)
|
local function prompt_ssh_domain(window, pane)
|
||||||
|
|||||||
Reference in New Issue
Block a user