aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-server/src/plugins
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2024-03-26 18:44:56 +0100
committerGitHub <noreply@github.com>2024-03-26 18:44:56 +0100
commit2eaa50cc44284bdfd47a98770625f380c15fd51d (patch)
treee86909cdfce996d08442c5152fa4bacdbf203745 /zellij-server/src/plugins
parentdocs(changelog): ui fixes (diff)
downloadsl0ppij-2eaa50cc44284bdfd47a98770625f380c15fd51d.tar.gz
sl0ppij-2eaa50cc44284bdfd47a98770625f380c15fd51d.tar.xz
sl0ppij-2eaa50cc44284bdfd47a98770625f380c15fd51d.zip
feat(plugins): add api to dump the current session layout to a plugin (#3227)
Diffstat (limited to 'zellij-server/src/plugins')
-rw-r--r--zellij-server/src/plugins/mod.rs29
-rw-r--r--zellij-server/src/plugins/zellij_exports.rs10
2 files changed, 39 insertions, 0 deletions
diff --git a/zellij-server/src/plugins/mod.rs b/zellij-server/src/plugins/mod.rs
index 44e88ae0..e5516893 100644
--- a/zellij-server/src/plugins/mod.rs
+++ b/zellij-server/src/plugins/mod.rs
@@ -37,6 +37,7 @@ use zellij_utils::{
},
ipc::ClientAttributes,
pane_size::Size,
+ session_serialization,
};
pub type PluginId = u32;
@@ -104,6 +105,7 @@ pub enum PluginInstruction {
Option<PathBuf>,
),
DumpLayout(SessionLayoutMetadata, ClientId),
+ DumpLayoutToPlugin(SessionLayoutMetadata, PluginId),
LogLayoutToHd(SessionLayoutMetadata),
CliPipe {
pipe_id: String,
@@ -178,6 +180,7 @@ impl From<&PluginInstruction> for PluginContext {
PluginInstruction::UnblockCliPipes { .. } => PluginContext::UnblockCliPipes,
PluginInstruction::WatchFilesystem => PluginContext::WatchFilesystem,
PluginInstruction::KeybindPipe { .. } => PluginContext::KeybindPipe,
+ PluginInstruction::DumpLayoutToPlugin(..) => PluginContext::DumpLayoutToPlugin,
}
}
}
@@ -484,6 +487,32 @@ pub(crate) fn plugin_thread_main(
client_id,
)));
},
+ PluginInstruction::DumpLayoutToPlugin(mut session_layout_metadata, plugin_id) => {
+ populate_session_layout_metadata(&mut session_layout_metadata, &wasm_bridge);
+ match session_serialization::serialize_session_layout(
+ session_layout_metadata.into(),
+ ) {
+ Ok((layout, _pane_contents)) => {
+ let updates = vec![(
+ Some(plugin_id),
+ None,
+ Event::CustomMessage("session_layout".to_owned(), layout),
+ )];
+ wasm_bridge.update_plugins(updates, shutdown_send.clone())?;
+ },
+ Err(e) => {
+ let updates = vec![(
+ Some(plugin_id),
+ None,
+ Event::CustomMessage(
+ "session_layout_error".to_owned(),
+ format!("{}", e),
+ ),
+ )];
+ wasm_bridge.update_plugins(updates, shutdown_send.clone())?;
+ },
+ }
+ },
PluginInstruction::LogLayoutToHd(mut session_layout_metadata) => {
populate_session_layout_metadata(&mut session_layout_metadata, &wasm_bridge);
drop(
diff --git a/zellij-server/src/plugins/zellij_exports.rs b/zellij-server/src/plugins/zellij_exports.rs
index 65c18e16..1f65fad5 100644
--- a/zellij-server/src/plugins/zellij_exports.rs
+++ b/zellij-server/src/plugins/zellij_exports.rs
@@ -263,6 +263,7 @@ fn host_run_plugin_command(env: FunctionEnvMut<ForeignFunctionEnv>) {
scan_host_folder(env, folder_to_scan)
},
PluginCommand::WatchFilesystem => watch_filesystem(env),
+ PluginCommand::DumpSessionLayout => dump_session_layout(env),
},
(PermissionStatus::Denied, permission) => {
log::error!(
@@ -1340,6 +1341,14 @@ fn watch_filesystem(env: &ForeignFunctionEnv) {
.map(|sender| sender.send(PluginInstruction::WatchFilesystem));
}
+fn dump_session_layout(env: &ForeignFunctionEnv) {
+ let _ = env.plugin_env.senders.to_screen.as_ref().map(|sender| {
+ sender.send(ScreenInstruction::DumpLayoutToPlugin(
+ env.plugin_env.plugin_id,
+ ))
+ });
+}
+
fn scan_host_folder(env: &ForeignFunctionEnv, folder_to_scan: PathBuf) {
if !folder_to_scan.starts_with("/host") {
log::error!(
@@ -1542,6 +1551,7 @@ fn check_command_permission(
| PluginCommand::BlockCliPipeInput(..)
| PluginCommand::CliPipeOutput(..) => PermissionType::ReadCliPipes,
PluginCommand::MessageToPlugin(..) => PermissionType::MessageAndLaunchOtherPlugins,
+ PluginCommand::DumpSessionLayout => PermissionType::ReadApplicationState,
_ => return (PermissionStatus::Granted, None),
};