[PATCH 2/3] evdev: avoid sending back to clients events generated by accelerometers

Tiago Vignatti tiago.vignatti at intel.com
Fri Aug 19 05:06:21 PDT 2011


As a general rule we don't want to restrict the registration of any
input devices in the compositor. So instead ignoring accelerometer type
of devices, this patch introduces the concept of devices with cursor
(has_cursor), where motion events will be generated only on those.

We may want to adjust the protocol later for clients that care for
these devices only, generating a special event.

Signed-off-by: Tiago Vignatti <tiago.vignatti at intel.com>
---
My reak motivation for doing so was that my accelerometer fd doesn't stop to
spit data when the compositor is reading it. So I ended up with a wacky effect
of the cursor moving all the time in random positions.

 compositor/evdev.c |   19 ++++++++++++++++++-
 1 files changed, 18 insertions(+), 1 deletions(-)

diff --git a/compositor/evdev.c b/compositor/evdev.c
index 150ca04..df82881 100644
--- a/compositor/evdev.c
+++ b/compositor/evdev.c
@@ -20,6 +20,7 @@
  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -41,6 +42,7 @@ struct evdev_input_device {
 	int fd;
 	int min_x, max_x, min_y, max_y;
 	int is_touchpad, old_x_value, old_y_value, reset_x_value, reset_y_value;
+	int has_cursor;
 };
 
 static int
@@ -183,7 +185,7 @@ evdev_input_device_data(int fd, uint32_t mask, void *data)
 	if (dx != 0 || dy != 0)
 		notify_motion(&device->master->base.input_device,
 			      time, x + dx, y + dy);
-	if (absolute_event)
+	if (absolute_event && device->has_cursor)
 		notify_motion(&device->master->base.input_device, time, x, y);
 
 	return 1;
@@ -207,9 +209,14 @@ evdev_configure_device(struct evdev_input_device *device)
 	unsigned long ev_bits[NBITS(EV_MAX)];
 	unsigned long abs_bits[NBITS(ABS_MAX)];
 	unsigned long key_bits[NBITS(KEY_MAX)];
+	bool has_key, has_abs;
+
+	has_key = 0;
+	has_abs = 0;
 
 	ioctl(device->fd, EVIOCGBIT(0, sizeof(ev_bits)), ev_bits);
 	if (TEST_BIT(ev_bits, EV_ABS)) {
+		has_abs = 1;
 		ioctl(device->fd, EVIOCGBIT(EV_ABS, sizeof(abs_bits)),
 		      abs_bits);
 		if (TEST_BIT(abs_bits, ABS_X)) {
@@ -224,12 +231,21 @@ evdev_configure_device(struct evdev_input_device *device)
 		}
 	}
 	if (TEST_BIT(ev_bits, EV_KEY)) {
+		has_key = 1;
 		ioctl(device->fd, EVIOCGBIT(EV_KEY, sizeof(key_bits)),
 		      key_bits);
 		if (TEST_BIT(key_bits, BTN_TOOL_FINGER) &&
 		             !TEST_BIT(key_bits, BTN_TOOL_PEN))
 			device->is_touchpad = 1;
 	}
+
+	/* This rule tries to catch accelerometer devices. We simply mark it as
+	 * device without cursor, so later in evdev_input_device_data ->
+	 * notify_motion, the compositor refuses to send it back to clients. We
+	 * may want to adjust the protocol later adding a proper event for
+	 * dealing with accelerometers */
+	if (has_abs && !has_key)
+		device->has_cursor = 0;
 }
 
 static struct evdev_input_device *
@@ -248,6 +264,7 @@ evdev_input_device_create(struct evdev_input *master,
 	device->new_y = 1;
 	device->master = master;
 	device->is_touchpad = 0;
+	device->has_cursor = 1;
 
 	device->fd = open(path, O_RDONLY);
 	if (device->fd < 0) {
-- 
1.7.2.2



More information about the wayland-devel mailing list