mirror of
https://github.com/swaywm/sway.git
synced 2024-11-14 14:34:07 +01:00
Merge pull request #2973 from ianyfan/swaybar
swaybar: fix scrolling behaviour
This commit is contained in:
commit
6b59533646
@ -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,
|
// If there is a button press binding, execute it, skip default behavior,
|
||||||
// and check button release bindings
|
// and check button release bindings
|
||||||
if (check_bindings(bar, wl_axis_to_x11_button(axis, value),
|
enum x11_button button = wl_axis_to_x11_button(axis, value);
|
||||||
WL_POINTER_BUTTON_STATE_PRESSED)) {
|
if (check_bindings(bar, button, WL_POINTER_BUTTON_STATE_PRESSED)) {
|
||||||
check_bindings(bar, wl_axis_to_x11_button(axis, value),
|
check_bindings(bar, button, WL_POINTER_BUTTON_STATE_RELEASED);
|
||||||
WL_POINTER_BUTTON_STATE_RELEASED);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,68 +167,59 @@ static void wl_pointer_axis(void *data, struct wl_pointer *wl_pointer,
|
|||||||
&& x < hotspot->x + hotspot->width
|
&& x < hotspot->x + hotspot->width
|
||||||
&& y < hotspot->y + hotspot->height) {
|
&& y < hotspot->y + hotspot->height) {
|
||||||
if (HOTSPOT_IGNORE == hotspot->callback(
|
if (HOTSPOT_IGNORE == hotspot->callback(
|
||||||
output, pointer->x, pointer->y,
|
output, pointer->x, pointer->y, button, hotspot->data)) {
|
||||||
wl_axis_to_x11_button(axis, value), hotspot->data)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct swaybar_config *config = bar->config;
|
||||||
double amt = wl_fixed_to_double(value);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// last doesn't actually need initialization,
|
if (!sway_assert(!wl_list_empty(&output->workspaces), "axis with no workspaces")) {
|
||||||
// but gcc (7.3.1) is too dumb to figure it out
|
return;
|
||||||
struct swaybar_workspace *first = NULL;
|
|
||||||
struct swaybar_workspace *active = NULL;
|
|
||||||
struct swaybar_workspace *last = NULL;
|
|
||||||
|
|
||||||
struct swaybar_workspace *iter;
|
|
||||||
wl_list_for_each(iter, &output->workspaces, link) {
|
|
||||||
if (!first) {
|
|
||||||
first = iter;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (iter->visible) {
|
|
||||||
active = iter;
|
|
||||||
}
|
|
||||||
|
|
||||||
last = iter;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sway_assert(active, "axis with null workspace")) {
|
struct swaybar_workspace *first =
|
||||||
|
wl_container_of(output->workspaces.next, first, link);
|
||||||
|
struct swaybar_workspace *last =
|
||||||
|
wl_container_of(output->workspaces.prev, last, link);
|
||||||
|
|
||||||
|
struct swaybar_workspace *active;
|
||||||
|
wl_list_for_each(active, &output->workspaces, link) {
|
||||||
|
if (active->visible) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!sway_assert(active->visible, "axis with null workspace")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct swaybar_workspace *new;
|
struct swaybar_workspace *new;
|
||||||
|
if (amt < 0.0) {
|
||||||
if (amt > 0.0) {
|
|
||||||
if (active == first) {
|
if (active == first) {
|
||||||
if (!bar->config->wrap_scroll) {
|
new = config->wrap_scroll ? last : NULL;
|
||||||
return;
|
} else {
|
||||||
}
|
new = wl_container_of(active->link.prev, new, link);
|
||||||
new = last;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
new = wl_container_of(active->link.prev, new, link);
|
|
||||||
} else {
|
} else {
|
||||||
if (active == last) {
|
if (active == last) {
|
||||||
if (!bar->config->wrap_scroll) {
|
new = config->wrap_scroll ? first : NULL;
|
||||||
return;
|
} else {
|
||||||
}
|
new = wl_container_of(active->link.next, new, link);
|
||||||
new = first;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 button release bindings
|
||||||
check_bindings(bar, wl_axis_to_x11_button(axis, value),
|
check_bindings(bar, button, WL_POINTER_BUTTON_STATE_RELEASED);
|
||||||
WL_POINTER_BUTTON_STATE_RELEASED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wl_pointer_frame(void *data, struct wl_pointer *wl_pointer) {
|
static void wl_pointer_frame(void *data, struct wl_pointer *wl_pointer) {
|
||||||
|
@ -307,7 +307,7 @@ bool ipc_get_workspaces(struct swaybar *bar) {
|
|||||||
if (ws->urgent) {
|
if (ws->urgent) {
|
||||||
bar->visible_by_urgency = true;
|
bar->visible_by_urgency = true;
|
||||||
}
|
}
|
||||||
wl_list_insert(&output->workspaces, &ws->link);
|
wl_list_insert(output->workspaces.prev, &ws->link);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -466,7 +466,7 @@ static uint32_t render_to_cairo(cairo_t *cairo, struct swaybar_output *output) {
|
|||||||
x = 0;
|
x = 0;
|
||||||
if (config->workspace_buttons) {
|
if (config->workspace_buttons) {
|
||||||
struct swaybar_workspace *ws;
|
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);
|
uint32_t h = render_workspace_button(cairo, output, ws, &x);
|
||||||
max_height = h > max_height ? h : max_height;
|
max_height = h > max_height ? h : max_height;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user