refactor(tab): move tiled panes to their own module (#1239)
* work * tests passing * simplify render state * move more stuff to state * moved tiled panes outside * move files around * style(fmt): rustfmt
This commit is contained in:
parent
6092165980
commit
ab74b9974a
22 changed files with 3827 additions and 2746 deletions
|
|
@ -477,6 +477,7 @@ pub fn close_tab() {
|
|||
let mut step_is_complete = false;
|
||||
if remote_terminal.cursor_position_is(3, 2)
|
||||
&& !remote_terminal.snapshot_contains("Tab #2")
|
||||
&& remote_terminal.tip_appears()
|
||||
{
|
||||
// cursor is in the first tab again
|
||||
step_is_complete = true;
|
||||
|
|
|
|||
|
|
@ -1,12 +1,8 @@
|
|||
use super::pane_resizer::PaneResizer;
|
||||
use crate::tab::{MIN_TERMINAL_HEIGHT, MIN_TERMINAL_WIDTH};
|
||||
use crate::{panes::PaneId, tab::Pane};
|
||||
use std::cmp::Ordering;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use zellij_utils::{
|
||||
input::layout::Direction,
|
||||
pane_size::{Dimension, PaneGeom, Size, Viewport},
|
||||
};
|
||||
use std::collections::HashMap;
|
||||
use zellij_utils::pane_size::{Dimension, PaneGeom, Size, Viewport};
|
||||
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
|
|
@ -40,11 +36,6 @@ impl<'a> FloatingPaneGrid<'a> {
|
|||
viewport,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn layout(&mut self, direction: Direction, space: usize) -> Result<(), String> {
|
||||
let mut pane_resizer = PaneResizer::new(self.panes.clone());
|
||||
pane_resizer.layout(direction, space)
|
||||
}
|
||||
pub fn move_pane_by(&mut self, pane_id: PaneId, x: isize, y: isize) {
|
||||
// true => succeeded to move, false => failed to move
|
||||
let new_pane_position = {
|
||||
|
|
@ -568,16 +559,6 @@ impl<'a> FloatingPaneGrid<'a> {
|
|||
None
|
||||
}
|
||||
}
|
||||
fn increase_pane_height(&mut self, id: &PaneId, percent: f64) {
|
||||
let mut panes = self.panes.borrow_mut();
|
||||
let terminal = panes.get_mut(id).unwrap();
|
||||
terminal.increase_height(percent);
|
||||
}
|
||||
fn increase_pane_width(&mut self, id: &PaneId, percent: f64) {
|
||||
let mut panes = self.panes.borrow_mut();
|
||||
let terminal = panes.get_mut(id).unwrap();
|
||||
terminal.increase_width(percent);
|
||||
}
|
||||
fn increase_pane_size_left(&mut self, id: &PaneId, increase_by: usize) {
|
||||
let new_pane_geom = {
|
||||
let mut panes = self.panes.borrow_mut();
|
||||
|
|
@ -679,140 +660,6 @@ impl<'a> FloatingPaneGrid<'a> {
|
|||
};
|
||||
self.set_pane_geom(*id, new_pane_geom);
|
||||
}
|
||||
fn pane_ids_directly_left_of(&self, id: &PaneId) -> Option<Vec<PaneId>> {
|
||||
let panes = self.panes.borrow();
|
||||
let mut ids = vec![];
|
||||
let terminal_to_check = panes.get(id).unwrap();
|
||||
if terminal_to_check.x() == 0 {
|
||||
return None;
|
||||
}
|
||||
// for (&pid, terminal) in self.get_panes() {
|
||||
for (&pid, terminal) in panes.iter() {
|
||||
if terminal.x() + terminal.cols() == terminal_to_check.x() {
|
||||
ids.push(pid);
|
||||
}
|
||||
}
|
||||
if ids.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(ids)
|
||||
}
|
||||
}
|
||||
fn pane_ids_directly_right_of(&self, id: &PaneId) -> Option<Vec<PaneId>> {
|
||||
let mut ids = vec![];
|
||||
let panes = self.panes.borrow();
|
||||
let terminal_to_check = panes.get(id).unwrap();
|
||||
// for (&pid, terminal) in self.get_panes() {
|
||||
for (&pid, terminal) in panes.iter() {
|
||||
if terminal.x() == terminal_to_check.x() + terminal_to_check.cols() {
|
||||
ids.push(pid);
|
||||
}
|
||||
}
|
||||
if ids.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(ids)
|
||||
}
|
||||
}
|
||||
fn pane_ids_directly_below(&self, id: &PaneId) -> Option<Vec<PaneId>> {
|
||||
let mut ids = vec![];
|
||||
let panes = self.panes.borrow();
|
||||
let terminal_to_check = panes.get(id).unwrap();
|
||||
// for (&pid, terminal) in self.get_panes() {
|
||||
for (&pid, terminal) in panes.iter() {
|
||||
if terminal.y() == terminal_to_check.y() + terminal_to_check.rows() {
|
||||
ids.push(pid);
|
||||
}
|
||||
}
|
||||
if ids.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(ids)
|
||||
}
|
||||
}
|
||||
fn pane_ids_directly_above(&self, id: &PaneId) -> Option<Vec<PaneId>> {
|
||||
let mut ids = vec![];
|
||||
let panes = self.panes.borrow();
|
||||
let terminal_to_check = panes.get(id).unwrap();
|
||||
// for (&pid, terminal) in self.get_panes() {
|
||||
for (&pid, terminal) in panes.iter() {
|
||||
if terminal.y() + terminal.rows() == terminal_to_check.y() {
|
||||
ids.push(pid);
|
||||
}
|
||||
}
|
||||
if ids.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(ids)
|
||||
}
|
||||
}
|
||||
fn pane_is_between_vertical_borders(
|
||||
&self,
|
||||
id: &PaneId,
|
||||
left_border_x: usize,
|
||||
right_border_x: usize,
|
||||
) -> bool {
|
||||
let panes = self.panes.borrow();
|
||||
let pane = panes.get(id).unwrap();
|
||||
pane.x() >= left_border_x && pane.x() + pane.cols() <= right_border_x
|
||||
}
|
||||
fn pane_is_between_horizontal_borders(
|
||||
&self,
|
||||
id: &PaneId,
|
||||
top_border_y: usize,
|
||||
bottom_border_y: usize,
|
||||
) -> bool {
|
||||
let panes = self.panes.borrow();
|
||||
let pane = panes.get(id).unwrap();
|
||||
pane.y() >= top_border_y && pane.y() + pane.rows() <= bottom_border_y
|
||||
}
|
||||
pub fn next_selectable_pane_id(&self, current_pane_id: &PaneId) -> PaneId {
|
||||
let panes = self.panes.borrow();
|
||||
let mut panes: Vec<(&PaneId, &&mut Box<dyn Pane>)> =
|
||||
panes.iter().filter(|(_, p)| p.selectable()).collect();
|
||||
panes.sort_by(|(_a_id, a_pane), (_b_id, b_pane)| {
|
||||
if a_pane.y() == b_pane.y() {
|
||||
a_pane.x().cmp(&b_pane.x())
|
||||
} else {
|
||||
a_pane.y().cmp(&b_pane.y())
|
||||
}
|
||||
});
|
||||
let active_pane_position = panes
|
||||
.iter()
|
||||
.position(|(id, _)| *id == current_pane_id) // TODO: better
|
||||
.unwrap();
|
||||
|
||||
let next_active_pane_id = panes
|
||||
.get(active_pane_position + 1)
|
||||
.or_else(|| panes.get(0))
|
||||
.map(|p| *p.0)
|
||||
.unwrap();
|
||||
next_active_pane_id
|
||||
}
|
||||
pub fn previous_selectable_pane_id(&self, current_pane_id: &PaneId) -> PaneId {
|
||||
let panes = self.panes.borrow();
|
||||
let mut panes: Vec<(&PaneId, &&mut Box<dyn Pane>)> =
|
||||
panes.iter().filter(|(_, p)| p.selectable()).collect();
|
||||
panes.sort_by(|(_a_id, a_pane), (_b_id, b_pane)| {
|
||||
if a_pane.y() == b_pane.y() {
|
||||
a_pane.x().cmp(&b_pane.x())
|
||||
} else {
|
||||
a_pane.y().cmp(&b_pane.y())
|
||||
}
|
||||
});
|
||||
let last_pane = panes.last().unwrap();
|
||||
let active_pane_position = panes
|
||||
.iter()
|
||||
.position(|(id, _)| *id == current_pane_id) // TODO: better
|
||||
.unwrap();
|
||||
|
||||
let previous_active_pane_id = if active_pane_position == 0 {
|
||||
*last_pane.0
|
||||
} else {
|
||||
*panes.get(active_pane_position - 1).unwrap().0
|
||||
};
|
||||
previous_active_pane_id
|
||||
}
|
||||
pub fn next_selectable_pane_id_to_the_left(&self, current_pane_id: &PaneId) -> Option<PaneId> {
|
||||
let panes = self.panes.borrow();
|
||||
let current_pane = panes.get(current_pane_id)?;
|
||||
|
|
@ -917,196 +764,6 @@ impl<'a> FloatingPaneGrid<'a> {
|
|||
.copied();
|
||||
next_index
|
||||
}
|
||||
fn horizontal_borders(&self, pane_ids: &[PaneId]) -> HashSet<usize> {
|
||||
pane_ids.iter().fold(HashSet::new(), |mut borders, p| {
|
||||
let panes = self.panes.borrow();
|
||||
let pane = panes.get(p).unwrap();
|
||||
borders.insert(pane.y());
|
||||
borders.insert(pane.y() + pane.rows());
|
||||
borders
|
||||
})
|
||||
}
|
||||
fn vertical_borders(&self, pane_ids: &[PaneId]) -> HashSet<usize> {
|
||||
pane_ids.iter().fold(HashSet::new(), |mut borders, p| {
|
||||
let panes = self.panes.borrow();
|
||||
let pane = panes.get(p).unwrap();
|
||||
borders.insert(pane.x());
|
||||
borders.insert(pane.x() + pane.cols());
|
||||
borders
|
||||
})
|
||||
}
|
||||
fn panes_to_the_left_between_aligning_borders(&self, id: PaneId) -> Option<Vec<PaneId>> {
|
||||
let panes = self.panes.borrow();
|
||||
if let Some(pane) = panes.get(&id) {
|
||||
let upper_close_border = pane.y();
|
||||
let lower_close_border = pane.y() + pane.rows();
|
||||
|
||||
if let Some(panes_to_the_left) = self.pane_ids_directly_left_of(&id) {
|
||||
let mut selectable_panes: Vec<_> = panes_to_the_left
|
||||
.into_iter()
|
||||
.filter(|pid| panes.get(pid).unwrap().selectable())
|
||||
.collect();
|
||||
let pane_borders_to_the_left = self.horizontal_borders(&selectable_panes);
|
||||
if pane_borders_to_the_left.contains(&upper_close_border)
|
||||
&& pane_borders_to_the_left.contains(&lower_close_border)
|
||||
{
|
||||
selectable_panes.retain(|t| {
|
||||
self.pane_is_between_horizontal_borders(
|
||||
t,
|
||||
upper_close_border,
|
||||
lower_close_border,
|
||||
)
|
||||
});
|
||||
return Some(selectable_panes);
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
fn panes_to_the_right_between_aligning_borders(&self, id: PaneId) -> Option<Vec<PaneId>> {
|
||||
let panes = self.panes.borrow();
|
||||
if let Some(pane) = panes.get(&id) {
|
||||
let upper_close_border = pane.y();
|
||||
let lower_close_border = pane.y() + pane.rows();
|
||||
|
||||
if let Some(panes_to_the_right) = self.pane_ids_directly_right_of(&id) {
|
||||
let mut selectable_panes: Vec<_> = panes_to_the_right
|
||||
.into_iter()
|
||||
.filter(|pid| panes.get(pid).unwrap().selectable())
|
||||
.collect();
|
||||
let pane_borders_to_the_right = self.horizontal_borders(&selectable_panes);
|
||||
if pane_borders_to_the_right.contains(&upper_close_border)
|
||||
&& pane_borders_to_the_right.contains(&lower_close_border)
|
||||
{
|
||||
selectable_panes.retain(|t| {
|
||||
self.pane_is_between_horizontal_borders(
|
||||
t,
|
||||
upper_close_border,
|
||||
lower_close_border,
|
||||
)
|
||||
});
|
||||
return Some(selectable_panes);
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
fn panes_above_between_aligning_borders(&self, id: PaneId) -> Option<Vec<PaneId>> {
|
||||
let panes = self.panes.borrow();
|
||||
if let Some(pane) = panes.get(&id) {
|
||||
let left_close_border = pane.x();
|
||||
let right_close_border = pane.x() + pane.cols();
|
||||
|
||||
if let Some(panes_above) = self.pane_ids_directly_above(&id) {
|
||||
let mut selectable_panes: Vec<_> = panes_above
|
||||
.into_iter()
|
||||
.filter(|pid| panes.get(pid).unwrap().selectable())
|
||||
.collect();
|
||||
let pane_borders_above = self.vertical_borders(&selectable_panes);
|
||||
if pane_borders_above.contains(&left_close_border)
|
||||
&& pane_borders_above.contains(&right_close_border)
|
||||
{
|
||||
selectable_panes.retain(|t| {
|
||||
self.pane_is_between_vertical_borders(
|
||||
t,
|
||||
left_close_border,
|
||||
right_close_border,
|
||||
)
|
||||
});
|
||||
return Some(selectable_panes);
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
fn panes_below_between_aligning_borders(&self, id: PaneId) -> Option<Vec<PaneId>> {
|
||||
let panes = self.panes.borrow();
|
||||
if let Some(pane) = panes.get(&id) {
|
||||
let left_close_border = pane.x();
|
||||
let right_close_border = pane.x() + pane.cols();
|
||||
|
||||
if let Some(panes_below) = self.pane_ids_directly_below(&id) {
|
||||
let mut selectable_panes: Vec<_> = panes_below
|
||||
.into_iter()
|
||||
.filter(|pid| panes[pid].selectable())
|
||||
.collect();
|
||||
let pane_borders_below = self.vertical_borders(&selectable_panes);
|
||||
if pane_borders_below.contains(&left_close_border)
|
||||
&& pane_borders_below.contains(&right_close_border)
|
||||
{
|
||||
selectable_panes.retain(|t| {
|
||||
self.pane_is_between_vertical_borders(
|
||||
t,
|
||||
left_close_border,
|
||||
right_close_border,
|
||||
)
|
||||
});
|
||||
return Some(selectable_panes);
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
fn find_panes_to_grow(&self, id: PaneId) -> Option<(Vec<PaneId>, Direction)> {
|
||||
if let Some(panes) = self
|
||||
.panes_to_the_left_between_aligning_borders(id)
|
||||
.or_else(|| self.panes_to_the_right_between_aligning_borders(id))
|
||||
{
|
||||
return Some((panes, Direction::Horizontal));
|
||||
}
|
||||
|
||||
if let Some(panes) = self
|
||||
.panes_above_between_aligning_borders(id)
|
||||
.or_else(|| self.panes_below_between_aligning_borders(id))
|
||||
{
|
||||
return Some((panes, Direction::Vertical));
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
fn grow_panes(&mut self, panes: &[PaneId], direction: Direction, (width, height): (f64, f64)) {
|
||||
match direction {
|
||||
Direction::Horizontal => {
|
||||
for pane_id in panes {
|
||||
self.increase_pane_width(pane_id, width);
|
||||
}
|
||||
}
|
||||
Direction::Vertical => {
|
||||
for pane_id in panes {
|
||||
self.increase_pane_height(pane_id, height);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
pub fn fill_space_over_pane(&mut self, id: PaneId) -> bool {
|
||||
// true => successfully filled space over pane
|
||||
// false => didn't succeed, so didn't do anything
|
||||
let (freed_width, freed_height) = {
|
||||
let panes = self.panes.borrow_mut();
|
||||
let pane_to_close = panes.get(&id).unwrap();
|
||||
let freed_space = pane_to_close.position_and_size();
|
||||
let freed_width = freed_space.cols.as_percent();
|
||||
let freed_height = freed_space.rows.as_percent();
|
||||
(freed_width, freed_height)
|
||||
};
|
||||
if let (Some(freed_width), Some(freed_height)) = (freed_width, freed_height) {
|
||||
if let Some((panes_to_grow, direction)) = self.find_panes_to_grow(id) {
|
||||
self.grow_panes(&panes_to_grow, direction, (freed_width, freed_height));
|
||||
let side_length = match direction {
|
||||
Direction::Vertical => self.display_area.rows,
|
||||
Direction::Horizontal => self.display_area.cols,
|
||||
};
|
||||
{
|
||||
let mut panes = self.panes.borrow_mut();
|
||||
(*panes).remove(&id);
|
||||
}
|
||||
let mut pane_resizer = PaneResizer::new(self.panes.clone());
|
||||
let _ = pane_resizer.layout(direction, side_length);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
pub fn find_room_for_new_pane(&self) -> Option<PaneGeom> {
|
||||
let panes = self.panes.borrow();
|
||||
let pane_geoms: Vec<PaneGeom> = panes.values().map(|p| p.position_and_size()).collect();
|
||||
|
|
@ -1,7 +1,9 @@
|
|||
mod floating_pane_grid;
|
||||
|
||||
use zellij_utils::{position::Position, zellij_tile};
|
||||
|
||||
use crate::tab::floating_pane_grid::FloatingPaneGrid;
|
||||
use crate::tab::Pane;
|
||||
use floating_pane_grid::FloatingPaneGrid;
|
||||
|
||||
use crate::{
|
||||
os_input_output::ServerOsApi,
|
||||
|
|
@ -35,6 +37,12 @@ pub struct FloatingPanes {
|
|||
panes: BTreeMap<PaneId, Box<dyn Pane>>,
|
||||
display_area: Rc<RefCell<Size>>,
|
||||
viewport: Rc<RefCell<Viewport>>,
|
||||
connected_clients: Rc<RefCell<HashSet<ClientId>>>,
|
||||
connected_clients_in_app: Rc<RefCell<HashSet<ClientId>>>,
|
||||
mode_info: Rc<RefCell<HashMap<ClientId, ModeInfo>>>,
|
||||
default_mode_info: ModeInfo,
|
||||
colors: Palette,
|
||||
session_is_mirrored: bool,
|
||||
desired_pane_positions: HashMap<PaneId, PaneGeom>, // this represents the positions of panes the user moved with intention, rather than by resizing the terminal window
|
||||
z_indices: Vec<PaneId>,
|
||||
active_panes: HashMap<ClientId, PaneId>,
|
||||
|
|
@ -44,11 +52,26 @@ pub struct FloatingPanes {
|
|||
|
||||
#[allow(clippy::borrowed_box)]
|
||||
impl FloatingPanes {
|
||||
pub fn new(display_area: Rc<RefCell<Size>>, viewport: Rc<RefCell<Viewport>>) -> Self {
|
||||
pub fn new(
|
||||
display_area: Rc<RefCell<Size>>,
|
||||
viewport: Rc<RefCell<Viewport>>,
|
||||
connected_clients: Rc<RefCell<HashSet<ClientId>>>,
|
||||
connected_clients_in_app: Rc<RefCell<HashSet<ClientId>>>,
|
||||
mode_info: Rc<RefCell<HashMap<ClientId, ModeInfo>>>,
|
||||
session_is_mirrored: bool,
|
||||
default_mode_info: ModeInfo,
|
||||
colors: Palette,
|
||||
) -> Self {
|
||||
FloatingPanes {
|
||||
panes: BTreeMap::new(),
|
||||
display_area,
|
||||
viewport,
|
||||
connected_clients,
|
||||
connected_clients_in_app,
|
||||
mode_info,
|
||||
session_is_mirrored,
|
||||
default_mode_info,
|
||||
colors,
|
||||
desired_pane_positions: HashMap::new(),
|
||||
z_indices: vec![],
|
||||
show_panes: false,
|
||||
|
|
@ -56,13 +79,17 @@ impl FloatingPanes {
|
|||
pane_being_moved_with_mouse: None,
|
||||
}
|
||||
}
|
||||
pub fn stack(&self) -> FloatingPanesStack {
|
||||
let layers = self
|
||||
.z_indices
|
||||
.iter()
|
||||
.map(|pane_id| self.panes.get(pane_id).unwrap().position_and_size())
|
||||
.collect();
|
||||
FloatingPanesStack { layers }
|
||||
pub fn stack(&self) -> Option<FloatingPanesStack> {
|
||||
if self.panes_are_visible() {
|
||||
let layers = self
|
||||
.z_indices
|
||||
.iter()
|
||||
.map(|pane_id| self.panes.get(pane_id).unwrap().position_and_size())
|
||||
.collect();
|
||||
Some(FloatingPanesStack { layers })
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
pub fn pane_ids(&self) -> impl Iterator<Item = &PaneId> {
|
||||
self.panes.keys()
|
||||
|
|
@ -151,17 +178,9 @@ impl FloatingPanes {
|
|||
resize_pty!(pane, os_api);
|
||||
}
|
||||
}
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub fn render(
|
||||
&mut self,
|
||||
connected_clients_in_app: &Rc<RefCell<HashSet<ClientId>>>,
|
||||
connected_clients: &HashSet<ClientId>,
|
||||
mode_info: &HashMap<ClientId, ModeInfo>,
|
||||
default_mode_info: &ModeInfo,
|
||||
session_is_mirrored: bool,
|
||||
output: &mut Output,
|
||||
colors: Palette,
|
||||
) {
|
||||
pub fn render(&mut self, output: &mut Output) {
|
||||
let connected_clients: Vec<ClientId> =
|
||||
{ self.connected_clients.borrow().iter().copied().collect() };
|
||||
let mut floating_panes: Vec<_> = self.panes.iter_mut().collect();
|
||||
floating_panes.sort_by(|(a_id, _a_pane), (b_id, _b_pane)| {
|
||||
self.z_indices
|
||||
|
|
@ -173,25 +192,35 @@ impl FloatingPanes {
|
|||
|
||||
for (z_index, (kind, pane)) in floating_panes.iter_mut().enumerate() {
|
||||
let mut active_panes = self.active_panes.clone();
|
||||
let multiple_users_exist_in_session = { connected_clients_in_app.borrow().len() > 1 };
|
||||
active_panes.retain(|c_id, _| connected_clients.contains(c_id));
|
||||
let multiple_users_exist_in_session =
|
||||
{ self.connected_clients_in_app.borrow().len() > 1 };
|
||||
active_panes.retain(|c_id, _| self.connected_clients.borrow().contains(c_id));
|
||||
let mut pane_contents_and_ui = PaneContentsAndUi::new(
|
||||
pane,
|
||||
output,
|
||||
colors,
|
||||
self.colors,
|
||||
&active_panes,
|
||||
multiple_users_exist_in_session,
|
||||
Some(z_index + 1), // +1 because 0 is reserved for non-floating panes
|
||||
);
|
||||
for &client_id in connected_clients {
|
||||
let client_mode = mode_info.get(&client_id).unwrap_or(default_mode_info).mode;
|
||||
pane_contents_and_ui.render_pane_frame(client_id, client_mode, session_is_mirrored);
|
||||
for client_id in &connected_clients {
|
||||
let client_mode = self
|
||||
.mode_info
|
||||
.borrow()
|
||||
.get(&client_id)
|
||||
.unwrap_or(&self.default_mode_info)
|
||||
.mode;
|
||||
pane_contents_and_ui.render_pane_frame(
|
||||
*client_id,
|
||||
client_mode,
|
||||
self.session_is_mirrored,
|
||||
);
|
||||
if let PaneId::Plugin(..) = kind {
|
||||
pane_contents_and_ui.render_pane_contents_for_client(client_id);
|
||||
pane_contents_and_ui.render_pane_contents_for_client(*client_id);
|
||||
}
|
||||
// this is done for panes that don't have their own cursor (eg. panes of
|
||||
// another user)
|
||||
pane_contents_and_ui.render_fake_cursor_if_needed(client_id);
|
||||
pane_contents_and_ui.render_fake_cursor_if_needed(*client_id);
|
||||
}
|
||||
if let PaneId::Terminal(..) = kind {
|
||||
pane_contents_and_ui
|
||||
|
|
@ -719,18 +748,32 @@ impl FloatingPanes {
|
|||
}
|
||||
}
|
||||
}
|
||||
pub fn focus_pane(&mut self, pane_id: PaneId, client_id: ClientId) {
|
||||
self.active_panes.insert(client_id, pane_id);
|
||||
pub fn focus_pane_for_all_clients(&mut self, pane_id: PaneId) {
|
||||
let connected_clients: Vec<ClientId> =
|
||||
self.connected_clients.borrow().iter().copied().collect();
|
||||
for client_id in connected_clients {
|
||||
self.active_panes.insert(client_id, pane_id);
|
||||
}
|
||||
self.z_indices.retain(|p_id| *p_id != pane_id);
|
||||
self.z_indices.push(pane_id);
|
||||
self.set_pane_active_at(pane_id);
|
||||
self.set_force_render();
|
||||
}
|
||||
pub fn focus_pane(&mut self, pane_id: PaneId, client_id: ClientId) {
|
||||
self.active_panes.insert(client_id, pane_id);
|
||||
self.focus_pane_for_all_clients(pane_id);
|
||||
}
|
||||
pub fn defocus_pane(&mut self, pane_id: PaneId, client_id: ClientId) {
|
||||
self.z_indices.retain(|p_id| *p_id != pane_id);
|
||||
self.active_panes.remove(&client_id);
|
||||
self.set_force_render();
|
||||
}
|
||||
pub fn get_pane(&self, pane_id: PaneId) -> Option<&Box<dyn Pane>> {
|
||||
self.panes.get(&pane_id)
|
||||
}
|
||||
pub fn get_pane_mut(&mut self, pane_id: PaneId) -> Option<&mut Box<dyn Pane>> {
|
||||
self.panes.get_mut(&pane_id)
|
||||
}
|
||||
pub fn get_pane_id_at(&self, point: &Position, search_selectable: bool) -> Option<PaneId> {
|
||||
if search_selectable {
|
||||
// TODO: better - loop through z-indices and check each one if it contains the point
|
||||
|
|
@ -825,4 +868,10 @@ impl FloatingPanes {
|
|||
};
|
||||
self.pane_being_moved_with_mouse = None;
|
||||
}
|
||||
pub fn get_active_pane_id(&self, client_id: ClientId) -> Option<PaneId> {
|
||||
self.active_panes.get(&client_id).copied()
|
||||
}
|
||||
pub fn get_panes(&self) -> impl Iterator<Item = (&PaneId, &Box<dyn Pane>)> {
|
||||
self.panes.iter()
|
||||
}
|
||||
}
|
||||
|
|
@ -6,6 +6,7 @@ mod plugin_pane;
|
|||
pub mod selection;
|
||||
pub mod terminal_character;
|
||||
mod terminal_pane;
|
||||
mod tiled_panes;
|
||||
|
||||
pub use alacritty_functions::*;
|
||||
pub use floating_panes::*;
|
||||
|
|
@ -14,3 +15,4 @@ pub use link_handler::*;
|
|||
pub(crate) use plugin_pane::*;
|
||||
pub(crate) use terminal_character::*;
|
||||
pub use terminal_pane::*;
|
||||
pub use tiled_panes::*;
|
||||
|
|
|
|||
1035
zellij-server/src/panes/tiled_panes/mod.rs
Normal file
1035
zellij-server/src/panes/tiled_panes/mod.rs
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1,5 +1,6 @@
|
|||
use super::is_inside_viewport;
|
||||
use super::pane_resizer::PaneResizer;
|
||||
use crate::tab::{is_inside_viewport, MIN_TERMINAL_HEIGHT, MIN_TERMINAL_WIDTH};
|
||||
use crate::tab::{MIN_TERMINAL_HEIGHT, MIN_TERMINAL_WIDTH};
|
||||
use crate::{panes::PaneId, tab::Pane};
|
||||
use std::cmp::Reverse;
|
||||
use std::collections::{HashMap, HashSet};
|
||||
|
|
@ -428,7 +428,7 @@ impl Screen {
|
|||
let size = self.size;
|
||||
let overlay = self.overlay.clone();
|
||||
for (tab_index, tab) in &mut self.tabs {
|
||||
if tab.has_active_panes() {
|
||||
if tab.has_selectable_panes() {
|
||||
let vte_overlay = overlay.generate_overlay(size);
|
||||
tab.render(&mut output, Some(vte_overlay));
|
||||
} else {
|
||||
|
|
@ -567,11 +567,9 @@ impl Screen {
|
|||
}
|
||||
pub fn remove_client(&mut self, client_id: ClientId) {
|
||||
self.tabs.iter_mut().for_each(|(_, tab)| {
|
||||
if tab.active_panes.get(&client_id).is_some() {
|
||||
tab.remove_client(client_id);
|
||||
if tab.has_no_connected_clients() {
|
||||
tab.visible(false);
|
||||
}
|
||||
tab.remove_client(client_id);
|
||||
if tab.has_no_connected_clients() {
|
||||
tab.visible(false);
|
||||
}
|
||||
});
|
||||
if self.active_tab_indices.contains_key(&client_id) {
|
||||
|
|
@ -604,7 +602,7 @@ impl Screen {
|
|||
position: tab.position,
|
||||
name: tab.name.clone(),
|
||||
active: *active_tab_index == tab.index,
|
||||
panes_to_hide: tab.panes_to_hide.len(),
|
||||
panes_to_hide: tab.panes_to_hide_count(),
|
||||
is_fullscreen_active: tab.is_fullscreen_active(),
|
||||
is_sync_panes_active: tab.is_sync_panes_active(),
|
||||
are_floating_panes_visible: tab.are_floating_panes_visible(),
|
||||
|
|
@ -874,7 +872,7 @@ pub(crate) fn screen_thread_main(
|
|||
screen
|
||||
.get_active_tab_mut(client_id)
|
||||
.unwrap()
|
||||
.move_focus(client_id);
|
||||
.focus_next_pane(client_id);
|
||||
|
||||
screen.render();
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -5,7 +5,7 @@ expression: snapshot
|
|||
---
|
||||
00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
01 (C): │ │
|
||||
02 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ │
|
||||
02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │
|
||||
03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
@ -15,7 +15,7 @@ expression: snapshot
|
|||
09 (C): │ │ │ │
|
||||
10 (C): │ │ │ │
|
||||
11 (C): │ │ I am scratch terminal │ │
|
||||
12 (C): │ ┌ Pane #2 ─────────────── SCROLL│ │────────── SCROLL: 0/1 ┐ │
|
||||
12 (C): │ ┌ Pane #5 ─────────────── SCROLL│ │────────── SCROLL: 0/1 ┐ │
|
||||
13 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
14 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
15 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ expression: snapshot
|
|||
---
|
||||
00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
01 (C): │ │
|
||||
02 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ │
|
||||
02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │
|
||||
03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│─────────────────────────────────────│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
@ -15,7 +15,7 @@ expression: snapshot
|
|||
09 (C): │ │ I am scratch terminal │ │
|
||||
10 (C): │ │ │ │
|
||||
11 (C): │ │ │ │
|
||||
12 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ │
|
||||
12 (C): │ ┌ Pane #5 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #6 ─────────────── SCROLL: 0/1 ┐ │
|
||||
13 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
14 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│─────────────────────────────────────│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
15 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ expression: snapshot
|
|||
---
|
||||
00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
01 (C): │ │
|
||||
02 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ │
|
||||
02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │
|
||||
03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE┌ Pane #2 ─────────────────────────────────────────────────┐EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
@ -15,7 +15,7 @@ expression: snapshot
|
|||
09 (C): │ │ I am scratch terminal │ │
|
||||
10 (C): │ │ │ │
|
||||
11 (C): │ │ │ │
|
||||
12 (C): │ ┌ Pane #2 ─────────────── SC│ │────────────── SCROLL: 0/1 ┐ │
|
||||
12 (C): │ ┌ Pane #5 ─────────────── SC│ │────────────── SCROLL: 0/1 ┐ │
|
||||
13 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
14 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE└──────────────────────────────────────────────────────────┘EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
15 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ expression: snapshot
|
|||
---
|
||||
00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
01 (C): │ │
|
||||
02 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ │
|
||||
02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │
|
||||
03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE┌ Pane #2 ─────────────────────────────────────────────────┐EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
@ -15,7 +15,7 @@ expression: snapshot
|
|||
09 (C): │ │ I am scratch terminal │ │
|
||||
10 (C): │ │ │ │
|
||||
11 (C): │ │ │ │
|
||||
12 (C): │ ┌ Pane #2 ─────────────── SC│ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ │
|
||||
12 (C): │ ┌ Pane #5 ─────────────── SC│ ┌ Pane #6 ─────────────── SCROLL: 0/1 ┐ │
|
||||
13 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
14 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE└────────────────────────────────────────────────│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
15 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ expression: snapshot
|
|||
---
|
||||
00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
01 (C): │ │
|
||||
02 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ │
|
||||
02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │
|
||||
03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE┌ Pane #2 ─────────────────────────────────────────────────┐EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
@ -15,7 +15,7 @@ expression: snapshot
|
|||
09 (C): │ │ I am scratch terminal │ │
|
||||
10 (C): │ │ │ │
|
||||
11 (C): │ │ │ │
|
||||
12 (C): │ ┌ Pane #2 ─────────────── SC│ │────────────── SCROLL: 0/1 ┐ │
|
||||
12 (C): │ ┌ Pane #5 ─────────────── SC│ │────────────── SCROLL: 0/1 ┐ │
|
||||
13 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
14 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE└──────────────────────────────────────────────────────────┘EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
15 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ expression: snapshot
|
|||
---
|
||||
00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
01 (C): │ │
|
||||
02 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ │
|
||||
02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │
|
||||
03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE┌ Pane #2 ───────────────────────────────────────│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
@ -15,7 +15,7 @@ expression: snapshot
|
|||
09 (C): │ │ I am scratch terminal │ │
|
||||
10 (C): │ │ │ │
|
||||
11 (C): │ │ │ │
|
||||
12 (C): │ ┌ Pane #2 ─────────────── SC│ │────────────── SCROLL: 0/1 ┐ │
|
||||
12 (C): │ ┌ Pane #5 ─────────────── SC│ │────────────── SCROLL: 0/1 ┐ │
|
||||
13 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
14 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE└──────────────────────────────────────────────────────────┘EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
15 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ expression: snapshot
|
|||
---
|
||||
00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
01 (C): │ │
|
||||
02 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ │
|
||||
02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │
|
||||
03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE┌ Pane #2 ─────────────────────────────────────────────────┐EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
@ -15,7 +15,7 @@ expression: snapshot
|
|||
09 (C): │ │ I am scratch terminal │ │
|
||||
10 (C): │ │ │ │
|
||||
11 (C): │ │ │ │
|
||||
12 (C): │ ┌ Pane #2 ─────────────── SC│ │────────────── SCROLL: 0/1 ┐ │
|
||||
12 (C): │ ┌ Pane #5 ─────────────── SC│ │────────────── SCROLL: 0/1 ┐ │
|
||||
13 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
14 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE└──────────────────────────────────────────────────────────┘EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
15 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ expression: snapshot
|
|||
---
|
||||
00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
01 (C): │ │
|
||||
02 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ │
|
||||
02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │
|
||||
03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE┌ Pane #2 ─────────────────────────────────────────────────┐EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
@ -15,7 +15,7 @@ expression: snapshot
|
|||
09 (C): │ │ I am scratch terminal │ │
|
||||
10 (C): │ │ │ │
|
||||
11 (C): │ │ │ │
|
||||
12 (C): │ ┌ Pane #2 ─────────────── SC│ │────────────── SCROLL: 0/1 ┐ │
|
||||
12 (C): │ ┌ Pane #5 ─────────────── SC│ │────────────── SCROLL: 0/1 ┐ │
|
||||
13 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
14 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEE└──────────────────────────────────────────────────────────┘EEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
15 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@ expression: snapshot
|
|||
---
|
||||
00 (C): ┌ Pane #1 ────────────────────┌ Pane #2 ─────────────────────────────────────────────────┐─────────┐
|
||||
01 (C): │ │ │ │
|
||||
02 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐
|
||||
02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐
|
||||
03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│
|
||||
04 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ I am scrat┌ Pane #2 ─────────────── SCROLL: 0/1 ┐
|
||||
04 (C): │ ┌ Pane #5 ─────────────── SCROLL: 0/1 ┐ I am scrat┌ Pane #6 ─────────────── SCROLL: 0/1 ┐
|
||||
05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│
|
||||
06 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│
|
||||
07 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@ expression: snapshot
|
|||
---
|
||||
00 (C): ┌ Pane #1 ────────────────────┌ Pane #2 ─────────┐
|
||||
01 (C): │ │ │
|
||||
02 (C): │ ┌ Pane #┌ Pane #2 ─────────────── SCROLL: 0/1 ┐
|
||||
02 (C): │ ┌ Pane #┌ Pane #4 ─────────────── SCROLL: 0/1 ┐
|
||||
03 (C): │ │EEEEEEE│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│
|
||||
04 (C): │ ┌ Pane #┌ Pane #2 ─────────────── SCROLL: 0/1 ┐
|
||||
04 (C): │ ┌ Pane #┌ Pane #6 ─────────────── SCROLL: 0/1 ┐
|
||||
05 (C): │ │EEEEEEE│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│
|
||||
06 (C): │ │EEEEEEE│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│
|
||||
07 (C): │ │EEEEEEE│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ expression: snapshot
|
|||
---
|
||||
00 (C): ┌ Pane #1 ──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
01 (C): │ │
|
||||
02 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ │
|
||||
02 (C): │ ┌ Pane #3 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #4 ─────────────── SCROLL: 0/1 ┐ │
|
||||
03 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
04 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
05 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│─────────────────────────────────────│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
@ -15,7 +15,7 @@ expression: snapshot
|
|||
09 (C): │ │ I am scratch terminal │ │
|
||||
10 (C): │ │ │ │
|
||||
11 (C): │ │ │ │
|
||||
12 (C): │ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #2 ─────────────── SCROLL: 0/1 ┐ │
|
||||
12 (C): │ ┌ Pane #5 ─────────────── SCROLL: 0/1 ┐ ┌ Pane #6 ─────────────── SCROLL: 0/1 ┐ │
|
||||
13 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
14 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│─────────────────────────────────────│EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
15 (C): │ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE│ │
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -458,10 +458,9 @@ fn switch_to_tab_with_fullscreen() {
|
|||
screen
|
||||
.get_active_tab(1)
|
||||
.unwrap()
|
||||
.active_panes
|
||||
.get(&1)
|
||||
.get_active_pane_id(1)
|
||||
.unwrap(),
|
||||
&PaneId::Terminal(2),
|
||||
PaneId::Terminal(2),
|
||||
"Active pane is still the fullscreen pane"
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue