summaryrefslogtreecommitdiffstats
path: root/zellij-server/src/panes
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2023-06-15 17:07:40 +0200
committerGitHub <noreply@github.com>2023-06-15 17:07:40 +0200
commitbcbd940bf94cd76751af9b5fad64b716ce2cd3e6 (patch)
tree3bfed3792edd57f074c4aed9093c90bc6ed215fe /zellij-server/src/panes
parent8d6f20cfd95927b604f9806a2ceb72727901ff1c (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.rs6
-rw-r--r--zellij-server/src/panes/floating_panes/mod.rs17
-rw-r--r--zellij-server/src/panes/plugin_pane.rs7
-rw-r--r--zellij-server/src/panes/terminal_pane.rs25
-rw-r--r--zellij-server/src/panes/tiled_panes/mod.rs17
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)]