]> git.mdlowis.com Git - proto/labwc.git/commitdiff
config: support libinput sendEventsMode
authorSachin Bhat <sachubhat17@gmail.com>
Sun, 25 Jun 2023 23:36:54 +0000 (07:36 +0800)
committerConsolatis <35009135+Consolatis@users.noreply.github.com>
Sat, 24 Feb 2024 20:36:53 +0000 (21:36 +0100)
This allows to enable / disable libinput devices.

Co-Authored-By: @Consolatis
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 bc8cf59bc68c8ddbe4fbe668d4aca3f3d7cb3865..223eae0aa7251e68e5756f68d01532ff88e5ccb7 100644 (file)
@@ -684,6 +684,20 @@ extending outward from the snapped edge.
 
        The default method depends on the touchpad hardware.
 
+*<libinput><device><sendEventsMode>* [yes|no|disabledOnExternalMouse]
+       Optionally enable or disable sending any device events.
+
+       The options available are:
+       - *yes* - Events are sent as usual
+       - *no* - No events are sent from this device
+       - *disabledOnExternalMouse* - This device does not send events if an
+         external mouse has been detected.
+
+       It is possible to prevent events from a device in the config and then do
+       a Reconfigure to temporarily enable / disable specific devices.
+
+       By default, this setting is not configured.
+
 ## WINDOW RULES
 
 Two types of window rules are supported, actions and properties. They are
index 5d0c4cff357eaebd1ad4fd712c3029411e25003a..c3586ae0503a19c78efb3b67b82fc1ed4853613c 100644 (file)
       - accelProfile [flat|adaptive]
       - tapButtonMap [lrm|lmr]
       - clickMethod [none|buttonAreas|clickfinger]
+      - sendEventsMode [yes|no|disabledOnExternalMouse]
   -->
   <libinput>
     <device category="default">
       <middleEmulation></middleEmulation>
       <disableWhileTyping></disableWhileTyping>
       <clickMethod></clickMethod>
+      <sendEventsMode></sendEventsMode>
     </device>
   </libinput>
 
index dffeea98f4578c30a67a619219f822e0ae3cadf8..912009ea3d1eb15cdaa993cd92f8cc5dac1300b7 100644 (file)
@@ -23,12 +23,13 @@ struct libinput_category {
        int left_handed;
        enum libinput_config_tap_state tap;
        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 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 */
+       int tap_and_drag;     /* -1 or libinput_config_drag_state */
+       int drag_lock;        /* -1 or libinput_config_drag_lock_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 */
+       int click_method;     /* -1 or libinput_config_click_method */
+       int send_events_mode; /* -1 or libinput_config_send_events_mode */
 };
 
 enum lab_libinput_device_type get_device_type(const char *s);
index a8de5e7b5cbd00f7f7801f91c6eee62fa8987af3..93ab9af262361fcab1b447612ab38f22418f3763 100644 (file)
@@ -24,6 +24,7 @@ libinput_category_init(struct libinput_category *l)
        l->middle_emu = -1;
        l->dwt = -1;
        l->click_method = -1;
+       l->send_events_mode = -1;
 }
 
 enum lab_libinput_device_type
index f18cce322abb051435a379f83c025eba62a750d3..56f93e36c7cb2a5456fcd343c2f24dd59c6ee8e1 100644 (file)
@@ -461,6 +461,29 @@ get_accel_profile(const char *s)
        return -1;
 }
 
+static int
+get_send_events_mode(const char *s)
+{
+       if (!s) {
+               goto err;
+       }
+
+       int ret = parse_bool(s, -1);
+       if (ret >= 0) {
+               return ret
+                       ? LIBINPUT_CONFIG_SEND_EVENTS_ENABLED
+                       : LIBINPUT_CONFIG_SEND_EVENTS_DISABLED;
+       }
+
+       if (!strcasecmp(s, "disabledOnExternalMouse")) {
+               return LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE;
+       }
+
+err:
+       wlr_log(WLR_INFO, "Not a recognised send events mode");
+       return -1;
+}
+
 static void
 fill_libinput_category(char *nodename, char *content)
 {
@@ -576,6 +599,9 @@ fill_libinput_category(char *nodename, char *content)
                } else {
                        wlr_log(WLR_ERROR, "invalid clickMethod");
                }
+       } else if (!strcasecmp(nodename, "sendEventsMode")) {
+               current_libinput_category->send_events_mode =
+                       get_send_events_mode(content);
        }
 }
 
index 635945b16cc24e1a62fceab9fd6dd50313840520..e4e69efea364a597ea2f80c4a72d995451d6d026 100644 (file)
@@ -91,6 +91,24 @@ get_category(struct wlr_input_device *device)
 static void
 configure_libinput(struct wlr_input_device *wlr_input_device)
 {
+       /*
+        * TODO: We do not check any return values for the various
+        *       libinput_device_config_*_set_*() calls. It would
+        *       be nice if we could inform the users via log file
+        *       that some libinput setting could not be applied.
+        *
+        * TODO: We are currently using int32_t with -1 as default
+        *       to desribe the not-configured state. This is not
+        *       really optimal as we can't properly deal with
+        *       enum values that are 0. After some discussion via
+        *       IRC the best way forward seem to be to use a
+        *       uint32_t instead and UINT32_MAX as indicator for
+        *       a not-configured state. This allows to properly
+        *       test the enum being a member of a bitset via
+        *       mask & value == value. All libinput enums are
+        *       way below UINT32_MAX.
+        */
+
        if (!wlr_input_device) {
                wlr_log(WLR_ERROR, "no wlr_input_device");
                return;
@@ -209,6 +227,16 @@ configure_libinput(struct wlr_input_device *wlr_input_device)
 
                libinput_device_config_click_set_method(libinput_dev, dc->click_method);
        }
+
+       if ((dc->send_events_mode != LIBINPUT_CONFIG_SEND_EVENTS_ENABLED
+                       && (libinput_device_config_send_events_get_modes(libinput_dev)
+                               & dc->send_events_mode) == 0)
+                       || dc->send_events_mode < 0) {
+               wlr_log(WLR_INFO, "send events mode not configured");
+       } else {
+               wlr_log(WLR_INFO, "send events mode configured");
+               libinput_device_config_send_events_set_mode(libinput_dev, dc->send_events_mode);
+       }
 }
 
 static struct wlr_output *