diff options
Diffstat (limited to 'swaybar/ipc.c')
-rw-r--r-- | swaybar/ipc.c | 116 |
1 files changed, 91 insertions, 25 deletions
diff --git a/swaybar/ipc.c b/swaybar/ipc.c index 4104103d..b5ae6747 100644 --- a/swaybar/ipc.c +++ b/swaybar/ipc.c | |||
@@ -11,7 +11,7 @@ static void ipc_parse_config(struct config *config, const char *payload) { | |||
11 | json_object *bar_config = json_tokener_parse(payload); | 11 | json_object *bar_config = json_tokener_parse(payload); |
12 | json_object *tray_output, *mode, *hidden_bar, *position, *status_command; | 12 | json_object *tray_output, *mode, *hidden_bar, *position, *status_command; |
13 | json_object *font, *bar_height, *workspace_buttons, *strip_workspace_numbers; | 13 | json_object *font, *bar_height, *workspace_buttons, *strip_workspace_numbers; |
14 | json_object *binding_mode_indicator, *verbose, *colors, *sep_symbol; | 14 | json_object *binding_mode_indicator, *verbose, *colors, *sep_symbol, *outputs; |
15 | json_object_object_get_ex(bar_config, "tray_output", &tray_output); | 15 | json_object_object_get_ex(bar_config, "tray_output", &tray_output); |
16 | json_object_object_get_ex(bar_config, "mode", &mode); | 16 | json_object_object_get_ex(bar_config, "mode", &mode); |
17 | json_object_object_get_ex(bar_config, "hidden_bar", &hidden_bar); | 17 | json_object_object_get_ex(bar_config, "hidden_bar", &hidden_bar); |
@@ -25,6 +25,7 @@ static void ipc_parse_config(struct config *config, const char *payload) { | |||
25 | json_object_object_get_ex(bar_config, "verbose", &verbose); | 25 | json_object_object_get_ex(bar_config, "verbose", &verbose); |
26 | json_object_object_get_ex(bar_config, "separator_symbol", &sep_symbol); | 26 | json_object_object_get_ex(bar_config, "separator_symbol", &sep_symbol); |
27 | json_object_object_get_ex(bar_config, "colors", &colors); | 27 | json_object_object_get_ex(bar_config, "colors", &colors); |
28 | json_object_object_get_ex(bar_config, "outputs", &outputs); | ||
28 | 29 | ||
29 | if (status_command) { | 30 | if (status_command) { |
30 | free(config->status_command); | 31 | free(config->status_command); |
@@ -61,6 +62,28 @@ static void ipc_parse_config(struct config *config, const char *payload) { | |||
61 | config->height = json_object_get_int(bar_height); | 62 | config->height = json_object_get_int(bar_height); |
62 | } | 63 | } |
63 | 64 | ||
65 | // free previous outputs list | ||
66 | int i; | ||
67 | for (i = 0; i < config->outputs->length; ++i) { | ||
68 | free(config->outputs->items[i]); | ||
69 | } | ||
70 | list_free(config->outputs); | ||
71 | config->outputs = create_list(); | ||
72 | |||
73 | if (outputs) { | ||
74 | int length = json_object_array_length(outputs); | ||
75 | json_object *output; | ||
76 | const char *output_str; | ||
77 | for (i = 0; i < length; ++i) { | ||
78 | output = json_object_array_get_idx(outputs, i); | ||
79 | output_str = json_object_get_string(output); | ||
80 | if (strcmp("*", output_str) == 0) { | ||
81 | break; | ||
82 | } | ||
83 | list_add(config->outputs, strdup(output_str)); | ||
84 | } | ||
85 | } | ||
86 | |||
64 | if (colors) { | 87 | if (colors) { |
65 | json_object *background, *statusline, *separator; | 88 | json_object *background, *statusline, *separator; |
66 | json_object *focused_workspace_border, *focused_workspace_bg, *focused_workspace_text; | 89 | json_object *focused_workspace_border, *focused_workspace_bg, *focused_workspace_text; |
@@ -151,10 +174,14 @@ static void ipc_parse_config(struct config *config, const char *payload) { | |||
151 | } | 174 | } |
152 | 175 | ||
153 | static void ipc_update_workspaces(struct bar *bar) { | 176 | static void ipc_update_workspaces(struct bar *bar) { |
154 | if (bar->output->workspaces) { | 177 | int i; |
155 | free_workspaces(bar->output->workspaces); | 178 | for (i = 0; i < bar->outputs->length; ++i) { |
179 | struct output *output = bar->outputs->items[i]; | ||
180 | if (output->workspaces) { | ||
181 | free_workspaces(output->workspaces); | ||
182 | } | ||
183 | output->workspaces = create_list(); | ||
156 | } | 184 | } |
157 | bar->output->workspaces = create_list(); | ||
158 | 185 | ||
159 | uint32_t len = 0; | 186 | uint32_t len = 0; |
160 | char *res = ipc_single_command(bar->ipc_socketfd, IPC_GET_WORKSPACES, NULL, &len); | 187 | char *res = ipc_single_command(bar->ipc_socketfd, IPC_GET_WORKSPACES, NULL, &len); |
@@ -164,7 +191,6 @@ static void ipc_update_workspaces(struct bar *bar) { | |||
164 | return; | 191 | return; |
165 | } | 192 | } |
166 | 193 | ||
167 | int i; | ||
168 | int length = json_object_array_length(results); | 194 | int length = json_object_array_length(results); |
169 | json_object *ws_json; | 195 | json_object *ws_json; |
170 | json_object *num, *name, *visible, *focused, *out, *urgent; | 196 | json_object *num, *name, *visible, *focused, *out, *urgent; |
@@ -178,14 +204,18 @@ static void ipc_update_workspaces(struct bar *bar) { | |||
178 | json_object_object_get_ex(ws_json, "output", &out); | 204 | json_object_object_get_ex(ws_json, "output", &out); |
179 | json_object_object_get_ex(ws_json, "urgent", &urgent); | 205 | json_object_object_get_ex(ws_json, "urgent", &urgent); |
180 | 206 | ||
181 | if (strcmp(json_object_get_string(out), bar->output->name) == 0) { | 207 | int j; |
182 | struct workspace *ws = malloc(sizeof(struct workspace)); | 208 | for (j = 0; j < bar->outputs->length; ++j) { |
183 | ws->num = json_object_get_int(num); | 209 | struct output *output = bar->outputs->items[j]; |
184 | ws->name = strdup(json_object_get_string(name)); | 210 | if (strcmp(json_object_get_string(out), output->name) == 0) { |
185 | ws->visible = json_object_get_boolean(visible); | 211 | struct workspace *ws = malloc(sizeof(struct workspace)); |
186 | ws->focused = json_object_get_boolean(focused); | 212 | ws->num = json_object_get_int(num); |
187 | ws->urgent = json_object_get_boolean(urgent); | 213 | ws->name = strdup(json_object_get_string(name)); |
188 | list_add(bar->output->workspaces, ws); | 214 | ws->visible = json_object_get_boolean(visible); |
215 | ws->focused = json_object_get_boolean(focused); | ||
216 | ws->urgent = json_object_get_boolean(urgent); | ||
217 | list_add(output->workspaces, ws); | ||
218 | } | ||
189 | } | 219 | } |
190 | } | 220 | } |
191 | 221 | ||
@@ -193,22 +223,58 @@ static void ipc_update_workspaces(struct bar *bar) { | |||
193 | free(res); | 223 | free(res); |
194 | } | 224 | } |
195 | 225 | ||
196 | void ipc_bar_init(struct bar *bar, int outputi, const char *bar_id) { | 226 | void ipc_bar_init(struct bar *bar, const char *bar_id) { |
197 | uint32_t len = 0; | 227 | // Get bar config |
198 | char *res = ipc_single_command(bar->ipc_socketfd, IPC_GET_OUTPUTS, NULL, &len); | 228 | uint32_t len = strlen(bar_id); |
199 | json_object *outputs = json_tokener_parse(res); | 229 | char *res = ipc_single_command(bar->ipc_socketfd, IPC_GET_BAR_CONFIG, bar_id, &len); |
200 | json_object *info = json_object_array_get_idx(outputs, outputi); | 230 | |
201 | json_object *name; | 231 | ipc_parse_config(bar->config, res); |
202 | json_object_object_get_ex(info, "name", &name); | ||
203 | bar->output->name = strdup(json_object_get_string(name)); | ||
204 | free(res); | 232 | free(res); |
205 | json_object_put(outputs); | ||
206 | 233 | ||
207 | len = strlen(bar_id); | 234 | // Get outputs |
208 | res = ipc_single_command(bar->ipc_socketfd, IPC_GET_BAR_CONFIG, bar_id, &len); | 235 | len = 0; |
236 | res = ipc_single_command(bar->ipc_socketfd, IPC_GET_OUTPUTS, NULL, &len); | ||
237 | json_object *outputs = json_tokener_parse(res); | ||
238 | int i; | ||
239 | int length = json_object_array_length(outputs); | ||
240 | json_object *output, *output_name, *output_active; | ||
241 | const char *name; | ||
242 | bool active; | ||
243 | for (i = 0; i < length; ++i) { | ||
244 | output = json_object_array_get_idx(outputs, i); | ||
245 | json_object_object_get_ex(output, "name", &output_name); | ||
246 | json_object_object_get_ex(output, "active", &output_active); | ||
247 | name = json_object_get_string(output_name); | ||
248 | active = json_object_get_boolean(output_active); | ||
249 | if (!active) { | ||
250 | continue; | ||
251 | } | ||
209 | 252 | ||
210 | ipc_parse_config(bar->config, res); | 253 | bool use_output = false; |
254 | if (bar->config->outputs->length == 0) { | ||
255 | use_output = true; | ||
256 | } else { | ||
257 | int j = 0; | ||
258 | for (j = 0; j < bar->config->outputs->length; ++j) { | ||
259 | const char *conf_name = bar->config->outputs->items[i]; | ||
260 | if (strcasecmp(name, conf_name) == 0) { | ||
261 | use_output = true; | ||
262 | break; | ||
263 | } | ||
264 | } | ||
265 | } | ||
266 | |||
267 | if (!use_output) { | ||
268 | continue; | ||
269 | } | ||
270 | |||
271 | // add bar to the output | ||
272 | struct output *bar_output = new_output(name); | ||
273 | bar_output->idx = i; | ||
274 | list_add(bar->outputs, bar_output); | ||
275 | } | ||
211 | free(res); | 276 | free(res); |
277 | json_object_put(outputs); | ||
212 | 278 | ||
213 | const char *subscribe_json = "[ \"workspace\", \"mode\" ]"; | 279 | const char *subscribe_json = "[ \"workspace\", \"mode\" ]"; |
214 | len = strlen(subscribe_json); | 280 | len = strlen(subscribe_json); |