aboutsummaryrefslogtreecommitdiff
path: root/src/client/shell/input_source.rs
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-06 02:27:06 +0300
committerGitHub <noreply@github.com>2026-09-06 02:27:06 +0300
commit9e9bc8a144667a6b7debfd4f0c7a31ff0e11493a (patch)
tree03f1259f91fd9edeacfd4b904f2e84d4acf25232 /src/client/shell/input_source.rs
parent35b0dff96579f099e0436290085024424ffb289c (diff)
feat: manage multiple ssh machines from one client (#3670)
Diffstat (limited to 'src/client/shell/input_source.rs')
-rw-r--r--src/client/shell/input_source.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/client/shell/input_source.rs b/src/client/shell/input_source.rs
new file mode 100644
index 00000000..7997c72f
--- /dev/null
+++ b/src/client/shell/input_source.rs
@@ -0,0 +1,41 @@
+use super::*;
+
+impl ClientShellState {
+ fn wants_ascii_input(&self) -> bool {
+ if let Some(overlay) = self.overlay.as_ref() {
+ return matches!(
+ overlay,
+ ClientShellOverlay::ConfirmClose(_)
+ | ClientShellOverlay::Help(_)
+ | ClientShellOverlay::Navigator(_)
+ | ClientShellOverlay::WorktreeRemove(_)
+ | ClientShellOverlay::ContextMenu(_)
+ | ClientShellOverlay::GlobalMenu(_)
+ );
+ }
+ matches!(
+ self.mode,
+ ClientShellMode::Prefix
+ | ClientShellMode::Navigate
+ | ClientShellMode::Resize
+ | ClientShellMode::Copy
+ )
+ }
+
+ pub(crate) fn reconcile_input_source(&mut self) {
+ // Keep the platform restore token while another window has focus. Restoring
+ // through a global key injection is only safe after this client regains focus.
+ if self.outer_focused == Some(false) {
+ return;
+ }
+ let desired = self.config.switch_ascii_input_source_in_prefix && self.wants_ascii_input();
+ if desired != self.ascii_input_source_active {
+ self.ascii_input_source_active = desired;
+ self.pending_input_source_changes.push(desired);
+ }
+ }
+
+ pub(crate) fn take_input_source_changes(&mut self) -> Vec<bool> {
+ std::mem::take(&mut self.pending_input_source_changes)
+ }
+}