mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	input: move <scrollFactor> to <libinput> section
This allows per-device configuration of scroll factor (e.g. setting different scroll factors for mice and touchpads).
This commit is contained in:
		
							parent
							
								
									228a74ca48
								
							
						
					
					
						commit
						b667107d1a
					
				
					 9 changed files with 45 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -26,6 +26,7 @@ libinput_category_init(struct libinput_category *l)
 | 
			
		|||
	l->click_method = -1;
 | 
			
		||||
	l->send_events_mode = -1;
 | 
			
		||||
	l->have_calibration_matrix = false;
 | 
			
		||||
	l->scroll_factor = 1.0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum lab_libinput_device_type
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,6 +63,8 @@ static struct window_rule *current_window_rule;
 | 
			
		|||
static struct action *current_window_rule_action;
 | 
			
		||||
static struct view_query *current_view_query;
 | 
			
		||||
static struct action *current_child_action;
 | 
			
		||||
/* for backword compatibility of <mouse><scrollFactor> */
 | 
			
		||||
static double mouse_scroll_factor = -1;
 | 
			
		||||
 | 
			
		||||
enum font_place {
 | 
			
		||||
	FONT_PLACE_NONE = 0,
 | 
			
		||||
| 
						 | 
				
			
			@ -733,6 +735,8 @@ fill_libinput_category(char *nodename, char *content)
 | 
			
		|||
			current_libinput_category->have_calibration_matrix = false;
 | 
			
		||||
		}
 | 
			
		||||
		g_strfreev(elements);
 | 
			
		||||
	} else if (!strcasecmp(nodename, "scrollFactor")) {
 | 
			
		||||
		set_double(content, ¤t_libinput_category->scroll_factor);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1011,7 +1015,8 @@ entry(xmlNode *node, char *nodename, char *content)
 | 
			
		|||
			wlr_log(WLR_ERROR, "invalid doubleClickTime");
 | 
			
		||||
		}
 | 
			
		||||
	} else if (!strcasecmp(nodename, "scrollFactor.mouse")) {
 | 
			
		||||
		set_double(content, &rc.scroll_factor);
 | 
			
		||||
		/* This is deprecated. Show an error message in post_processing() */
 | 
			
		||||
		set_double(content, &mouse_scroll_factor);
 | 
			
		||||
	} else if (!strcasecmp(nodename, "name.context.mouse")) {
 | 
			
		||||
		current_mouse_context = content;
 | 
			
		||||
		current_mousebind = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -1345,7 +1350,6 @@ rcxml_init(void)
 | 
			
		|||
	rc.raise_on_focus = false;
 | 
			
		||||
 | 
			
		||||
	rc.doubleclick_time = 500;
 | 
			
		||||
	rc.scroll_factor = 1.0;
 | 
			
		||||
 | 
			
		||||
	rc.tablet.force_mouse_emulation = false;
 | 
			
		||||
	rc.tablet.output_name = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -1596,12 +1600,21 @@ post_processing(void)
 | 
			
		|||
		rc.font_osd.name = xstrdup("sans");
 | 
			
		||||
	}
 | 
			
		||||
	if (!libinput_category_get_default()) {
 | 
			
		||||
		/* So we still allow tap to click by default */
 | 
			
		||||
		/* So we set default values of <tap> and <scrollFactor> */
 | 
			
		||||
		struct libinput_category *l = libinput_category_create();
 | 
			
		||||
		/* Prevents unused variable warning when compiled without asserts */
 | 
			
		||||
		(void)l;
 | 
			
		||||
		assert(l && libinput_category_get_default() == l);
 | 
			
		||||
	}
 | 
			
		||||
	if (mouse_scroll_factor >= 0) {
 | 
			
		||||
		wlr_log(WLR_ERROR, "<mouse><scrollFactor> is deprecated"
 | 
			
		||||
				" and overwrites <libinput><scrollFactor>."
 | 
			
		||||
				" Use only <libinput><scrollFactor>.");
 | 
			
		||||
		struct libinput_category *l;
 | 
			
		||||
		wl_list_for_each(l, &rc.libinput_categories, link) {
 | 
			
		||||
			l->scroll_factor = mouse_scroll_factor;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	int nr_workspaces = wl_list_length(&rc.workspace_config.workspaces);
 | 
			
		||||
	if (nr_workspaces < rc.workspace_config.min_nr_workspaces) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1884,4 +1897,5 @@ rcxml_finish(void)
 | 
			
		|||
	current_field = NULL;
 | 
			
		||||
	current_window_rule = NULL;
 | 
			
		||||
	current_window_rule_action = NULL;
 | 
			
		||||
	mouse_scroll_factor = -1;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1335,6 +1335,13 @@ cursor_axis(struct wl_listener *listener, void *data)
 | 
			
		|||
	struct seat *seat = wl_container_of(listener, seat, cursor_axis);
 | 
			
		||||
	struct wlr_pointer_axis_event *event = data;
 | 
			
		||||
	struct server *server = seat->server;
 | 
			
		||||
 | 
			
		||||
	/* input->scroll_factor is set for pointer/touch devices */
 | 
			
		||||
	assert(event->pointer->base.type == WLR_INPUT_DEVICE_POINTER
 | 
			
		||||
		|| event->pointer->base.type == WLR_INPUT_DEVICE_TOUCH);
 | 
			
		||||
	struct input *input = event->pointer->base.data;
 | 
			
		||||
	double scroll_factor = input->scroll_factor;
 | 
			
		||||
 | 
			
		||||
	struct cursor_context ctx = get_cursor_context(server);
 | 
			
		||||
	idle_manager_notify_activity(seat->seat);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1349,8 +1356,8 @@ cursor_axis(struct wl_listener *listener, void *data)
 | 
			
		|||
 | 
			
		||||
		/* Notify the client with pointer focus of the axis event. */
 | 
			
		||||
		wlr_seat_pointer_notify_axis(seat->seat, event->time_msec,
 | 
			
		||||
			event->orientation, rc.scroll_factor * event->delta,
 | 
			
		||||
			round(rc.scroll_factor * event->delta_discrete),
 | 
			
		||||
			event->orientation, scroll_factor * event->delta,
 | 
			
		||||
			round(scroll_factor * event->delta_discrete),
 | 
			
		||||
			event->source, event->relative_direction);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -114,7 +114,11 @@ configure_libinput(struct wlr_input_device *wlr_input_device)
 | 
			
		|||
		wlr_log(WLR_ERROR, "no wlr_input_device");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	struct input *input = wlr_input_device->data;
 | 
			
		||||
 | 
			
		||||
	/* Set scroll factor to 1.0 for Wayland/X11 backends or virtual pointers */
 | 
			
		||||
	if (!wlr_input_device_is_libinput(wlr_input_device)) {
 | 
			
		||||
		input->scroll_factor = 1.0;
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -247,6 +251,9 @@ configure_libinput(struct wlr_input_device *wlr_input_device)
 | 
			
		|||
		wlr_log(WLR_INFO, "calibration matrix configured");
 | 
			
		||||
		libinput_device_config_calibration_set_matrix(libinput_dev, dc->calibration_matrix);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	wlr_log(WLR_INFO, "scroll factor configured");
 | 
			
		||||
	input->scroll_factor = dc->scroll_factor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct wlr_output *
 | 
			
		||||
| 
						 | 
				
			
			@ -286,6 +293,7 @@ new_pointer(struct seat *seat, struct wlr_input_device *dev)
 | 
			
		|||
{
 | 
			
		||||
	struct input *input = znew(*input);
 | 
			
		||||
	input->wlr_input_device = dev;
 | 
			
		||||
	dev->data = input;
 | 
			
		||||
	configure_libinput(dev);
 | 
			
		||||
	wlr_cursor_attach_input_device(seat->cursor, dev);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -354,6 +362,7 @@ new_touch(struct seat *seat, struct wlr_input_device *dev)
 | 
			
		|||
{
 | 
			
		||||
	struct input *input = znew(*input);
 | 
			
		||||
	input->wlr_input_device = dev;
 | 
			
		||||
	dev->data = input;
 | 
			
		||||
	configure_libinput(dev);
 | 
			
		||||
	wlr_cursor_attach_input_device(seat->cursor, dev);
 | 
			
		||||
	/* In support of running with WLR_WL_OUTPUTS set to >=2 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue