diff options
| author | Can Celik <ogulcancelik@gmail.com> | 2026-09-01 15:48:22 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-01 15:48:22 +0300 |
| commit | 207be3c771d281baae6e5fa0fb74be9a056e97a2 (patch) | |
| tree | d7b037ecdf629224a048c841d11659efdc23507d /src/app/api/tabs.rs | |
| parent | 8a6d697308162874a236c84aac0b0f8c7ac01f83 (diff) | |
refactor: render the shell in the client (#3487)
* feat: add opt-in client-rendered shell
* feat: add client-owned shell mouse controls
* feat: complete client-owned shell chrome
* feat: add client-owned shell settings and notifications
* feat: run client shell custom commands
* feat: render popup terminals in client shell
* feat: add client-owned scrollback and copy mode
* fix: preserve client worktree trust defaults
* feat: render startup diagnostics in client shell
* feat: render onboarding in client shell
* feat: render product announcements in client shell
* feat: render release notes in client shell
* feat: render mobile switcher in client shell
* feat: render kitty graphics in client shell
* fix: preserve client shell lifecycle coherence
* refactor: route client shell commands through endpoint connections
* refactor: make the client-rendered shell the default
* refactor: remove monolithic launch mode
* refactor: complete client-rendered shell cutover
* perf: retain client pane surface updates
* perf: scale retained pane surface updates
* perf: remove remote pane input latency
* test: make client shell checks platform-independent
* fix: prevent client timer starvation
* test: fix client shell platform gates
* test: accept retained surfaces in cross-area checks
* test: make client mode assertions platform-neutral
* fix: badge only outdated integrations
Diffstat (limited to 'src/app/api/tabs.rs')
| -rw-r--r-- | src/app/api/tabs.rs | 66 |
1 files changed, 21 insertions, 45 deletions
diff --git a/src/app/api/tabs.rs b/src/app/api/tabs.rs index 42d2b029..c1bd86e9 100644 --- a/src/app/api/tabs.rs +++ b/src/app/api/tabs.rs @@ -157,13 +157,6 @@ impl App { }; tab.set_custom_name(params.label.clone()); crate::logging::tab_renamed(&workspace_id, &tab_id); - if self.state.active == Some(ws_idx) { - // Reflow the tab bar so the new label width takes effect immediately. - // The tab bar renders into cached hit areas; without this refresh the - // old geometry lingers until the next refresh (e.g. a tab switch), - // leaving the visible label stale. Mirrors handle_tab_move. - self.state.refresh_tab_bar_view(); - } self.schedule_session_save(); self.emit_event(EventEnvelope { event: EventKind::TabRenamed, @@ -206,10 +199,6 @@ impl App { let tabs = self.tab_list_info(ws_idx); if moved { self.schedule_session_save(); - if self.state.active == Some(ws_idx) { - self.state.tab_scroll_follow_active = true; - self.state.refresh_tab_bar_view(); - } self.emit_event(EventEnvelope { event: EventKind::TabMoved, data: EventData::TabMoved { @@ -337,7 +326,13 @@ mod tests { fn api_tab_close_last_tab_closes_workspace_and_emits_both_events() { let event_hub = crate::api::EventHub::default(); let (_api_tx, api_rx) = tokio::sync::mpsc::unbounded_channel(); - let mut app = App::new(&Config::default(), true, None, api_rx, event_hub.clone()); + let mut app = App::new( + &Config::default(), + crate::app::AppPolicy::TEST, + None, + api_rx, + event_hub.clone(), + ); app.state.workspaces = vec![Workspace::test_new("tabs")]; app.state.active = Some(0); app.state.selected = 0; @@ -384,7 +379,13 @@ mod tests { fn api_tab_move_reorders_tabs_in_target_workspace() { let event_hub = crate::api::EventHub::default(); let (_api_tx, api_rx) = tokio::sync::mpsc::unbounded_channel(); - let mut app = App::new(&Config::default(), true, None, api_rx, event_hub.clone()); + let mut app = App::new( + &Config::default(), + crate::app::AppPolicy::TEST, + None, + api_rx, + event_hub.clone(), + ); let mut workspace = Workspace::test_new("tabs"); workspace.test_add_tab(Some("two")); workspace.test_add_tab(Some("three")); @@ -424,42 +425,17 @@ mod tests { })); } - #[test] - fn api_tab_rename_reflows_active_tab_bar() { - let event_hub = crate::api::EventHub::default(); - let (_api_tx, api_rx) = tokio::sync::mpsc::unbounded_channel(); - let mut app = App::new(&Config::default(), true, None, api_rx, event_hub); - let workspace = Workspace::test_new("tabs"); - app.state.workspaces = vec![workspace]; - app.state.active = Some(0); - app.state.selected = 0; - app.state.view.tab_bar_rect = ratatui::layout::Rect::new(0, 0, 60, 1); - app.state.refresh_tab_bar_view(); - - let tab_id = app.public_tab_id(0, 0).unwrap(); - let width_before = app.state.view.tab_hit_areas[0].width; - - app.handle_tab_rename( - "req".into(), - TabRenameParams { - tab_id, - label: "a much longer custom tab label".into(), - }, - ); - - let width_after = app.state.view.tab_hit_areas[0].width; - assert!( - width_after > width_before, - "tab bar should reflow to the new label width immediately: \ - before={width_before}, after={width_after}" - ); - } - #[tokio::test] async fn tab_create_follows_cached_focused_pane_cwd_without_runtime() { let event_hub = crate::api::EventHub::default(); let (_api_tx, api_rx) = tokio::sync::mpsc::unbounded_channel(); - let mut app = App::new(&Config::default(), true, None, api_rx, event_hub); + let mut app = App::new( + &Config::default(), + crate::app::AppPolicy::TEST, + None, + api_rx, + event_hub, + ); app.state.default_shell = exiting_test_command().into(); app.state.shell_mode = ShellModeConfig::NonLogin; let workspace = Workspace::test_new("tabs"); |
