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, Debug, PartialEq, Eq)]
52pub enum MonitorBindingTarget {
53    Direction(DirectionalAction),
54    Output(String),
55}
56
57#[derive(Clone, Debug, PartialEq, Eq)]
58pub enum MonitorBindingAction {
59    Focus(MonitorBindingTarget),
60}
61
62#[derive(Clone, Copy, Debug, PartialEq, Eq)]
63pub enum StackCycleDirection {
64    Forward,
65    Backward,
66}
67
68#[derive(Clone, Debug, PartialEq, Eq)]
69pub enum StackBindingAction {
70    Cycle(StackCycleDirection),
71}
72
73#[derive(Clone, Debug, PartialEq, Eq)]
74pub enum TileBindingAction {
75    Focus(DirectionalAction),
76    Swap(DirectionalAction),
77}
78
79#[derive(Clone, Debug, PartialEq, Eq)]
80pub enum ClusterBindingAction {
81    LayoutCycle,
82}
83
84#[derive(Clone, Copy, Debug, PartialEq, Eq)]
85pub enum CompositorBindingScope {
86    Global,
87    Field,
88    Cluster,
89    Tile,
90    Stack,
91}
92
93#[derive(Clone, Debug, PartialEq, Eq)]
94pub enum BearingsBindingAction {
95    Show,
96    Toggle,
97}
98
99#[derive(Clone, Debug, PartialEq, Eq)]
100pub enum CompositorBindingAction {
101    Reload,
102    OpenTerminal,
103    ToggleState,
104    CloseFocusedWindow,
105    ClusterMode,
106    Quit { requires_shift: bool },
107    ZoomIn,
108    ZoomOut,
109    ZoomReset,
110    Node(NodeBindingAction),
111    Trail(TrailBindingAction),
112    Monitor(MonitorBindingAction),
113    Bearings(BearingsBindingAction),
114    Stack(StackBindingAction),
115    Tile(TileBindingAction),
116    Cluster(ClusterBindingAction),
117}
118
119#[derive(Clone, Debug)]
120pub struct CompositorBinding {
121    pub scope: CompositorBindingScope,
122    pub modifiers: KeyModifiers,
123    pub key: u32,
124    pub action: CompositorBindingAction,
125}
126
127#[derive(Clone, Copy, Debug, PartialEq, Eq)]
128pub enum PointerBindingAction {
129    MoveWindow,
130    FieldJump,
131    ResizeWindow,
132}
133
134#[derive(Clone, Debug)]
135pub struct PointerBinding {
136    pub modifiers: KeyModifiers,
137    pub button: u32,
138    pub action: PointerBindingAction,
139}
140
141impl Default for Keybinds {
142    fn default() -> Self {
143        Self {
144            modifier: KeyModifiers {
145                left_alt: true,
146                ..KeyModifiers::default()
147            },
148        }
149    }
150}
151
152impl Keybinds {
153    pub fn modifier_name(&self) -> String {
154        let mut parts = Vec::new();
155
156        if self.modifier.left_super {
157            parts.push("lsuper");
158        }
159        if self.modifier.right_super {
160            parts.push("rsuper");
161        }
162        if self.modifier.super_key {
163            parts.push("super");
164        }
165
166        if self.modifier.left_ctrl {
167            parts.push("lctrl");
168        }
169        if self.modifier.right_ctrl {
170            parts.push("rctrl");
171        }
172        if self.modifier.ctrl {
173            parts.push("ctrl");
174        }
175
176        if self.modifier.left_alt {
177            parts.push("lalt");
178        }
179        if self.modifier.right_alt {
180            parts.push("ralt");
181        }
182        if self.modifier.alt {
183            parts.push("alt");
184        }
185
186        if self.modifier.left_shift {
187            parts.push("lshift");
188        }
189        if self.modifier.right_shift {
190            parts.push("rshift");
191        }
192        if self.modifier.shift {
193            parts.push("shift");
194        }
195
196        if parts.is_empty() {
197            "none".to_string()
198        } else {
199            parts.join("+")
200        }
201    }
202}