Skip to main content

rmux_core/session/
resize.rs

1use rmux_proto::{ResizePaneAdjustment, RmuxError, SplitDirection};
2
3use super::target_error::{invalid_pane_target, invalid_window_target};
4use super::Session;
5
6impl Session {
7    /// Applies the supported resize adjustment to the session layout.
8    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    /// Applies the supported resize adjustment to the addressed window.
17    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    /// Resizes the addressed pane to an exact size along the split axis.
63    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    /// Toggles zoom for the addressed pane's window.
79    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}