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 | |
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')
-rw-r--r-- | swaybar/bar.c | 9 | ||||
-rw-r--r-- | swaybar/ipc.c | 63 |
2 files changed, 69 insertions, 3 deletions
diff --git a/swaybar/bar.c b/swaybar/bar.c index a6e3b780..68dea408 100644 --- a/swaybar/bar.c +++ b/swaybar/bar.c | |||
@@ -72,6 +72,7 @@ static void handle_global(void *data, struct wl_registry *registry, | |||
72 | output->output = wl_registry_bind(registry, name, | 72 | output->output = wl_registry_bind(registry, name, |
73 | &wl_output_interface, 1); | 73 | &wl_output_interface, 1); |
74 | output->index = index++; | 74 | output->index = index++; |
75 | wl_list_init(&output->workspaces); | ||
75 | wl_list_insert(&bar->outputs, &output->link); | 76 | wl_list_insert(&bar->outputs, &output->link); |
76 | } else if (strcmp(interface, zwlr_layer_shell_v1_interface.name) == 0) { | 77 | } else if (strcmp(interface, zwlr_layer_shell_v1_interface.name) == 0) { |
77 | bar->layer_shell = wl_registry_bind( | 78 | bar->layer_shell = wl_registry_bind( |
@@ -96,7 +97,7 @@ void bar_setup(struct swaybar *bar, | |||
96 | 97 | ||
97 | bar->ipc_socketfd = ipc_open_socket(socket_path); | 98 | bar->ipc_socketfd = ipc_open_socket(socket_path); |
98 | bar->ipc_event_socketfd = ipc_open_socket(socket_path); | 99 | bar->ipc_event_socketfd = ipc_open_socket(socket_path); |
99 | ipc_get_config(bar, bar_id); | 100 | ipc_initialize(bar, bar_id); |
100 | 101 | ||
101 | assert(bar->display = wl_display_connect(NULL)); | 102 | assert(bar->display = wl_display_connect(NULL)); |
102 | 103 | ||
@@ -113,6 +114,7 @@ void bar_setup(struct swaybar *bar, | |||
113 | if (coutput->index != output->index) { | 114 | if (coutput->index != output->index) { |
114 | continue; | 115 | continue; |
115 | } | 116 | } |
117 | output->name = strdup(coutput->name); | ||
116 | assert(output->surface = wl_compositor_create_surface( | 118 | assert(output->surface = wl_compositor_create_surface( |
117 | bar->compositor)); | 119 | bar->compositor)); |
118 | output->layer_surface = zwlr_layer_shell_v1_get_layer_surface( | 120 | output->layer_surface = zwlr_layer_shell_v1_get_layer_surface( |
@@ -123,10 +125,13 @@ void bar_setup(struct swaybar *bar, | |||
123 | &layer_surface_listener, output); | 125 | &layer_surface_listener, output); |
124 | zwlr_layer_surface_v1_set_anchor(output->layer_surface, | 126 | zwlr_layer_surface_v1_set_anchor(output->layer_surface, |
125 | bar->config->position); | 127 | bar->config->position); |
126 | render_frame(bar, output); | ||
127 | break; | 128 | break; |
128 | } | 129 | } |
129 | } | 130 | } |
131 | ipc_get_workspaces(bar); | ||
132 | wl_list_for_each(output, &bar->outputs, link) { | ||
133 | render_frame(bar, output); | ||
134 | } | ||
130 | } | 135 | } |
131 | 136 | ||
132 | static void display_in(int fd, short mask, void *_bar) { | 137 | static void display_in(int fd, short mask, void *_bar) { |
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) { |