Hi, First of all patches 1 - 9 look good and are:
Reviewed-by: Hans de Goede <hdego...@redhat.com> On 09/03/2014 04:03 AM, Peter Hutterer wrote: > Rather than adding a config interface to disable a device merely allow a > caller to toggle the "send events" mode on the device. If off, the device > won't send events (though further events may be received depending on the > current state of the device). > Default is enabled, i.e. the device sends events. > > A special mode is added to the obvious enable/disable: disable the device when > an external mouse is connected. Once set, the device will be enabled when no > mouse is present and stop sending events otherwise. This isn't hooked up to > anything yet though. > > Built into the config API is the default option of "enabled". Any device > supports this, for the obvious reason. Disabling or conditionally disabling is > left to the implementation. > > Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> > --- > src/evdev.c | 25 +++++++++++++ > src/evdev.h | 3 ++ > src/libinput-private.h | 9 +++++ > src/libinput.c | 39 +++++++++++++++++++ > src/libinput.h | 100 > +++++++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 176 insertions(+) > > diff --git a/src/evdev.c b/src/evdev.c > index 9e91ee5..9d98b58 100644 > --- a/src/evdev.c > +++ b/src/evdev.c > @@ -1189,6 +1189,31 @@ evdev_device_suspend(struct evdev_device *device) > return 0; > } > > +int > +evdev_device_resume(struct evdev_device *device) > +{ > + struct libinput *libinput = device->base.seat->libinput; > + int fd; > + > + if (device->fd != -1) > + return 0; > + > + fd = open_restricted(libinput, device->devnode, O_RDWR | O_NONBLOCK); > + > + if (fd < 0) > + return -errno; > + > + device->fd = fd; > + device->source = > + libinput_add_fd(libinput, fd, evdev_device_dispatch, device); > + if (!device->source) > + return -ENOMEM; > + > + memset(device->hw_key_mask, 0, sizeof(device->hw_key_mask)); > + > + return 0; > +} > + Suspend also closes the mtdev handle, should we not re-open that here too ? Also it would be good to split this large commit in 2, 1 just adding the resume function, and 1 with the rest. > void > evdev_device_remove(struct evdev_device *device) > { > diff --git a/src/evdev.h b/src/evdev.h > index ef02491..8a6dfec 100644 > --- a/src/evdev.h > +++ b/src/evdev.h > @@ -189,6 +189,9 @@ evdev_device_transform_y(struct evdev_device *device, > int > evdev_device_suspend(struct evdev_device *device); > > +int > +evdev_device_resume(struct evdev_device *device); > + > void > evdev_keyboard_notify_key(struct evdev_device *device, > uint32_t time, > diff --git a/src/libinput-private.h b/src/libinput-private.h > index cb90a15..cf03c03 100644 > --- a/src/libinput-private.h > +++ b/src/libinput-private.h > @@ -101,9 +101,18 @@ struct libinput_device_config_calibration { > float matrix[6]); > }; > > +struct libinput_device_config_send_events { > + uint32_t (*get_modes)(struct libinput_device *device); > + enum libinput_config_status (*set_mode)(struct libinput_device *device, > + enum > libinput_config_send_events_mode mode); > + enum libinput_config_send_events_mode (*get_mode)(struct > libinput_device *device); > + enum libinput_config_send_events_mode (*get_default_mode)(struct > libinput_device *device); > +}; > + > struct libinput_device_config { > struct libinput_device_config_tap *tap; > struct libinput_device_config_calibration *calibration; > + struct libinput_device_config_send_events *sendevents; > }; > > struct libinput_device { > diff --git a/src/libinput.c b/src/libinput.c > index 20aa1cb..14f0257 100644 > --- a/src/libinput.c > +++ b/src/libinput.c > @@ -1349,3 +1349,42 @@ > libinput_device_config_calibration_get_default_matrix(struct libinput_device > *de > > return device->config.calibration->get_default_matrix(device, matrix); > } > + > +LIBINPUT_EXPORT uint32_t > +libinput_device_config_send_events_get_modes(struct libinput_device *device) > +{ > + uint32_t modes = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; > + > + if (device->config.sendevents) > + modes |= device->config.sendevents->get_modes(device); > + > + return modes; > +} > + > +LIBINPUT_EXPORT enum libinput_config_status > +libinput_device_config_send_events_set_mode(struct libinput_device *device, > + enum > libinput_config_send_events_mode mode) > +{ > + if ((libinput_device_config_send_events_get_modes(device) & mode) == 0) > + return LIBINPUT_CONFIG_STATUS_UNSUPPORTED; > + > + if (device->config.sendevents) > + return device->config.sendevents->set_mode(device, mode); > + else /* mode must be _ENABLED to get here */ > + return LIBINPUT_CONFIG_STATUS_SUCCESS; > +} > + > +LIBINPUT_EXPORT enum libinput_config_send_events_mode > +libinput_device_config_send_events_get_mode(struct libinput_device *device) > +{ > + if (device->config.sendevents) > + return device->config.sendevents->get_mode(device); > + else > + return LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; > +} > + > +LIBINPUT_EXPORT enum libinput_config_send_events_mode > +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 5af0dde..334b16d 100644 > --- a/src/libinput.h > +++ b/src/libinput.h > @@ -1634,6 +1634,106 @@ int > libinput_device_config_calibration_get_default_matrix(struct libinput_device > *device, > float matrix[6]); > > +/** > + * The send-event mode of a device defines when a device may generate events > + * and pass those events to the caller. > + */ > +enum libinput_config_send_events_mode { > + /** > + * Send events from this device normally. > + */ > + LIBINPUT_CONFIG_SEND_EVENTS_ENABLED = (1 << 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. > + */ > + LIBINPUT_CONFIG_SEND_EVENTS_DISABLED = (1 << 1), > + /** > + * 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), > +}; > + > +/** > + * @ingroup config > + * > + * Return the possible send-event modes for this device. These modes define > + * when a device may process and send events. > + * > + * @param device The device to configure > + * > + * @return A bitmask of possible modes. > + * > + * @see libinput_device_config_send_events_set_mode > + * @see libinput_device_config_send_events_get_mode > + * @see libinput_device_config_send_events_get_default_mode > + */ > +uint32_t > +libinput_device_config_send_events_get_modes(struct libinput_device *device); > + > +/** > + * Set the send-event mode for this device. The mode defines when the device > + * processes and sends events to the caller. > + * > + * The selected mode may not take effect immediately. Events already > + * 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 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. > + * > + * @return A config status code. > + * > + * @see libinput_device_config_send_events_get_modes > + * @see libinput_device_config_send_events_get_mode > + * @see libinput_device_config_send_events_get_default_mode > + */ > +enum libinput_config_status > +libinput_device_config_send_events_set_mode(struct libinput_device *device, > + enum > libinput_config_send_events_mode mode); > + > +/** > + * Get the send-event mode for this device. The mode defines when the device > + * processes and sends events to the caller. > + * > + * @param device The device to configure > + * @return The current 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 > +libinput_device_config_send_events_get_mode(struct libinput_device *device); > + > +/** > + * Get the default send-event mode for this device. The mode defines when > + * the device processes and sends events to the caller. > + * > + * @param device The device to configure > + * @return The current 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 > +libinput_device_config_send_events_get_default_mode(struct libinput_device > *device); > + > #ifdef __cplusplus > } > #endif > Otherwise looks good to me. Regards, Hans _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel