diff options
author | Drew DeVault <sir@cmpwn.com> | 2018-03-29 00:07:35 -0400 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2018-03-29 22:11:08 -0400 |
commit | e5e8094dc3119584ae611c3197b38243b6c016c9 (patch) | |
tree | 6d0c6f0ff47f495f0cafc1a6d617a471330d2258 /swaybar/ipc.c | |
parent | Wire up basic IPC support (diff) | |
download | sway-e5e8094dc3119584ae611c3197b38243b6c016c9.tar.gz sway-e5e8094dc3119584ae611c3197b38243b6c016c9.tar.zst sway-e5e8094dc3119584ae611c3197b38243b6c016c9.zip |
Only utilize the configured outputs
Diffstat (limited to 'swaybar/ipc.c')
-rw-r--r-- | swaybar/ipc.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/swaybar/ipc.c b/swaybar/ipc.c index cef784d0..d3ee170c 100644 --- a/swaybar/ipc.c +++ b/swaybar/ipc.c | |||
@@ -1,4 +1,5 @@ | |||
1 | #define _XOPEN_SOURCE 500 | 1 | #define _XOPEN_SOURCE 500 |
2 | #include <limits.h> | ||
2 | #include <string.h> | 3 | #include <string.h> |
3 | #include <strings.h> | 4 | #include <strings.h> |
4 | #include <json-c/json.h> | 5 | #include <json-c/json.h> |
@@ -174,6 +175,7 @@ static void ipc_parse_config( | |||
174 | struct config_output *coutput = calloc( | 175 | struct config_output *coutput = calloc( |
175 | 1, sizeof(struct config_output)); | 176 | 1, sizeof(struct config_output)); |
176 | coutput->name = strdup(name); | 177 | coutput->name = strdup(name); |
178 | coutput->index = SIZE_MAX; | ||
177 | wl_list_insert(&config->outputs, &coutput->link); | 179 | wl_list_insert(&config->outputs, &coutput->link); |
178 | } | 180 | } |
179 | } | 181 | } |
@@ -185,12 +187,47 @@ static void ipc_parse_config( | |||
185 | json_object_put(bar_config); | 187 | json_object_put(bar_config); |
186 | } | 188 | } |
187 | 189 | ||
190 | static void ipc_get_outputs(struct swaybar *bar) { | ||
191 | uint32_t len = 0; | ||
192 | char *res = ipc_single_command(bar->ipc_socketfd, | ||
193 | IPC_GET_OUTPUTS, NULL, &len); | ||
194 | json_object *outputs = json_tokener_parse(res); | ||
195 | for (size_t i = 0; i < json_object_array_length(outputs); ++i) { | ||
196 | json_object *output = json_object_array_get_idx(outputs, i); | ||
197 | json_object *output_name, *output_active; | ||
198 | json_object_object_get_ex(output, "name", &output_name); | ||
199 | json_object_object_get_ex(output, "active", &output_active); | ||
200 | const char *name = json_object_get_string(output_name); | ||
201 | bool active = json_object_get_boolean(output_active); | ||
202 | if (!active) { | ||
203 | continue; | ||
204 | } | ||
205 | if (wl_list_empty(&bar->config->outputs)) { | ||
206 | struct config_output *coutput = calloc( | ||
207 | 1, sizeof(struct config_output)); | ||
208 | coutput->name = strdup(name); | ||
209 | coutput->index = i; | ||
210 | wl_list_insert(&bar->config->outputs, &coutput->link); | ||
211 | } else { | ||
212 | struct config_output *coutput; | ||
213 | wl_list_for_each(coutput, &bar->config->outputs, link) { | ||
214 | if (strcmp(name, coutput->name) == 0) { | ||
215 | coutput->index = i; | ||
216 | break; | ||
217 | } | ||
218 | } | ||
219 | } | ||
220 | } | ||
221 | free(res); | ||
222 | } | ||
223 | |||
188 | void ipc_get_config(struct swaybar *bar, const char *bar_id) { | 224 | void ipc_get_config(struct swaybar *bar, const char *bar_id) { |
189 | uint32_t len = strlen(bar_id); | 225 | uint32_t len = strlen(bar_id); |
190 | char *res = ipc_single_command(bar->ipc_socketfd, | 226 | char *res = ipc_single_command(bar->ipc_socketfd, |
191 | IPC_GET_BAR_CONFIG, bar_id, &len); | 227 | IPC_GET_BAR_CONFIG, bar_id, &len); |
192 | ipc_parse_config(bar->config, res); | 228 | ipc_parse_config(bar->config, res); |
193 | free(res); | 229 | free(res); |
230 | ipc_get_outputs(bar); | ||
194 | } | 231 | } |
195 | 232 | ||
196 | void handle_ipc_event(struct swaybar *bar) { | 233 | void handle_ipc_event(struct swaybar *bar) { |