aboutsummaryrefslogtreecommitdiff
path: root/swaybar/bar.c
diff options
context:
space:
mode:
Diffstat (limited to 'swaybar/bar.c')
-rw-r--r--swaybar/bar.c71
1 files changed, 63 insertions, 8 deletions
diff --git a/swaybar/bar.c b/swaybar/bar.c
index 5e87eac9..f8dc3a1f 100644
--- a/swaybar/bar.c
+++ b/swaybar/bar.c
@@ -7,6 +7,7 @@
#include <sys/wait.h>
#include <signal.h>
#include <poll.h>
+#include <linux/input-event-codes.h>
#ifdef ENABLE_TRAY
#include <dbus/dbus.h>
#include "swaybar/tray/sni_watcher.h"
@@ -31,16 +32,30 @@ static void bar_init(struct bar *bar) {
static void spawn_status_cmd_proc(struct bar *bar) {
if (bar->config->status_command) {
- int pipefd[2];
- if (pipe(pipefd) != 0) {
- sway_log(L_ERROR, "Unable to create pipe for status_command fork");
+ int pipe_read_fd[2];
+ int pipe_write_fd[2];
+
+ if (pipe(pipe_read_fd) != 0) {
+ sway_log(L_ERROR, "Unable to create pipes for status_command fork");
+ return;
+ }
+ if (pipe(pipe_write_fd) != 0) {
+ sway_log(L_ERROR, "Unable to create pipe for status_command fork (write)");
+ close(pipe_read_fd[0]);
+ close(pipe_read_fd[1]);
return;
}
+
bar->status_command_pid = fork();
if (bar->status_command_pid == 0) {
- close(pipefd[0]);
- dup2(pipefd[1], STDOUT_FILENO);
- close(pipefd[1]);
+ close(pipe_read_fd[0]);
+ dup2(pipe_read_fd[1], STDOUT_FILENO);
+ close(pipe_read_fd[1]);
+
+ dup2(pipe_write_fd[0], STDIN_FILENO);
+ close(pipe_write_fd[0]);
+ close(pipe_write_fd[1]);
+
char *const cmd[] = {
"sh",
"-c",
@@ -51,9 +66,13 @@ static void spawn_status_cmd_proc(struct bar *bar) {
return;
}
- close(pipefd[1]);
- bar->status_read_fd = pipefd[0];
+ close(pipe_read_fd[1]);
+ bar->status_read_fd = pipe_read_fd[0];
fcntl(bar->status_read_fd, F_SETFL, O_NONBLOCK);
+
+ close(pipe_write_fd[0]);
+ bar->status_write_fd = pipe_write_fd[1];
+ fcntl(bar->status_write_fd, F_SETFL, O_NONBLOCK);
}
}
@@ -103,14 +122,46 @@ static void mouse_button_notify(struct window *window, int x, int y,
}
}
+ switch (button) {
+ case BTN_LEFT:
+ status_line_mouse_event(&swaybar, x, y, 1);
+ break;
+ case BTN_MIDDLE:
+ status_line_mouse_event(&swaybar, x, y, 2);
+ break;
+ case BTN_RIGHT:
+ status_line_mouse_event(&swaybar, x, y, 3);
+ break;
+ }
+
#ifdef ENABLE_TRAY
tray_mouse_event(clicked_output, x, y, button, state_w);
#endif
+
}
static void mouse_scroll_notify(struct window *window, enum scroll_direction direction) {
sway_log(L_DEBUG, "Mouse wheel scrolled %s", direction == SCROLL_UP ? "up" : "down");
+ // If there are status blocks and click_events are enabled
+ // check if the position is within the status area and if so
+ // tell the status line to output the event and skip workspace
+ // switching below.
+ int num_blocks = swaybar.status->block_line->length;
+ if (swaybar.status->click_events && num_blocks > 0) {
+ struct status_block *first_block = swaybar.status->block_line->items[0];
+ int x = window->pointer_input.last_x;
+ int y = window->pointer_input.last_y;
+ if (x > first_block->x) {
+ if (direction == SCROLL_UP) {
+ status_line_mouse_event(&swaybar, x, y, 4);
+ } else {
+ status_line_mouse_event(&swaybar, x, y, 5);
+ }
+ return;
+ }
+ }
+
if (!swaybar.config->wrap_scroll) {
// Find output this window lives on
int i;
@@ -318,6 +369,10 @@ void bar_teardown(struct bar *bar) {
close(bar->status_read_fd);
}
+ if (bar->status_write_fd) {
+ close(bar->status_write_fd);
+ }
+
if (bar->ipc_socketfd) {
close(bar->ipc_socketfd);
}