]> git.mdlowis.com Git - proto/labwc.git/commitdiff
libinput: implement threeFingerDrag feature
authormay <m4rch3n1ng@gmail.com>
Fri, 6 Jun 2025 21:08:53 +0000 (23:08 +0200)
committerHiroaki Yamamoto <hrak1529@gmail.com>
Sat, 7 Jun 2025 12:30:07 +0000 (21:30 +0900)
docs/labwc-config.5.scd
docs/rc.xml.all
include/config/libinput.h
meson.build
src/config/libinput.c
src/config/rcxml.c
src/seat.c

index fb98b3285f15783b0938406eb341fc179b811929..9e18d76406d7bc36c9fec785f8f6e1fb9e1cfa41 100644 (file)
@@ -959,6 +959,7 @@ extending outward from the snapped edge.
     <tapButtonMap></tapButtonMap>
     <tapAndDrag></tapAndDrag>
     <dragLock>sticky</dragLock>
+    <threeFingerDrag></threeFingerDrag>
     <middleEmulation></middleEmulation>
     <disableWhileTyping></disableWhileTyping>
     <clickMethod></clickMethod>
@@ -1033,6 +1034,16 @@ extending outward from the snapped edge.
        drag lock, but if *yes* is set, the drag lock expires after a timeout.
        Default is *sticky*.
 
+*<libinput><device><threeFingerDrag>* [yes|no|3|4]
+       Enable or disable the three-finger drag feature. When enabled, three
+       fingers down will result in a button down event and subsequent finger
+       motions triggers a drag.
+
+       The available options are:
+       - *no* - Disable three-finger drag.
+       - *yes* | *3* - Enable three-finger drag for 3 fingers.
+       - *4* - Enable three-finger drag for 4 fingers.
+
 *<libinput><device><middleEmulation>* [yes|no]
        Enable or disable middle button emulation for this category. Middle
        emulation processes a simultaneous left and right click as a press of
index c6f00f64987a53b75654653769a6f52649cd4bfe..4d137f80544ae0eab1893a26bc2977fbe0fa3e4a 100644 (file)
       <tapButtonMap></tapButtonMap>
       <tapAndDrag></tapAndDrag>
       <dragLock>sticky</dragLock>
+      <threeFingerDrag></threeFingerDrag>
       <middleEmulation></middleEmulation>
       <disableWhileTyping></disableWhileTyping>
       <clickMethod></clickMethod>
index a891a33fc4eeae80da7a72c3189c61f504549f0f..9de8f2523c7afb8848685330a020e1ed9b905133 100644 (file)
@@ -25,6 +25,7 @@ struct libinput_category {
        enum libinput_config_tap_button_map tap_button_map;
        int tap_and_drag;               /* -1 or libinput_config_drag_state */
        int drag_lock;                  /* -1 or libinput_config_drag_lock_state */
+       int three_finger_drag;          /* -1 or libinput_config_3fg_drag_state */
        int accel_profile;              /* -1 or libinput_config_accel_profile */
        int middle_emu;                 /* -1 or libinput_config_middle_emulation_state */
        int dwt;                        /* -1 or libinput_config_dwt_state */
index b83eb8c258c51fa627d20476855d631dd1ae94ed..41b500b667b8e93752c48ba8d39918620681e8bb 100644 (file)
@@ -110,7 +110,7 @@ conf_data.set10('HAVE_RSVG', have_rsvg)
 
 conf_data.set10('HAVE_LIBSFDO', have_libsfdo)
 
-foreach sym : ['LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_STICKY']
+foreach sym : ['LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_STICKY', 'LIBINPUT_CONFIG_3FG_DRAG_ENABLED_3FG']
        conf_data.set10('HAVE_' + sym, cc.has_header_symbol('libinput.h', sym, dependencies: input))
 endforeach
 
index f7e07d3aceed845707063024a206b78291f7e5ee..d6179d0f768a6070ccf04880f6b73156b24c9e59 100644 (file)
@@ -24,6 +24,7 @@ libinput_category_init(struct libinput_category *l)
 #else
        l->drag_lock = -1;
 #endif
+       l->three_finger_drag = -1;
        l->accel_profile = -1;
        l->middle_emu = -1;
        l->dwt = -1;
index b1bafcd8989045785c5afb8983ea3799dd91f846..717ff311aeb8188f5bf9e99208b85ab214c2fc13 100644 (file)
@@ -788,6 +788,27 @@ fill_libinput_category(char *nodename, char *content, struct parser_state *state
                state->current_libinput_category->drag_lock = ret
                        ? LIBINPUT_CONFIG_DRAG_LOCK_ENABLED
                        : LIBINPUT_CONFIG_DRAG_LOCK_DISABLED;
+       } else if (!strcasecmp(nodename, "threeFingerDrag")) {
+#if HAVE_LIBINPUT_CONFIG_3FG_DRAG_ENABLED_3FG
+               if (!strcmp(content, "3")) {
+                       state->current_libinput_category->three_finger_drag =
+                               LIBINPUT_CONFIG_3FG_DRAG_ENABLED_3FG;
+               } else if (!strcmp(content, "4")) {
+                       state->current_libinput_category->three_finger_drag =
+                               LIBINPUT_CONFIG_3FG_DRAG_ENABLED_4FG;
+               } else {
+                       int ret = parse_bool(content, -1);
+                       if (ret < 0) {
+                               return;
+                       }
+                       state->current_libinput_category->three_finger_drag = ret
+                               ? LIBINPUT_CONFIG_3FG_DRAG_ENABLED_3FG
+                               : LIBINPUT_CONFIG_3FG_DRAG_DISABLED;
+               }
+#else
+               wlr_log(WLR_ERROR, "<threeFingerDrag> is only"
+                       " supported in libinput >= 1.28");
+#endif
        } else if (!strcasecmp(nodename, "accelProfile")) {
                state->current_libinput_category->accel_profile =
                        get_accel_profile(content);
index a88a37d1501e467994f0ce36cbf249ab2384843e..2ba7fc5c29b1b931998b3d6467e8368964da4622 100644 (file)
@@ -164,6 +164,17 @@ configure_libinput(struct wlr_input_device *wlr_input_device)
                        libinput_dev, dc->drag_lock);
        }
 
+#if HAVE_LIBINPUT_CONFIG_3FG_DRAG_ENABLED_3FG
+       if (libinput_device_config_tap_get_finger_count(libinput_dev) <= 0
+                       || dc->three_finger_drag < 0) {
+               wlr_log(WLR_INFO, "three-finger drag not configured");
+       } else {
+               wlr_log(WLR_INFO, "three-finger drag configured");
+               libinput_device_config_3fg_drag_set_enabled(
+                       libinput_dev, dc->three_finger_drag);
+       }
+#endif
+
        if (libinput_device_config_scroll_has_natural_scroll(libinput_dev) <= 0
                        || dc->natural_scroll < 0) {
                wlr_log(WLR_INFO, "natural scroll not configured");