aboutsummaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/api')
-rw-r--r--src/api/mod.rs1
-rw-r--r--src/api/schema.rs25
-rw-r--r--src/api/schema/panes.rs63
-rw-r--r--src/api/server.rs1
-rw-r--r--src/api/subscriptions.rs4
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,