summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/sway/config.h1
-rw-r--r--sway/config/bar.c95
-rw-r--r--sway/server.c6
-rw-r--r--sway/tree/container.c2
4 files changed, 102 insertions, 2 deletions
diff --git a/include/sway/config.h b/include/sway/config.h
index 4a7fee0f..b7820128 100644
--- a/include/sway/config.h
+++ b/include/sway/config.h
@@ -420,6 +420,7 @@ struct sway_binding *sway_binding_dup(struct sway_binding *sb);
420 420
421/* Bar stuff */ 421/* Bar stuff */
422void load_swaybars(); 422void load_swaybars();
423void invoke_swaybar(struct bar_config *bar);
423void terminate_swaybg(pid_t pid); 424void terminate_swaybg(pid_t pid);
424struct bar_config *default_bar_config(void); 425struct bar_config *default_bar_config(void);
425void free_bar_config(struct bar_config *bar); 426void free_bar_config(struct bar_config *bar);
diff --git a/sway/config/bar.c b/sway/config/bar.c
index ecc357d0..5e02c01c 100644
--- a/sway/config/bar.c
+++ b/sway/config/bar.c
@@ -141,3 +141,98 @@ cleanup:
141 free_bar_config(bar); 141 free_bar_config(bar);
142 return NULL; 142 return NULL;
143} 143}
144
145void invoke_swaybar(struct bar_config *bar) {
146 // Pipe to communicate errors
147 int filedes[2];
148 if (pipe(filedes) == -1) {
149 wlr_log(L_ERROR, "Pipe setup failed! Cannot fork into bar");
150 return;
151 }
152
153 bar->pid = fork();
154 if (bar->pid == 0) {
155 close(filedes[0]);
156
157 // run custom swaybar
158 size_t len = snprintf(NULL, 0, "%s -b %s",
159 bar->swaybar_command ? bar->swaybar_command : "swaybar",
160 bar->id);
161 char *command = malloc(len + 1);
162 if (!command) {
163 const char msg[] = "Unable to allocate swaybar command string";
164 size_t len = sizeof(msg);
165 if (write(filedes[1], &len, sizeof(int))) {};
166 if (write(filedes[1], msg, len)) {};
167 close(filedes[1]);
168 exit(1);
169 }
170 snprintf(command, len + 1, "%s -b %s",
171 bar->swaybar_command ? bar->swaybar_command : "swaybar",
172 bar->id);
173 char *const cmd[] = { "sh", "-c", command, NULL, };
174 close(filedes[1]);
175 execvp(cmd[0], cmd);
176 exit(1);
177 }
178 close(filedes[0]);
179 ssize_t len;
180 if (read(filedes[1], &len, sizeof(int)) == sizeof(int)) {
181 char *buf = malloc(len);
182 if(!buf) {
183 wlr_log(L_ERROR, "Cannot allocate error string");
184 return;
185 }
186 if (read(filedes[1], buf, len)) {
187 wlr_log(L_ERROR, "%s", buf);
188 }
189 free(buf);
190 }
191 close(filedes[1]);
192}
193
194static void terminate_swaybar(pid_t pid) {
195 int ret = kill(pid, SIGTERM);
196 if (ret != 0) {
197 wlr_log_errno(L_ERROR, "Unable to terminate swaybar %d", pid);
198 } else {
199 int status;
200 waitpid(pid, &status, 0);
201 }
202}
203
204static bool active_output(const char *name) {
205 swayc_t *cont = NULL;
206 for (int i = 0; i < root_container.children->length; ++i) {
207 cont = root_container.children->items[i];
208 if (cont->type == C_OUTPUT && strcasecmp(name, cont->name) == 0) {
209 return true;
210 }
211 }
212 return false;
213}
214
215void load_swaybars() {
216 for (int i = 0; i < config->bars->length; ++i) {
217 struct bar_config *bar = config->bars->items[i];
218 bool apply = false;
219 if (bar->outputs) {
220 for (int j = 0; j < bar->outputs->length; ++j) {
221 char *o = bar->outputs->items[j];
222 if (!strcmp(o, "*") || active_output(o)) {
223 apply = true;
224 break;
225 }
226 }
227 } else {
228 apply = true;
229 }
230 if (apply) {
231 if (bar->pid != 0) {
232 terminate_swaybar(bar->pid);
233 }
234 wlr_log(L_DEBUG, "Invoking swaybar for bar id '%s'", bar->id);
235 invoke_swaybar(bar);
236 }
237 }
238}
diff --git a/sway/server.c b/sway/server.c
index 92f72f13..75202df2 100644
--- a/sway/server.c
+++ b/sway/server.c
@@ -8,6 +8,8 @@
8#include <wlr/render/gles2.h> 8#include <wlr/render/gles2.h>
9#include <wlr/types/wlr_compositor.h> 9#include <wlr/types/wlr_compositor.h>
10#include <wlr/types/wlr_layer_shell.h> 10#include <wlr/types/wlr_layer_shell.h>
11#include <wlr/types/wlr_screenshooter.h>
12#include <wlr/types/wlr_gamma_control.h>
11#include <wlr/types/wlr_wl_shell.h> 13#include <wlr/types/wlr_wl_shell.h>
12// TODO WLR: make Xwayland optional 14// TODO WLR: make Xwayland optional
13#include <wlr/xwayland.h> 15#include <wlr/xwayland.h>
@@ -45,10 +47,12 @@ bool server_init(struct sway_server *server) {
45 47
46 server->compositor = wlr_compositor_create( 48 server->compositor = wlr_compositor_create(
47 server->wl_display, server->renderer); 49 server->wl_display, server->renderer);
48
49 server->data_device_manager = 50 server->data_device_manager =
50 wlr_data_device_manager_create(server->wl_display); 51 wlr_data_device_manager_create(server->wl_display);
51 52
53 wlr_screenshooter_create(server->wl_display);
54 wlr_gamma_control_manager_create(server->wl_display);
55
52 server->new_output.notify = handle_new_output; 56 server->new_output.notify = handle_new_output;
53 wl_signal_add(&server->backend->events.new_output, &server->new_output); 57 wl_signal_add(&server->backend->events.new_output, &server->new_output);
54 58
diff --git a/sway/tree/container.c b/sway/tree/container.c
index bbafe9ec..64e2bdee 100644
--- a/sway/tree/container.c
+++ b/sway/tree/container.c
@@ -165,8 +165,8 @@ swayc_t *new_output(struct sway_output *sway_output) {
165 } 165 }
166 166
167 apply_output_config(oc, output); 167 apply_output_config(oc, output);
168
169 add_child(&root_container, output); 168 add_child(&root_container, output);
169 load_swaybars();
170 170
171 // Create workspace 171 // Create workspace
172 char *ws_name = workspace_next_name(output->name); 172 char *ws_name = workspace_next_name(output->name);