diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd index bc8cf59b..223eae0a 100644 --- a/docs/labwc-config.5.scd +++ b/docs/labwc-config.5.scd @@ -684,6 +684,20 @@ extending outward from the snapped edge. The default method depends on the touchpad hardware. +** [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 diff --git a/docs/rc.xml.all b/docs/rc.xml.all index 5d0c4cff..c3586ae0 100644 --- a/docs/rc.xml.all +++ b/docs/rc.xml.all @@ -473,6 +473,7 @@ - accelProfile [flat|adaptive] - tapButtonMap [lrm|lmr] - clickMethod [none|buttonAreas|clickfinger] + - sendEventsMode [yes|no|disabledOnExternalMouse] --> @@ -487,6 +488,7 @@ + diff --git a/include/config/libinput.h b/include/config/libinput.h index dffeea98..912009ea 100644 --- a/include/config/libinput.h +++ b/include/config/libinput.h @@ -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); diff --git a/src/config/libinput.c b/src/config/libinput.c index a8de5e7b..93ab9af2 100644 --- a/src/config/libinput.c +++ b/src/config/libinput.c @@ -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 diff --git a/src/config/rcxml.c b/src/config/rcxml.c index f18cce32..56f93e36 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -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); } } diff --git a/src/seat.c b/src/seat.c index 635945b1..e4e69efe 100644 --- a/src/seat.c +++ b/src/seat.c @@ -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 *