aboutsummaryrefslogtreecommitdiff
path: root/src/app/api/tabs.rs
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-01 15:48:22 +0300
committerGitHub <noreply@github.com>2026-09-01 15:48:22 +0300
commit207be3c771d281baae6e5fa0fb74be9a056e97a2 (patch)
treed7b037ecdf629224a048c841d11659efdc23507d /src/app/api/tabs.rs
parent8a6d697308162874a236c84aac0b0f8c7ac01f83 (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.rs66
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");