diff options
Diffstat (limited to 'sway/ipc-server.c')
-rw-r--r-- | sway/ipc-server.c | 39 |
1 files changed, 39 insertions, 0 deletions
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 | } | ||