]> git.mdlowis.com Git - proto/labwc.git/commitdiff
input: move <scrollFactor> to <libinput> section
authortokyo4j <hrak1529@gmail.com>
Thu, 8 Aug 2024 08:29:43 +0000 (17:29 +0900)
committerHiroaki Yamamoto <hrak1529@gmail.com>
Fri, 23 Aug 2024 07:20:56 +0000 (16:20 +0900)
This allows per-device configuration of scroll factor (e.g. setting
different scroll factors for mice and touchpads).

docs/labwc-config.5.scd
docs/rc.xml.all
include/config/libinput.h
include/config/rcxml.h
include/labwc.h
src/config/libinput.c
src/config/rcxml.c
src/input/cursor.c
src/seat.c

index 7ff83625ad238e593a212e06db6ba316b7f58ebc..6da0af3419f9463e066c0aa7323c3216a7a25d08 100644 (file)
@@ -603,9 +603,6 @@ extending outward from the snapped edge.
 *<mouse><doubleClickTime>*
        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>*
        Multiple *<mousebind>* can exist within one *<context>*; and multiple
        *<action>* can exist within one *<mousebind>*.
@@ -814,6 +811,7 @@ extending outward from the snapped edge.
     <clickMethod></clickMethod>
     <sendEventsMode></sendEventsMode>
     <calibrationMatrix></calibrationMatrix>
+    <scrollFactor>1.0</scrollFactor>
   </device>
 </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
        for more information.
 
+*<libinput><scrollFactor>*
+       Set scroll factor. Default is 1.0.
+
 ## WINDOW RULES
 
 Two types of window rules are supported, actions and properties. They are
index b3b7821f7aa7050a26968e7f807b68f9f84bdfa5..ab462a14f9445142d42cfa1bf3e73b9a793ebea1 100644 (file)
 
     <!-- time is in ms -->
     <doubleClickTime>500</doubleClickTime>
-    <scrollFactor>1.0</scrollFactor>
 
     <context name="Frame">
       <mousebind button="A-Left" action="Press">
       - clickMethod [none|buttonAreas|clickfinger]
       - sendEventsMode [yes|no|disabledOnExternalMouse]
       - calibrationMatrix [six float values split by space]
+      - scrollFactor [float]
   -->
   <libinput>
     <device category="default">
       <clickMethod></clickMethod>
       <sendEventsMode></sendEventsMode>
       <calibrationMatrix></calibrationMatrix>
+      <scrollFactor>1.0</scrollFactor>
     </device>
   </libinput>
 
index 0c211613a5a479d3a81a89f473bc44e796f645b9..94a99a3a0c5dce04b81727c3f5bd3e5155dc2c7a 100644 (file)
@@ -31,6 +31,7 @@ struct libinput_category {
        int click_method;               /* -1 or libinput_config_click_method */
        int send_events_mode;           /* -1 or libinput_config_send_events_mode */
        bool have_calibration_matrix;
+       double scroll_factor;
        float calibration_matrix[6];
 };
 
index 03a2588175eaa4c2ad4b135157015ba708c5eabe..cb56d4732ebab83b98a093d490522af10a5ac302 100644 (file)
@@ -110,7 +110,6 @@ struct rcxml {
        /* mouse */
        long doubleclick_time;     /* in ms */
        struct wl_list mousebinds; /* struct mousebind.link */
-       double scroll_factor;
 
        /* touch tablet */
        struct wl_list touch_configs;
index 14ce607c90c358d25400deb090ce509f1d02d320..30f9fbafe776d497e8bb21770594d29477464099 100644 (file)
@@ -71,6 +71,8 @@ enum input_mode {
 struct input {
        struct wlr_input_device *wlr_input_device;
        struct seat *seat;
+       /* Set for pointer/touch devices */
+       double scroll_factor;
        struct wl_listener destroy;
        struct wl_list link; /* seat.inputs */
 };
index af4f1bd086e3c1f38ee40bc437cc24778b081c82..42ec647afa6a808394cd06259ff0e347716a33eb 100644 (file)
@@ -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
index 923822fcbc5342375e50637b85b25f807cdb34bf..30fd6afe3a50f601d97e43c223c6c17231bf0f88 100644 (file)
@@ -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, &current_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;
 }
index 3b2583f018694cba0623dfc5eb2cc95529f15d30..cd28cf4429858bdf8d299b2508105524c7a5c7a5 100644 (file)
@@ -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);
        }
 }
index 49f317cccb5408a0bee6ecc3986d4aa52ec7d3e6..004b610ef797194b2fddfeb7086631cf84abaf6a 100644 (file)
@@ -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 */