diff options
author | Aram Drevekenin <aram@poor.dev> | 2023-06-15 17:07:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-15 17:07:40 +0200 |
commit | bcbd940bf94cd76751af9b5fad64b716ce2cd3e6 (patch) | |
tree | 3bfed3792edd57f074c4aed9093c90bc6ed215fe /zellij-server/src/panes | |
parent | 8d6f20cfd95927b604f9806a2ceb72727901ff1c (diff) |
feat(plugins): plugin pane state events (#2545)
* feat(plugins): report pane state to plugins
* refactor(plugins): rename some stuff
* tests(plugins): adjust for new behavior
* style(fmt): rustfmt
Diffstat (limited to 'zellij-server/src/panes')
-rw-r--r-- | zellij-server/src/panes/active_panes.rs | 6 | ||||
-rw-r--r-- | zellij-server/src/panes/floating_panes/mod.rs | 17 | ||||
-rw-r--r-- | zellij-server/src/panes/plugin_pane.rs | 7 | ||||
-rw-r--r-- | zellij-server/src/panes/terminal_pane.rs | 25 | ||||
-rw-r--r-- | zellij-server/src/panes/tiled_panes/mod.rs | 17 |
5 files changed, 68 insertions, 4 deletions
diff --git a/zellij-server/src/panes/active_panes.rs b/zellij-server/src/panes/active_panes.rs index c726bafe1..039c71c61 100644 --- a/zellij-server/src/panes/active_panes.rs +++ b/zellij-server/src/panes/active_panes.rs @@ -98,4 +98,10 @@ impl ActivePanes { } } } + pub fn pane_id_is_focused(&self, pane_id: &PaneId) -> bool { + self.active_panes + .values() + .find(|p_id| **p_id == *pane_id) + .is_some() + } } diff --git a/zellij-server/src/panes/floating_panes/mod.rs b/zellij-server/src/panes/floating_panes/mod.rs index 071f6e7c2..98c6046bf 100644 --- a/zellij-server/src/panes/floating_panes/mod.rs +++ b/zellij-server/src/panes/floating_panes/mod.rs @@ -1,11 +1,11 @@ mod floating_pane_grid; use zellij_utils::{ - data::{Direction, ResizeStrategy}, + data::{Direction, PaneInfo, ResizeStrategy}, position::Position, }; use crate::resize_pty; -use crate::tab::Pane; +use crate::tab::{pane_info_for_pane, Pane}; use floating_pane_grid::FloatingPaneGrid; use crate::{ @@ -885,4 +885,17 @@ impl FloatingPanes { Err(anyhow!("Pane not found")) } } + pub fn pane_info(&self) -> Vec<PaneInfo> { + let mut pane_infos = vec![]; + for (pane_id, pane) in self.panes.iter() { + let mut pane_info_for_pane = pane_info_for_pane(pane_id, pane); + let is_focused = self.active_panes.pane_id_is_focused(pane_id); + pane_info_for_pane.is_floating = true; + pane_info_for_pane.is_suppressed = false; + pane_info_for_pane.is_focused = is_focused; + pane_info_for_pane.is_fullscreen = false; + pane_infos.push(pane_info_for_pane); + } + pane_infos + } } diff --git a/zellij-server/src/panes/plugin_pane.rs b/zellij-server/src/panes/plugin_pane.rs index d1d595f23..557769f02 100644 --- a/zellij-server/src/panes/plugin_pane.rs +++ b/zellij-server/src/panes/plugin_pane.rs @@ -564,6 +564,13 @@ impl Pane for PluginPane { self.loading_indication.to_string().as_bytes().to_vec(), ); } + fn current_title(&self) -> String { + if self.pane_name.is_empty() { + self.pane_title.to_owned() + } else { + self.pane_name.to_owned() + } + } } impl PluginPane { diff --git a/zellij-server/src/panes/terminal_pane.rs b/zellij-server/src/panes/terminal_pane.rs index c9e125b8d..df74afd69 100644 --- a/zellij-server/src/panes/terminal_pane.rs +++ b/zellij-server/src/panes/terminal_pane.rs @@ -720,6 +720,31 @@ impl Pane for TerminalPane { fn set_title(&mut self, title: String) { self.pane_title = title; } + fn current_title(&self) -> String { + if self.pane_name.is_empty() { + self.grid + .title + .as_deref() + .unwrap_or(&self.pane_title) + .into() + } else { + self.pane_name.to_owned() + } + } + fn exit_status(&self) -> Option<i32> { + self.is_held + .as_ref() + .and_then(|(exit_status, _, _)| *exit_status) + } + fn is_held(&self) -> bool { + self.is_held.is_some() + } + fn exited(&self) -> bool { + match self.is_held { + Some((_, is_first_run, _)) => !is_first_run, + None => false, + } + } } impl TerminalPane { diff --git a/zellij-server/src/panes/tiled_panes/mod.rs b/zellij-server/src/panes/tiled_panes/mod.rs index 3734214af..424053405 100644 --- a/zellij-server/src/panes/tiled_panes/mod.rs +++ b/zellij-server/src/panes/tiled_panes/mod.rs @@ -10,7 +10,7 @@ use crate::{ output::Output, panes::{ActivePanes, PaneId}, plugins::PluginInstruction, - tab::{Pane, MIN_TERMINAL_HEIGHT, MIN_TERMINAL_WIDTH}, + tab::{pane_info_for_pane, Pane, MIN_TERMINAL_HEIGHT, MIN_TERMINAL_WIDTH}, thread_bus::ThreadSenders, ui::boundaries::Boundaries, ui::pane_contents_and_ui::PaneContentsAndUi, @@ -18,7 +18,7 @@ use crate::{ }; use stacked_panes::StackedPanes; use zellij_utils::{ - data::{Direction, ModeInfo, ResizeStrategy, Style}, + data::{Direction, ModeInfo, PaneInfo, ResizeStrategy, Style}, errors::prelude::*, input::{ command::RunCommand, @@ -1709,6 +1709,19 @@ impl TiledPanes { .find(|(_id, s_p)| s_p.invoked_with() == &run) .map(|(id, _)| *id) } + pub fn pane_info(&self) -> Vec<PaneInfo> { + let mut pane_infos = vec![]; + for (pane_id, pane) in self.panes.iter() { + let mut pane_info_for_pane = pane_info_for_pane(pane_id, pane); + let is_focused = self.active_panes.pane_id_is_focused(pane_id); + pane_info_for_pane.is_floating = false; + pane_info_for_pane.is_suppressed = false; + pane_info_for_pane.is_focused = is_focused; + pane_info_for_pane.is_fullscreen = is_focused && self.fullscreen_is_active(); + pane_infos.push(pane_info_for_pane); + } + pane_infos + } } #[allow(clippy::borrowed_box)] |