aboutsummaryrefslogtreecommitdiffstats
path: root/swaybar/ipc.c
diff options
context:
space:
mode:
authorLibravatar Drew DeVault <sir@cmpwn.com>2018-03-28 23:56:02 -0400
committerLibravatar Drew DeVault <sir@cmpwn.com>2018-03-29 22:11:08 -0400
commit5c9ad035db1bebba3f1954dd1f4328c6421776d4 (patch)
tree860eef96eaa4e7573384e64731f914d24e846cf5 /swaybar/ipc.c
parentStart port of swaybar to layer shell (diff)
downloadsway-5c9ad035db1bebba3f1954dd1f4328c6421776d4.tar.gz
sway-5c9ad035db1bebba3f1954dd1f4328c6421776d4.tar.zst
sway-5c9ad035db1bebba3f1954dd1f4328c6421776d4.zip
Wire up basic IPC support
Diffstat (limited to 'swaybar/ipc.c')
-rw-r--r--swaybar/ipc.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/swaybar/ipc.c b/swaybar/ipc.c
new file mode 100644
index 00000000..cef784d0
--- /dev/null
+++ b/swaybar/ipc.c
@@ -0,0 +1,199 @@
1#define _XOPEN_SOURCE 500
2#include <string.h>
3#include <strings.h>
4#include <json-c/json.h>
5#include "swaybar/config.h"
6#include "swaybar/ipc.h"
7#include "ipc-client.h"
8
9char *parse_font(const char *font) {
10 char *new_font = NULL;
11 if (strncmp("pango:", font, 6) == 0) {
12 font += 6;
13 }
14 new_font = strdup(font);
15 return new_font;
16}
17
18static void ipc_parse_colors(
19 struct swaybar_config *config, json_object *colors) {
20 json_object *background, *statusline, *separator;
21 json_object *focused_background, *focused_statusline, *focused_separator;
22 json_object *focused_workspace_border, *focused_workspace_bg, *focused_workspace_text;
23 json_object *inactive_workspace_border, *inactive_workspace_bg, *inactive_workspace_text;
24 json_object *active_workspace_border, *active_workspace_bg, *active_workspace_text;
25 json_object *urgent_workspace_border, *urgent_workspace_bg, *urgent_workspace_text;
26 json_object *binding_mode_border, *binding_mode_bg, *binding_mode_text;
27 json_object_object_get_ex(colors, "background", &background);
28 json_object_object_get_ex(colors, "statusline", &statusline);
29 json_object_object_get_ex(colors, "separator", &separator);
30 json_object_object_get_ex(colors, "focused_background", &focused_background);
31 json_object_object_get_ex(colors, "focused_statusline", &focused_statusline);
32 json_object_object_get_ex(colors, "focused_separator", &focused_separator);
33 json_object_object_get_ex(colors, "focused_workspace_border", &focused_workspace_border);
34 json_object_object_get_ex(colors, "focused_workspace_bg", &focused_workspace_bg);
35 json_object_object_get_ex(colors, "focused_workspace_text", &focused_workspace_text);
36 json_object_object_get_ex(colors, "active_workspace_border", &active_workspace_border);
37 json_object_object_get_ex(colors, "active_workspace_bg", &active_workspace_bg);
38 json_object_object_get_ex(colors, "active_workspace_text", &active_workspace_text);
39 json_object_object_get_ex(colors, "inactive_workspace_border", &inactive_workspace_border);
40 json_object_object_get_ex(colors, "inactive_workspace_bg", &inactive_workspace_bg);
41 json_object_object_get_ex(colors, "inactive_workspace_text", &inactive_workspace_text);
42 json_object_object_get_ex(colors, "urgent_workspace_border", &urgent_workspace_border);
43 json_object_object_get_ex(colors, "urgent_workspace_bg", &urgent_workspace_bg);
44 json_object_object_get_ex(colors, "urgent_workspace_text", &urgent_workspace_text);
45 json_object_object_get_ex(colors, "binding_mode_border", &binding_mode_border);
46 json_object_object_get_ex(colors, "binding_mode_bg", &binding_mode_bg);
47 json_object_object_get_ex(colors, "binding_mode_text", &binding_mode_text);
48 if (background) {
49 config->colors.background = parse_color(json_object_get_string(background));
50 }
51 if (statusline) {
52 config->colors.statusline = parse_color(json_object_get_string(statusline));
53 }
54 if (separator) {
55 config->colors.separator = parse_color(json_object_get_string(separator));
56 }
57 if (focused_background) {
58 config->colors.focused_background = parse_color(json_object_get_string(focused_background));
59 }
60 if (focused_statusline) {
61 config->colors.focused_statusline = parse_color(json_object_get_string(focused_statusline));
62 }
63 if (focused_separator) {
64 config->colors.focused_separator = parse_color(json_object_get_string(focused_separator));
65 }
66 if (focused_workspace_border) {
67 config->colors.focused_workspace.border = parse_color(json_object_get_string(focused_workspace_border));
68 }
69 if (focused_workspace_bg) {
70 config->colors.focused_workspace.background = parse_color(json_object_get_string(focused_workspace_bg));
71 }
72 if (focused_workspace_text) {
73 config->colors.focused_workspace.text = parse_color(json_object_get_string(focused_workspace_text));
74 }
75 if (active_workspace_border) {
76 config->colors.active_workspace.border = parse_color(json_object_get_string(active_workspace_border));
77 }
78 if (active_workspace_bg) {
79 config->colors.active_workspace.background = parse_color(json_object_get_string(active_workspace_bg));
80 }
81 if (active_workspace_text) {
82 config->colors.active_workspace.text = parse_color(json_object_get_string(active_workspace_text));
83 }
84 if (inactive_workspace_border) {
85 config->colors.inactive_workspace.border = parse_color(json_object_get_string(inactive_workspace_border));
86 }
87 if (inactive_workspace_bg) {
88 config->colors.inactive_workspace.background = parse_color(json_object_get_string(inactive_workspace_bg));
89 }
90 if (inactive_workspace_text) {
91 config->colors.inactive_workspace.text = parse_color(json_object_get_string(inactive_workspace_text));
92 }
93 if (binding_mode_border) {
94 config->colors.binding_mode.border = parse_color(json_object_get_string(binding_mode_border));
95 }
96 if (binding_mode_bg) {
97 config->colors.binding_mode.background = parse_color(json_object_get_string(binding_mode_bg));
98 }
99 if (binding_mode_text) {
100 config->colors.binding_mode.text = parse_color(json_object_get_string(binding_mode_text));
101 }
102}
103
104static void ipc_parse_config(
105 struct swaybar_config *config, const char *payload) {
106 json_object *bar_config = json_tokener_parse(payload);
107 json_object *markup, *mode, *hidden_bar, *position, *status_command;
108 json_object *font, *bar_height, *wrap_scroll, *workspace_buttons, *strip_workspace_numbers;
109 json_object *binding_mode_indicator, *verbose, *colors, *sep_symbol, *outputs;
110 json_object_object_get_ex(bar_config, "mode", &mode);
111 json_object_object_get_ex(bar_config, "hidden_bar", &hidden_bar);
112 json_object_object_get_ex(bar_config, "position", &position);
113 json_object_object_get_ex(bar_config, "status_command", &status_command);
114 json_object_object_get_ex(bar_config, "font", &font);
115 json_object_object_get_ex(bar_config, "bar_height", &bar_height);
116 json_object_object_get_ex(bar_config, "wrap_scroll", &wrap_scroll);
117 json_object_object_get_ex(bar_config, "workspace_buttons", &workspace_buttons);
118 json_object_object_get_ex(bar_config, "strip_workspace_numbers", &strip_workspace_numbers);
119 json_object_object_get_ex(bar_config, "binding_mode_indicator", &binding_mode_indicator);
120 json_object_object_get_ex(bar_config, "verbose", &verbose);
121 json_object_object_get_ex(bar_config, "separator_symbol", &sep_symbol);
122 json_object_object_get_ex(bar_config, "colors", &colors);
123 json_object_object_get_ex(bar_config, "outputs", &outputs);
124 json_object_object_get_ex(bar_config, "pango_markup", &markup);
125 if (status_command) {
126 free(config->status_command);
127 config->status_command = strdup(json_object_get_string(status_command));
128 }
129 if (position) {
130 config->position = parse_position(json_object_get_string(position));
131 }
132 if (font) {
133 free(config->font);
134 config->font = parse_font(json_object_get_string(font));
135 }
136 if (sep_symbol) {
137 free(config->sep_symbol);
138 config->sep_symbol = strdup(json_object_get_string(sep_symbol));
139 }
140 if (strip_workspace_numbers) {
141 config->strip_workspace_numbers = json_object_get_boolean(strip_workspace_numbers);
142 }
143 if (binding_mode_indicator) {
144 config->binding_mode_indicator = json_object_get_boolean(binding_mode_indicator);
145 }
146 if (wrap_scroll) {
147 config->wrap_scroll = json_object_get_boolean(wrap_scroll);
148 }
149 if (workspace_buttons) {
150 config->workspace_buttons = json_object_get_boolean(workspace_buttons);
151 }
152 if (bar_height) {
153 config->height = json_object_get_int(bar_height);
154 }
155 if (markup) {
156 config->pango_markup = json_object_get_boolean(markup);
157 }
158
159 struct config_output *output, *tmp;
160 wl_list_for_each_safe(output, tmp, &config->outputs, link) {
161 wl_list_remove(&output->link);
162 free(output->name);
163 free(output);
164 }
165 if (outputs) {
166 int length = json_object_array_length(outputs);
167 for (int i = 0; i < length; ++i) {
168 json_object *output = json_object_array_get_idx(outputs, i);
169 const char *name = json_object_get_string(output);
170 if (strcmp("*", name) == 0) {
171 // TODO: do we need to clear out the list here or something
172 break;
173 }
174 struct config_output *coutput = calloc(
175 1, sizeof(struct config_output));
176 coutput->name = strdup(name);
177 wl_list_insert(&config->outputs, &coutput->link);
178 }
179 }
180
181 if (colors) {
182 ipc_parse_colors(config, colors);
183 }
184
185 json_object_put(bar_config);
186}
187
188void ipc_get_config(struct swaybar *bar, const char *bar_id) {
189 uint32_t len = strlen(bar_id);
190 char *res = ipc_single_command(bar->ipc_socketfd,
191 IPC_GET_BAR_CONFIG, bar_id, &len);
192 ipc_parse_config(bar->config, res);
193 free(res);
194}
195
196void handle_ipc_event(struct swaybar *bar) {
197 struct ipc_response *resp = ipc_recv_response(bar->ipc_event_socketfd);
198 free_ipc_response(resp);
199}