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}