aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-utils/src/ipc/protobuf_conversion.rs
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2026-03-07 16:33:05 +0100
committerGitHub <noreply@github.com>2026-03-07 16:33:05 +0100
commit58cb2267fd7994ad9abb2df9792ec452a2deab45 (patch)
treed0ab9dbbc147bd5db5b7dee5c1687069cc946d99 /zellij-utils/src/ipc/protobuf_conversion.rs
parentUpdate CHANGELOG.md (diff)
downloadsl0ppij-58cb2267fd7994ad9abb2df9792ec452a2deab45.tar.gz
sl0ppij-58cb2267fd7994ad9abb2df9792ec452a2deab45.tar.xz
sl0ppij-58cb2267fd7994ad9abb2df9792ec452a2deab45.zip
Allow subscribing to pane viewport updates (renders) from the CLI (#4814)
* initial subscribe implementation * tests for subscribe * update cli help * rustfmt * add pr
Diffstat (limited to 'zellij-utils/src/ipc/protobuf_conversion.rs')
-rw-r--r--zellij-utils/src/ipc/protobuf_conversion.rs65
1 files changed, 61 insertions, 4 deletions
diff --git a/zellij-utils/src/ipc/protobuf_conversion.rs b/zellij-utils/src/ipc/protobuf_conversion.rs
index 1d228340..d843dc9d 100644
--- a/zellij-utils/src/ipc/protobuf_conversion.rs
+++ b/zellij-utils/src/ipc/protobuf_conversion.rs
@@ -6,13 +6,14 @@ use crate::{
ConnStatusMsg, ConnectedMsg, DetachSessionMsg, ExitMsg, ExitReason as ProtoExitReason,
FailedToStartWebServerMsg, FirstClientConnectedMsg, ForegroundColorMsg,
InputMode as ProtoInputMode, KeyMsg, KillSessionMsg, LayoutMetadata as ProtoLayoutMetadata,
- LogErrorMsg, LogMsg, PaneMetadata as ProtoPaneMetadata, QueryTerminalSizeMsg,
- RenamedSessionMsg, RenderMsg, ServerToClientMsg as ProtoServerToClientMsg,
- StartWebServerMsg, SwitchSessionMsg, TabMetadata as ProtoTabMetadata,
+ LogErrorMsg, LogMsg, PaneMetadata as ProtoPaneMetadata, PaneRenderUpdateMsg,
+ QueryTerminalSizeMsg, RenamedSessionMsg, RenderMsg,
+ ServerToClientMsg as ProtoServerToClientMsg, StartWebServerMsg, SubscribeToPaneRendersMsg,
+ SubscribedPaneClosedMsg, SwitchSessionMsg, TabMetadata as ProtoTabMetadata,
TerminalPixelDimensionsMsg, TerminalResizeMsg, UnblockCliPipeInputMsg,
UnblockInputThreadMsg, WebServerStartedMsg,
},
- data::InputMode,
+ data::{InputMode, PaneId},
errors::prelude::*,
ipc::{
ClientToServerMsg, ColorRegister, ExitReason, PaneReference, PixelDimensions,
@@ -114,6 +115,13 @@ impl From<ClientToServerMsg> for ProtoClientToServerMsg {
error,
})
},
+ ClientToServerMsg::SubscribeToPaneRenders {
+ pane_ids,
+ scrollback,
+ } => client_to_server_msg::Message::SubscribeToPaneRenders(SubscribeToPaneRendersMsg {
+ pane_ids: pane_ids.into_iter().map(|id| id.into()).collect(),
+ scrollback: scrollback.map(|s| s as u32),
+ }),
};
ProtoClientToServerMsg {
@@ -228,6 +236,14 @@ impl TryFrom<ProtoClientToServerMsg> for ClientToServerMsg {
error: failed.error,
})
},
+ Some(client_to_server_msg::Message::SubscribeToPaneRenders(msg)) => {
+ let pane_ids: Result<Vec<PaneId>> =
+ msg.pane_ids.into_iter().map(|p| p.try_into()).collect();
+ Ok(ClientToServerMsg::SubscribeToPaneRenders {
+ pane_ids: pane_ids?,
+ scrollback: msg.scrollback.map(|s| s as usize),
+ })
+ },
None => Err(anyhow!("Empty ClientToServerMsg message")),
}
}
@@ -290,6 +306,23 @@ impl From<ServerToClientMsg> for ProtoServerToClientMsg {
ServerToClientMsg::ConfigFileUpdated => {
server_to_client_msg::Message::ConfigFileUpdated(ConfigFileUpdatedMsg {})
},
+ ServerToClientMsg::PaneRenderUpdate {
+ pane_id,
+ viewport,
+ scrollback,
+ is_initial,
+ } => server_to_client_msg::Message::PaneRenderUpdate(PaneRenderUpdateMsg {
+ pane_id: Some(pane_id.into()),
+ viewport,
+ scrollback: scrollback.clone().unwrap_or_default(),
+ has_scrollback: scrollback.is_some(),
+ is_initial,
+ }),
+ ServerToClientMsg::SubscribedPaneClosed { pane_id } => {
+ server_to_client_msg::Message::SubscribedPaneClosed(SubscribedPaneClosedMsg {
+ pane_id: Some(pane_id.into()),
+ })
+ },
};
ProtoServerToClientMsg {
@@ -372,6 +405,30 @@ impl TryFrom<ProtoServerToClientMsg> for ServerToClientMsg {
Some(server_to_client_msg::Message::ConfigFileUpdated(_)) => {
Ok(ServerToClientMsg::ConfigFileUpdated)
},
+ Some(server_to_client_msg::Message::PaneRenderUpdate(msg)) => {
+ let pane_id: PaneId = msg
+ .pane_id
+ .ok_or_else(|| anyhow!("Missing pane_id"))?
+ .try_into()?;
+ let scrollback = if msg.has_scrollback {
+ Some(msg.scrollback)
+ } else {
+ None
+ };
+ Ok(ServerToClientMsg::PaneRenderUpdate {
+ pane_id,
+ viewport: msg.viewport,
+ scrollback,
+ is_initial: msg.is_initial,
+ })
+ },
+ Some(server_to_client_msg::Message::SubscribedPaneClosed(msg)) => {
+ let pane_id: PaneId = msg
+ .pane_id
+ .ok_or_else(|| anyhow!("Missing pane_id"))?
+ .try_into()?;
+ Ok(ServerToClientMsg::SubscribedPaneClosed { pane_id })
+ },
None => Err(anyhow!("Empty ServerToClientMsg message")),
}
}