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    ToggleFocusedPin,
113    CloseFocusedWindow,
114    ClusterMode,
115    FocusCycle(FocusCycleBindingAction),
116    Quit { requires_shift: bool },
117    ZoomIn,
118    ZoomOut,
119    ZoomReset,
120    Node(NodeBindingAction),
121    Trail(TrailBindingAction),
122    Monitor(MonitorBindingAction),
123    Bearings(BearingsBindingAction),
124    Stack(StackBindingAction),
125    Tile(TileBindingAction),
126    Cluster(ClusterBindingAction),
127}
128
129#[derive(Clone, Debug)]
130pub struct CompositorBinding {
131    pub scope: CompositorBindingScope,
132    pub modifiers: KeyModifiers,
133    pub key: u32,
134    pub action: CompositorBindingAction,
135}
136
137#[derive(Clone, Copy, Debug, PartialEq, Eq)]
138pub enum PointerBindingAction {
139    MoveWindow,
140    PanField,
141    ResizeWindow,
142}
143
144#[derive(Clone, Debug)]
145pub struct PointerBinding {
146    pub modifiers: KeyModifiers,
147    pub button: u32,
148    pub action: PointerBindingAction,
149}
150
151impl Default for Keybinds {
152    fn default() -> Self {
153        Self {
154            modifier: KeyModifiers {
155                left_alt: true,
156                ..KeyModifiers::default()
157            },
158        }
159    }
160}
161
162impl Keybinds {
163    pub fn modifier_name(&self) -> String {
164        let mut parts = Vec::new();
165
166        if self.modifier.left_super {
167            parts.push("lsuper");
168        }
169        if self.modifier.right_super {
170            parts.push("rsuper");
171        }
172        if self.modifier.super_key {
173            parts.push("super");
174        }
175
176        if self.modifier.left_ctrl {
177            parts.push("lctrl");
178        }
179        if self.modifier.right_ctrl {
180            parts.push("rctrl");
181        }
182        if self.modifier.ctrl {
183            parts.push("ctrl");
184        }
185
186        if self.modifier.left_alt {
187            parts.push("lalt");
188        }
189        if self.modifier.right_alt {
190            parts.push("ralt");
191        }
192        if self.modifier.alt {
193            parts.push("alt");
194        }
195
196        if self.modifier.left_shift {
197            parts.push("lshift");
198        }
199        if self.modifier.right_shift {
200            parts.push("rshift");
201        }
202        if self.modifier.shift {
203            parts.push("shift");
204        }
205
206        if parts.is_empty() {
207            "none".to_string()
208        } else {
209            parts.join("+")
210        }
211    }
212}