diff options
| author | ppggff <pgf00a@gmail.com> | 2026-07-05 08:25:47 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-05 03:25:47 +0300 |
| commit | 2bc1724c2dae72184a5d2ec070e30c70dc519f9b (patch) | |
| tree | 573a960e82f832455d303ca97ea1783587482ad6 /src/app/state.rs | |
| parent | e713949ca51facf1e40c584b271f812f527bc522 (diff) | |
fix: switch prefix ASCII input source on the foreground client (#1016)
* fix: switch prefix ASCII input source on the foreground client
The macOS prefix ASCII-switch ran in the headless server, whose
TISCopyCurrentKeyboardInputSource read is a stale per-process cache
(refreshed only via a main-run-loop notification the server never pumps),
so prefix could leave the terminal on the wrong input source.
Forward it to the foreground client, like clipboard: sync_prefix_input_source
emits AppEvent::PrefixInputSource as an intent; the server forwards it to the
foreground client and the monolithic app applies it in-process via
RealPrefixInputSource, which pumps its main run loop before the stale TIS read.
Key it on Mode::wants_ascii_input so multi-level prefix commands keep ASCII
until returning to the terminal, and restore the IME for rename text entry.
Adds ServerMessage::PrefixInputSource to the already-unreleased protocol 15.
refs #774
* fix: keep prefix input-source switch out of the headless server process
An App-internal drain (the exhaustive drain at the top of
handle_api_request, reachable from prefix-key runtime mutations) can
consume a queued PrefixInputSource intent before the server's
forwarding drain sees it, applying the TIS switch in the headless
server process and stranding the restore state. Gate the in-process
switch on App.local_input_source_switch, disabled by the headless
server alongside the other local side effects, so a swallowed intent
degrades to a skipped switch. Widen the forwarding-bypass maintenance
test to the handle_internal_event_with_prefix_sync wrapper.
refs #774
* docs: clarify prefix input-source comments and flag docs
refs #774
* fix: bump protocol for prefix input source
refs #774
---------
Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com>
Diffstat (limited to 'src/app/state.rs')
| -rw-r--r-- | src/app/state.rs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/app/state.rs b/src/app/state.rs index 99ab648b..eee61566 100644 --- a/src/app/state.rs +++ b/src/app/state.rs @@ -768,6 +768,33 @@ pub enum Mode { Navigator, } +impl Mode { + /// Whether keys in this mode are commands/navigation (an ASCII input source is wanted) rather + /// than free text. This is an explicit **allowlist** of the prefix command/navigation realm: + /// any mode NOT listed defaults to leaving the user's IME alone (the safe default), so adding a + /// new text-entry or overlay mode can never silently force ASCII. Used by + /// `sync_prefix_input_source` (gated by `switch_ascii_input_source_in_prefix`) so multi-level + /// prefix commands keep ASCII until they return to the terminal. + /// + /// Known limitation: `Navigator`'s search box is also held on ASCII, since this `Mode`-level + /// predicate can't see `search_focused` (non-ASCII filtering there would need a runtime check). + pub(crate) fn wants_ascii_input(self) -> bool { + matches!( + self, + Mode::Prefix + | Mode::Navigate + | Mode::Navigator + | Mode::Copy + | Mode::Resize + | Mode::ConfirmClose + | Mode::ConfirmRemoveWorktree + | Mode::ContextMenu + | Mode::GlobalMenu + | Mode::KeybindHelp + ) + } +} + #[derive(Debug, Clone, PartialEq, Eq)] pub(crate) enum NavigatorTarget { Workspace { |
