rmux_core/session/
resize.rs1use rmux_proto::{ResizePaneAdjustment, RmuxError, SplitDirection};
2
3use super::target_error::{invalid_pane_target, invalid_window_target};
4use super::Session;
5
6impl Session {
7 pub fn resize_pane(
9 &mut self,
10 pane_index: u32,
11 adjustment: ResizePaneAdjustment,
12 ) -> Result<(), RmuxError> {
13 self.resize_pane_in_window(self.active_window, pane_index, adjustment)
14 }
15
16 pub fn resize_pane_in_window(
18 &mut self,
19 window_index: u32,
20 pane_index: u32,
21 adjustment: ResizePaneAdjustment,
22 ) -> Result<(), RmuxError> {
23 if adjustment == ResizePaneAdjustment::Zoom {
24 return self.toggle_zoom_in_window(window_index, pane_index);
25 }
26
27 self.ensure_resize_target(window_index, pane_index)?;
28 let window = self
29 .window_at_mut(window_index)
30 .expect("addressed session window must exist");
31
32 match adjustment {
33 ResizePaneAdjustment::NoOp => {}
34 ResizePaneAdjustment::AbsoluteWidth { columns } => {
35 let _ = window.resize_pane_width(pane_index, columns);
36 }
37 ResizePaneAdjustment::AbsoluteHeight { rows } => {
38 let _ = window.resize_pane_height(pane_index, rows);
39 }
40 ResizePaneAdjustment::AbsoluteSize { columns, rows } => {
41 let _ = window.resize_pane_width(pane_index, columns);
42 let _ = window.resize_pane_height(pane_index, rows);
43 }
44 ResizePaneAdjustment::Up { cells } => {
45 let _ = window.resize_pane_by(pane_index, ResizePaneAdjustment::Up { cells });
46 }
47 ResizePaneAdjustment::Down { cells } => {
48 let _ = window.resize_pane_by(pane_index, ResizePaneAdjustment::Down { cells });
49 }
50 ResizePaneAdjustment::Left { cells } => {
51 let _ = window.resize_pane_by(pane_index, ResizePaneAdjustment::Left { cells });
52 }
53 ResizePaneAdjustment::Right { cells } => {
54 let _ = window.resize_pane_by(pane_index, ResizePaneAdjustment::Right { cells });
55 }
56 ResizePaneAdjustment::TrimBelow => {}
57 ResizePaneAdjustment::Zoom => unreachable!("zoom returned early"),
58 }
59 Ok(())
60 }
61
62 pub fn resize_pane_to_in_window(
64 &mut self,
65 window_index: u32,
66 pane_index: u32,
67 direction: SplitDirection,
68 size: u32,
69 ) -> Result<(), RmuxError> {
70 self.ensure_resize_target(window_index, pane_index)?;
71 let window = self
72 .window_at_mut(window_index)
73 .expect("addressed session window must exist");
74 let _ = window.resize_pane_to(pane_index, direction, size.max(1));
75 Ok(())
76 }
77
78 pub fn toggle_zoom_in_window(
80 &mut self,
81 window_index: u32,
82 pane_index: u32,
83 ) -> Result<(), RmuxError> {
84 self.ensure_resize_target(window_index, pane_index)?;
85 self.window_at_mut(window_index)
86 .expect("addressed session window must exist")
87 .toggle_zoom(pane_index);
88 Ok(())
89 }
90
91 fn ensure_resize_target(&self, window_index: u32, pane_index: u32) -> Result<(), RmuxError> {
92 if self.window_at(window_index).is_none() {
93 return Err(invalid_window_target(&self.name, window_index));
94 }
95
96 if self
97 .window_at(window_index)
98 .and_then(|window| window.pane(pane_index))
99 .is_none()
100 {
101 return Err(invalid_pane_target(
102 &self.name,
103 window_index,
104 pane_index,
105 "pane index does not exist in session",
106 ));
107 }
108
109 Ok(())
110 }
111}