diff options
author | Drew DeVault <sir@cmpwn.com> | 2018-03-29 00:21:05 -0400 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2018-03-29 22:11:08 -0400 |
commit | 3399ad9840f0d3d42b377f4404115d887f65e18a (patch) | |
tree | 33c5d7fd9af3662646f426f4e2dee4722bf0e0b3 /swaybar/ipc.c | |
parent | Only utilize the configured outputs (diff) | |
download | sway-3399ad9840f0d3d42b377f4404115d887f65e18a.tar.gz sway-3399ad9840f0d3d42b377f4404115d887f65e18a.tar.zst sway-3399ad9840f0d3d42b377f4404115d887f65e18a.zip |
Round up workspaces on each output
Diffstat (limited to 'swaybar/ipc.c')
-rw-r--r-- | swaybar/ipc.c | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/swaybar/ipc.c b/swaybar/ipc.c index d3ee170c..6b832070 100644 --- a/swaybar/ipc.c +++ b/swaybar/ipc.c | |||
@@ -187,6 +187,65 @@ static void ipc_parse_config( | |||
187 | json_object_put(bar_config); | 187 | json_object_put(bar_config); |
188 | } | 188 | } |
189 | 189 | ||
190 | static void free_workspaces(struct wl_list *list) { | ||
191 | struct swaybar_workspace *ws, *tmp; | ||
192 | wl_list_for_each_safe(ws, tmp, list, link) { | ||
193 | wl_list_remove(&ws->link); | ||
194 | free(ws->name); | ||
195 | free(ws); | ||
196 | } | ||
197 | } | ||
198 | |||
199 | void ipc_get_workspaces(struct swaybar *bar) { | ||
200 | struct swaybar_output *output; | ||
201 | wl_list_for_each(output, &bar->outputs, link) { | ||
202 | free_workspaces(&output->workspaces); | ||
203 | } | ||
204 | uint32_t len = 0; | ||
205 | char *res = ipc_single_command(bar->ipc_socketfd, | ||
206 | IPC_GET_WORKSPACES, NULL, &len); | ||
207 | json_object *results = json_tokener_parse(res); | ||
208 | if (!results) { | ||
209 | free(res); | ||
210 | return; | ||
211 | } | ||
212 | size_t length = json_object_array_length(results); | ||
213 | json_object *ws_json; | ||
214 | json_object *num, *name, *visible, *focused, *out, *urgent; | ||
215 | for (size_t i = 0; i < length; ++i) { | ||
216 | ws_json = json_object_array_get_idx(results, i); | ||
217 | |||
218 | json_object_object_get_ex(ws_json, "num", &num); | ||
219 | json_object_object_get_ex(ws_json, "name", &name); | ||
220 | json_object_object_get_ex(ws_json, "visible", &visible); | ||
221 | json_object_object_get_ex(ws_json, "focused", &focused); | ||
222 | json_object_object_get_ex(ws_json, "output", &out); | ||
223 | json_object_object_get_ex(ws_json, "urgent", &urgent); | ||
224 | |||
225 | wl_list_for_each(output, &bar->outputs, link) { | ||
226 | const char *ws_output = json_object_get_string(out); | ||
227 | if (strcmp(ws_output, output->name) == 0) { | ||
228 | struct swaybar_workspace *ws = | ||
229 | calloc(1, sizeof(struct swaybar_workspace)); | ||
230 | ws->num = json_object_get_int(num); | ||
231 | ws->name = strdup(json_object_get_string(name)); | ||
232 | ws->visible = json_object_get_boolean(visible); | ||
233 | ws->focused = json_object_get_boolean(focused); | ||
234 | if (ws->focused) { | ||
235 | if (bar->focused_output) { | ||
236 | bar->focused_output->focused = false; | ||
237 | } | ||
238 | bar->focused_output = output; | ||
239 | output->focused = true; | ||
240 | } | ||
241 | ws->urgent = json_object_get_boolean(urgent); | ||
242 | wl_list_insert(&output->workspaces, &ws->link); | ||
243 | } | ||
244 | } | ||
245 | } | ||
246 | free(res); | ||
247 | } | ||
248 | |||
190 | static void ipc_get_outputs(struct swaybar *bar) { | 249 | static void ipc_get_outputs(struct swaybar *bar) { |
191 | uint32_t len = 0; | 250 | uint32_t len = 0; |
192 | char *res = ipc_single_command(bar->ipc_socketfd, | 251 | char *res = ipc_single_command(bar->ipc_socketfd, |
@@ -218,16 +277,18 @@ static void ipc_get_outputs(struct swaybar *bar) { | |||
218 | } | 277 | } |
219 | } | 278 | } |
220 | } | 279 | } |
280 | json_object_put(outputs); | ||
221 | free(res); | 281 | free(res); |
222 | } | 282 | } |
223 | 283 | ||
224 | void ipc_get_config(struct swaybar *bar, const char *bar_id) { | 284 | void ipc_initialize(struct swaybar *bar, const char *bar_id) { |
225 | uint32_t len = strlen(bar_id); | 285 | uint32_t len = strlen(bar_id); |
226 | char *res = ipc_single_command(bar->ipc_socketfd, | 286 | char *res = ipc_single_command(bar->ipc_socketfd, |
227 | IPC_GET_BAR_CONFIG, bar_id, &len); | 287 | IPC_GET_BAR_CONFIG, bar_id, &len); |
228 | ipc_parse_config(bar->config, res); | 288 | ipc_parse_config(bar->config, res); |
229 | free(res); | 289 | free(res); |
230 | ipc_get_outputs(bar); | 290 | ipc_get_outputs(bar); |
291 | // TODO: subscribe to stuff | ||
231 | } | 292 | } |
232 | 293 | ||
233 | void handle_ipc_event(struct swaybar *bar) { | 294 | void handle_ipc_event(struct swaybar *bar) { |