diff options
| author | Can Celik <ogulcancelik@gmail.com> | 2026-09-02 16:09:19 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-02 16:09:19 +0300 |
| commit | d08e44686d8b19bd9555cc99ec9068d9fde05f16 (patch) | |
| tree | ca2f34d2117efbf770095c437f9d6402c24d9fb3 /src/client/mod.rs | |
| parent | 8633a398e653eee47b375c963996c78a8a14aa48 (diff) | |
fix(client): detach when terminal geometry is unavailable (#3531)
refs #3519
Diffstat (limited to 'src/client/mod.rs')
| -rw-r--r-- | src/client/mod.rs | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/client/mod.rs b/src/client/mod.rs index b7fdcabe..b20a6e85 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -36,9 +36,9 @@ pub use terminal_sessions::{run_terminal_session_control, run_terminal_session_o use terminal_geometry::query_host_terminal_appearance; #[cfg(test)] use terminal_geometry::{ - cell_size_fallback, ioctl_cell_size, pack_cell_size, resize_report_required, - should_query_host_cell_size, write_host_cell_size_query, write_host_terminal_appearance_query, - write_host_terminal_theme_query, + cell_size_fallback, current_terminal_geometry_with, ioctl_cell_size, pack_cell_size, + resize_report_required, should_query_host_cell_size, write_host_cell_size_query, + write_host_terminal_appearance_query, write_host_terminal_theme_query, }; use terminal_geometry::{ host_cell_size_query_required, initial_terminal_geometry, query_host_cell_size, @@ -302,6 +302,8 @@ enum ClientLoopEvent { StdinEvents(Vec<crate::protocol::ClientInputEvent>), /// Terminal resize detected, including current exact-pixel eligibility. Resize(u16, u16, u32, u32, bool), + /// The client's host terminal can no longer report a valid grid. + TerminalUnavailable(io::Error), /// Server message received. ServerMessage(Box<ServerMessage>), /// Server reader thread exited (connection lost). @@ -400,7 +402,7 @@ fn run_client_with_mode( // Get the terminal geometry before handshake (before raw mode). let (cols, rows, cell_width_px, cell_height_px, exact_cell_size) = - initial_terminal_geometry(pixel_geometry_enabled, kitty_graphics_enabled); + initial_terminal_geometry(pixel_geometry_enabled, kitty_graphics_enabled)?; let shell_surface_size = loop_config .shell_config @@ -1216,6 +1218,11 @@ async fn run_client_loop( } // Direct terminal attach is Unix-only; every Windows client uses ClientShell. } + ClientLoopEvent::TerminalUnavailable(err) => { + info!(err = %err, "client terminal unavailable; detaching"); + let _ = write_to_server(&mut write_stream, &ClientMessage::Detach); + return Ok(()); + } ClientLoopEvent::Resize( new_cols, new_rows, |
