]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Add click method libinput option (#1416)
authorMarvin Dostal <maffinmaffinmaffinmaffin@gmail.com>
Wed, 21 Feb 2024 17:19:48 +0000 (18:19 +0100)
committerGitHub <noreply@github.com>
Wed, 21 Feb 2024 17:19:48 +0000 (17:19 +0000)
<libinput>
  <device>
    <clickMethod>none|buttonAreas|clickfinger</clickMethod>
  </device>
</libinput>

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

index 1375181386108654b759f0deef011571b9d10ea7..bc8cf59bc68c8ddbe4fbe668d4aca3f3d7cb3865 100644 (file)
@@ -592,6 +592,7 @@ extending outward from the snapped edge.
     <dragLock></dragLock>
     <middleEmulation></middleEmulation>
     <disableWhileTyping></disableWhileTyping>
+    <clickMethod></clickMethod>
   </device>
 </libinput>
 ```
@@ -667,6 +668,22 @@ extending outward from the snapped edge.
        any motion events while a keyboard is typing, and for a short while
        after as well.
 
+*<libinput><device><clickMethod>* [none|buttonAreas|clickfinger]
+       Configure the method by which physical clicks on a touchpad are mapped to
+       mouse-button events.
+
+       The click methods available are:
+       - *buttonAreas* - The bottom of the touchpad is divided into distinct
+         regions corresponding to left, middle and right buttons; clicking within
+         the region will trigger the corresponding event. Clicking the main area
+         further up produces a left button event.
+       - *clickfinger* - Clicking with one, two or three finger(s) will produce
+         left, right or middle button event without regard to the location of a
+         click.
+       - *none* - Physical clicks will not produce button events.
+
+       The default method depends on the touchpad hardware.
+
 ## WINDOW RULES
 
 Two types of window rules are supported, actions and properties. They are
index 423bcb749d020193c081eb98a0369907e48382dd..5d0c4cff357eaebd1ad4fd712c3029411e25003a 100644 (file)
     non-touch, default or the name of a device. You can obtain device names by
     running *libinput list-devices* as root or member of the input group.
 
-    Tap is set to *yes* be default. All others are left blank in order to use
+    Tap is set to *yes* by default. All others are left blank in order to use
     device defaults.
 
     All values are [yes|no] except for:
       - pointerSpeed [-1.0 to 1.0]
       - accelProfile [flat|adaptive]
       - tapButtonMap [lrm|lmr]
+      - clickMethod [none|buttonAreas|clickfinger]
   -->
   <libinput>
     <device category="default">
       <dragLock></dragLock>
       <middleEmulation></middleEmulation>
       <disableWhileTyping></disableWhileTyping>
+      <clickMethod></clickMethod>
     </device>
   </libinput>
 
index 4ec0ebb7deb561eb98a3521e926ac23ba6b30ba5..dffeea98f4578c30a67a619219f822e0ae3cadf8 100644 (file)
@@ -28,6 +28,7 @@ struct libinput_category {
        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 */
+       int click_method; /* -1 or libinput_config_click_method */
 };
 
 enum lab_libinput_device_type get_device_type(const char *s);
index 7ce62b793c6e186a0c298e34586646c90a9bc7bc..a8de5e7b5cbd00f7f7801f91c6eee62fa8987af3 100644 (file)
@@ -23,6 +23,7 @@ libinput_category_init(struct libinput_category *l)
        l->accel_profile = -1;
        l->middle_emu = -1;
        l->dwt = -1;
+       l->click_method = -1;
 }
 
 enum lab_libinput_device_type
index 61784e1326461d8056b5558ed755cffbefb08cf3..f18cce322abb051435a379f83c025eba62a750d3 100644 (file)
@@ -563,6 +563,19 @@ fill_libinput_category(char *nodename, char *content)
                current_libinput_category->dwt = ret
                        ? LIBINPUT_CONFIG_DWT_ENABLED
                        : LIBINPUT_CONFIG_DWT_DISABLED;
+       } else if (!strcasecmp(nodename, "clickMethod")) {
+               if (!strcasecmp(content, "none")) {
+                       current_libinput_category->click_method =
+                               LIBINPUT_CONFIG_CLICK_METHOD_NONE;
+               } else if (!strcasecmp(content, "clickfinger")) {
+                       current_libinput_category->click_method =
+                               LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER;
+               } else if (!strcasecmp(content, "buttonAreas")) {
+                       current_libinput_category->click_method =
+                               LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
+               } else {
+                       wlr_log(WLR_ERROR, "invalid clickMethod");
+               }
        }
 }
 
index 52b1b5d0ed3b3a46caf695870f0391ba00c6693d..0f4219877b3c7aca923df3ccbfa07de3e96c3b6f 100644 (file)
@@ -189,6 +189,24 @@ configure_libinput(struct wlr_input_device *wlr_input_device)
                wlr_log(WLR_INFO, "dwt configured");
                libinput_device_config_dwt_set_enabled(libinput_dev, dc->dwt);
        }
+       if ((libinput_device_config_click_get_methods(libinput_dev)
+                               & dc->click_method) == 0
+                       || dc->click_method < 0) {
+               wlr_log(WLR_INFO, "click method not configured");
+       } else {
+               wlr_log(WLR_INFO, "click method configured");
+
+               /*
+                * Note, the documentation claims that:
+                * > [...] The device may require changing to a neutral state
+                * > first before activating the new method.
+                *
+                * However, just setting the method seems to work without
+                * issues.
+                */
+
+               libinput_device_config_click_set_method(libinput_dev, dc->click_method);
+       }
 }
 
 static struct wlr_output *