On Thu, Sep 27, 2012 at 06:40:39PM +0200, Jonas Ådahl wrote:
> Signed-off-by: Jonas Ådahl <jad...@gmail.com>

Applied this as-is, but even for "just cleanup and fefactoring" this
is a big patch with many unrelated changes.  It makes it harder to
review and worse, the patch subject becomes very generic (cleanup and
refactoring) when it tries to cover a bunch of changes.  So in the
future, try to avoid grab-bag-of-fixes patches and split into smaller
self-contained parts.

thanks,
Kristian

> ---
>  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
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to