This allows to enable / disable libinput devices.
Co-Authored-By: @Consolatis
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
- 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>
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);
l->middle_emu = -1;
l->dwt = -1;
l->click_method = -1;
+ l->send_events_mode = -1;
}
enum lab_libinput_device_type
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)
{
} else {
wlr_log(WLR_ERROR, "invalid clickMethod");
}
+ } else if (!strcasecmp(nodename, "sendEventsMode")) {
+ current_libinput_category->send_events_mode =
+ get_send_events_mode(content);
}
}
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;
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 *