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::Zoom => unreachable!("zoom returned early"),
57 }
58 Ok(())
59 }
60
61 pub fn resize_pane_to_in_window(
63 &mut self,
64 window_index: u32,
65 pane_index: u32,
66 direction: SplitDirection,
67 size: u32,
68 ) -> Result<(), RmuxError> {
69 self.ensure_resize_target(window_index, pane_index)?;
70 let window = self
71 .window_at_mut(window_index)
72 .expect("addressed session window must exist");
73 let _ = window.resize_pane_to(pane_index, direction, size.max(1));
74 Ok(())
75 }
76
77 pub fn toggle_zoom_in_window(
79 &mut self,
80 window_index: u32,
81 pane_index: u32,
82 ) -> Result<(), RmuxError> {
83 self.ensure_resize_target(window_index, pane_index)?;
84 self.window_at_mut(window_index)
85 .expect("addressed session window must exist")
86 .toggle_zoom(pane_index);
87 Ok(())
88 }
89
90 fn ensure_resize_target(&self, window_index: u32, pane_index: u32) -> Result<(), RmuxError> {
91 if self.window_at(window_index).is_none() {
92 return Err(invalid_window_target(&self.name, window_index));
93 }
94
95 if self
96 .window_at(window_index)
97 .and_then(|window| window.pane(pane_index))
98 .is_none()
99 {
100 return Err(invalid_pane_target(
101 &self.name,
102 window_index,
103 pane_index,
104 "pane index does not exist in session",
105 ));
106 }
107
108 Ok(())
109 }
110}