aboutsummaryrefslogtreecommitdiff
path: root/src/app/api
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-07-06 23:06:00 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-07-06 23:06:00 +0300
commit56edcbcba83b8ff7f6f69ee4231f163e97df3346 (patch)
treee6eb1c31fd8f9a317fe1d6d49b019037f14b4746 /src/app/api
parentefceb30f0b447196615e3b2821d12ef82adcb3e2 (diff)
feat: expose pane scroll state
Diffstat (limited to 'src/app/api')
-rw-r--r--src/app/api/panes.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/app/api/panes.rs b/src/app/api/panes.rs
index c4e6321d..60b2e93b 100644
--- a/src/app/api/panes.rs
+++ b/src/app/api/panes.rs
@@ -1877,6 +1877,22 @@ mod tests {
(app, public_pane_id, rx)
}
+ fn app_with_scrollback_runtime() -> (App, String, PaneId) {
+ let (mut app, public_pane_id) = app_with_test_workspace();
+ let pane_id = app.state.workspaces[0].tabs[0].root_pane;
+ let lines = (0..20)
+ .map(|line| format!("line {line:02}\n"))
+ .collect::<String>();
+ let runtime = crate::terminal::TerminalRuntime::test_with_scrollback_bytes(
+ 20,
+ 5,
+ 1000,
+ lines.as_bytes(),
+ );
+ app.state.insert_test_runtime(pane_id, runtime);
+ (app, public_pane_id, pane_id)
+ }
+
fn metadata_params(pane_id: String) -> PaneReportMetadataParams {
PaneReportMetadataParams {
pane_id,
@@ -1929,6 +1945,32 @@ mod tests {
}
#[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
+ .state
+ .runtime_for_pane_in_workspace(&app.terminal_runtimes, 0, pane_id)
+ .expect("runtime");
+ runtime.scroll_up(3);
+
+ let response = app.handle_pane_get(
+ "req".into(),
+ PaneTarget {
+ pane_id: public_pane_id,
+ },
+ );
+
+ let success: SuccessResponse = serde_json::from_str(&response).unwrap();
+ let ResponseResult::PaneInfo { pane } = success.result else {
+ panic!("expected pane info response");
+ };
+ let scroll = pane.scroll.expect("scroll metrics");
+ assert_eq!(scroll.offset_from_bottom, 3);
+ assert!(scroll.max_offset_from_bottom >= scroll.offset_from_bottom);
+ assert_eq!(scroll.viewport_rows, 5);
+ }
+
+ #[tokio::test]
async fn api_pane_send_keys_preserves_legacy_control_c_aliases() {
let (mut app, pane_id, mut rx) = app_with_send_key_runtime(3);