oxwm

https://git.tonybtw.com/oxwm.git git://git.tonybtw.com/oxwm.git
2,710 bytes raw
1
use super::{GapConfig, Layout, WindowGeometry};
2
use x11rb::protocol::xproto::Window;
3
4
pub struct TilingLayout;
5
6
impl Layout for TilingLayout {
7
    fn name(&self) -> &'static str {
8
        super::TILING
9
    }
10
11
    fn arrange(
12
        &self,
13
        windows: &[Window],
14
        screen_width: u32,
15
        screen_height: u32,
16
        gaps: &GapConfig,
17
    ) -> Vec<WindowGeometry> {
18
        let window_count = windows.len();
19
        if window_count == 0 {
20
            return Vec::new();
21
        }
22
23
        if window_count == 1 {
24
            let x = gaps.outer_horizontal as i32;
25
            let y = gaps.outer_vertical as i32;
26
            let width = screen_width.saturating_sub(2 * gaps.outer_horizontal);
27
            let height = screen_height.saturating_sub(2 * gaps.outer_vertical);
28
29
            vec![WindowGeometry {
30
                x_coordinate: x,
31
                y_coordinate: y,
32
                width,
33
                height,
34
            }]
35
        } else {
36
            let mut geometries = Vec::new();
37
38
            let master_width = (screen_width / 2)
39
                .saturating_sub(gaps.outer_horizontal)
40
                .saturating_sub(gaps.inner_horizontal / 2);
41
42
            let master_x = gaps.outer_horizontal as i32;
43
            let master_y = gaps.outer_vertical as i32;
44
            let master_height = screen_height.saturating_sub(2 * gaps.outer_vertical);
45
46
            geometries.push(WindowGeometry {
47
                x_coordinate: master_x,
48
                y_coordinate: master_y,
49
                width: master_width,
50
                height: master_height,
51
            });
52
53
            let stack_count = window_count - 1;
54
            let stack_x = (screen_width / 2 + gaps.inner_horizontal / 2) as i32;
55
            let stack_width = (screen_width / 2)
56
                .saturating_sub(gaps.outer_horizontal)
57
                .saturating_sub(gaps.inner_horizontal / 2);
58
59
            let total_stack_height = screen_height.saturating_sub(2 * gaps.outer_vertical);
60
61
            let total_inner_gaps = gaps.inner_vertical * (stack_count as u32 - 1);
62
            let stack_height =
63
                total_stack_height.saturating_sub(total_inner_gaps) / stack_count as u32;
64
65
            for i in 1..window_count {
66
                let stack_index = i - 1;
67
                let y_offset = gaps.outer_vertical
68
                    + (stack_index as u32) * (stack_height + gaps.inner_vertical);
69
70
                geometries.push(WindowGeometry {
71
                    x_coordinate: stack_x,
72
                    y_coordinate: y_offset as i32,
73
                    width: stack_width,
74
                    height: stack_height,
75
                });
76
            }
77
78
            return geometries;
79
        }
80
    }
81
}