aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-10-25 18:32:09 +0200
committerGitHub <noreply@github.com>2018-10-25 18:32:09 +0200
commit6b59533646ea50e843f594ba041109873e0db16b (patch)
tree5b088b441106cf669162c7793b2ef876ea30c864
parent51ad2676d0bed4b2f0a3de5d118ce80d3d4e2eb2 (diff)
parent19421373b9837860115f1fcf70f160f9d716aee1 (diff)
Merge pull request #2973 from ianyfan/swaybar
swaybar: fix scrolling behaviour
-rw-r--r--swaybar/input.c70
-rw-r--r--swaybar/ipc.c2
-rw-r--r--swaybar/render.c2
3 files changed, 32 insertions, 42 deletions
diff --git a/swaybar/input.c b/swaybar/input.c
index d0191f51..263d0253 100644
--- a/swaybar/input.c
+++ b/swaybar/input.c
@@ -152,10 +152,9 @@ static void wl_pointer_axis(void *data, struct wl_pointer *wl_pointer,
// If there is a button press binding, execute it, skip default behavior,
// and check button release bindings
- if (check_bindings(bar, wl_axis_to_x11_button(axis, value),
- WL_POINTER_BUTTON_STATE_PRESSED)) {
- check_bindings(bar, wl_axis_to_x11_button(axis, value),
- WL_POINTER_BUTTON_STATE_RELEASED);
+ enum x11_button button = wl_axis_to_x11_button(axis, value);
+ if (check_bindings(bar, button, WL_POINTER_BUTTON_STATE_PRESSED)) {
+ check_bindings(bar, button, WL_POINTER_BUTTON_STATE_RELEASED);
return;
}
@@ -168,68 +167,59 @@ static void wl_pointer_axis(void *data, struct wl_pointer *wl_pointer,
&& x < hotspot->x + hotspot->width
&& y < hotspot->y + hotspot->height) {
if (HOTSPOT_IGNORE == hotspot->callback(
- output, pointer->x, pointer->y,
- wl_axis_to_x11_button(axis, value), hotspot->data)) {
+ output, pointer->x, pointer->y, button, hotspot->data)) {
return;
}
}
}
+ struct swaybar_config *config = bar->config;
double amt = wl_fixed_to_double(value);
- if (amt == 0.0) {
+ if (amt == 0.0 || !config->workspace_buttons) {
+ check_bindings(bar, button, WL_POINTER_BUTTON_STATE_RELEASED);
return;
}
- // last doesn't actually need initialization,
- // but gcc (7.3.1) is too dumb to figure it out
- struct swaybar_workspace *first = NULL;
- struct swaybar_workspace *active = NULL;
- struct swaybar_workspace *last = NULL;
+ if (!sway_assert(!wl_list_empty(&output->workspaces), "axis with no workspaces")) {
+ return;
+ }
- struct swaybar_workspace *iter;
- wl_list_for_each(iter, &output->workspaces, link) {
- if (!first) {
- first = iter;
- }
+ struct swaybar_workspace *first =
+ wl_container_of(output->workspaces.next, first, link);
+ struct swaybar_workspace *last =
+ wl_container_of(output->workspaces.prev, last, link);
- if (iter->visible) {
- active = iter;
+ struct swaybar_workspace *active;
+ wl_list_for_each(active, &output->workspaces, link) {
+ if (active->visible) {
+ break;
}
-
- last = iter;
}
-
- if (!sway_assert(active, "axis with null workspace")) {
+ if (!sway_assert(active->visible, "axis with null workspace")) {
return;
}
struct swaybar_workspace *new;
-
- if (amt > 0.0) {
+ if (amt < 0.0) {
if (active == first) {
- if (!bar->config->wrap_scroll) {
- return;
- }
- new = last;
+ new = config->wrap_scroll ? last : NULL;
+ } else {
+ new = wl_container_of(active->link.prev, new, link);
}
-
- new = wl_container_of(active->link.prev, new, link);
} else {
if (active == last) {
- if (!bar->config->wrap_scroll) {
- return;
- }
- new = first;
+ new = config->wrap_scroll ? first : NULL;
+ } else {
+ new = wl_container_of(active->link.next, new, link);
}
-
- new = wl_container_of(active->link.next, new, link);
}
- ipc_send_workspace_command(bar, new->name);
+ if (new) {
+ ipc_send_workspace_command(bar, new->name);
+ }
// Check button release bindings
- check_bindings(bar, wl_axis_to_x11_button(axis, value),
- WL_POINTER_BUTTON_STATE_RELEASED);
+ check_bindings(bar, button, WL_POINTER_BUTTON_STATE_RELEASED);
}
static void wl_pointer_frame(void *data, struct wl_pointer *wl_pointer) {
diff --git a/swaybar/ipc.c b/swaybar/ipc.c
index e1b30b52..706f968d 100644
--- a/swaybar/ipc.c
+++ b/swaybar/ipc.c
@@ -307,7 +307,7 @@ bool ipc_get_workspaces(struct swaybar *bar) {
if (ws->urgent) {
bar->visible_by_urgency = true;
}
- wl_list_insert(&output->workspaces, &ws->link);
+ wl_list_insert(output->workspaces.prev, &ws->link);
}
}
}
diff --git a/swaybar/render.c b/swaybar/render.c
index 85e7542f..4ebf922e 100644
--- a/swaybar/render.c
+++ b/swaybar/render.c
@@ -466,7 +466,7 @@ static uint32_t render_to_cairo(cairo_t *cairo, struct swaybar_output *output) {
x = 0;
if (config->workspace_buttons) {
struct swaybar_workspace *ws;
- wl_list_for_each_reverse(ws, &output->workspaces, link) {
+ wl_list_for_each(ws, &output->workspaces, link) {
uint32_t h = render_workspace_button(cairo, output, ws, &x);
max_height = h > max_height ? h : max_height;
}