diff options
| author | Aram Drevekenin <aram@poor.dev> | 2025-04-29 20:52:17 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-29 20:52:17 +0200 |
| commit | 27c8986939a1642f3e4afda73e9717b7bd328824 (patch) | |
| tree | e80ee57aeede2578a5ce9fa6d0ab4a350ed9d838 /zellij-utils/src/plugin_api | |
| parent | chore: update development version (diff) | |
| download | sl0ppij-27c8986939a1642f3e4afda73e9717b7bd328824.tar.gz sl0ppij-27c8986939a1642f3e4afda73e9717b7bd328824.tar.xz sl0ppij-27c8986939a1642f3e4afda73e9717b7bd328824.zip | |
feat: multiple Select and Bulk Pane Actions (#4169)
* initial implementation with break panes to new tab
* break pane group left/right
* group embed/eject panes
* stack pane group on resize
* close pane group
* style(fmt): rustfmt
* fix tests
* group drag and ungroup with the mouse
* fix mouse hover for multiple clients
* fix for multiple clients
* multiple select plugin initial
* use real data in plugin
* adjust functionality
* fix some ux issues
* reflect group mouse group selections in plugin
* group/ungroup panes in Zellij
* highlight frames when marked by the plugin
* refactor: render function in plugin
* some ui responsiveness
* some more responsiveness and adjust hover text
* break out functionality
* stack functionality
* break panes left/right and close multiple panes
* fix(tab): only relayout the relevant layout when non-focused pane is closed
* status bar UI
* embed and float panes
* work
* fix some ui/ux issues
* refactor: move stuff around
* some responsiveness and fix search result browsing bug
* change plugin pane title
* differentiate group from focused pane
* add keyboard shortcut
* add ui to compact bar
* make boundary colors appear properly without pane frames
* get plugins to also display their frame color
* make hover shortcuts appear on command panes
* fix: do not render search string component if it's empty
* BeforeClose Event and unhighlight panes on exit
* some UI/UX fixes
* some fixes to the catppuccin-latte theme
* remove ungroup shortcut
* make some ui components opaque
* fix more opaque elements
* fix some issues with stacking pane order
* keyboard shortcuts for grouping
* config to opt out of advanced mouse actions
* make selected + focused frame color distinct
* group marking mode
* refactor: multiple-select plugin
* adjust stacking group behavior
* adjust flashing periods
* render common modifier in group controls
* add to compact bar
* adjust key hint wording
* add key to presets and default config
* some cleanups
* some refactoring
* fix tests
* fix plugin system tests
* tests: group/ungroup/hover
* test: BeforeClose plugin event
* new plugin assets
* style(fmt): rustfmt
* remove warnings
* tests: give plugin more time to load
Diffstat (limited to 'zellij-utils/src/plugin_api')
| -rw-r--r-- | zellij-utils/src/plugin_api/action.proto | 2 | ||||
| -rw-r--r-- | zellij-utils/src/plugin_api/action.rs | 18 | ||||
| -rw-r--r-- | zellij-utils/src/plugin_api/event.proto | 8 | ||||
| -rw-r--r-- | zellij-utils/src/plugin_api/event.rs | 44 | ||||
| -rw-r--r-- | zellij-utils/src/plugin_api/plugin_command.proto | 32 | ||||
| -rw-r--r-- | zellij-utils/src/plugin_api/plugin_command.rs | 153 | ||||
| -rw-r--r-- | zellij-utils/src/plugin_api/plugin_ids.proto | 1 | ||||
| -rw-r--r-- | zellij-utils/src/plugin_api/plugin_ids.rs | 2 |
8 files changed, 250 insertions, 10 deletions
diff --git a/zellij-utils/src/plugin_api/action.proto b/zellij-utils/src/plugin_api/action.proto index 3c4948cf..40a6481f 100644 --- a/zellij-utils/src/plugin_api/action.proto +++ b/zellij-utils/src/plugin_api/action.proto @@ -241,6 +241,8 @@ enum ActionName { KeybindPipe = 84; TogglePanePinned = 85; MouseEvent = 86; + TogglePaneInGroup = 87; + ToggleGroupMarking = 88; } message Position { diff --git a/zellij-utils/src/plugin_api/action.rs b/zellij-utils/src/plugin_api/action.rs index 6d1fa9cd..857bb385 100644 --- a/zellij-utils/src/plugin_api/action.rs +++ b/zellij-utils/src/plugin_api/action.rs @@ -692,6 +692,16 @@ impl TryFrom<ProtobufAction> for Action { Some(_) => Err("TogglePanePinned should not have a payload"), None => Ok(Action::TogglePanePinned), }, + Some(ProtobufActionName::TogglePaneInGroup) => match protobuf_action.optional_payload { + Some(_) => Err("TogglePaneInGroup should not have a payload"), + None => Ok(Action::TogglePaneInGroup), + }, + Some(ProtobufActionName::ToggleGroupMarking) => { + match protobuf_action.optional_payload { + Some(_) => Err("ToggleGroupMarking should not have a payload"), + None => Ok(Action::ToggleGroupMarking), + } + }, Some(ProtobufActionName::KeybindPipe) => match protobuf_action.optional_payload { Some(_) => Err("KeybindPipe should not have a payload"), // TODO: at some point we might want to support a payload here @@ -1236,6 +1246,14 @@ impl TryFrom<Action> for ProtobufAction { name: ProtobufActionName::TogglePanePinned as i32, optional_payload: None, }), + Action::TogglePaneInGroup { .. } => Ok(ProtobufAction { + name: ProtobufActionName::TogglePaneInGroup as i32, + optional_payload: None, + }), + Action::ToggleGroupMarking { .. } => Ok(ProtobufAction { + name: ProtobufActionName::ToggleGroupMarking as i32, + optional_payload: None, + }), Action::NoOp | Action::Confirm | Action::NewInPlacePane(..) diff --git a/zellij-utils/src/plugin_api/event.proto b/zellij-utils/src/plugin_api/event.proto index 14eb0c40..9b0e4d2f 100644 --- a/zellij-utils/src/plugin_api/event.proto +++ b/zellij-utils/src/plugin_api/event.proto @@ -54,6 +54,7 @@ enum EventType { FailedToChangeHostFolder = 28; PastedText = 29; ConfigWasWrittenToDisk = 30; + BeforeClose = 31; } message EventNameList { @@ -304,6 +305,12 @@ message PaneInfo { optional string terminal_command = 20; optional string plugin_url = 21; bool is_selectable = 22; + repeated IndexInPaneGroup index_in_pane_group = 23; +} + +message IndexInPaneGroup { + uint32 client_id = 1; + uint32 index = 2; } message TabInfo { @@ -334,6 +341,7 @@ message ModeUpdatePayload { optional input_mode.InputMode base_mode = 6; optional string editor = 7; optional string shell = 8; + optional bool currently_marking_pane_group = 9; } message InputModeKeybinds { diff --git a/zellij-utils/src/plugin_api/event.rs b/zellij-utils/src/plugin_api/event.rs index 4707d657..88c55827 100644 --- a/zellij-utils/src/plugin_api/event.rs +++ b/zellij-utils/src/plugin_api/event.rs @@ -359,6 +359,10 @@ impl TryFrom<ProtobufEvent> for Event { None => Ok(Event::ConfigWasWrittenToDisk), _ => Err("Malformed payload for the ConfigWasWrittenToDisk Event"), }, + Some(ProtobufEventType::BeforeClose) => match protobuf_event.payload { + None => Ok(Event::BeforeClose), + _ => Err("Malformed payload for the BeforeClose Event"), + }, None => Err("Unknown Protobuf Event"), } } @@ -733,6 +737,10 @@ impl TryFrom<Event> for ProtobufEvent { name: ProtobufEventType::ConfigWasWrittenToDisk as i32, payload: None, }), + Event::BeforeClose => Ok(ProtobufEvent { + name: ProtobufEventType::BeforeClose as i32, + payload: None, + }), } } } @@ -1072,6 +1080,16 @@ impl TryFrom<ProtobufPaneInfo> for PaneInfo { terminal_command: protobuf_pane_info.terminal_command, plugin_url: protobuf_pane_info.plugin_url, is_selectable: protobuf_pane_info.is_selectable, + index_in_pane_group: protobuf_pane_info + .index_in_pane_group + .iter() + .map(|index_in_pane_group| { + ( + index_in_pane_group.client_id as u16, + index_in_pane_group.index as usize, + ) + }) + .collect(), }) } } @@ -1107,6 +1125,14 @@ impl TryFrom<PaneInfo> for ProtobufPaneInfo { terminal_command: pane_info.terminal_command, plugin_url: pane_info.plugin_url, is_selectable: pane_info.is_selectable, + index_in_pane_group: pane_info + .index_in_pane_group + .iter() + .map(|(&client_id, &index)| IndexInPaneGroup { + client_id: client_id as u32, + index: index as u32, + }) + .collect(), }) } } @@ -1216,6 +1242,8 @@ impl TryFrom<ProtobufModeUpdatePayload> for ModeInfo { let capabilities = PluginCapabilities { arrow_fonts: protobuf_mode_update_payload.arrow_fonts_support, }; + let currently_marking_pane_group = + protobuf_mode_update_payload.currently_marking_pane_group; let mode_info = ModeInfo { mode: current_mode, keybinds, @@ -1225,6 +1253,7 @@ impl TryFrom<ProtobufModeUpdatePayload> for ModeInfo { base_mode, editor, shell, + currently_marking_pane_group, }; Ok(mode_info) } @@ -1242,6 +1271,7 @@ impl TryFrom<ModeInfo> for ProtobufModeUpdatePayload { let session_name = mode_info.session_name; let editor = mode_info.editor.map(|e| e.display().to_string()); let shell = mode_info.shell.map(|s| s.display().to_string()); + let currently_marking_pane_group = mode_info.currently_marking_pane_group; let mut protobuf_input_mode_keybinds: Vec<ProtobufInputModeKeybinds> = vec![]; for (input_mode, input_mode_keybinds) in mode_info.keybinds { let mode: ProtobufInputMode = input_mode.try_into()?; @@ -1275,6 +1305,7 @@ impl TryFrom<ModeInfo> for ProtobufModeUpdatePayload { base_mode: base_mode.map(|b_m| b_m as i32), editor, shell, + currently_marking_pane_group, }) } } @@ -1344,6 +1375,7 @@ impl TryFrom<ProtobufEventType> for EventType { ProtobufEventType::FailedToChangeHostFolder => EventType::FailedToChangeHostFolder, ProtobufEventType::PastedText => EventType::PastedText, ProtobufEventType::ConfigWasWrittenToDisk => EventType::ConfigWasWrittenToDisk, + ProtobufEventType::BeforeClose => EventType::BeforeClose, }) } } @@ -1383,6 +1415,7 @@ impl TryFrom<EventType> for ProtobufEventType { EventType::FailedToChangeHostFolder => ProtobufEventType::FailedToChangeHostFolder, EventType::PastedText => ProtobufEventType::PastedText, EventType::ConfigWasWrittenToDisk => ProtobufEventType::ConfigWasWrittenToDisk, + EventType::BeforeClose => ProtobufEventType::BeforeClose, }) } } @@ -1523,6 +1556,7 @@ fn serialize_mode_update_event_with_non_default_values() { base_mode: Some(InputMode::Locked), editor: Some(PathBuf::from("my_awesome_editor")), shell: Some(PathBuf::from("my_awesome_shell")), + currently_marking_pane_group: Some(false), }); let protobuf_event: ProtobufEvent = mode_update_event.clone().try_into().unwrap(); let serialized_protobuf_event = protobuf_event.encode_to_vec(); @@ -1884,6 +1918,14 @@ fn serialize_session_update_event_with_non_default_values() { TabInfo::default(), ]; let mut panes = HashMap::new(); + let mut index_in_pane_group_1 = BTreeMap::new(); + index_in_pane_group_1.insert(1, 0); + index_in_pane_group_1.insert(2, 0); + index_in_pane_group_1.insert(3, 0); + let mut index_in_pane_group_2 = BTreeMap::new(); + index_in_pane_group_2.insert(1, 1); + index_in_pane_group_2.insert(2, 1); + index_in_pane_group_2.insert(3, 1); let panes_list = vec![ PaneInfo { id: 1, @@ -1908,6 +1950,7 @@ fn serialize_session_update_event_with_non_default_values() { terminal_command: Some("foo".to_owned()), plugin_url: None, is_selectable: true, + index_in_pane_group: index_in_pane_group_1, }, PaneInfo { id: 1, @@ -1932,6 +1975,7 @@ fn serialize_session_update_event_with_non_default_values() { terminal_command: None, plugin_url: Some("i_am_a_fake_plugin".to_owned()), is_selectable: true, + index_in_pane_group: index_in_pane_group_2, }, ]; panes.insert(0, panes_list); diff --git a/zellij-utils/src/plugin_api/plugin_command.proto b/zellij-utils/src/plugin_api/plugin_command.proto index 3fa321cc..3a63b0c8 100644 --- a/zellij-utils/src/plugin_api/plugin_command.proto +++ b/zellij-utils/src/plugin_api/plugin_command.proto @@ -140,6 +140,11 @@ enum CommandName { OpenFileNearPlugin = 124; OpenFileFloatingNearPlugin = 125; OpenFileInPlaceOfPlugin = 126; + GroupAndUngroupPanes = 127; + HighlightAndUnhighlightPanes = 128; + CloseMultiplePanes = 129; + FloatMultiplePanes = 130; + EmbedMultiplePanes = 131; } message PluginCommand { @@ -236,9 +241,36 @@ message PluginCommand { OpenFileNearPluginPayload open_file_near_plugin_payload = 99; OpenFileFloatingNearPluginPayload open_file_floating_near_plugin_payload = 100; OpenFileInPlaceOfPluginPayload open_file_in_place_of_plugin_payload = 101; + GroupAndUngroupPanesPayload group_and_ungroup_panes_payload = 102; + HighlightAndUnhighlightPanesPayload highlight_and_unhighlight_panes_payload = 103; + CloseMultiplePanesPayload close_multiple_panes_payload = 104; + FloatMultiplePanesPayload float_multiple_panes_payload = 105; + EmbedMultiplePanesPayload embed_multiple_panes_payload = 106; } } +message EmbedMultiplePanesPayload { + repeated PaneId pane_ids = 1; +} + +message FloatMultiplePanesPayload { + repeated PaneId pane_ids = 1; +} + +message CloseMultiplePanesPayload { + repeated PaneId pane_ids = 1; +} + +message HighlightAndUnhighlightPanesPayload { + repeated PaneId pane_ids_to_highlight = 1; + repeated PaneId pane_ids_to_unhighlight = 2; +} + +message GroupAndUngroupPanesPayload { + repeated PaneId pane_ids_to_group = 1; + repeated PaneId pane_ids_to_ungroup = 2; +} + message OpenFileInPlaceOfPluginPayload { file.File file_to_open = 1; optional FloatingPaneCoordinates floating_pane_coordinates = 2; diff --git a/zellij-utils/src/plugin_api/plugin_command.rs b/zellij-utils/src/plugin_api/plugin_command.rs index 0de590e7..833d6270 100644 --- a/zellij-utils/src/plugin_api/plugin_command.rs +++ b/zellij-utils/src/plugin_api/plugin_command.rs @@ -5,17 +5,19 @@ pub use super::generated_api::api::{ plugin_command::{ plugin_command::Payload, BreakPanesToNewTabPayload, BreakPanesToTabWithIndexPayload, ChangeFloatingPanesCoordinatesPayload, ChangeHostFolderPayload, - ClearScreenForPaneIdPayload, CliPipeOutputPayload, CloseTabWithIndexPayload, CommandName, - ContextItem, EditScrollbackForPaneWithIdPayload, EnvVariable, ExecCmdPayload, + ClearScreenForPaneIdPayload, CliPipeOutputPayload, CloseMultiplePanesPayload, + CloseTabWithIndexPayload, CommandName, ContextItem, EditScrollbackForPaneWithIdPayload, + EmbedMultiplePanesPayload, EnvVariable, ExecCmdPayload, FixedOrPercent as ProtobufFixedOrPercent, - FixedOrPercentValue as ProtobufFixedOrPercentValue, - FloatingPaneCoordinates as ProtobufFloatingPaneCoordinates, HidePaneWithIdPayload, - HttpVerb as ProtobufHttpVerb, IdAndNewName, KeyToRebind, KeyToUnbind, KillSessionsPayload, - LoadNewPluginPayload, MessageToPluginPayload, MovePaneWithPaneIdInDirectionPayload, - MovePaneWithPaneIdPayload, MovePayload, NewPluginArgs as ProtobufNewPluginArgs, - NewTabsWithLayoutInfoPayload, OpenCommandPaneFloatingNearPluginPayload, - OpenCommandPaneInPlaceOfPluginPayload, OpenCommandPaneNearPluginPayload, - OpenCommandPanePayload, OpenFileFloatingNearPluginPayload, OpenFileInPlaceOfPluginPayload, + FixedOrPercentValue as ProtobufFixedOrPercentValue, FloatMultiplePanesPayload, + FloatingPaneCoordinates as ProtobufFloatingPaneCoordinates, GroupAndUngroupPanesPayload, + HidePaneWithIdPayload, HighlightAndUnhighlightPanesPayload, HttpVerb as ProtobufHttpVerb, + IdAndNewName, KeyToRebind, KeyToUnbind, KillSessionsPayload, LoadNewPluginPayload, + MessageToPluginPayload, MovePaneWithPaneIdInDirectionPayload, MovePaneWithPaneIdPayload, + MovePayload, NewPluginArgs as ProtobufNewPluginArgs, NewTabsWithLayoutInfoPayload, + OpenCommandPaneFloatingNearPluginPayload, OpenCommandPaneInPlaceOfPluginPayload, + OpenCommandPaneNearPluginPayload, OpenCommandPanePayload, + OpenFileFloatingNearPluginPayload, OpenFileInPlaceOfPluginPayload, OpenFileNearPluginPayload, OpenFilePayload, OpenTerminalFloatingNearPluginPayload, OpenTerminalInPlaceOfPluginPayload, OpenTerminalNearPluginPayload, PageScrollDownInPaneIdPayload, PageScrollUpInPaneIdPayload, PaneId as ProtobufPaneId, @@ -1540,6 +1542,78 @@ impl TryFrom<ProtobufPluginCommand> for PluginCommand { }, _ => Err("Mismatched payload for OpenFileInPlaceOfPlugin"), }, + Some(CommandName::GroupAndUngroupPanes) => match protobuf_plugin_command.payload { + Some(Payload::GroupAndUngroupPanesPayload(group_and_ungroup_panes_payload)) => { + Ok(PluginCommand::GroupAndUngroupPanes( + group_and_ungroup_panes_payload + .pane_ids_to_group + .into_iter() + .filter_map(|p| p.try_into().ok()) + .collect(), + group_and_ungroup_panes_payload + .pane_ids_to_ungroup + .into_iter() + .filter_map(|p| p.try_into().ok()) + .collect(), + )) + }, + _ => Err("Mismatched payload for GroupAndUngroupPanes"), + }, + Some(CommandName::HighlightAndUnhighlightPanes) => { + match protobuf_plugin_command.payload { + Some(Payload::HighlightAndUnhighlightPanesPayload( + highlight_and_unhighlight_panes_payload, + )) => Ok(PluginCommand::HighlightAndUnhighlightPanes( + highlight_and_unhighlight_panes_payload + .pane_ids_to_highlight + .into_iter() + .filter_map(|p| p.try_into().ok()) + .collect(), + highlight_and_unhighlight_panes_payload + .pane_ids_to_unhighlight + .into_iter() + .filter_map(|p| p.try_into().ok()) + .collect(), + )), + _ => Err("Mismatched payload for HighlightAndUnhighlightPanes"), + } + }, + Some(CommandName::CloseMultiplePanes) => match protobuf_plugin_command.payload { + Some(Payload::CloseMultiplePanesPayload(close_multiple_panes_payload)) => { + Ok(PluginCommand::CloseMultiplePanes( + close_multiple_panes_payload + .pane_ids + .into_iter() + .filter_map(|p| p.try_into().ok()) + .collect(), + )) + }, + _ => Err("Mismatched payload for CloseMultiplePanes"), + }, + Some(CommandName::FloatMultiplePanes) => match protobuf_plugin_command.payload { + Some(Payload::FloatMultiplePanesPayload(float_multiple_panes_payload)) => { + Ok(PluginCommand::FloatMultiplePanes( + float_multiple_panes_payload + .pane_ids + .into_iter() + .filter_map(|p| p.try_into().ok()) + .collect(), + )) + }, + _ => Err("Mismatched payload for FloatMultiplePanes"), + }, + Some(CommandName::EmbedMultiplePanes) => match protobuf_plugin_command.payload { + Some(Payload::EmbedMultiplePanesPayload(embed_multiple_panes_payload)) => { + Ok(PluginCommand::EmbedMultiplePanes( + embed_multiple_panes_payload + .pane_ids + .into_iter() + .filter_map(|p| p.try_into().ok()) + .collect(), + )) + }, + _ => Err("Mismatched payload for EmbedMultiplePanes"), + }, None => Err("Unrecognized plugin command"), } } @@ -2551,6 +2625,65 @@ impl TryFrom<PluginCommand> for ProtobufPluginCommand { }, )), }), + PluginCommand::GroupAndUngroupPanes(panes_to_group, panes_to_ungroup) => { + Ok(ProtobufPluginCommand { + name: CommandName::GroupAndUngroupPanes as i32, + payload: Some(Payload::GroupAndUngroupPanesPayload( + GroupAndUngroupPanesPayload { + pane_ids_to_group: panes_to_group + .iter() + .filter_map(|&p| p.try_into().ok()) + .collect(), + pane_ids_to_ungroup: panes_to_ungroup + .iter() + .filter_map(|&p| p.try_into().ok()) + .collect(), + }, + )), + }) + }, + PluginCommand::HighlightAndUnhighlightPanes( + panes_to_highlight, + panes_to_unhighlight, + ) => Ok(ProtobufPluginCommand { + name: CommandName::HighlightAndUnhighlightPanes as i32, + payload: Some(Payload::HighlightAndUnhighlightPanesPayload( + HighlightAndUnhighlightPanesPayload { + pane_ids_to_highlight: panes_to_highlight + .iter() + .filter_map(|&p| p.try_into().ok()) + .collect(), + pane_ids_to_unhighlight: panes_to_unhighlight + .iter() + .filter_map(|&p| p.try_into().ok()) + .collect(), + }, + )), + }), + PluginCommand::CloseMultiplePanes(pane_ids) => Ok(ProtobufPluginCommand { + name: CommandName::CloseMultiplePanes as i32, + payload: Some(Payload::CloseMultiplePanesPayload( + CloseMultiplePanesPayload { + pane_ids: pane_ids.iter().filter_map(|&p| p.try_into().ok()).collect(), + }, + )), + }), + PluginCommand::FloatMultiplePanes(pane_ids) => Ok(ProtobufPluginCommand { + name: CommandName::FloatMultiplePanes as i32, + payload: Some(Payload::FloatMultiplePanesPayload( + FloatMultiplePanesPayload { + pane_ids: pane_ids.iter().filter_map(|&p| p.try_into().ok()).collect(), + }, + )), + }), + PluginCommand::EmbedMultiplePanes(pane_ids) => Ok(ProtobufPluginCommand { + name: CommandName::EmbedMultiplePanes as i32, + payload: Some(Payload::EmbedMultiplePanesPayload( + EmbedMultiplePanesPayload { + pane_ids: pane_ids.iter().filter_map(|&p| p.try_into().ok()).collect(), + }, + )), + }), } } } diff --git a/zellij-utils/src/plugin_api/plugin_ids.proto b/zellij-utils/src/plugin_api/plugin_ids.proto index 09d30bd0..c2c7870c 100644 --- a/zellij-utils/src/plugin_api/plugin_ids.proto +++ b/zellij-utils/src/plugin_api/plugin_ids.proto @@ -6,6 +6,7 @@ message PluginIds { int32 plugin_id = 1; int32 zellij_pid = 2; string initial_cwd = 3; + uint32 client_id = 4; } message ZellijVersion { diff --git a/zellij-utils/src/plugin_api/plugin_ids.rs b/zellij-utils/src/plugin_api/plugin_ids.rs index 749ccf22..9a750973 100644 --- a/zellij-utils/src/plugin_api/plugin_ids.rs +++ b/zellij-utils/src/plugin_api/plugin_ids.rs @@ -13,6 +13,7 @@ impl TryFrom<ProtobufPluginIds> for PluginIds { plugin_id: protobuf_plugin_ids.plugin_id as u32, zellij_pid: protobuf_plugin_ids.zellij_pid as u32, initial_cwd: PathBuf::from(protobuf_plugin_ids.initial_cwd), + client_id: protobuf_plugin_ids.client_id as u16, }) } } @@ -24,6 +25,7 @@ impl TryFrom<PluginIds> for ProtobufPluginIds { plugin_id: plugin_ids.plugin_id as i32, zellij_pid: plugin_ids.zellij_pid as i32, initial_cwd: plugin_ids.initial_cwd.display().to_string(), + client_id: plugin_ids.client_id as u32, }) } } |
