aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-server/src/plugins
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2024-08-21 16:46:01 +0200
committerGitHub <noreply@github.com>2024-08-21 16:46:01 +0200
commit08b6072a6971f99e3958d61515bf77b997cd08b6 (patch)
tree582ad115cf186ec3a4c47ca2e9bfcf3854652ac0 /zellij-server/src/plugins
parentdocs(changelog): change themes at runtime (diff)
downloadsl0ppij-08b6072a6971f99e3958d61515bf77b997cd08b6.tar.gz
sl0ppij-08b6072a6971f99e3958d61515bf77b997cd08b6.tar.xz
sl0ppij-08b6072a6971f99e3958d61515bf77b997cd08b6.zip
feat(plugins): API to temporarily bind keys to send a message to a specific plugin id (#3561)
Diffstat (limited to 'zellij-server/src/plugins')
-rw-r--r--zellij-server/src/plugins/mod.rs79
1 files changed, 46 insertions, 33 deletions
diff --git a/zellij-server/src/plugins/mod.rs b/zellij-server/src/plugins/mod.rs
index e1b807ce..62cc8916 100644
--- a/zellij-server/src/plugins/mod.rs
+++ b/zellij-server/src/plugins/mod.rs
@@ -134,6 +134,7 @@ pub enum PluginInstruction {
cwd: Option<PathBuf>,
skip_cache: bool,
cli_client_id: ClientId,
+ plugin_and_client_id: Option<(u32, ClientId)>,
},
CachePluginEvents {
plugin_id: PluginId,
@@ -624,42 +625,52 @@ pub(crate) fn plugin_thread_main(
cwd,
skip_cache,
cli_client_id,
+ plugin_and_client_id,
} => {
let should_float = floating.unwrap_or(true);
let mut pipe_messages = vec![];
- match plugin {
- Some(plugin_url) => {
- // send to specific plugin(s)
- pipe_to_specific_plugins(
- PipeSource::Keybind,
- &plugin_url,
- &configuration,
- &cwd,
- skip_cache,
- should_float,
- &pane_id_to_replace,
- &pane_title,
- Some(cli_client_id),
- &mut pipe_messages,
- &name,
- &payload,
- &args,
- &bus,
- &mut wasm_bridge,
- &plugin_aliases,
- );
- },
- None => {
- // no specific destination, send to all plugins
- pipe_to_all_plugins(
- PipeSource::Keybind,
- &name,
- &payload,
- &args,
- &mut wasm_bridge,
- &mut pipe_messages,
- );
- },
+ if let Some((plugin_id, client_id)) = plugin_and_client_id {
+ let is_private = true;
+ pipe_messages.push((
+ Some(plugin_id),
+ Some(client_id),
+ PipeMessage::new(PipeSource::Keybind, name, &payload, &args, is_private),
+ ));
+ } else {
+ match plugin {
+ Some(plugin_url) => {
+ // send to specific plugin(s)
+ pipe_to_specific_plugins(
+ PipeSource::Keybind,
+ &plugin_url,
+ &configuration,
+ &cwd,
+ skip_cache,
+ should_float,
+ &pane_id_to_replace,
+ &pane_title,
+ Some(cli_client_id),
+ &mut pipe_messages,
+ &name,
+ &payload,
+ &args,
+ &bus,
+ &mut wasm_bridge,
+ &plugin_aliases,
+ );
+ },
+ None => {
+ // no specific destination, send to all plugins
+ pipe_to_all_plugins(
+ PipeSource::Keybind,
+ &name,
+ &payload,
+ &args,
+ &mut wasm_bridge,
+ &mut pipe_messages,
+ );
+ },
+ }
}
wasm_bridge.pipe_messages(pipe_messages, shutdown_send.clone())?;
},
@@ -768,6 +779,8 @@ pub(crate) fn plugin_thread_main(
keybinds,
default_mode,
} => {
+ // TODO: notify plugins that this happened so that they can eg. rebind temporary keys that
+ // were lost
wasm_bridge
.reconfigure(client_id, keybinds, default_mode)
.non_fatal();