diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h index af478f333..f1ff25b26 100644 --- a/include/swaybar/bar.h +++ b/include/swaybar/bar.h @@ -16,11 +16,24 @@ struct swaybar_pointer { int x, y; }; +enum x11_button { + NONE, + LEFT, + MIDDLE, + RIGHT, + SCROLL_UP, + SCROLL_DOWN, + SCROLL_LEFT, + SCROLL_RIGHT, + BACK, + FORWARD, +}; + struct swaybar_hotspot { struct wl_list link; int x, y, width, height; void (*callback)(struct swaybar_output *output, - int x, int y, uint32_t button, void *data); + int x, int y, enum x11_button button, void *data); void (*destroy)(void *data); void *data; }; diff --git a/include/swaybar/status_line.h b/include/swaybar/status_line.h index bf12a842d..2eaf81409 100644 --- a/include/swaybar/status_line.h +++ b/include/swaybar/status_line.h @@ -72,7 +72,9 @@ bool status_handle_readable(struct status_line *status); void status_line_free(struct status_line *status); bool i3bar_handle_readable(struct status_line *status); void i3bar_block_send_click(struct status_line *status, - struct i3bar_block *block, int x, int y, uint32_t button); + struct i3bar_block *block, int x, int y, enum x11_button button); void i3bar_block_free(struct i3bar_block *block); +enum x11_button wl_button_to_x11_button(uint32_t button); +enum x11_button wl_axis_to_x11_button(uint32_t axis, wl_fixed_t value); #endif diff --git a/swaybar/bar.c b/swaybar/bar.c index f03c5aead..1186d1e53 100644 --- a/swaybar/bar.c +++ b/swaybar/bar.c @@ -147,7 +147,7 @@ static void wl_pointer_button(void *data, struct wl_pointer *wl_pointer, && x < hotspot->x + hotspot->width && y < hotspot->y + hotspot->height) { hotspot->callback(output, pointer->x, pointer->y, - button, hotspot->data); + wl_button_to_x11_button(button), hotspot->data); } } } diff --git a/swaybar/i3bar.c b/swaybar/i3bar.c index 26f073c87..a615fb277 100644 --- a/swaybar/i3bar.c +++ b/swaybar/i3bar.c @@ -1,5 +1,6 @@ #define _POSIX_C_SOURCE 200809L #include +#include #include #include #include @@ -192,7 +193,7 @@ bool i3bar_handle_readable(struct status_line *status) { } void i3bar_block_send_click(struct status_line *status, - struct i3bar_block *block, int x, int y, uint32_t button) { + struct i3bar_block *block, int x, int y, enum x11_button button) { wlr_log(WLR_DEBUG, "block %s clicked", block->name ? block->name : "(nil)"); if (!block->name || !status->i3bar_state.click_events) { return; @@ -215,3 +216,32 @@ void i3bar_block_send_click(struct status_line *status, } json_object_put(event_json); } + +enum x11_button wl_button_to_x11_button(uint32_t button) { + switch (button) { + case (BTN_LEFT): + return LEFT; + case (BTN_MIDDLE): + return MIDDLE; + case (BTN_RIGHT): + return RIGHT; + case (BTN_SIDE): + return BACK; + case (BTN_EXTRA): + return FORWARD; + default: + return NONE; + } +} + +enum x11_button wl_axis_to_x11_button(uint32_t axis, wl_fixed_t value) { + switch (axis) { + case WL_POINTER_AXIS_VERTICAL_SCROLL: + return wl_fixed_to_double(value) < 0 ? SCROLL_UP : SCROLL_DOWN; + case WL_POINTER_AXIS_HORIZONTAL_SCROLL: + return wl_fixed_to_double(value) < 0 ? SCROLL_LEFT : SCROLL_RIGHT; + default: + wlr_log(WLR_DEBUG, "Unexpected axis value on mouse scroll"); + return NONE; + } +} diff --git a/swaybar/render.c b/swaybar/render.c index 909b56f40..d210e25ac 100644 --- a/swaybar/render.c +++ b/swaybar/render.c @@ -109,7 +109,7 @@ static void render_sharp_line(cairo_t *cairo, uint32_t color, } static void block_hotspot_callback(struct swaybar_output *output, - int x, int y, uint32_t button, void *data) { + int x, int y, enum x11_button button, void *data) { struct i3bar_block *block = data; struct status_line *status = output->bar->status; i3bar_block_send_click(status, block, x, y, button); @@ -349,7 +349,7 @@ static const char *strip_workspace_number(const char *ws_name) { } static void workspace_hotspot_callback(struct swaybar_output *output, - int x, int y, uint32_t button, void *data) { + int x, int y, enum x11_button button, void *data) { ipc_send_workspace_command(output->bar, (const char *)data); }