Hi, On 11/03/2014 06:53 AM, Peter Hutterer wrote: > In the future, we should allow multiple sendevent modes set simultanously. > Change the API to use a bitmask instead of a single return value. > > Signed-off-by: Peter Hutterer <[email protected]>
Looks good: Reviewed-by: Hans de Goede <[email protected]> Regards, Hans > --- > src/evdev-mt-touchpad.c | 8 ++++++-- > src/evdev.c | 5 ++--- > src/libinput.c | 8 ++++---- > src/libinput.h | 44 +++++++++++++++++++++++++++++--------------- > test/device.c | 40 ++++++++++++++++++++++++++++++++++++++-- > 5 files changed, 79 insertions(+), 26 deletions(-) > > diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c > index a8d12e4..34ad151 100644 > --- a/src/evdev-mt-touchpad.c > +++ b/src/evdev-mt-touchpad.c > @@ -988,8 +988,7 @@ static uint32_t > tp_sendevents_get_modes(struct libinput_device *device) > { > struct evdev_device *evdev = (struct evdev_device*)device; > - uint32_t modes = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED | > - LIBINPUT_CONFIG_SEND_EVENTS_DISABLED; > + uint32_t modes = LIBINPUT_CONFIG_SEND_EVENTS_DISABLED; > > if (evdev->tags & EVDEV_TAG_INTERNAL_TOUCHPAD) > modes |= LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE; > @@ -1019,6 +1018,11 @@ tp_sendevents_set_mode(struct libinput_device *device, > struct evdev_device *evdev = (struct evdev_device*)device; > struct tp_dispatch *tp = (struct tp_dispatch*)evdev->dispatch; > > + /* DISABLED overrides any DISABLED_ON_ */ > + if ((mode & LIBINPUT_CONFIG_SEND_EVENTS_DISABLED) && > + (mode & LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE)) > + mode &= ~LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE; > + > if (mode == tp->sendevents.current_mode) > return LIBINPUT_CONFIG_STATUS_SUCCESS; > > diff --git a/src/evdev.c b/src/evdev.c > index 3aa87a7..1e40a30 100644 > --- a/src/evdev.c > +++ b/src/evdev.c > @@ -717,8 +717,7 @@ struct evdev_dispatch_interface fallback_interface = { > static uint32_t > evdev_sendevents_get_modes(struct libinput_device *device) > { > - return LIBINPUT_CONFIG_SEND_EVENTS_ENABLED | > - LIBINPUT_CONFIG_SEND_EVENTS_DISABLED; > + return LIBINPUT_CONFIG_SEND_EVENTS_DISABLED; > } > > static enum libinput_config_status > @@ -738,7 +737,7 @@ evdev_sendevents_set_mode(struct libinput_device *device, > case LIBINPUT_CONFIG_SEND_EVENTS_DISABLED: > evdev_device_suspend(evdev); > break; > - default: > + default: /* no support for combined modes yet */ > return LIBINPUT_CONFIG_STATUS_UNSUPPORTED; > } > > diff --git a/src/libinput.c b/src/libinput.c > index 5780a92..05e594e 100644 > --- a/src/libinput.c > +++ b/src/libinput.c > @@ -1363,9 +1363,9 @@ libinput_device_config_send_events_get_modes(struct > libinput_device *device) > > LIBINPUT_EXPORT enum libinput_config_status > libinput_device_config_send_events_set_mode(struct libinput_device *device, > - enum > libinput_config_send_events_mode mode) > + uint32_t mode) > { > - if ((libinput_device_config_send_events_get_modes(device) & mode) == 0) > + if ((libinput_device_config_send_events_get_modes(device) & mode) != > mode) > return LIBINPUT_CONFIG_STATUS_UNSUPPORTED; > > if (device->config.sendevents) > @@ -1374,7 +1374,7 @@ libinput_device_config_send_events_set_mode(struct > libinput_device *device, > return LIBINPUT_CONFIG_STATUS_SUCCESS; > } > > -LIBINPUT_EXPORT enum libinput_config_send_events_mode > +LIBINPUT_EXPORT uint32_t > libinput_device_config_send_events_get_mode(struct libinput_device *device) > { > if (device->config.sendevents) > @@ -1383,7 +1383,7 @@ libinput_device_config_send_events_get_mode(struct > libinput_device *device) > return LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; > } > > -LIBINPUT_EXPORT enum libinput_config_send_events_mode > +LIBINPUT_EXPORT uint32_t > libinput_device_config_send_events_get_default_mode(struct libinput_device > *device) > { > return LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; > diff --git a/src/libinput.h b/src/libinput.h > index de6bfc8..2c60233 100644 > --- a/src/libinput.h > +++ b/src/libinput.h > @@ -1689,22 +1689,31 @@ > libinput_device_config_calibration_get_default_matrix(struct libinput_device > *de > */ > enum libinput_config_send_events_mode { > /** > - * Send events from this device normally. > + * Send events from this device normally. This is a placeholder > + * mode only, any device detected by libinput can be enabled. Do not > + * test for this value as bitmask. > */ > - LIBINPUT_CONFIG_SEND_EVENTS_ENABLED = (1 << 0), > + LIBINPUT_CONFIG_SEND_EVENTS_ENABLED = 0, > /** > * Do not send events through this device. Depending on the device, > * this may close all file descriptors on the device or it may leave > * the file descriptors open and route events through a different > * device. > + * > + * If this bit field is set, other disable modes may be > + * ignored. For example, if both @ref > + * LIBINPUT_CONFIG_SEND_EVENTS_DISABLED and @ref > + * LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE are set, > + * the device remains disabled when all external pointer devices are > + * unplugged. > */ > - LIBINPUT_CONFIG_SEND_EVENTS_DISABLED = (1 << 1), > + LIBINPUT_CONFIG_SEND_EVENTS_DISABLED = (1 << 0), > /** > * If an external pointer device is plugged in, do not send events > * from this device. This option may be available on built-in > * touchpads. > */ > - LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE = (1 << 2), > + LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE = (1 << 1), > }; > > /** > @@ -1734,18 +1743,17 @@ libinput_device_config_send_events_get_modes(struct > libinput_device *device); > * received and processed from this device are unaffected and will be passed > * to the caller on the next call to libinput_get_event(). > * > - * If the mode is one of @ref LIBINPUT_CONFIG_SEND_EVENTS_DISABLED or > - * @ref LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE, the device > - * may wait for or generate events until it is in a neutral state. > - * For example, this may include waiting for or generating button release > - * events. > + * If the mode is a bitmask of @ref libinput_config_send_events_mode, > + * the device may wait for or generate events until it is in a neutral > + * state. For example, this may include waiting for or generating button > + * release events. > * > * If the device is already suspended, this function does nothing and > * returns success. Changing the send-event mode on a device that has been > * removed is permitted. > * > * @param device The device to configure > - * @param mode The send-event mode for this device. > + * @param mode A bitmask of send-events modes > * > * @return A config status code. > * > @@ -1755,7 +1763,7 @@ libinput_device_config_send_events_get_modes(struct > libinput_device *device); > */ > enum libinput_config_status > libinput_device_config_send_events_set_mode(struct libinput_device *device, > - enum > libinput_config_send_events_mode mode); > + uint32_t mode); > > /** > * @ingroup config > @@ -1763,14 +1771,20 @@ libinput_device_config_send_events_set_mode(struct > libinput_device *device, > * Get the send-event mode for this device. The mode defines when the device > * processes and sends events to the caller. > * > + * If a caller enables the bits for multiple modes, some of which are > + * subsets of another mode libinput may drop the bits that are subsets. In > + * other words, don't expect libinput_device_config_send_events_get_mode() > + * to always return exactly the same bitmask as passed into > + * libinput_device_config_send_events_set_mode(). > + * > * @param device The device to configure > - * @return The current send-event mode for this device. > + * @return The current bitmask of the send-event mode for this device. > * > * @see libinput_device_config_send_events_get_modes > * @see libinput_device_config_send_events_set_mode > * @see libinput_device_config_send_events_get_default_mode > */ > -enum libinput_config_send_events_mode > +uint32_t > libinput_device_config_send_events_get_mode(struct libinput_device *device); > > /** > @@ -1780,13 +1794,13 @@ libinput_device_config_send_events_get_mode(struct > libinput_device *device); > * the device processes and sends events to the caller. > * > * @param device The device to configure > - * @return The default send-event mode for this device. > + * @return The bitmask of the send-event mode for this device. > * > * @see libinput_device_config_send_events_get_modes > * @see libinput_device_config_send_events_set_mode > * @see libinput_device_config_send_events_get_default_mode > */ > -enum libinput_config_send_events_mode > +uint32_t > libinput_device_config_send_events_get_default_mode(struct libinput_device > *device); > > /** > diff --git a/test/device.c b/test/device.c > index 3061ebc..edc115f 100644 > --- a/test/device.c > +++ b/test/device.c > @@ -42,11 +42,24 @@ START_TEST(device_sendevents_config) > > modes = libinput_device_config_send_events_get_modes(device); > ck_assert_int_eq(modes, > - LIBINPUT_CONFIG_SEND_EVENTS_ENABLED| > LIBINPUT_CONFIG_SEND_EVENTS_DISABLED); > } > END_TEST > > +START_TEST(device_sendevents_config_invalid) > +{ > + struct litest_device *dev = litest_current_device(); > + struct libinput_device *device; > + enum libinput_config_status status; > + > + device = dev->libinput_device; > + > + status = libinput_device_config_send_events_set_mode(device, > + LIBINPUT_CONFIG_SEND_EVENTS_DISABLED | (1 << 4)); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED); > +} > +END_TEST > + > START_TEST(device_sendevents_config_touchpad) > { > struct litest_device *dev = litest_current_device(); > @@ -57,12 +70,33 @@ START_TEST(device_sendevents_config_touchpad) > > modes = libinput_device_config_send_events_get_modes(device); > ck_assert_int_eq(modes, > - LIBINPUT_CONFIG_SEND_EVENTS_ENABLED| > LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE| > LIBINPUT_CONFIG_SEND_EVENTS_DISABLED); > } > END_TEST > > +START_TEST(device_sendevents_config_touchpad_superset) > +{ > + struct litest_device *dev = litest_current_device(); > + struct libinput_device *device; > + enum libinput_config_status status; > + uint32_t modes; > + > + device = dev->libinput_device; > + > + modes = LIBINPUT_CONFIG_SEND_EVENTS_DISABLED | > + LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE; > + > + status = libinput_device_config_send_events_set_mode(device, > + modes); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); > + > + /* DISABLED supersedes the rest, expect the rest to be dropped */ > + modes = libinput_device_config_send_events_get_mode(device); > + ck_assert_int_eq(modes, LIBINPUT_CONFIG_SEND_EVENTS_DISABLED); > +} > +END_TEST > + > START_TEST(device_sendevents_config_default) > { > struct litest_device *dev = litest_current_device(); > @@ -568,7 +602,9 @@ END_TEST > int main (int argc, char **argv) > { > litest_add("device:sendevents", device_sendevents_config, LITEST_ANY, > LITEST_TOUCHPAD); > + litest_add("device:sendevents", device_sendevents_config_invalid, > LITEST_ANY, LITEST_ANY); > litest_add("device:sendevents", device_sendevents_config_touchpad, > LITEST_TOUCHPAD, LITEST_ANY); > + litest_add("device:sendevents", > device_sendevents_config_touchpad_superset, LITEST_TOUCHPAD, LITEST_ANY); > litest_add("device:sendevents", device_sendevents_config_default, > LITEST_ANY, LITEST_ANY); > litest_add("device:sendevents", device_disable, LITEST_POINTER, > LITEST_ANY); > litest_add("device:sendevents", device_disable_touchpad, > LITEST_TOUCHPAD, LITEST_ANY); > _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
