mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Merge pull request #2973 from ianyfan/swaybar
swaybar: fix scrolling behaviour
This commit is contained in:
		
						commit
						6b59533646
					
				
					 3 changed files with 34 additions and 44 deletions
				
			
		| 
						 | 
				
			
			@ -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;
 | 
			
		||||
 | 
			
		||||
	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(!wl_list_empty(&output->workspaces), "axis with no workspaces")) {
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue