From: Peter Hutterer Date: Thu, 19 Jun 2014 01:11:36 +0000 (+1000) Subject: evdev: keep the absinfo struct around instead of min/max X-Git-Tag: 0.4.0~23 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=df212db2a3335466648496d34d1ece4b2bdd1c5d;p=platform%2Fupstream%2Flibinput.git evdev: keep the absinfo struct around instead of min/max We'll need that later for conversion to mm. Signed-off-by: Peter Hutterer Reviewed-by: Hans de Goede --- diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c index ce48ed0b..45d5d703 100644 --- a/src/evdev-mt-touchpad-buttons.c +++ b/src/evdev-mt-touchpad-buttons.c @@ -565,6 +565,7 @@ tp_init_buttons(struct tp_dispatch *tp, struct tp_touch *t; int width, height; double diagonal; + const struct input_absinfo *absinfo_x, *absinfo_y; tp->buttons.is_clickpad = libevdev_has_property(device->evdev, INPUT_PROP_BUTTONPAD); @@ -580,8 +581,11 @@ tp_init_buttons(struct tp_dispatch *tp, log_bug_kernel("non clickpad without right button?\n"); } - width = abs(device->abs.max_x - device->abs.min_x); - height = abs(device->abs.max_y - device->abs.min_y); + absinfo_x = device->abs.absinfo_x; + absinfo_y = device->abs.absinfo_y; + + width = abs(absinfo_x->maximum - absinfo_x->minimum); + height = abs(absinfo_y->maximum - absinfo_y->minimum); diagonal = sqrt(width*width + height*height); tp->buttons.motion_dist = diagonal * DEFAULT_BUTTON_MOTION_THRESHOLD; @@ -590,13 +594,15 @@ tp_init_buttons(struct tp_dispatch *tp, tp->buttons.use_clickfinger = true; if (tp->buttons.is_clickpad && !tp->buttons.use_clickfinger) { - tp->buttons.bottom_area.top_edge = height * .8 + device->abs.min_y; - tp->buttons.bottom_area.rightbutton_left_edge = width/2 + device->abs.min_x; + int xoffset = absinfo_x->minimum, + yoffset = absinfo_y->minimum; + tp->buttons.bottom_area.top_edge = height * .8 + yoffset; + tp->buttons.bottom_area.rightbutton_left_edge = width/2 + xoffset; if (tp->buttons.has_topbuttons) { - tp->buttons.top_area.bottom_edge = height * .08 + device->abs.min_y; - tp->buttons.top_area.rightbutton_left_edge = width * .58 + device->abs.min_x; - tp->buttons.top_area.leftbutton_right_edge = width * .42 + device->abs.min_x; + tp->buttons.top_area.bottom_edge = height * .08 + yoffset; + tp->buttons.top_area.rightbutton_left_edge = width * .58 + xoffset; + tp->buttons.top_area.leftbutton_right_edge = width * .42 + xoffset; } else { tp->buttons.top_area.bottom_edge = INT_MIN; } diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index 92e0651a..787afa4c 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -750,8 +750,10 @@ tp_init(struct tp_dispatch *tp, if (tp_init_slots(tp, device) != 0) return -1; - width = abs(device->abs.max_x - device->abs.min_x); - height = abs(device->abs.max_y - device->abs.min_y); + width = abs(device->abs.absinfo_x->maximum - + device->abs.absinfo_x->minimum); + height = abs(device->abs.absinfo_y->maximum - + device->abs.absinfo_y->minimum); diagonal = sqrt(width*width + height*height); tp->hysteresis.margin_x = diff --git a/src/evdev.c b/src/evdev.c index 51ad5e31..907d18e5 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -89,13 +89,19 @@ transform_absolute(struct evdev_device *device, int32_t *x, int32_t *y) } } +static inline double +scale_axis(const struct input_absinfo *absinfo, double val, double to_range) +{ + return (val - absinfo->minimum) * to_range / + (absinfo->maximum - absinfo->minimum + 1); +} + double evdev_device_transform_x(struct evdev_device *device, double x, uint32_t width) { - return (x - device->abs.min_x) * width / - (device->abs.max_x - device->abs.min_x + 1); + return scale_axis(device->abs.absinfo_x, x, width); } double @@ -103,8 +109,7 @@ evdev_device_transform_y(struct evdev_device *device, double y, uint32_t height) { - return (y - device->abs.min_y) * height / - (device->abs.max_y - device->abs.min_y + 1); + return scale_axis(device->abs.absinfo_y, y, height); } static void @@ -606,13 +611,11 @@ evdev_configure_device(struct evdev_device *device) if (libevdev_has_event_type(evdev, EV_ABS)) { if ((absinfo = libevdev_get_abs_info(evdev, ABS_X))) { - device->abs.min_x = absinfo->minimum; - device->abs.max_x = absinfo->maximum; + device->abs.absinfo_x = absinfo; has_abs = 1; } if ((absinfo = libevdev_get_abs_info(evdev, ABS_Y))) { - device->abs.min_y = absinfo->minimum; - device->abs.max_y = absinfo->maximum; + device->abs.absinfo_y = absinfo; has_abs = 1; } /* We only handle the slotted Protocol B in weston. @@ -621,11 +624,9 @@ evdev_configure_device(struct evdev_device *device) if (libevdev_has_event_code(evdev, EV_ABS, ABS_MT_POSITION_X) && libevdev_has_event_code(evdev, EV_ABS, ABS_MT_POSITION_Y)) { absinfo = libevdev_get_abs_info(evdev, ABS_MT_POSITION_X); - device->abs.min_x = absinfo->minimum; - device->abs.max_x = absinfo->maximum; + device->abs.absinfo_x = absinfo; absinfo = libevdev_get_abs_info(evdev, ABS_MT_POSITION_Y); - device->abs.min_y = absinfo->minimum; - device->abs.max_y = absinfo->maximum; + device->abs.absinfo_y = absinfo; device->is_mt = 1; has_touch = 1; has_mt = 1; diff --git a/src/evdev.h b/src/evdev.h index d057010b..03b67429 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -66,7 +66,7 @@ struct evdev_device { const char *devname; int fd; struct { - int min_x, max_x, min_y, max_y; + const struct input_absinfo *absinfo_x, *absinfo_y; int32_t x, y; int32_t seat_slot;