diff options
author | Drew DeVault <sir@cmpwn.com> | 2015-12-13 15:40:19 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2015-12-13 15:40:19 -0500 |
commit | 7918feb9cd7c43cb059b6a6d4ea0be8346c61535 (patch) | |
tree | 62f4c56258df7f624c63cce27a516fc276ccff73 /swaybar | |
parent | Free last line in swaybar (diff) | |
download | sway-7918feb9cd7c43cb059b6a6d4ea0be8346c61535.tar.gz sway-7918feb9cd7c43cb059b6a6d4ea0be8346c61535.tar.zst sway-7918feb9cd7c43cb059b6a6d4ea0be8346c61535.zip |
Display workspaces on swaybar
Diffstat (limited to 'swaybar')
-rw-r--r-- | swaybar/CMakeLists.txt | 2 | ||||
-rw-r--r-- | swaybar/main.c | 119 |
2 files changed, 120 insertions, 1 deletions
diff --git a/swaybar/CMakeLists.txt b/swaybar/CMakeLists.txt index a2ff9f5a..a03ffcf4 100644 --- a/swaybar/CMakeLists.txt +++ b/swaybar/CMakeLists.txt | |||
@@ -3,6 +3,7 @@ include_directories( | |||
3 | ${WAYLAND_CLIENT_INCLUDE_DIR} | 3 | ${WAYLAND_CLIENT_INCLUDE_DIR} |
4 | ${CAIRO_INCLUDE_DIRS} | 4 | ${CAIRO_INCLUDE_DIRS} |
5 | ${PANGO_INCLUDE_DIRS} | 5 | ${PANGO_INCLUDE_DIRS} |
6 | ${JSONC_INCLUDE_DIRS} | ||
6 | ) | 7 | ) |
7 | 8 | ||
8 | add_executable(swaybar | 9 | add_executable(swaybar |
@@ -16,6 +17,7 @@ target_link_libraries(swaybar | |||
16 | ${WAYLAND_CURSOR_LIBRARIES} | 17 | ${WAYLAND_CURSOR_LIBRARIES} |
17 | ${CAIRO_LIBRARIES} | 18 | ${CAIRO_LIBRARIES} |
18 | ${PANGO_LIBRARIES} | 19 | ${PANGO_LIBRARIES} |
20 | ${JSONC_LIBRARIES} | ||
19 | m | 21 | m |
20 | ) | 22 | ) |
21 | 23 | ||
diff --git a/swaybar/main.c b/swaybar/main.c index e252a2db..c7c4ed47 100644 --- a/swaybar/main.c +++ b/swaybar/main.c | |||
@@ -1,10 +1,15 @@ | |||
1 | #include <stdio.h> | 1 | #include <stdio.h> |
2 | #include <stdlib.h> | 2 | #include <stdlib.h> |
3 | #include <string.h> | 3 | #include <string.h> |
4 | #include <stdint.h> | ||
5 | #include <stdbool.h> | ||
6 | #include <json-c/json.h> | ||
7 | #include "ipc-client.h" | ||
4 | #include "readline.h" | 8 | #include "readline.h" |
5 | #include "client/registry.h" | 9 | #include "client/registry.h" |
6 | #include "client/window.h" | 10 | #include "client/window.h" |
7 | #include "client/pango.h" | 11 | #include "client/pango.h" |
12 | #include "stringop.h" | ||
8 | #include "log.h" | 13 | #include "log.h" |
9 | 14 | ||
10 | #define MARGIN 5 | 15 | #define MARGIN 5 |
@@ -27,10 +32,21 @@ struct colors { | |||
27 | struct box_colors binding_mode; | 32 | struct box_colors binding_mode; |
28 | }; | 33 | }; |
29 | 34 | ||
35 | struct workspace { | ||
36 | int num; | ||
37 | char *name; | ||
38 | bool focused; | ||
39 | bool visible; | ||
40 | bool urgent; | ||
41 | }; | ||
42 | |||
43 | list_t *workspaces = NULL; | ||
44 | int socketfd; | ||
30 | FILE *command; | 45 | FILE *command; |
31 | char *line; | 46 | char *line, *output; |
32 | struct registry *registry; | 47 | struct registry *registry; |
33 | struct window *window; | 48 | struct window *window; |
49 | |||
34 | struct colors colors = { | 50 | struct colors colors = { |
35 | .background = 0x000000FF, | 51 | .background = 0x000000FF, |
36 | .statusline = 0xFFFFFFFF, | 52 | .statusline = 0xFFFFFFFF, |
@@ -89,20 +105,114 @@ void update() { | |||
89 | } | 105 | } |
90 | 106 | ||
91 | void render() { | 107 | void render() { |
108 | // Clear | ||
92 | cairo_save(window->cairo); | 109 | cairo_save(window->cairo); |
93 | cairo_set_operator(window->cairo, CAIRO_OPERATOR_CLEAR); | 110 | cairo_set_operator(window->cairo, CAIRO_OPERATOR_CLEAR); |
94 | cairo_paint(window->cairo); | 111 | cairo_paint(window->cairo); |
95 | cairo_restore(window->cairo); | 112 | cairo_restore(window->cairo); |
96 | 113 | ||
114 | // Background | ||
97 | cairo_set_source_u32(window->cairo, colors.background); | 115 | cairo_set_source_u32(window->cairo, colors.background); |
98 | cairo_paint(window->cairo); | 116 | cairo_paint(window->cairo); |
99 | 117 | ||
118 | // Command output | ||
100 | cairo_set_source_u32(window->cairo, colors.statusline); | 119 | cairo_set_source_u32(window->cairo, colors.statusline); |
101 | int width, height; | 120 | int width, height; |
102 | get_text_size(window, &width, &height, "%s", line); | 121 | get_text_size(window, &width, &height, "%s", line); |
103 | 122 | ||
104 | cairo_move_to(window->cairo, window->width - MARGIN - width, MARGIN); | 123 | cairo_move_to(window->cairo, window->width - MARGIN - width, MARGIN); |
105 | pango_printf(window, "%s", line); | 124 | pango_printf(window, "%s", line); |
125 | |||
126 | // Workspaces | ||
127 | int x = 0; | ||
128 | int i; | ||
129 | for (i = 0; i < workspaces->length; ++i) { | ||
130 | struct workspace *ws = workspaces->items[i]; | ||
131 | get_text_size(window, &width, &height, "%s", ws->name); | ||
132 | struct box_colors box_colors; | ||
133 | if (ws->urgent) { | ||
134 | box_colors = colors.urgent_workspace; | ||
135 | } else if (ws->focused) { | ||
136 | box_colors = colors.focused_workspace; | ||
137 | } else if (ws->visible) { | ||
138 | box_colors = colors.active_workspace; | ||
139 | } else { | ||
140 | box_colors = colors.inactive_workspace; | ||
141 | } | ||
142 | cairo_set_source_u32(window->cairo, box_colors.background); | ||
143 | cairo_rectangle(window->cairo, x, 0, width + MARGIN * 2, window->height); | ||
144 | cairo_fill(window->cairo); | ||
145 | |||
146 | cairo_set_source_u32(window->cairo, box_colors.border); | ||
147 | cairo_rectangle(window->cairo, x, 0, width + MARGIN * 2, window->height); | ||
148 | cairo_stroke(window->cairo); | ||
149 | |||
150 | cairo_set_source_u32(window->cairo, box_colors.text); | ||
151 | cairo_move_to(window->cairo, x + MARGIN, MARGIN); | ||
152 | pango_printf(window, "%s", ws->name); | ||
153 | |||
154 | x += width + MARGIN * 2 + MARGIN; | ||
155 | } | ||
156 | } | ||
157 | |||
158 | void ipc_update_workspaces() { | ||
159 | if (workspaces) { | ||
160 | free_flat_list(workspaces); | ||
161 | } | ||
162 | workspaces = create_list(); | ||
163 | |||
164 | uint32_t len = 0; | ||
165 | char *res = ipc_single_command(socketfd, IPC_GET_WORKSPACES, NULL, &len); | ||
166 | json_object *results = json_tokener_parse(res); | ||
167 | |||
168 | int i; | ||
169 | for (i = 0; i < json_object_array_length(results); ++i) { | ||
170 | json_object *ws_json = json_object_array_get_idx(results, i); | ||
171 | json_object *num, *name, *visible, *focused, *out, *urgent; | ||
172 | json_object_object_get_ex(ws_json, "num", &num); | ||
173 | json_object_object_get_ex(ws_json, "name", &name); | ||
174 | json_object_object_get_ex(ws_json, "visible", &visible); | ||
175 | json_object_object_get_ex(ws_json, "focused", &focused); | ||
176 | json_object_object_get_ex(ws_json, "output", &out); | ||
177 | json_object_object_get_ex(ws_json, "urgent", &urgent); | ||
178 | |||
179 | if (strcmp(json_object_get_string(out), output) == 0) { | ||
180 | struct workspace *ws = malloc(sizeof(struct workspace)); | ||
181 | ws->num = json_object_get_int(num); | ||
182 | ws->name = strdup(json_object_get_string(name)); | ||
183 | ws->visible = json_object_get_boolean(visible); | ||
184 | ws->focused = json_object_get_boolean(focused); | ||
185 | ws->urgent = json_object_get_boolean(urgent); | ||
186 | list_add(workspaces, ws); | ||
187 | sway_log(L_INFO, "Handling workspace %s", ws->name); | ||
188 | } | ||
189 | |||
190 | json_object_put(num); | ||
191 | json_object_put(name); | ||
192 | json_object_put(visible); | ||
193 | json_object_put(focused); | ||
194 | json_object_put(out); | ||
195 | json_object_put(urgent); | ||
196 | json_object_put(ws_json); | ||
197 | } | ||
198 | |||
199 | json_object_put(results); | ||
200 | free(res); | ||
201 | } | ||
202 | |||
203 | void bar_ipc_init(int outputi) { | ||
204 | uint32_t len = 0; | ||
205 | char *res = ipc_single_command(socketfd, IPC_GET_OUTPUTS, NULL, &len); | ||
206 | json_object *outputs = json_tokener_parse(res); | ||
207 | json_object *info = json_object_array_get_idx(outputs, outputi); | ||
208 | json_object *name; | ||
209 | json_object_object_get_ex(info, "name", &name); | ||
210 | output = strdup(json_object_get_string(name)); | ||
211 | free(res); | ||
212 | json_object_put(outputs); | ||
213 | sway_log(L_INFO, "Running on output %s", output); | ||
214 | |||
215 | ipc_update_workspaces(); | ||
106 | } | 216 | } |
107 | 217 | ||
108 | int main(int argc, char **argv) { | 218 | int main(int argc, char **argv) { |
@@ -132,6 +242,13 @@ int main(int argc, char **argv) { | |||
132 | line = malloc(1024); | 242 | line = malloc(1024); |
133 | line[0] = '\0'; | 243 | line[0] = '\0'; |
134 | 244 | ||
245 | char *socket_path = get_socketpath(); | ||
246 | if (!socket_path) { | ||
247 | sway_abort("Unable to retrieve socket path"); | ||
248 | } | ||
249 | socketfd = ipc_open_socket(socket_path); | ||
250 | bar_ipc_init(desired_output); | ||
251 | |||
135 | do { | 252 | do { |
136 | if (window_prerender(window) && window->cairo) { | 253 | if (window_prerender(window) && window->cairo) { |
137 | update(); | 254 | update(); |