aboutsummaryrefslogtreecommitdiffstats
path: root/swaybar
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
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')
-rw-r--r--swaybar/bar.c11
-rw-r--r--swaybar/config.c14
-rw-r--r--swaybar/ipc.c199
-rw-r--r--swaybar/meson.build1
4 files changed, 212 insertions, 13 deletions
diff --git a/swaybar/bar.c b/swaybar/bar.c
index e1d594b4..433e2948 100644
--- a/swaybar/bar.c
+++ b/swaybar/bar.c
@@ -14,6 +14,8 @@
14#include "swaybar/config.h" 14#include "swaybar/config.h"
15#include "swaybar/event_loop.h" 15#include "swaybar/event_loop.h"
16#include "swaybar/bar.h" 16#include "swaybar/bar.h"
17#include "swaybar/ipc.h"
18#include "ipc-client.h"
17#include "list.h" 19#include "list.h"
18#include "pango.h" 20#include "pango.h"
19#include "pool-buffer.h" 21#include "pool-buffer.h"
@@ -92,6 +94,10 @@ void bar_setup(struct swaybar *bar,
92 bar_init(bar); 94 bar_init(bar);
93 init_event_loop(); 95 init_event_loop();
94 96
97 bar->ipc_socketfd = ipc_open_socket(socket_path);
98 bar->ipc_event_socketfd = ipc_open_socket(socket_path);
99 ipc_get_config(bar, bar_id);
100
95 assert(bar->display = wl_display_connect(NULL)); 101 assert(bar->display = wl_display_connect(NULL));
96 102
97 struct wl_registry *registry = wl_display_get_registry(bar->display); 103 struct wl_registry *registry = wl_display_get_registry(bar->display);
@@ -122,6 +128,11 @@ static void display_in(int fd, short mask, void *_bar) {
122 } 128 }
123} 129}
124 130
131static void ipc_in(int fd, short mask, void *_bar) {
132 struct swaybar *bar = (struct swaybar *)_bar;
133 handle_ipc_event(bar);
134}
135
125void bar_run(struct swaybar *bar) { 136void bar_run(struct swaybar *bar) {
126 add_event(wl_display_get_fd(bar->display), POLLIN, display_in, bar); 137 add_event(wl_display_get_fd(bar->display), POLLIN, display_in, bar);
127 while (1) { 138 while (1) {
diff --git a/swaybar/config.c b/swaybar/config.c
index 0c2b57e0..83cf2309 100644
--- a/swaybar/config.c
+++ b/swaybar/config.c
@@ -22,17 +22,6 @@ uint32_t parse_position(const char *position) {
22 } 22 }
23} 23}
24 24
25char *parse_font(const char *font) {
26 char *new_font = NULL;
27 if (strncmp("pango:", font, 6) == 0) {
28 font += 6;
29 }
30
31 new_font = strdup(font);
32
33 return new_font;
34}
35
36struct swaybar_config *init_config() { 25struct swaybar_config *init_config() {
37 struct swaybar_config *config = calloc(1, sizeof(struct swaybar_config)); 26 struct swaybar_config *config = calloc(1, sizeof(struct swaybar_config));
38 config->status_command = NULL; 27 config->status_command = NULL;
@@ -45,8 +34,7 @@ struct swaybar_config *init_config() {
45 config->binding_mode_indicator = true; 34 config->binding_mode_indicator = true;
46 config->wrap_scroll = false; 35 config->wrap_scroll = false;
47 config->workspace_buttons = true; 36 config->workspace_buttons = true;
48 config->all_outputs = false; 37 wl_list_init(&config->outputs);
49 config->outputs = create_list();
50 38
51 /* height */ 39 /* height */
52 config->height = 0; 40 config->height = 0;
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}
diff --git a/swaybar/meson.build b/swaybar/meson.build
index fd87e51d..6dc7c564 100644
--- a/swaybar/meson.build
+++ b/swaybar/meson.build
@@ -4,6 +4,7 @@ executable(
4 'bar.c', 4 'bar.c',
5 'config.c', 5 'config.c',
6 'event_loop.c', 6 'event_loop.c',
7 'ipc.c',
7 'main.c', 8 'main.c',
8 'render.c', 9 'render.c',
9 ], 10 ],