diff options
| author | Can Celik <ogulcancelik@gmail.com> | 2026-09-06 02:27:06 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-06 02:27:06 +0300 |
| commit | 9e9bc8a144667a6b7debfd4f0c7a31ff0e11493a (patch) | |
| tree | 03f1259f91fd9edeacfd4b904f2e84d4acf25232 /src/server/headless/render.rs | |
| parent | 35b0dff96579f099e0436290085024424ffb289c (diff) | |
feat: manage multiple ssh machines from one client (#3670)
Diffstat (limited to 'src/server/headless/render.rs')
| -rw-r--r-- | src/server/headless/render.rs | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/server/headless/render.rs b/src/server/headless/render.rs index 991d1861..5e36be01 100644 --- a/src/server/headless/render.rs +++ b/src/server/headless/render.rs @@ -39,7 +39,10 @@ impl HeadlessServer { .iter() .filter_map(|(&client_id, client)| match &client.mode { ClientConnectionMode::ClientShell => { - let focused = self.shell_focused_runtime(client_id); + let focused = client + .shell_surface_active + .then(|| self.shell_focused_runtime(client_id)) + .flatten(); let child_requests_mouse = focused.is_some_and(|(runtime, _)| runtime.mouse_reporting_enabled()); let sgr_pixels = client.pixel_mouse @@ -49,8 +52,9 @@ impl HeadlessServer { }); Some(( client_id, - client.shell_mouse_capture || child_requests_mouse, - sgr_pixels, + client.shell_surface_active + && (client.shell_mouse_capture || child_requests_mouse), + client.shell_surface_active && sgr_pixels, )) } ClientConnectionMode::TerminalAttach { terminal_id } => { @@ -113,9 +117,10 @@ impl HeadlessServer { .clients .iter() .filter(|(_, client)| client.is_shell_client()) - .map(|(&client_id, _)| { - let report_all = - self.shell_focused_runtime(client_id) + .map(|(&client_id, client)| { + let report_all = client.shell_surface_active + && self + .shell_focused_runtime(client_id) .is_some_and(|(runtime, _)| { let protocol = runtime.keyboard_protocol(); protocol.reports_all_keys() @@ -224,7 +229,7 @@ impl HeadlessServer { let mut pane_ids = HashSet::new(); if has_app_target { for (&client_id, client) in &self.clients { - if !client.is_shell_client() || client.writer.is_none() { + if !client.is_active_shell_client() || client.writer.is_none() { continue; } let Some(target) = self.shell_target_for_client(client_id) else { @@ -279,7 +284,10 @@ impl HeadlessServer { .filter(|client| client.writer.is_some()) { match &client.mode { - ClientConnectionMode::ClientShell => has_app_target = true, + ClientConnectionMode::ClientShell if client.shell_surface_active => { + has_app_target = true; + } + ClientConnectionMode::ClientShell => {} ClientConnectionMode::TerminalAttach { terminal_id } | ClientConnectionMode::TerminalObserve { terminal_id } => { direct_terminal_targets.insert(terminal_id.as_str()); @@ -339,7 +347,7 @@ impl HeadlessServer { fn any_shell_surface_contains_pane(&self, pane_id: crate::layout::PaneId) -> bool { self.clients.iter().any(|(&client_id, client)| { - if !client.is_shell_client() || client.writer.is_none() { + if !client.is_active_shell_client() || client.writer.is_none() { return false; } if self @@ -456,6 +464,10 @@ impl HeadlessServer { client.shell_snapshot = Some(candidate); } shell_projection_revision = client.shell_projection_revision; + if !client.shell_surface_active { + client.clear_deferred_render(); + continue; + } } let shell_graphics_delivery = self .clients |
