[PATCH weston 1/8] evdev-touchpad: Cleanup and refactoring

Jonas Ådahl jadahl at gmail.com
Thu Sep 27 09:40:39 PDT 2012


Signed-off-by: Jonas Ådahl <jadahl at gmail.com>
---
 src/evdev-touchpad.c |  227 ++++++++++++++++++++++++++------------------------
 1 file changed, 117 insertions(+), 110 deletions(-)

diff --git a/src/evdev-touchpad.c b/src/evdev-touchpad.c
index e453f9d..7a724c8 100644
--- a/src/evdev-touchpad.c
+++ b/src/evdev-touchpad.c
@@ -42,11 +42,13 @@ enum touchpad_model {
 	TOUCHPAD_MODEL_ELANTECH
 };
 
-#define TOUCHPAD_EVENT_NONE		0
-#define TOUCHPAD_EVENT_ABSOLUTE_ANY	(1 << 0)
-#define TOUCHPAD_EVENT_ABSOLUTE_X	(1 << 1)
-#define TOUCHPAD_EVENT_ABSOLUTE_Y	(1 << 2)
-#define TOUCHPAD_EVENT_REPORT		(1 << 3)
+enum touchpad_event {
+	TOUCHPAD_EVENT_NONE	    = 0,
+	TOUCHPAD_EVENT_ABSOLUTE_ANY = (1 << 0),
+	TOUCHPAD_EVENT_ABSOLUTE_X   = (1 << 1),
+	TOUCHPAD_EVENT_ABSOLUTE_Y   = (1 << 2),
+	TOUCHPAD_EVENT_REPORT	    = (1 << 3)
+};
 
 struct touchpad_model_spec {
 	short vendor;
@@ -63,9 +65,9 @@ static struct touchpad_model_spec touchpad_spec_table[] = {
 };
 
 enum touchpad_state {
-	TOUCHPAD_STATE_NONE = 0,
-	TOUCHPAD_STATE_TOUCH,
-	TOUCHPAD_STATE_PRESS
+	TOUCHPAD_STATE_NONE  = 0,
+	TOUCHPAD_STATE_TOUCH = (1 << 0),
+	TOUCHPAD_STATE_MOVE  = (1 << 1)
 };
 
 #define TOUCHPAD_HISTORY_LENGTH 4
@@ -86,7 +88,7 @@ struct touchpad_dispatch {
 	struct evdev_device *device;
 
 	enum touchpad_model model;
-	enum touchpad_state state;
+	unsigned int state;
 	int finger_state;
 	int last_finger_state;
 
@@ -108,7 +110,6 @@ struct touchpad_dispatch {
 	struct {
 		int32_t touch_low;
 		int32_t touch_high;
-		int32_t press;
 	} pressure;
 
 	struct {
@@ -122,7 +123,7 @@ struct touchpad_dispatch {
 	int motion_index;
 	unsigned int motion_count;
 
-	struct wl_list motion_filters;
+	struct weston_motion_filter *filter;
 };
 
 static enum touchpad_model
@@ -163,8 +164,6 @@ configure_touchpad_pressure(struct touchpad_dispatch *touchpad,
 		touchpad->pressure.touch_high =
 			pressure_min + range * (30.0/256.0);
 	}
-
-	touchpad->pressure.press = pressure_min + range;
 }
 
 static double
@@ -188,65 +187,6 @@ touchpad_profile(struct weston_motion_filter *filter,
 	return accel_factor;
 }
 
-static void
-configure_touchpad(struct touchpad_dispatch *touchpad,
-		   struct evdev_device *device)
-{
-	struct weston_motion_filter *accel;
-
-	struct input_absinfo absinfo;
-	unsigned long abs_bits[NBITS(ABS_MAX)];
-
-	double width;
-	double height;
-	double diagonal;
-
-	/* Detect model */
-	touchpad->model = get_touchpad_model(device);
-
-	/* Configure pressure */
-	ioctl(device->fd, EVIOCGBIT(EV_ABS, sizeof(abs_bits)), abs_bits);
-	if (TEST_BIT(abs_bits, ABS_PRESSURE)) {
-		ioctl(device->fd, EVIOCGABS(ABS_PRESSURE), &absinfo);
-		configure_touchpad_pressure(touchpad,
-					    absinfo.minimum,
-					    absinfo.maximum);
-	}
-
-	/* Configure acceleration factor */
-	width = abs(device->abs.max_x - device->abs.min_x);
-	height = abs(device->abs.max_y - device->abs.min_y);
-	diagonal = sqrt(width*width + height*height);
-
-	touchpad->constant_accel_factor =
-		DEFAULT_CONSTANT_ACCEL_NUMERATOR / diagonal;
-
-	touchpad->min_accel_factor = DEFAULT_MIN_ACCEL_FACTOR;
-	touchpad->max_accel_factor = DEFAULT_MAX_ACCEL_FACTOR;
-
-	touchpad->hysteresis.margin_x =
-	       	diagonal / DEFAULT_HYSTERESIS_MARGIN_DENOMINATOR;
-	touchpad->hysteresis.margin_y =
-	       	diagonal / DEFAULT_HYSTERESIS_MARGIN_DENOMINATOR;
-	touchpad->hysteresis.center_x = 0;
-	touchpad->hysteresis.center_y = 0;
-
-	/* Configure acceleration profile */
-	accel = create_pointer_accelator_filter(touchpad_profile);
-	wl_list_insert(&touchpad->motion_filters, &accel->link);
-
-	/* Setup initial state */
-	touchpad->reset = 1;
-
-	memset(touchpad->motion_history, 0, sizeof touchpad->motion_history);
-	touchpad->motion_index = 0;
-	touchpad->motion_count = 0;
-
-	touchpad->state = TOUCHPAD_STATE_NONE;
-	touchpad->last_finger_state = 0;
-	touchpad->finger_state = 0;
-}
-
 static inline struct touchpad_motion *
 motion_history_offset(struct touchpad_dispatch *touchpad, int offset)
 {
@@ -294,14 +234,12 @@ static void
 filter_motion(struct touchpad_dispatch *touchpad,
 	      double *dx, double *dy, uint32_t time)
 {
-	struct weston_motion_filter *filter;
 	struct weston_motion_params motion;
 
 	motion.dx = *dx;
 	motion.dy = *dy;
 
-	wl_list_for_each(filter, &touchpad->motion_filters, link)
-		weston_filter_dispatch(filter, &motion, touchpad, time);
+	weston_filter_dispatch(touchpad->filter, &motion, touchpad, time);
 
 	*dx = motion.dx;
 	*dy = motion.dy;
@@ -312,7 +250,7 @@ touchpad_update_state(struct touchpad_dispatch *touchpad, uint32_t time)
 {
 	int motion_index;
 	int center_x, center_y;
-	double dx, dy;
+	double dx = 0.0, dy = 0.0;
 
 	if (touchpad->reset ||
 	    touchpad->last_finger_state != touchpad->finger_state) {
@@ -349,8 +287,7 @@ touchpad_update_state(struct touchpad_dispatch *touchpad, uint32_t time)
 		center_y = hysteresis(touchpad->hw_abs.y,
 				      touchpad->hysteresis.center_y,
 				      touchpad->hysteresis.margin_y);
-	}
-	else {
+	} else {
 		center_x = touchpad->hw_abs.x;
 		center_y = touchpad->hw_abs.y;
 	}
@@ -376,6 +313,25 @@ touchpad_update_state(struct touchpad_dispatch *touchpad, uint32_t time)
 		touchpad->device->rel.dy = wl_fixed_from_double(dy);
 		touchpad->device->pending_events |= EVDEV_RELATIVE_MOTION;
 	}
+
+	if (!(touchpad->state & TOUCHPAD_STATE_MOVE) &&
+	    ((int)dx || (int)dy)) {
+		touchpad->state |= TOUCHPAD_STATE_MOVE;
+	}
+}
+
+static void
+on_touch(struct touchpad_dispatch *touchpad)
+{
+	touchpad->state |= TOUCHPAD_STATE_TOUCH;
+}
+
+static void
+on_release(struct touchpad_dispatch *touchpad)
+{
+
+	touchpad->reset = 1;
+	touchpad->state &= ~(TOUCHPAD_STATE_MOVE | TOUCHPAD_STATE_TOUCH);
 }
 
 static inline void
@@ -385,27 +341,23 @@ process_absolute(struct touchpad_dispatch *touchpad,
 {
 	switch (e->code) {
 	case ABS_PRESSURE:
-		if (e->value > touchpad->pressure.press)
-			touchpad->state = TOUCHPAD_STATE_PRESS;
-		else if (e->value > touchpad->pressure.touch_high)
-			touchpad->state = TOUCHPAD_STATE_TOUCH;
-		else if (e->value < touchpad->pressure.touch_low) {
-			if (touchpad->state > TOUCHPAD_STATE_NONE)
-				touchpad->reset = 1;
-
-			touchpad->state = TOUCHPAD_STATE_NONE;
-		}
+		if (e->value > touchpad->pressure.touch_high &&
+		    !(touchpad->state & TOUCHPAD_STATE_TOUCH))
+			on_touch(touchpad);
+		else if (e->value < touchpad->pressure.touch_low &&
+			 touchpad->state & TOUCHPAD_STATE_TOUCH)
+			on_release(touchpad);
 
 		break;
 	case ABS_X:
-		if (touchpad->state >= TOUCHPAD_STATE_TOUCH) {
+		if (touchpad->state & TOUCHPAD_STATE_TOUCH) {
 			touchpad->hw_abs.x = e->value;
 			touchpad->event_mask |= TOUCHPAD_EVENT_ABSOLUTE_ANY;
 			touchpad->event_mask |= TOUCHPAD_EVENT_ABSOLUTE_X;
 		}
 		break;
 	case ABS_Y:
-		if (touchpad->state >= TOUCHPAD_STATE_TOUCH) {
+		if (touchpad->state & TOUCHPAD_STATE_TOUCH) {
 			touchpad->hw_abs.y = e->value;
 			touchpad->event_mask |= TOUCHPAD_EVENT_ABSOLUTE_ANY;
 			touchpad->event_mask |= TOUCHPAD_EVENT_ABSOLUTE_Y;
@@ -423,15 +375,10 @@ process_key(struct touchpad_dispatch *touchpad,
 	switch (e->code) {
 	case BTN_TOUCH:
 		if (!touchpad->has_pressure) {
-			if (!e->value) {
-				touchpad->state = TOUCHPAD_STATE_NONE;
-				touchpad->reset = 1;
-			} else {
-				touchpad->state =
-					e->value ?
-					TOUCHPAD_STATE_TOUCH :
-					TOUCHPAD_STATE_NONE;
-			}
+			if (e->value && !(touchpad->state & TOUCHPAD_STATE_TOUCH))
+				on_touch(touchpad);
+			else if (!e->value)
+				on_release(touchpad);
 		}
 		break;
 	case BTN_LEFT:
@@ -504,12 +451,8 @@ touchpad_destroy(struct evdev_dispatch *dispatch)
 {
 	struct touchpad_dispatch *touchpad =
 		(struct touchpad_dispatch *) dispatch;
-	struct weston_motion_filter *filter;
-	struct weston_motion_filter *next;
-
-	wl_list_for_each_safe(filter, next, &touchpad->motion_filters, link)
-		filter->interface->destroy(filter);
 
+	touchpad->filter->interface->destroy(touchpad->filter);
 	free(dispatch);
 }
 
@@ -518,6 +461,72 @@ struct evdev_dispatch_interface touchpad_interface = {
 	touchpad_destroy
 };
 
+static int
+touchpad_init(struct touchpad_dispatch *touchpad,
+	      struct evdev_device *device)
+{
+	struct weston_motion_filter *accel;
+
+	struct input_absinfo absinfo;
+	unsigned long abs_bits[NBITS(ABS_MAX)];
+
+	double width;
+	double height;
+	double diagonal;
+
+	touchpad->base.interface = &touchpad_interface;
+	touchpad->device = device;
+
+	/* Detect model */
+	touchpad->model = get_touchpad_model(device);
+
+	/* Configure pressure */
+	ioctl(device->fd, EVIOCGBIT(EV_ABS, sizeof(abs_bits)), abs_bits);
+	if (TEST_BIT(abs_bits, ABS_PRESSURE)) {
+		ioctl(device->fd, EVIOCGABS(ABS_PRESSURE), &absinfo);
+		configure_touchpad_pressure(touchpad,
+					    absinfo.minimum,
+					    absinfo.maximum);
+	}
+
+	/* Configure acceleration factor */
+	width = abs(device->abs.max_x - device->abs.min_x);
+	height = abs(device->abs.max_y - device->abs.min_y);
+	diagonal = sqrt(width*width + height*height);
+
+	touchpad->constant_accel_factor =
+		DEFAULT_CONSTANT_ACCEL_NUMERATOR / diagonal;
+
+	touchpad->min_accel_factor = DEFAULT_MIN_ACCEL_FACTOR;
+	touchpad->max_accel_factor = DEFAULT_MAX_ACCEL_FACTOR;
+
+	touchpad->hysteresis.margin_x =
+		diagonal / DEFAULT_HYSTERESIS_MARGIN_DENOMINATOR;
+	touchpad->hysteresis.margin_y =
+		diagonal / DEFAULT_HYSTERESIS_MARGIN_DENOMINATOR;
+	touchpad->hysteresis.center_x = 0;
+	touchpad->hysteresis.center_y = 0;
+
+	/* Configure acceleration profile */
+	accel = create_pointer_accelator_filter(touchpad_profile);
+	if (accel == NULL)
+		return -1;
+	touchpad->filter = accel;
+
+	/* Setup initial state */
+	touchpad->reset = 1;
+
+	memset(touchpad->motion_history, 0, sizeof touchpad->motion_history);
+	touchpad->motion_index = 0;
+	touchpad->motion_count = 0;
+
+	touchpad->state = TOUCHPAD_STATE_NONE;
+	touchpad->last_finger_state = 0;
+	touchpad->finger_state = 0;
+
+	return 0;
+}
+
 struct evdev_dispatch *
 evdev_touchpad_create(struct evdev_device *device)
 {
@@ -527,12 +536,10 @@ evdev_touchpad_create(struct evdev_device *device)
 	if (touchpad == NULL)
 		return NULL;
 
-	touchpad->base.interface = &touchpad_interface;
-
-	touchpad->device = device;
-	wl_list_init(&touchpad->motion_filters);
-
-	configure_touchpad(touchpad, device);
+	if (touchpad_init(touchpad, device) != 0) {
+		free(touchpad);
+		return NULL;
+	}
 
 	return &touchpad->base;
 }
-- 
1.7.9.5



More information about the wayland-devel mailing list