mirror of
https://github.com/labwc/labwc.git
synced 2025-10-29 05:40:24 -04: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
|
|
@ -603,9 +603,6 @@ extending outward from the snapped edge.
|
||||||
*<mouse><doubleClickTime>*
|
*<mouse><doubleClickTime>*
|
||||||
Set double click time in milliseconds. Default is 500.
|
Set double click time in milliseconds. Default is 500.
|
||||||
|
|
||||||
*<mouse><scrollFactor>*
|
|
||||||
Set scroll factor. Default is 1.0.
|
|
||||||
|
|
||||||
*<mouse><context name=""><mousebind button="" direction="" action=""><action>*
|
*<mouse><context name=""><mousebind button="" direction="" action=""><action>*
|
||||||
Multiple *<mousebind>* can exist within one *<context>*; and multiple
|
Multiple *<mousebind>* can exist within one *<context>*; and multiple
|
||||||
*<action>* can exist within one *<mousebind>*.
|
*<action>* can exist within one *<mousebind>*.
|
||||||
|
|
@ -814,6 +811,7 @@ extending outward from the snapped edge.
|
||||||
<clickMethod></clickMethod>
|
<clickMethod></clickMethod>
|
||||||
<sendEventsMode></sendEventsMode>
|
<sendEventsMode></sendEventsMode>
|
||||||
<calibrationMatrix></calibrationMatrix>
|
<calibrationMatrix></calibrationMatrix>
|
||||||
|
<scrollFactor>1.0</scrollFactor>
|
||||||
</device>
|
</device>
|
||||||
</libinput>
|
</libinput>
|
||||||
```
|
```
|
||||||
|
|
@ -939,6 +937,9 @@ The most common matrices are:
|
||||||
visit https://wayland.freedesktop.org/libinput/doc/latest/absolute-axes.html#calibration-of-absolute-devices
|
visit https://wayland.freedesktop.org/libinput/doc/latest/absolute-axes.html#calibration-of-absolute-devices
|
||||||
for more information.
|
for more information.
|
||||||
|
|
||||||
|
*<libinput><scrollFactor>*
|
||||||
|
Set scroll factor. Default is 1.0.
|
||||||
|
|
||||||
## WINDOW RULES
|
## WINDOW RULES
|
||||||
|
|
||||||
Two types of window rules are supported, actions and properties. They are
|
Two types of window rules are supported, actions and properties. They are
|
||||||
|
|
|
||||||
|
|
@ -330,7 +330,6 @@
|
||||||
|
|
||||||
<!-- time is in ms -->
|
<!-- time is in ms -->
|
||||||
<doubleClickTime>500</doubleClickTime>
|
<doubleClickTime>500</doubleClickTime>
|
||||||
<scrollFactor>1.0</scrollFactor>
|
|
||||||
|
|
||||||
<context name="Frame">
|
<context name="Frame">
|
||||||
<mousebind button="A-Left" action="Press">
|
<mousebind button="A-Left" action="Press">
|
||||||
|
|
@ -559,6 +558,7 @@
|
||||||
- clickMethod [none|buttonAreas|clickfinger]
|
- clickMethod [none|buttonAreas|clickfinger]
|
||||||
- sendEventsMode [yes|no|disabledOnExternalMouse]
|
- sendEventsMode [yes|no|disabledOnExternalMouse]
|
||||||
- calibrationMatrix [six float values split by space]
|
- calibrationMatrix [six float values split by space]
|
||||||
|
- scrollFactor [float]
|
||||||
-->
|
-->
|
||||||
<libinput>
|
<libinput>
|
||||||
<device category="default">
|
<device category="default">
|
||||||
|
|
@ -575,6 +575,7 @@
|
||||||
<clickMethod></clickMethod>
|
<clickMethod></clickMethod>
|
||||||
<sendEventsMode></sendEventsMode>
|
<sendEventsMode></sendEventsMode>
|
||||||
<calibrationMatrix></calibrationMatrix>
|
<calibrationMatrix></calibrationMatrix>
|
||||||
|
<scrollFactor>1.0</scrollFactor>
|
||||||
</device>
|
</device>
|
||||||
</libinput>
|
</libinput>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ struct libinput_category {
|
||||||
int click_method; /* -1 or libinput_config_click_method */
|
int click_method; /* -1 or libinput_config_click_method */
|
||||||
int send_events_mode; /* -1 or libinput_config_send_events_mode */
|
int send_events_mode; /* -1 or libinput_config_send_events_mode */
|
||||||
bool have_calibration_matrix;
|
bool have_calibration_matrix;
|
||||||
|
double scroll_factor;
|
||||||
float calibration_matrix[6];
|
float calibration_matrix[6];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,6 @@ struct rcxml {
|
||||||
/* mouse */
|
/* mouse */
|
||||||
long doubleclick_time; /* in ms */
|
long doubleclick_time; /* in ms */
|
||||||
struct wl_list mousebinds; /* struct mousebind.link */
|
struct wl_list mousebinds; /* struct mousebind.link */
|
||||||
double scroll_factor;
|
|
||||||
|
|
||||||
/* touch tablet */
|
/* touch tablet */
|
||||||
struct wl_list touch_configs;
|
struct wl_list touch_configs;
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,8 @@ enum input_mode {
|
||||||
struct input {
|
struct input {
|
||||||
struct wlr_input_device *wlr_input_device;
|
struct wlr_input_device *wlr_input_device;
|
||||||
struct seat *seat;
|
struct seat *seat;
|
||||||
|
/* Set for pointer/touch devices */
|
||||||
|
double scroll_factor;
|
||||||
struct wl_listener destroy;
|
struct wl_listener destroy;
|
||||||
struct wl_list link; /* seat.inputs */
|
struct wl_list link; /* seat.inputs */
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ libinput_category_init(struct libinput_category *l)
|
||||||
l->click_method = -1;
|
l->click_method = -1;
|
||||||
l->send_events_mode = -1;
|
l->send_events_mode = -1;
|
||||||
l->have_calibration_matrix = false;
|
l->have_calibration_matrix = false;
|
||||||
|
l->scroll_factor = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum lab_libinput_device_type
|
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 action *current_window_rule_action;
|
||||||
static struct view_query *current_view_query;
|
static struct view_query *current_view_query;
|
||||||
static struct action *current_child_action;
|
static struct action *current_child_action;
|
||||||
|
/* for backword compatibility of <mouse><scrollFactor> */
|
||||||
|
static double mouse_scroll_factor = -1;
|
||||||
|
|
||||||
enum font_place {
|
enum font_place {
|
||||||
FONT_PLACE_NONE = 0,
|
FONT_PLACE_NONE = 0,
|
||||||
|
|
@ -733,6 +735,8 @@ fill_libinput_category(char *nodename, char *content)
|
||||||
current_libinput_category->have_calibration_matrix = false;
|
current_libinput_category->have_calibration_matrix = false;
|
||||||
}
|
}
|
||||||
g_strfreev(elements);
|
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");
|
wlr_log(WLR_ERROR, "invalid doubleClickTime");
|
||||||
}
|
}
|
||||||
} else if (!strcasecmp(nodename, "scrollFactor.mouse")) {
|
} 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")) {
|
} else if (!strcasecmp(nodename, "name.context.mouse")) {
|
||||||
current_mouse_context = content;
|
current_mouse_context = content;
|
||||||
current_mousebind = NULL;
|
current_mousebind = NULL;
|
||||||
|
|
@ -1345,7 +1350,6 @@ rcxml_init(void)
|
||||||
rc.raise_on_focus = false;
|
rc.raise_on_focus = false;
|
||||||
|
|
||||||
rc.doubleclick_time = 500;
|
rc.doubleclick_time = 500;
|
||||||
rc.scroll_factor = 1.0;
|
|
||||||
|
|
||||||
rc.tablet.force_mouse_emulation = false;
|
rc.tablet.force_mouse_emulation = false;
|
||||||
rc.tablet.output_name = NULL;
|
rc.tablet.output_name = NULL;
|
||||||
|
|
@ -1596,12 +1600,21 @@ post_processing(void)
|
||||||
rc.font_osd.name = xstrdup("sans");
|
rc.font_osd.name = xstrdup("sans");
|
||||||
}
|
}
|
||||||
if (!libinput_category_get_default()) {
|
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();
|
struct libinput_category *l = libinput_category_create();
|
||||||
/* Prevents unused variable warning when compiled without asserts */
|
/* Prevents unused variable warning when compiled without asserts */
|
||||||
(void)l;
|
(void)l;
|
||||||
assert(l && libinput_category_get_default() == 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);
|
int nr_workspaces = wl_list_length(&rc.workspace_config.workspaces);
|
||||||
if (nr_workspaces < rc.workspace_config.min_nr_workspaces) {
|
if (nr_workspaces < rc.workspace_config.min_nr_workspaces) {
|
||||||
|
|
@ -1884,4 +1897,5 @@ rcxml_finish(void)
|
||||||
current_field = NULL;
|
current_field = NULL;
|
||||||
current_window_rule = NULL;
|
current_window_rule = NULL;
|
||||||
current_window_rule_action = 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 seat *seat = wl_container_of(listener, seat, cursor_axis);
|
||||||
struct wlr_pointer_axis_event *event = data;
|
struct wlr_pointer_axis_event *event = data;
|
||||||
struct server *server = seat->server;
|
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);
|
struct cursor_context ctx = get_cursor_context(server);
|
||||||
idle_manager_notify_activity(seat->seat);
|
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. */
|
/* Notify the client with pointer focus of the axis event. */
|
||||||
wlr_seat_pointer_notify_axis(seat->seat, event->time_msec,
|
wlr_seat_pointer_notify_axis(seat->seat, event->time_msec,
|
||||||
event->orientation, rc.scroll_factor * event->delta,
|
event->orientation, scroll_factor * event->delta,
|
||||||
round(rc.scroll_factor * event->delta_discrete),
|
round(scroll_factor * event->delta_discrete),
|
||||||
event->source, event->relative_direction);
|
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");
|
wlr_log(WLR_ERROR, "no wlr_input_device");
|
||||||
return;
|
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)) {
|
if (!wlr_input_device_is_libinput(wlr_input_device)) {
|
||||||
|
input->scroll_factor = 1.0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -247,6 +251,9 @@ configure_libinput(struct wlr_input_device *wlr_input_device)
|
||||||
wlr_log(WLR_INFO, "calibration matrix configured");
|
wlr_log(WLR_INFO, "calibration matrix configured");
|
||||||
libinput_device_config_calibration_set_matrix(libinput_dev, dc->calibration_matrix);
|
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 *
|
static struct wlr_output *
|
||||||
|
|
@ -286,6 +293,7 @@ new_pointer(struct seat *seat, struct wlr_input_device *dev)
|
||||||
{
|
{
|
||||||
struct input *input = znew(*input);
|
struct input *input = znew(*input);
|
||||||
input->wlr_input_device = dev;
|
input->wlr_input_device = dev;
|
||||||
|
dev->data = input;
|
||||||
configure_libinput(dev);
|
configure_libinput(dev);
|
||||||
wlr_cursor_attach_input_device(seat->cursor, 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);
|
struct input *input = znew(*input);
|
||||||
input->wlr_input_device = dev;
|
input->wlr_input_device = dev;
|
||||||
|
dev->data = input;
|
||||||
configure_libinput(dev);
|
configure_libinput(dev);
|
||||||
wlr_cursor_attach_input_device(seat->cursor, dev);
|
wlr_cursor_attach_input_device(seat->cursor, dev);
|
||||||
/* In support of running with WLR_WL_OUTPUTS set to >=2 */
|
/* In support of running with WLR_WL_OUTPUTS set to >=2 */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue