diff options
author | Mikkel Oscar Lyderik <mikkeloscar@gmail.com> | 2016-01-03 22:00:59 +0100 |
---|---|---|
committer | Mikkel Oscar Lyderik <mikkeloscar@gmail.com> | 2016-01-03 22:16:36 +0100 |
commit | aa2f754c64605676c9f3586ebf18f667e787c06a (patch) | |
tree | 3cd19b37cfe852fa9e2b2f7104fc0c92c4ccdec1 /swaybar | |
parent | Merge pull request #427 from mikkeloscar/ipc-update (diff) | |
download | sway-aa2f754c64605676c9f3586ebf18f667e787c06a.tar.gz sway-aa2f754c64605676c9f3586ebf18f667e787c06a.tar.zst sway-aa2f754c64605676c9f3586ebf18f667e787c06a.zip |
swaybar: Implement binding_mode_indicator
Diffstat (limited to 'swaybar')
-rw-r--r-- | swaybar/main.c | 83 |
1 files changed, 76 insertions, 7 deletions
diff --git a/swaybar/main.c b/swaybar/main.c index 2ee25589..18283afa 100644 --- a/swaybar/main.c +++ b/swaybar/main.c | |||
@@ -76,6 +76,8 @@ struct registry *registry; | |||
76 | struct window *window; | 76 | struct window *window; |
77 | bool dirty = true; | 77 | bool dirty = true; |
78 | char *separator_symbol = NULL; | 78 | char *separator_symbol = NULL; |
79 | char *mode = NULL; | ||
80 | bool binding_mode_indicator = true; | ||
79 | bool strip_workspace_numbers = false; | 81 | bool strip_workspace_numbers = false; |
80 | typedef enum {UNDEF, TEXT, I3BAR} command_protocol; | 82 | typedef enum {UNDEF, TEXT, I3BAR} command_protocol; |
81 | command_protocol protocol = UNDEF; | 83 | command_protocol protocol = UNDEF; |
@@ -291,7 +293,7 @@ void bar_ipc_init(int outputi, const char *bar_id) { | |||
291 | json_object *bar_config = json_tokener_parse(res); | 293 | json_object *bar_config = json_tokener_parse(res); |
292 | json_object *tray_output, *mode, *hidden_state, *position, *_status_command; | 294 | json_object *tray_output, *mode, *hidden_state, *position, *_status_command; |
293 | json_object *font, *bar_height, *workspace_buttons, *_strip_workspace_numbers; | 295 | json_object *font, *bar_height, *workspace_buttons, *_strip_workspace_numbers; |
294 | json_object *binding_mode_indicator, *verbose, *_colors, *sep_symbol; | 296 | json_object *_binding_mode_indicator, *verbose, *_colors, *sep_symbol; |
295 | json_object_object_get_ex(bar_config, "tray_output", &tray_output); | 297 | json_object_object_get_ex(bar_config, "tray_output", &tray_output); |
296 | json_object_object_get_ex(bar_config, "mode", &mode); | 298 | json_object_object_get_ex(bar_config, "mode", &mode); |
297 | json_object_object_get_ex(bar_config, "hidden_state", &hidden_state); | 299 | json_object_object_get_ex(bar_config, "hidden_state", &hidden_state); |
@@ -301,7 +303,7 @@ void bar_ipc_init(int outputi, const char *bar_id) { | |||
301 | json_object_object_get_ex(bar_config, "bar_height", &bar_height); | 303 | json_object_object_get_ex(bar_config, "bar_height", &bar_height); |
302 | json_object_object_get_ex(bar_config, "workspace_buttons", &workspace_buttons); | 304 | json_object_object_get_ex(bar_config, "workspace_buttons", &workspace_buttons); |
303 | json_object_object_get_ex(bar_config, "strip_workspace_numbers", &_strip_workspace_numbers); | 305 | json_object_object_get_ex(bar_config, "strip_workspace_numbers", &_strip_workspace_numbers); |
304 | json_object_object_get_ex(bar_config, "binding_mode_indicator", &binding_mode_indicator); | 306 | json_object_object_get_ex(bar_config, "binding_mode_indicator", &_binding_mode_indicator); |
305 | json_object_object_get_ex(bar_config, "verbose", &verbose); | 307 | json_object_object_get_ex(bar_config, "verbose", &verbose); |
306 | json_object_object_get_ex(bar_config, "separator_symbol", &sep_symbol); | 308 | json_object_object_get_ex(bar_config, "separator_symbol", &sep_symbol); |
307 | json_object_object_get_ex(bar_config, "colors", &_colors); | 309 | json_object_object_get_ex(bar_config, "colors", &_colors); |
@@ -328,6 +330,10 @@ void bar_ipc_init(int outputi, const char *bar_id) { | |||
328 | strip_workspace_numbers = json_object_get_boolean(_strip_workspace_numbers); | 330 | strip_workspace_numbers = json_object_get_boolean(_strip_workspace_numbers); |
329 | } | 331 | } |
330 | 332 | ||
333 | if (_binding_mode_indicator) { | ||
334 | binding_mode_indicator = json_object_get_boolean(_binding_mode_indicator); | ||
335 | } | ||
336 | |||
331 | if (bar_height) { | 337 | if (bar_height) { |
332 | int width, height; | 338 | int width, height; |
333 | get_text_size(window, &width, &height, "Test string for measuring purposes"); | 339 | get_text_size(window, &width, &height, "Test string for measuring purposes"); |
@@ -635,6 +641,28 @@ void render_workspace_button(struct workspace *ws, double *x) { | |||
635 | free(name); | 641 | free(name); |
636 | } | 642 | } |
637 | 643 | ||
644 | void render_binding_mode_indicator(double pos) { | ||
645 | int width, height; | ||
646 | get_text_size(window, &width, &height, "%s", mode); | ||
647 | |||
648 | // background | ||
649 | cairo_set_source_u32(window->cairo, colors.binding_mode.background); | ||
650 | cairo_rectangle(window->cairo, pos, 1.5, width + ws_hor_padding * 2 - 1, | ||
651 | height + ws_ver_padding * 2); | ||
652 | cairo_fill(window->cairo); | ||
653 | |||
654 | // border | ||
655 | cairo_set_source_u32(window->cairo, colors.binding_mode.border); | ||
656 | cairo_rectangle(window->cairo, pos, 1.5, width + ws_hor_padding * 2 - 1, | ||
657 | height + ws_ver_padding * 2); | ||
658 | cairo_stroke(window->cairo); | ||
659 | |||
660 | // text | ||
661 | cairo_set_source_u32(window->cairo, colors.binding_mode.text); | ||
662 | cairo_move_to(window->cairo, (int)pos + ws_hor_padding, margin); | ||
663 | pango_printf(window, "%s", mode); | ||
664 | } | ||
665 | |||
638 | void render() { | 666 | void render() { |
639 | int i; | 667 | int i; |
640 | 668 | ||
@@ -675,6 +703,11 @@ void render() { | |||
675 | struct workspace *ws = workspaces->items[i]; | 703 | struct workspace *ws = workspaces->items[i]; |
676 | render_workspace_button(ws, &x); | 704 | render_workspace_button(ws, &x); |
677 | } | 705 | } |
706 | |||
707 | // binding mode indicator | ||
708 | if (mode && binding_mode_indicator) { | ||
709 | render_binding_mode_indicator(x); | ||
710 | } | ||
678 | } | 711 | } |
679 | 712 | ||
680 | void free_status_block(void *item) { | 713 | void free_status_block(void *item) { |
@@ -1034,6 +1067,45 @@ int i3json_handle_fd(int fd) { | |||
1034 | return i3json_parse(); | 1067 | return i3json_parse(); |
1035 | } | 1068 | } |
1036 | 1069 | ||
1070 | bool handle_ipc_event() { | ||
1071 | struct ipc_response *resp = ipc_recv_response(ipc_event_socketfd); | ||
1072 | switch (resp->type) { | ||
1073 | case IPC_EVENT_WORKSPACE: | ||
1074 | ipc_update_workspaces(); | ||
1075 | break; | ||
1076 | case IPC_EVENT_MODE: { | ||
1077 | json_object *result = json_tokener_parse(resp->payload); | ||
1078 | if (!result) { | ||
1079 | free_ipc_response(resp); | ||
1080 | sway_log(L_ERROR, "failed to parse payload as json"); | ||
1081 | return false; | ||
1082 | } | ||
1083 | json_object *json_change; | ||
1084 | if (json_object_object_get_ex(result, "change", &json_change)) { | ||
1085 | const char *change = json_object_get_string(json_change); | ||
1086 | |||
1087 | free(mode); | ||
1088 | if (strcmp(change, "default") == 0) { | ||
1089 | mode = NULL; | ||
1090 | } else { | ||
1091 | mode = strdup(change); | ||
1092 | } | ||
1093 | } else { | ||
1094 | sway_log(L_ERROR, "failed to parse response"); | ||
1095 | } | ||
1096 | |||
1097 | json_object_put(result); | ||
1098 | break; | ||
1099 | } | ||
1100 | default: | ||
1101 | free_ipc_response(resp); | ||
1102 | return false; | ||
1103 | } | ||
1104 | |||
1105 | free_ipc_response(resp); | ||
1106 | return true; | ||
1107 | } | ||
1108 | |||
1037 | void poll_for_update() { | 1109 | void poll_for_update() { |
1038 | fd_set readfds; | 1110 | fd_set readfds; |
1039 | int activity; | 1111 | int activity; |
@@ -1058,11 +1130,8 @@ void poll_for_update() { | |||
1058 | } | 1130 | } |
1059 | 1131 | ||
1060 | if (FD_ISSET(ipc_event_socketfd, &readfds)) { | 1132 | if (FD_ISSET(ipc_event_socketfd, &readfds)) { |
1061 | sway_log(L_DEBUG, "Got workspace update."); | 1133 | sway_log(L_DEBUG, "Got IPC event."); |
1062 | struct ipc_response *resp = ipc_recv_response(ipc_event_socketfd); | 1134 | dirty = handle_ipc_event(); |
1063 | free_ipc_response(resp); | ||
1064 | ipc_update_workspaces(); | ||
1065 | dirty = true; | ||
1066 | } | 1135 | } |
1067 | 1136 | ||
1068 | if (status_command && FD_ISSET(status_read_fd, &readfds)) { | 1137 | if (status_command && FD_ISSET(status_read_fd, &readfds)) { |