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:
Aram Drevekenin 2022-03-18 10:32:43 +01:00 committed by GitHub
parent 6092165980
commit ab74b9974a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 3827 additions and 2746 deletions

View file

@ -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;

View file

@ -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();

View file

@ -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()
}
}

View file

@ -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::*;

File diff suppressed because it is too large Load diff

View file

@ -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};

View file

@ -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

View file

@ -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│ │

View file

@ -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│ │

View file

@ -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│ │

View file

@ -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│ │

View file

@ -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│ │

View file

@ -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│ │

View file

@ -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│ │

View file

@ -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│ │

View file

@ -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│

View file

@ -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│

View file

@ -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

View file

@ -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"
);
}