Skip to content

Commit 5446f64

Browse files
committed
chore: more refactors
1 parent aa05b2a commit 5446f64

8 files changed

Lines changed: 131 additions & 223 deletions

File tree

include/config.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,13 @@ typedef struct {
103103
const char *submap_name, *external_cmd;
104104
} bind_t;
105105

106+
#define MOUSE_BUTTON_SYNTH_KEYCODE_BASE 0x20000000
107+
#define MOUSE_BUTTON_KEYCODE_OFFSET 272
108+
#define mouse_button_to_keycode(button_index) \
109+
(MOUSE_BUTTON_SYNTH_KEYCODE_BASE + ((button_index) + MOUSE_BUTTON_KEYCODE_OFFSET))
110+
#define keycode_to_mouse_button_index(keycode) \
111+
((int)(keycode) - MOUSE_BUTTON_SYNTH_KEYCODE_BASE - MOUSE_BUTTON_KEYCODE_OFFSET)
112+
106113
typedef struct {
107114
uint32_t modifiers;
108115
xkb_keysym_t keysym;
@@ -159,6 +166,9 @@ void load_hotkeys(const char *config_path);
159166
void reload_hotkeys(void);
160167
bool keybind_matches(const keybind_t *kb, uint32_t modifiers, xkb_keysym_t keysym,
161168
uint32_t keycode);
169+
keybind_t *find_keybind(uint32_t modifiers, xkb_keysym_t keysym, uint32_t keycode,
170+
bool prefer_keycode, bool fallback_to_global);
171+
bool is_interactive_bind(const keybind_t *kb);
162172
void execute_keybind(const keybind_t *kb);
163173
void execute_bell_bind(void);
164174
void setup_hotkey_event_listener(struct wl_event_loop *event_loop);

include/keyboard.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include "config.h"
34
#include <stdbool.h>
45
#include <stdint.h>
56
#include <wlr/types/wlr_input_device.h>
@@ -100,3 +101,4 @@ void cancel_presel(void);
100101

101102
// keybind processing
102103
bool handle_keybind(uint32_t modifiers, xkb_keysym_t sym);
104+
keybind_t *handle_keybind_raw(uint32_t modifiers, uint32_t keycode, bool pressed);

include/toplevel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ void toplevel_apply_decoration_mode(toplevel_t *tl);
9696

9797
bool toplevel_can_tear(toplevel_t *toplevel);
9898

99-
void toplevel_send_frame_done_interator(struct wlr_scene_buffer *scene_buffer, int x, int y,
99+
void toplevel_send_frame_done_iterator(struct wlr_scene_buffer *scene_buffer, int x, int y,
100100
void *data);
101101

102102
toplevel_t *toplevel_create(struct wlr_xdg_toplevel *xdg_toplevel);

src/config.c

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,6 @@ xkb_keysym_t parse_keysym(const char *name) {
109109
if (!name || name[0] == '\0')
110110
return XKB_KEY_NoSymbol;
111111

112-
if (strlen(name) == 1)
113-
return xkb_keysym_from_name(name, XKB_KEYSYM_CASE_INSENSITIVE);
114-
115112
return xkb_keysym_from_name(name, XKB_KEYSYM_CASE_INSENSITIVE);
116113
}
117114

@@ -129,7 +126,7 @@ uint32_t parse_keycode(const char *name) {
129126

130127
for (size_t i = 0; i < sizeof(mouse_buttons) / sizeof(mouse_buttons[0]); i++)
131128
if (strcmp(name, mouse_buttons[i]) == 0)
132-
return 0x20000000 + i + 272;
129+
return mouse_button_to_keycode(i);
133130

134131
if (name[0] >= '1' && name[0] <= '9' && name[1] == '\0')
135132
return name[0] - '0' + 1;
@@ -1056,6 +1053,32 @@ bool keybind_matches(const keybind_t *kb, uint32_t modifiers, xkb_keysym_t keysy
10561053
}
10571054
}
10581055

1056+
keybind_t *find_keybind(uint32_t modifiers, xkb_keysym_t keysym, uint32_t keycode,
1057+
bool prefer_keycode, bool fallback_to_global) {
1058+
if (active_submap) {
1059+
for (size_t i = 0; i < active_submap->num_keybinds; i++) {
1060+
keybind_t *kb = &active_submap->keybinds[i];
1061+
if (kb->use_keycode == prefer_keycode && keybind_matches(kb, modifiers, keysym, keycode))
1062+
return kb;
1063+
}
1064+
if (!fallback_to_global)
1065+
return NULL;
1066+
}
1067+
1068+
for (size_t i = 0; i < num_keybinds; i++) {
1069+
keybind_t *kb = &keybinds[i];
1070+
if (kb->use_keycode == prefer_keycode && keybind_matches(kb, modifiers, keysym, keycode))
1071+
return kb;
1072+
}
1073+
1074+
return NULL;
1075+
}
1076+
1077+
bool is_interactive_bind(const keybind_t *kb) {
1078+
return kb && (kb->action == BIND_INTERACTIVE_MOVE || kb->action == BIND_INTERACTIVE_RESIZE ||
1079+
kb->action == BIND_TILING_DRAG);
1080+
}
1081+
10591082
void execute_bind(bind_t b) {
10601083
switch (b.action) {
10611084
case BIND_QUIT:

0 commit comments

Comments
 (0)