aboutsummaryrefslogtreecommitdiff
path: root/src/app/api/panes.rs
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-09-19 14:47:18 +0300
committerGitHub <noreply@github.com>2026-09-19 14:47:18 +0300
commitcc7c696cd0772e466da403eb4e3f00f4e8d8ae1e (patch)
treed8325f7f2fb1ac53613ae56e8215042e6d497dd9 /src/app/api/panes.rs
parent3f2a6e743f67bc947cfa06be25df106d00b9ee11 (diff)
feat: add configurable pane screen and scrollback clearing (#4383)
Diffstat (limited to 'src/app/api/panes.rs')
-rw-r--r--src/app/api/panes.rs36
1 files changed, 36 insertions, 0 deletions
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(&params.pane_id) else {
return pane_not_found(id, &params.pane_id);
@@ -2350,6 +2366,26 @@ mod tests {
}
#[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();
let runtime = app