sway

i3-compatible Wayland compositor
git clone https://git.awy.one/sway
Log | Files | Refs | README | LICENSE

commit e4965f7dace96546d3802f4533ba1f145290f48c
parent a41057714f786bfe6a797cb8393b49e6870d5329
Author: Drew DeVault <sir@cmpwn.com>
Date:   Sun, 22 Apr 2018 10:54:21 +0200

Merge branch 'master' into rename-surface-subsurfaces
Diffstat:
Mswaybar/bar.c | 61+++++++++++++++++++++++++++++++++++++++++++------------------
1 file changed, 43 insertions(+), 18 deletions(-)

diff --git a/swaybar/bar.c b/swaybar/bar.c @@ -156,31 +156,56 @@ static void wl_pointer_axis(void *data, struct wl_pointer *wl_pointer, if (!sway_assert(output, "axis with no active output")) { return; } + double amt = wl_fixed_to_double(value); - if (!bar->config->wrap_scroll) { - int i = 0; - struct swaybar_workspace *ws = NULL; - wl_list_for_each(ws, &output->workspaces, link) { - if (ws->focused) { - break; - } - ++i; + if (amt == 0.0) { + return; + } + + struct swaybar_workspace *first = NULL; + struct swaybar_workspace *active = NULL; + struct swaybar_workspace *last; + + struct swaybar_workspace *iter; + wl_list_for_each(iter, &output->workspaces, link) { + if (!first) { + first = iter; } - int len = wl_list_length(&output->workspaces); - if (!sway_assert(i != len, "axis with null workspace")) { - return; + + if (iter->visible) { + active = iter; } - if (i == 0 && amt > 0) { - return; // Do not wrap + + last = iter; + } + + if (!sway_assert(active, "axis with null workspace")) { + return; + } + + struct swaybar_workspace *new; + + if (amt > 0.0) { + if (active == first) { + if (!bar->config->wrap_scroll) { + return; + } + new = last; } - if (i == len - 1 && amt < 0) { - return; // Do not wrap + + new = wl_container_of(active->link.prev, new, link); + } else { + if (active == last) { + if (!bar->config->wrap_scroll) { + return; + } + new = first; } + + new = wl_container_of(active->link.next, new, link); } - const char *workspace_name = - amt < 0 ? "prev_on_output" : "next_on_output"; - ipc_send_workspace_command(bar, workspace_name); + ipc_send_workspace_command(bar, new->name); } static void wl_pointer_frame(void *data, struct wl_pointer *wl_pointer) {