diff options
author | Mikkel Oscar Lyderik <mikkeloscar@gmail.com> | 2016-01-05 18:07:43 +0100 |
---|---|---|
committer | Mikkel Oscar Lyderik <mikkeloscar@gmail.com> | 2016-01-05 18:36:24 +0100 |
commit | 95e0f44c73f2783541b180c9bd555f6b8abb7c0f (patch) | |
tree | f9f48b2376434e631fee5638b0dfe7c4ffa9eb83 | |
parent | Send IPC modifier event on bar_modifier up/down (diff) | |
download | sway-95e0f44c73f2783541b180c9bd555f6b8abb7c0f.tar.gz sway-95e0f44c73f2783541b180c9bd555f6b8abb7c0f.tar.zst sway-95e0f44c73f2783541b180c9bd555f6b8abb7c0f.zip |
Move modifier name table to common/util.c
Lookup of modifier names is required in several places, thus it makes
sense to move it to a general place.
-rw-r--r-- | common/util.c | 38 | ||||
-rw-r--r-- | include/util.h | 18 | ||||
-rw-r--r-- | sway/commands.c | 52 | ||||
-rw-r--r-- | sway/ipc-server.c | 27 |
4 files changed, 69 insertions, 66 deletions
diff --git a/common/util.c b/common/util.c index ed6d033f..b5037d35 100644 --- a/common/util.c +++ b/common/util.c | |||
@@ -13,3 +13,41 @@ int numlen(int n) { | |||
13 | if (n >= 10) return 2; | 13 | if (n >= 10) return 2; |
14 | return 1; | 14 | return 1; |
15 | } | 15 | } |
16 | |||
17 | static struct modifier_key { | ||
18 | char *name; | ||
19 | uint32_t mod; | ||
20 | } modifiers[] = { | ||
21 | { XKB_MOD_NAME_SHIFT, WLC_BIT_MOD_SHIFT }, | ||
22 | { XKB_MOD_NAME_CAPS, WLC_BIT_MOD_CAPS }, | ||
23 | { XKB_MOD_NAME_CTRL, WLC_BIT_MOD_CTRL }, | ||
24 | { "Ctrl", WLC_BIT_MOD_CTRL }, | ||
25 | { XKB_MOD_NAME_ALT, WLC_BIT_MOD_ALT }, | ||
26 | { "Alt", WLC_BIT_MOD_ALT }, | ||
27 | { XKB_MOD_NAME_NUM, WLC_BIT_MOD_MOD2 }, | ||
28 | { "Mod3", WLC_BIT_MOD_MOD3 }, | ||
29 | { XKB_MOD_NAME_LOGO, WLC_BIT_MOD_LOGO }, | ||
30 | { "Mod5", WLC_BIT_MOD_MOD5 }, | ||
31 | }; | ||
32 | |||
33 | uint32_t get_modifier_mask_by_name(const char *name) { | ||
34 | int i; | ||
35 | for (i = 0; i < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++i) { | ||
36 | if (strcasecmp(modifiers[i].name, name) == 0) { | ||
37 | return modifiers[i].mod; | ||
38 | } | ||
39 | } | ||
40 | |||
41 | return 0; | ||
42 | } | ||
43 | |||
44 | const char *get_modifier_name_by_mask(uint32_t modifier) { | ||
45 | int i; | ||
46 | for (i = 0; i < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++i) { | ||
47 | if (modifiers[i].mod == modifier) { | ||
48 | return modifiers[i].name; | ||
49 | } | ||
50 | } | ||
51 | |||
52 | return NULL; | ||
53 | } | ||
diff --git a/include/util.h b/include/util.h index 9cb861dd..4bbb64c8 100644 --- a/include/util.h +++ b/include/util.h | |||
@@ -1,6 +1,10 @@ | |||
1 | #ifndef _SWAY_UTIL_H | 1 | #ifndef _SWAY_UTIL_H |
2 | #define _SWAY_UTIL_H | 2 | #define _SWAY_UTIL_H |
3 | 3 | ||
4 | #include <stdint.h> | ||
5 | #include <wlc/wlc.h> | ||
6 | #include <xkbcommon/xkbcommon.h> | ||
7 | |||
4 | /** | 8 | /** |
5 | * Wrap i into the range [0, max[ | 9 | * Wrap i into the range [0, max[ |
6 | */ | 10 | */ |
@@ -11,4 +15,18 @@ int wrap(int i, int max); | |||
11 | */ | 15 | */ |
12 | int numlen(int n); | 16 | int numlen(int n); |
13 | 17 | ||
18 | /** | ||
19 | * Get modifier mask from modifier name. | ||
20 | * | ||
21 | * Returns the modifer mask or 0 if the name isn't found. | ||
22 | */ | ||
23 | uint32_t get_modifier_mask_by_name(const char *name); | ||
24 | |||
25 | /** | ||
26 | * Get modifier name from modifier mask. | ||
27 | * | ||
28 | * Returns the modifier name or NULL if it isn't found. | ||
29 | */ | ||
30 | const char *get_modifier_name_by_mask(uint32_t modifier); | ||
31 | |||
14 | #endif | 32 | #endif |
diff --git a/sway/commands.c b/sway/commands.c index f748a969..963d8f12 100644 --- a/sway/commands.c +++ b/sway/commands.c | |||
@@ -99,22 +99,6 @@ static sway_cmd bar_colors_cmd_urgent_workspace; | |||
99 | swayc_t *sp_view; | 99 | swayc_t *sp_view; |
100 | int sp_index = 0; | 100 | int sp_index = 0; |
101 | 101 | ||
102 | static struct modifier_key { | ||
103 | char *name; | ||
104 | uint32_t mod; | ||
105 | } modifiers[] = { | ||
106 | { XKB_MOD_NAME_SHIFT, WLC_BIT_MOD_SHIFT }, | ||
107 | { XKB_MOD_NAME_CAPS, WLC_BIT_MOD_CAPS }, | ||
108 | { XKB_MOD_NAME_CTRL, WLC_BIT_MOD_CTRL }, | ||
109 | { "Ctrl", WLC_BIT_MOD_CTRL }, | ||
110 | { XKB_MOD_NAME_ALT, WLC_BIT_MOD_ALT }, | ||
111 | { "Alt", WLC_BIT_MOD_ALT }, | ||
112 | { XKB_MOD_NAME_NUM, WLC_BIT_MOD_MOD2 }, | ||
113 | { "Mod3", WLC_BIT_MOD_MOD3 }, | ||
114 | { XKB_MOD_NAME_LOGO, WLC_BIT_MOD_LOGO }, | ||
115 | { "Mod5", WLC_BIT_MOD_MOD5 }, | ||
116 | }; | ||
117 | |||
118 | static char *bg_options[] = { | 102 | static char *bg_options[] = { |
119 | "stretch", | 103 | "stretch", |
120 | "center", | 104 | "center", |
@@ -187,16 +171,11 @@ static struct cmd_results *cmd_bindsym(int argc, char **argv) { | |||
187 | list_t *split = split_string(argv[0], "+"); | 171 | list_t *split = split_string(argv[0], "+"); |
188 | for (int i = 0; i < split->length; ++i) { | 172 | for (int i = 0; i < split->length; ++i) { |
189 | // Check for a modifier key | 173 | // Check for a modifier key |
190 | int j; | 174 | uint32_t mod; |
191 | bool is_mod = false; | 175 | if ((mod = get_modifier_mask_by_name(split->items[i])) > 0) { |
192 | for (j = 0; j < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++j) { | 176 | binding->modifiers |= mod; |
193 | if (strcasecmp(modifiers[j].name, split->items[i]) == 0) { | 177 | continue; |
194 | binding->modifiers |= modifiers[j].mod; | ||
195 | is_mod = true; | ||
196 | break; | ||
197 | } | ||
198 | } | 178 | } |
199 | if (is_mod) continue; | ||
200 | // Check for xkb key | 179 | // Check for xkb key |
201 | xkb_keysym_t sym = xkb_keysym_from_name(split->items[i], XKB_KEYSYM_CASE_INSENSITIVE); | 180 | xkb_keysym_t sym = xkb_keysym_from_name(split->items[i], XKB_KEYSYM_CASE_INSENSITIVE); |
202 | if (!sym) { | 181 | if (!sym) { |
@@ -408,17 +387,13 @@ static struct cmd_results *cmd_floating_mod(int argc, char **argv) { | |||
408 | if ((error = checkarg(argc, "floating_modifier", EXPECTED_AT_LEAST, 1))) { | 387 | if ((error = checkarg(argc, "floating_modifier", EXPECTED_AT_LEAST, 1))) { |
409 | return error; | 388 | return error; |
410 | } | 389 | } |
411 | int i, j; | 390 | int i; |
412 | list_t *split = split_string(argv[0], "+"); | 391 | list_t *split = split_string(argv[0], "+"); |
413 | config->floating_mod = 0; | 392 | config->floating_mod = 0; |
414 | 393 | ||
415 | // set modifier keys | 394 | // set modifier keys |
416 | for (i = 0; i < split->length; ++i) { | 395 | for (i = 0; i < split->length; ++i) { |
417 | for (j = 0; j < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++j) { | 396 | config->floating_mod |= get_modifier_mask_by_name(split->items[i]); |
418 | if (strcasecmp(modifiers[j].name, split->items[i]) == 0) { | ||
419 | config->floating_mod |= modifiers[j].mod; | ||
420 | } | ||
421 | } | ||
422 | } | 397 | } |
423 | free_flat_list(split); | 398 | free_flat_list(split); |
424 | if (!config->floating_mod) { | 399 | if (!config->floating_mod) { |
@@ -1893,16 +1868,11 @@ static struct cmd_results *bar_cmd_modifier(int argc, char **argv) { | |||
1893 | 1868 | ||
1894 | list_t *split = split_string(argv[0], "+"); | 1869 | list_t *split = split_string(argv[0], "+"); |
1895 | for (int i = 0; i < split->length; ++i) { | 1870 | for (int i = 0; i < split->length; ++i) { |
1896 | int j; | 1871 | uint32_t tmp_mod; |
1897 | bool is_mod = false; | 1872 | if ((tmp_mod = get_modifier_mask_by_name(split->items[i])) > 0) { |
1898 | for (j = 0; j < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++j) { | 1873 | mod |= tmp_mod; |
1899 | if (strcasecmp(modifiers[j].name, split->items[i]) == 0) { | 1874 | continue; |
1900 | mod = modifiers[j].mod; | 1875 | } else { |
1901 | is_mod = true; | ||
1902 | break; | ||
1903 | } | ||
1904 | } | ||
1905 | if (!is_mod) { | ||
1906 | free_flat_list(split); | 1876 | free_flat_list(split); |
1907 | return cmd_results_new(CMD_INVALID, "modifier", "Unknown modifier '%s'", split->items[i]); | 1877 | return cmd_results_new(CMD_INVALID, "modifier", "Unknown modifier '%s'", split->items[i]); |
1908 | } | 1878 | } |
diff --git a/sway/ipc-server.c b/sway/ipc-server.c index da3d52e3..a6598b84 100644 --- a/sway/ipc-server.c +++ b/sway/ipc-server.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include "commands.h" | 19 | #include "commands.h" |
20 | #include "list.h" | 20 | #include "list.h" |
21 | #include "stringop.h" | 21 | #include "stringop.h" |
22 | #include "util.h" | ||
22 | 23 | ||
23 | static int ipc_socket = -1; | 24 | static int ipc_socket = -1; |
24 | static struct wlc_event_source *ipc_event_source = NULL; | 25 | static struct wlc_event_source *ipc_event_source = NULL; |
@@ -35,22 +36,6 @@ struct ipc_client { | |||
35 | enum ipc_command_type subscribed_events; | 36 | enum ipc_command_type subscribed_events; |
36 | }; | 37 | }; |
37 | 38 | ||
38 | static struct modifier_key { | ||
39 | char *name; | ||
40 | uint32_t mod; | ||
41 | } modifiers[] = { | ||
42 | { XKB_MOD_NAME_SHIFT, WLC_BIT_MOD_SHIFT }, | ||
43 | { XKB_MOD_NAME_CAPS, WLC_BIT_MOD_CAPS }, | ||
44 | { XKB_MOD_NAME_CTRL, WLC_BIT_MOD_CTRL }, | ||
45 | { "Ctrl", WLC_BIT_MOD_CTRL }, | ||
46 | { XKB_MOD_NAME_ALT, WLC_BIT_MOD_ALT }, | ||
47 | { "Alt", WLC_BIT_MOD_ALT }, | ||
48 | { XKB_MOD_NAME_NUM, WLC_BIT_MOD_MOD2 }, | ||
49 | { "Mod3", WLC_BIT_MOD_MOD3 }, | ||
50 | { XKB_MOD_NAME_LOGO, WLC_BIT_MOD_LOGO }, | ||
51 | { "Mod5", WLC_BIT_MOD_MOD5 }, | ||
52 | }; | ||
53 | |||
54 | struct sockaddr_un *ipc_user_sockaddr(void); | 39 | struct sockaddr_un *ipc_user_sockaddr(void); |
55 | int ipc_handle_connection(int fd, uint32_t mask, void *data); | 40 | int ipc_handle_connection(int fd, uint32_t mask, void *data); |
56 | int ipc_client_handle_readable(int client_fd, uint32_t mask, void *data); | 41 | int ipc_client_handle_readable(int client_fd, uint32_t mask, void *data); |
@@ -640,15 +625,7 @@ void ipc_event_modifier(uint32_t modifier, const char *state) { | |||
640 | json_object *obj = json_object_new_object(); | 625 | json_object *obj = json_object_new_object(); |
641 | json_object_object_add(obj, "change", json_object_new_string(state)); | 626 | json_object_object_add(obj, "change", json_object_new_string(state)); |
642 | 627 | ||
643 | const char *modifier_name = NULL; | 628 | const char *modifier_name = get_modifier_name_by_mask(modifier); |
644 | int i; | ||
645 | for (i = 0; i < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++i) { | ||
646 | if (modifiers[i].mod == modifier) { | ||
647 | modifier_name = modifiers[i].name; | ||
648 | break; | ||
649 | } | ||
650 | } | ||
651 | |||
652 | json_object_object_add(obj, "modifier", json_object_new_string(modifier_name)); | 629 | json_object_object_add(obj, "modifier", json_object_new_string(modifier_name)); |
653 | 630 | ||
654 | const char *json_string = json_object_to_json_string(obj); | 631 | const char *json_string = json_object_to_json_string(obj); |