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}