diff options
author | Mikkel Oscar Lyderik <mikkeloscar@gmail.com> | 2016-01-05 02:20:20 +0100 |
---|---|---|
committer | Mikkel Oscar Lyderik <mikkeloscar@gmail.com> | 2016-01-05 02:25:56 +0100 |
commit | c20c63b677c03b17441f0d135b5325e23d65f38d (patch) | |
tree | e16dde2339d7cb1079a83842c53324ac91fed600 | |
parent | Detect bar modifier pressed/released (diff) | |
download | sway-c20c63b677c03b17441f0d135b5325e23d65f38d.tar.gz sway-c20c63b677c03b17441f0d135b5325e23d65f38d.tar.zst sway-c20c63b677c03b17441f0d135b5325e23d65f38d.zip |
Send IPC modifier event on bar_modifier up/down
Detects when a bar modifier key is pressed/released and sends a modifier
IPC event to any listeners (usually swaybars).
This way a swaybar can listen on the modifier event and hide/show the
bar accordingly (not implemented yet)
The modifier event looks like this:
{
"change": "pressed", // or released
"modifier": "Mod4"
}
-rw-r--r-- | include/ipc-server.h | 6 | ||||
-rw-r--r-- | include/ipc.h | 1 | ||||
-rw-r--r-- | sway/commands.c | 2 | ||||
-rw-r--r-- | sway/handlers.c | 17 | ||||
-rw-r--r-- | sway/ipc-server.c | 39 |
5 files changed, 57 insertions, 8 deletions
diff --git a/include/ipc-server.h b/include/ipc-server.h index 04975093..47026bfd 100644 --- a/include/ipc-server.h +++ b/include/ipc-server.h | |||
@@ -15,6 +15,12 @@ void ipc_event_barconfig_update(struct bar_config *bar); | |||
15 | * Send IPC mode event to all listening clients | 15 | * Send IPC mode event to all listening clients |
16 | */ | 16 | */ |
17 | void ipc_event_mode(const char *mode); | 17 | void ipc_event_mode(const char *mode); |
18 | /** | ||
19 | * Sends an IPC modifier event to all listening clients. The modifier event | ||
20 | * includes a key 'change' with the value of state and a key 'modifier' with | ||
21 | * the name of that modifier. | ||
22 | */ | ||
23 | void ipc_event_modifier(uint32_t modifier, const char *state); | ||
18 | const char *swayc_type_string(enum swayc_types type); | 24 | const char *swayc_type_string(enum swayc_types type); |
19 | 25 | ||
20 | #endif | 26 | #endif |
diff --git a/include/ipc.h b/include/ipc.h index e0b3b736..56593529 100644 --- a/include/ipc.h +++ b/include/ipc.h | |||
@@ -17,6 +17,7 @@ enum ipc_command_type { | |||
17 | IPC_EVENT_WINDOW = (1 << 31 | 3), | 17 | IPC_EVENT_WINDOW = (1 << 31 | 3), |
18 | IPC_EVENT_BARCONFIG_UPDATE = (1 << 31 | 4), | 18 | IPC_EVENT_BARCONFIG_UPDATE = (1 << 31 | 4), |
19 | IPC_EVENT_BINDING = (1 << 31 | 5), | 19 | IPC_EVENT_BINDING = (1 << 31 | 5), |
20 | IPC_EVENT_MODIFIER = (1 << 31 | 6), | ||
20 | IPC_SWAY_GET_PIXELS = 0x81 | 21 | IPC_SWAY_GET_PIXELS = 0x81 |
21 | }; | 22 | }; |
22 | 23 | ||
diff --git a/sway/commands.c b/sway/commands.c index 38019be5..f748a969 100644 --- a/sway/commands.c +++ b/sway/commands.c | |||
@@ -1897,7 +1897,7 @@ static struct cmd_results *bar_cmd_modifier(int argc, char **argv) { | |||
1897 | bool is_mod = false; | 1897 | bool is_mod = false; |
1898 | for (j = 0; j < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++j) { | 1898 | for (j = 0; j < (int)(sizeof(modifiers) / sizeof(struct modifier_key)); ++j) { |
1899 | if (strcasecmp(modifiers[j].name, split->items[i]) == 0) { | 1899 | if (strcasecmp(modifiers[j].name, split->items[i]) == 0) { |
1900 | mod |= modifiers[j].mod; | 1900 | mod = modifiers[j].mod; |
1901 | is_mod = true; | 1901 | is_mod = true; |
1902 | break; | 1902 | break; |
1903 | } | 1903 | } |
diff --git a/sway/handlers.c b/sway/handlers.c index 5e523468..4cbec0ab 100644 --- a/sway/handlers.c +++ b/sway/handlers.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include "resize.h" | 20 | #include "resize.h" |
21 | #include "extensions.h" | 21 | #include "extensions.h" |
22 | #include "criteria.h" | 22 | #include "criteria.h" |
23 | #include "ipc-server.h" | ||
23 | 24 | ||
24 | // Event should be sent to client | 25 | // Event should be sent to client |
25 | #define EVENT_PASSTHROUGH false | 26 | #define EVENT_PASSTHROUGH false |
@@ -392,13 +393,15 @@ static bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifier | |||
392 | struct bar_config *bar; | 393 | struct bar_config *bar; |
393 | for (i = 0; i < config->bars->length; ++i) { | 394 | for (i = 0; i < config->bars->length; ++i) { |
394 | bar = config->bars->items[i]; | 395 | bar = config->bars->items[i]; |
395 | switch (modifier_state_changed(modifiers->mods, bar->modifier)) { | 396 | if (strcmp(bar->mode, "hide") == 0 && strcmp(bar->hidden_state, "hide") == 0) { |
396 | case MOD_STATE_PRESSED: | 397 | switch (modifier_state_changed(modifiers->mods, bar->modifier)) { |
397 | sway_log(L_INFO, "pressed!!!"); | 398 | case MOD_STATE_PRESSED: |
398 | break; | 399 | ipc_event_modifier(bar->modifier, "pressed"); |
399 | case MOD_STATE_RELEASED: | 400 | break; |
400 | sway_log(L_INFO, "released!!!"); | 401 | case MOD_STATE_RELEASED: |
401 | break; | 402 | ipc_event_modifier(bar->modifier, "released"); |
403 | break; | ||
404 | } | ||
402 | } | 405 | } |
403 | } | 406 | } |
404 | // update modifiers state | 407 | // update modifiers state |
diff --git a/sway/ipc-server.c b/sway/ipc-server.c index ed3977d5..da3d52e3 100644 --- a/sway/ipc-server.c +++ b/sway/ipc-server.c | |||
@@ -35,6 +35,22 @@ struct ipc_client { | |||
35 | enum ipc_command_type subscribed_events; | 35 | enum ipc_command_type subscribed_events; |
36 | }; | 36 | }; |
37 | 37 | ||
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 | |||
38 | struct sockaddr_un *ipc_user_sockaddr(void); | 54 | struct sockaddr_un *ipc_user_sockaddr(void); |
39 | int ipc_handle_connection(int fd, uint32_t mask, void *data); | 55 | int ipc_handle_connection(int fd, uint32_t mask, void *data); |
40 | int ipc_client_handle_readable(int client_fd, uint32_t mask, void *data); | 56 | int ipc_client_handle_readable(int client_fd, uint32_t mask, void *data); |
@@ -295,6 +311,8 @@ void ipc_client_handle_command(struct ipc_client *client) { | |||
295 | client->subscribed_events |= IPC_EVENT_BARCONFIG_UPDATE; | 311 | client->subscribed_events |= IPC_EVENT_BARCONFIG_UPDATE; |
296 | } else if (strcmp(event_type, "mode") == 0) { | 312 | } else if (strcmp(event_type, "mode") == 0) { |
297 | client->subscribed_events |= IPC_EVENT_MODE; | 313 | client->subscribed_events |= IPC_EVENT_MODE; |
314 | } else if (strcmp(event_type, "modifier") == 0) { | ||
315 | client->subscribed_events |= IPC_EVENT_MODIFIER; | ||
298 | } else { | 316 | } else { |
299 | ipc_send_reply(client, "{\"success\": false}", 18); | 317 | ipc_send_reply(client, "{\"success\": false}", 18); |
300 | ipc_client_disconnect(client); | 318 | ipc_client_disconnect(client); |
@@ -617,3 +635,24 @@ void ipc_event_mode(const char *mode) { | |||
617 | 635 | ||
618 | json_object_put(obj); // free | 636 | json_object_put(obj); // free |
619 | } | 637 | } |
638 | |||
639 | void ipc_event_modifier(uint32_t modifier, const char *state) { | ||
640 | json_object *obj = json_object_new_object(); | ||
641 | json_object_object_add(obj, "change", json_object_new_string(state)); | ||
642 | |||
643 | const char *modifier_name = NULL; | ||
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)); | ||
653 | |||
654 | const char *json_string = json_object_to_json_string(obj); | ||
655 | ipc_send_event(json_string, IPC_EVENT_MODIFIER); | ||
656 | |||
657 | json_object_put(obj); // free | ||
658 | } | ||