diff options
| author | Aram Drevekenin <aram@poor.dev> | 2024-03-26 18:44:56 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-26 18:44:56 +0100 |
| commit | 2eaa50cc44284bdfd47a98770625f380c15fd51d (patch) | |
| tree | e86909cdfce996d08442c5152fa4bacdbf203745 /zellij-server/src/plugins | |
| parent | docs(changelog): ui fixes (diff) | |
| download | sl0ppij-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.rs | 29 | ||||
| -rw-r--r-- | zellij-server/src/plugins/zellij_exports.rs | 10 |
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), }; |
