diff options
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/mod.rs | 1 | ||||
| -rw-r--r-- | src/api/schema.rs | 25 | ||||
| -rw-r--r-- | src/api/schema/panes.rs | 63 | ||||
| -rw-r--r-- | src/api/server.rs | 1 | ||||
| -rw-r--r-- | src/api/subscriptions.rs | 4 |
5 files changed, 94 insertions, 0 deletions
diff --git a/src/api/mod.rs b/src/api/mod.rs index a9a8e25b..4832ac56 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -40,6 +40,7 @@ pub(crate) fn request_changes_ui(request: &Request) -> bool { | Method::AgentStart(_) | Method::PaneSplit(_) | Method::PaneSwap(_) + | Method::PaneMove(_) | Method::PaneZoom(_) | Method::PaneFocusDirection(_) | Method::PaneResize(_) diff --git a/src/api/schema.rs b/src/api/schema.rs index 491693ad..512c030f 100644 --- a/src/api/schema.rs +++ b/src/api/schema.rs @@ -86,6 +86,8 @@ pub enum Method { PaneSplit(PaneSplitParams), #[serde(rename = "pane.swap")] PaneSwap(PaneSwapParams), + #[serde(rename = "pane.move")] + PaneMove(PaneMoveParams), #[serde(rename = "pane.zoom")] PaneZoom(PaneZoomParams), #[serde(rename = "pane.layout")] @@ -395,6 +397,8 @@ pub enum Subscription { PaneClosed {}, #[serde(rename = "pane.focused")] PaneFocused {}, + #[serde(rename = "pane.moved")] + PaneMoved {}, #[serde(rename = "pane.exited")] PaneExited {}, #[serde(rename = "pane.agent_detected")] @@ -521,6 +525,9 @@ pub enum EventMatch { PaneFocused { pane_id: String, }, + PaneMoved { + pane_id: String, + }, PaneOutputChanged { pane_id: String, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -555,6 +562,7 @@ pub enum EventKind { PaneCreated, PaneClosed, PaneFocused, + PaneMoved, PaneOutputChanged, PaneExited, PaneAgentDetected, @@ -655,6 +663,9 @@ pub enum ResponseResult { PaneSwap { swap: PaneSwapResult, }, + PaneMove { + move_result: PaneMoveResult, + }, PaneZoom { zoom: PaneZoomResult, }, @@ -942,6 +953,20 @@ pub enum EventData { pane_id: String, workspace_id: String, }, + PaneMoved { + previous_pane_id: String, + previous_workspace_id: String, + previous_tab_id: String, + pane: Box<PaneInfo>, + #[serde(default, skip_serializing_if = "Option::is_none")] + created_workspace: Option<WorkspaceInfo>, + #[serde(default, skip_serializing_if = "Option::is_none")] + created_tab: Option<TabInfo>, + #[serde(default, skip_serializing_if = "Option::is_none")] + closed_workspace_id: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + closed_tab_id: Option<String>, + }, PaneOutputChanged { pane_id: String, workspace_id: String, diff --git a/src/api/schema/panes.rs b/src/api/schema/panes.rs index 6a1827a2..de330993 100644 --- a/src/api/schema/panes.rs +++ b/src/api/schema/panes.rs @@ -47,6 +47,39 @@ pub struct PaneSwapParams { pub target_pane_id: Option<String>, } +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PaneMoveParams { + pub pane_id: String, + pub destination: PaneMoveDestination, + #[serde(default)] + pub focus: bool, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(tag = "type", rename_all = "snake_case")] +pub enum PaneMoveDestination { + Tab { + tab_id: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + target_pane_id: Option<String>, + split: SplitDirection, + #[serde(default, skip_serializing_if = "Option::is_none")] + ratio: Option<f32>, + }, + NewTab { + #[serde(default, skip_serializing_if = "Option::is_none")] + workspace_id: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + label: Option<String>, + }, + NewWorkspace { + #[serde(default, skip_serializing_if = "Option::is_none")] + label: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + tab_label: Option<String>, + }, +} + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] pub struct PaneZoomParams { #[serde(default, skip_serializing_if = "Option::is_none")] @@ -275,6 +308,36 @@ pub enum PaneSwapReason { } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PaneMoveResult { + pub changed: bool, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub reason: Option<PaneMoveReason>, + pub previous_pane_id: String, + pub previous_workspace_id: String, + pub previous_tab_id: String, + pub pane: Box<PaneInfo>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub source_layout: Option<Box<PaneLayoutSnapshot>>, + pub target_layout: Box<PaneLayoutSnapshot>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub created_workspace: Option<super::WorkspaceInfo>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub created_tab: Option<super::TabInfo>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub closed_workspace_id: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub closed_tab_id: Option<String>, + pub focused_pane_id: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum PaneMoveReason { + SameTab, + ZoomedTab, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct PaneZoomResult { pub changed: bool, pub zoom_changed: bool, diff --git a/src/api/server.rs b/src/api/server.rs index 0d49d21d..5650b2d0 100644 --- a/src/api/server.rs +++ b/src/api/server.rs @@ -305,6 +305,7 @@ fn api_method_name(method: &Method) -> &'static str { Method::AgentStart(_) => "agent.start", Method::PaneSplit(_) => "pane.split", Method::PaneSwap(_) => "pane.swap", + Method::PaneMove(_) => "pane.move", Method::PaneZoom(_) => "pane.zoom", Method::PaneLayout(_) => "pane.layout", Method::PaneNeighbor(_) => "pane.neighbor", diff --git a/src/api/subscriptions.rs b/src/api/subscriptions.rs index e8563468..e8e362fe 100644 --- a/src/api/subscriptions.rs +++ b/src/api/subscriptions.rs @@ -156,6 +156,10 @@ impl ActiveSubscription { event_kind: crate::api::schema::EventKind::PaneFocused, last_sequence: 0, })), + Subscription::PaneMoved {} => Ok(Self::Event(ActiveEventSubscription { + event_kind: crate::api::schema::EventKind::PaneMoved, + last_sequence: 0, + })), Subscription::PaneExited {} => Ok(Self::Event(ActiveEventSubscription { event_kind: crate::api::schema::EventKind::PaneExited, last_sequence: 0, |
