From cc7c696cd0772e466da403eb4e3f00f4e8d8ae1e Mon Sep 17 00:00:00 2001 From: Can Celik Date: Sat, 19 Sep 2026 14:47:18 +0300 Subject: feat: add configurable pane screen and scrollback clearing (#4383) --- src/app/api/panes.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'src/app/api/panes.rs') diff --git a/src/app/api/panes.rs b/src/app/api/panes.rs index a025f0b9..119d9298 100644 --- a/src/app/api/panes.rs +++ b/src/app/api/panes.rs @@ -167,6 +167,22 @@ impl App { encode_success(id, ResponseResult::PaneInfo { pane }) } + pub(super) fn handle_pane_clear(&mut self, id: String, target: PaneTarget) -> String { + let Some((ws_idx, pane_id)) = self.parse_pane_id(&target.pane_id) else { + return pane_not_found(id, &target.pane_id); + }; + let Some(runtime) = + self.state + .runtime_for_pane_in_workspace(&self.terminal_runtimes, ws_idx, pane_id) + else { + return pane_not_found(id, &target.pane_id); + }; + match runtime.clear_screen() { + Ok(()) => encode_success(id, ResponseResult::Ok {}), + Err(err) => encode_error(id, "pane_clear_failed", err.to_string()), + } + } + pub(super) fn handle_pane_scroll(&mut self, id: String, params: PaneScrollParams) -> String { let Some((ws_idx, pane_id)) = self.parse_pane_id(¶ms.pane_id) else { return pane_not_found(id, ¶ms.pane_id); @@ -2349,6 +2365,26 @@ mod tests { assert!(rx.try_recv().is_err()); } + #[tokio::test] + async fn api_clear_pane_mutates_endpoint_owned_history() { + let (mut app, public_pane_id, pane_id) = app_with_scrollback_runtime(); + let request = crate::api::schema::Request { + id: "clear".into(), + method: crate::api::schema::Method::PaneClear(PaneTarget { + pane_id: public_pane_id, + }), + }; + assert!(crate::api::request_changes_ui(&request)); + let response = app.handle_api_request(request); + let success: SuccessResponse = serde_json::from_str(&response).unwrap(); + assert_eq!(success.result, ResponseResult::Ok {}); + let runtime = app + .state + .runtime_for_pane_in_workspace(&app.terminal_runtimes, 0, pane_id) + .unwrap(); + assert_eq!(runtime.scroll_metrics().unwrap().max_offset_from_bottom, 0); + } + #[tokio::test] async fn api_pane_get_exposes_scroll_metrics() { let (mut app, public_pane_id, pane_id) = app_with_scrollback_runtime(); -- cgit v1.2.3