Skip to main content

halley_config/keybinds/
types.rs

1#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
2pub struct KeyModifiers {
3    pub super_key: bool,
4    pub left_super: bool,
5    pub right_super: bool,
6    pub alt: bool,
7    pub left_alt: bool,
8    pub right_alt: bool,
9    pub ctrl: bool,
10    pub left_ctrl: bool,
11    pub right_ctrl: bool,
12    pub shift: bool,
13    pub left_shift: bool,
14    pub right_shift: bool,
15}
16
17#[derive(Clone, Debug)]
18pub struct Keybinds {
19    pub modifier: KeyModifiers,
20}
21
22#[derive(Clone, Debug)]
23pub struct LaunchBinding {
24    pub modifiers: KeyModifiers,
25    pub key: u32,
26    pub command: String,
27}
28
29pub const WHEEL_UP_CODE: u32 = 0x2000;
30pub const WHEEL_DOWN_CODE: u32 = 0x2001;
31
32#[derive(Clone, Copy, Debug, PartialEq, Eq)]
33pub enum DirectionalAction {
34    Left,
35    Right,
36    Up,
37    Down,
38}
39
40#[derive(Clone, Debug, PartialEq, Eq)]
41pub enum NodeBindingAction {
42    Move(DirectionalAction),
43}
44
45#[derive(Clone, Debug, PartialEq, Eq)]
46pub enum TrailBindingAction {
47    Prev,
48    Next,
49}
50
51#[derive(Clone, Copy, Debug, PartialEq, Eq)]
52pub enum FocusCycleBindingAction {
53    Forward,
54    Backward,
55}
56
57#[derive(Clone, Debug, PartialEq, Eq)]
58pub enum MonitorBindingTarget {
59    Direction(DirectionalAction),
60    Output(String),
61}
62
63#[derive(Clone, Debug, PartialEq, Eq)]
64pub enum MonitorBindingAction {
65    Focus(MonitorBindingTarget),
66}
67
68#[derive(Clone, Copy, Debug, PartialEq, Eq)]
69pub enum StackCycleDirection {
70    Forward,
71    Backward,
72}
73
74#[derive(Clone, Debug, PartialEq, Eq)]
75pub enum StackBindingAction {
76    Cycle(StackCycleDirection),
77}
78
79#[derive(Clone, Debug, PartialEq, Eq)]
80pub enum TileBindingAction {
81    Focus(DirectionalAction),
82    Swap(DirectionalAction),
83}
84
85#[derive(Clone, Debug, PartialEq, Eq)]
86pub enum ClusterBindingAction {
87    LayoutCycle,
88    Slot(u8),
89}
90
91#[derive(Clone, Copy, Debug, PartialEq, Eq)]
92pub enum CompositorBindingScope {
93    Global,
94    Field,
95    Cluster,
96    Tile,
97    Stack,
98}
99
100#[derive(Clone, Debug, PartialEq, Eq)]
101pub enum BearingsBindingAction {
102    Show,
103    Toggle,
104}
105
106#[derive(Clone, Debug, PartialEq, Eq)]
107pub enum CompositorBindingAction {
108    Reload,
109    OpenTerminal,
110    ToggleState,
111    MaximizeFocusedWindow,
112    CloseFocusedWindow,
113    ClusterMode,
114    FocusCycle(FocusCycleBindingAction),
115    Quit { requires_shift: bool },
116    ZoomIn,
117    ZoomOut,
118    ZoomReset,
119    Node(NodeBindingAction),
120    Trail(TrailBindingAction),
121    Monitor(MonitorBindingAction),
122    Bearings(BearingsBindingAction),
123    Stack(StackBindingAction),
124    Tile(TileBindingAction),
125    Cluster(ClusterBindingAction),
126}
127
128#[derive(Clone, Debug)]
129pub struct CompositorBinding {
130    pub scope: CompositorBindingScope,
131    pub modifiers: KeyModifiers,
132    pub key: u32,
133    pub action: CompositorBindingAction,
134}
135
136#[derive(Clone, Copy, Debug, PartialEq, Eq)]
137pub enum PointerBindingAction {
138    MoveWindow,
139    FieldJump,
140    ResizeWindow,
141}
142
143#[derive(Clone, Debug)]
144pub struct PointerBinding {
145    pub modifiers: KeyModifiers,
146    pub button: u32,
147    pub action: PointerBindingAction,
148}
149
150impl Default for Keybinds {
151    fn default() -> Self {
152        Self {
153            modifier: KeyModifiers {
154                left_alt: true,
155                ..KeyModifiers::default()
156            },
157        }
158    }
159}
160
161impl Keybinds {
162    pub fn modifier_name(&self) -> String {
163        let mut parts = Vec::new();
164
165        if self.modifier.left_super {
166            parts.push("lsuper");
167        }
168        if self.modifier.right_super {
169            parts.push("rsuper");
170        }
171        if self.modifier.super_key {
172            parts.push("super");
173        }
174
175        if self.modifier.left_ctrl {
176            parts.push("lctrl");
177        }
178        if self.modifier.right_ctrl {
179            parts.push("rctrl");
180        }
181        if self.modifier.ctrl {
182            parts.push("ctrl");
183        }
184
185        if self.modifier.left_alt {
186            parts.push("lalt");
187        }
188        if self.modifier.right_alt {
189            parts.push("ralt");
190        }
191        if self.modifier.alt {
192            parts.push("alt");
193        }
194
195        if self.modifier.left_shift {
196            parts.push("lshift");
197        }
198        if self.modifier.right_shift {
199            parts.push("rshift");
200        }
201        if self.modifier.shift {
202            parts.push("shift");
203        }
204
205        if parts.is_empty() {
206            "none".to_string()
207        } else {
208            parts.join("+")
209        }
210    }
211}