diff options
-rw-r--r-- | include/swaybar/bar.h | 3 | ||||
-rw-r--r-- | include/swaybar/config.h | 17 | ||||
-rw-r--r-- | include/swaybar/ipc.h | 5 | ||||
-rw-r--r-- | swaybar/bar.c | 11 | ||||
-rw-r--r-- | swaybar/config.c | 14 | ||||
-rw-r--r-- | swaybar/ipc.c | 199 | ||||
-rw-r--r-- | swaybar/meson.build | 1 |
7 files changed, 225 insertions, 25 deletions
diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h index 3ae8c0b3..df685f47 100644 --- a/include/swaybar/bar.h +++ b/include/swaybar/bar.h | |||
@@ -17,6 +17,9 @@ struct swaybar { | |||
17 | struct swaybar_config *config; | 17 | struct swaybar_config *config; |
18 | struct swaybar_output *focused_output; | 18 | struct swaybar_output *focused_output; |
19 | 19 | ||
20 | int ipc_event_socketfd; | ||
21 | int ipc_socketfd; | ||
22 | |||
20 | struct wl_list outputs; | 23 | struct wl_list outputs; |
21 | }; | 24 | }; |
22 | 25 | ||
diff --git a/include/swaybar/config.h b/include/swaybar/config.h index 1bfe4843..4b3b5b34 100644 --- a/include/swaybar/config.h +++ b/include/swaybar/config.h | |||
@@ -2,21 +2,20 @@ | |||
2 | #define _SWAYBAR_CONFIG_H | 2 | #define _SWAYBAR_CONFIG_H |
3 | #include <stdbool.h> | 3 | #include <stdbool.h> |
4 | #include <stdint.h> | 4 | #include <stdint.h> |
5 | #include "list.h" | 5 | #include <wayland-client.h> |
6 | #include "util.h" | 6 | #include "util.h" |
7 | 7 | ||
8 | /** | ||
9 | * Colors for a box with background, border and text colors. | ||
10 | */ | ||
11 | struct box_colors { | 8 | struct box_colors { |
12 | uint32_t border; | 9 | uint32_t border; |
13 | uint32_t background; | 10 | uint32_t background; |
14 | uint32_t text; | 11 | uint32_t text; |
15 | }; | 12 | }; |
16 | 13 | ||
17 | /** | 14 | struct config_output { |
18 | * Swaybar config. | 15 | struct wl_list link; |
19 | */ | 16 | char *name; |
17 | }; | ||
18 | |||
20 | struct swaybar_config { | 19 | struct swaybar_config { |
21 | char *status_command; | 20 | char *status_command; |
22 | bool pango_markup; | 21 | bool pango_markup; |
@@ -28,8 +27,7 @@ struct swaybar_config { | |||
28 | bool binding_mode_indicator; | 27 | bool binding_mode_indicator; |
29 | bool wrap_scroll; | 28 | bool wrap_scroll; |
30 | bool workspace_buttons; | 29 | bool workspace_buttons; |
31 | bool all_outputs; | 30 | struct wl_list outputs; |
32 | list_t *outputs; | ||
33 | int height; | 31 | int height; |
34 | 32 | ||
35 | struct { | 33 | struct { |
@@ -51,5 +49,6 @@ struct swaybar_config { | |||
51 | 49 | ||
52 | struct swaybar_config *init_config(); | 50 | struct swaybar_config *init_config(); |
53 | void free_config(struct swaybar_config *config); | 51 | void free_config(struct swaybar_config *config); |
52 | uint32_t parse_position(const char *position); | ||
54 | 53 | ||
55 | #endif | 54 | #endif |
diff --git a/include/swaybar/ipc.h b/include/swaybar/ipc.h index 57a1b925..7f71a506 100644 --- a/include/swaybar/ipc.h +++ b/include/swaybar/ipc.h | |||
@@ -2,8 +2,7 @@ | |||
2 | #define _SWAYBAR_IPC_H | 2 | #define _SWAYBAR_IPC_H |
3 | #include "swaybar/bar.h" | 3 | #include "swaybar/bar.h" |
4 | 4 | ||
5 | void ipc_bar_init(struct swaybar *bar, const char *bar_id); | 5 | void ipc_get_config(struct swaybar *bar, const char *bar_id); |
6 | bool handle_ipc_event(struct swaybar *bar); | 6 | void handle_ipc_event(struct swaybar *bar); |
7 | void ipc_send_workspace_command(const char *workspace_name); | ||
8 | 7 | ||
9 | #endif | 8 | #endif |
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 | ||
131 | static void ipc_in(int fd, short mask, void *_bar) { | ||
132 | struct swaybar *bar = (struct swaybar *)_bar; | ||
133 | handle_ipc_event(bar); | ||
134 | } | ||
135 | |||
125 | void bar_run(struct swaybar *bar) { | 136 | void 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 | ||
25 | char *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 | |||
36 | struct swaybar_config *init_config() { | 25 | struct 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 | |||
9 | char *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 | |||
18 | static 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 | |||
104 | static 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 | |||
188 | void 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 | |||
196 | void 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 | ], |