touchpad: change manual calculations of dimensions to helper functions

Wherever we use an absolute size in mm on the touchpad, switch to the new
helper functions. In a few cases we only need one coordinate so just leave the
other one as 0 in those cases.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
Peter Hutterer 2016-07-15 11:31:07 +10:00
parent b1c51ee9d9
commit c543b4a91a
3 changed files with 71 additions and 60 deletions

View file

@ -537,33 +537,26 @@ static void
tp_init_softbuttons(struct tp_dispatch *tp,
struct evdev_device *device)
{
int width, height;
const struct input_absinfo *absinfo_x, *absinfo_y;
struct device_coords offset;
int xres, yres;
double width, height;
struct device_coords edges;
int mb_le, mb_re; /* middle button left/right edge */
struct phys_coords mm = { 0.0, 0.0 };
absinfo_x = device->abs.absinfo_x;
absinfo_y = device->abs.absinfo_y;
offset.x = absinfo_x->minimum,
offset.y = absinfo_y->minimum,
xres = absinfo_x->resolution;
yres = absinfo_y->resolution;
width = device->abs.dimensions.x;
height = device->abs.dimensions.y;
evdev_device_get_size(device, &width, &height);
/* button height: 10mm or 15% or the touchpad height,
whichever is smaller */
if ((height * 0.15)/yres > 10) {
tp->buttons.bottom_area.top_edge =
absinfo_y->maximum - 10 * yres;
} else {
tp->buttons.bottom_area.top_edge = height * .85 + offset.y;
}
if (height * 0.15 > 10)
mm.y = height - 10;
else
mm.y = height * 0.85;
mm.x = width * 0.5;
edges = evdev_device_mm_to_units(device, &mm);
tp->buttons.bottom_area.top_edge = edges.y;
tp->buttons.bottom_area.rightbutton_left_edge = edges.x;
tp->buttons.bottom_area.middlebutton_left_edge = INT_MAX;
tp->buttons.bottom_area.rightbutton_left_edge = width/2 + offset.x;
/* if middlebutton emulation is enabled, don't init a software area */
if (device->middlebutton.want_enabled)
@ -580,14 +573,21 @@ tp_init_softbuttons(struct tp_dispatch *tp,
* All Dell touchpads appear to have a middle marker.
*/
if (tp->device->model_flags & EVDEV_MODEL_DELL_TOUCHPAD) {
const int MIDDLE_BUTTON_WIDTH = 10; /* mm */
int half_width = MIDDLE_BUTTON_WIDTH/2 * xres; /* units */
mm.x = width/2 - 5; /* 10mm wide */
edges = evdev_device_mm_to_units(device, &mm);
mb_le = edges.x;
mb_le = offset.x + width/2 - half_width;
mb_re = offset.x + width/2 + half_width;
mm.x = width/2 + 5; /* 10mm wide */
edges = evdev_device_mm_to_units(device, &mm);
mb_re = edges.x;
} else {
mb_le = offset.x + width * 0.375;
mb_re = offset.x + width * 0.625;
mm.x = width * 0.375;
edges = evdev_device_mm_to_units(device, &mm);
mb_le = edges.x;
mm.x = width * 0.625;
edges = evdev_device_mm_to_units(device, &mm);
mb_re = edges.x;
}
tp->buttons.bottom_area.middlebutton_left_edge = mb_le;
@ -599,18 +599,7 @@ tp_init_top_softbuttons(struct tp_dispatch *tp,
struct evdev_device *device,
double topbutton_size_mult)
{
int width;
const struct input_absinfo *absinfo_x, *absinfo_y;
struct device_coords offset;
int yres;
absinfo_x = device->abs.absinfo_x;
absinfo_y = device->abs.absinfo_y;
offset.x = absinfo_x->minimum,
offset.y = absinfo_y->minimum;
yres = absinfo_y->resolution;
width = device->abs.dimensions.x;
struct device_coords edges;
if (tp->buttons.has_topbuttons) {
/* T440s has the top button line 5mm from the top, event
@ -618,10 +607,20 @@ tp_init_top_softbuttons(struct tp_dispatch *tp,
top - which maps to 15%. We allow the caller to enlarge the
area using a multiplier for the touchpad disabled case. */
double topsize_mm = 10 * topbutton_size_mult;
struct phys_coords mm;
double width, height;
tp->buttons.top_area.bottom_edge = offset.y + topsize_mm * yres;
tp->buttons.top_area.rightbutton_left_edge = width * .58 + offset.x;
tp->buttons.top_area.leftbutton_right_edge = width * .42 + offset.x;
evdev_device_get_size(device, &width, &height);
mm.x = width * 0.58;
mm.y = topsize_mm;
edges = evdev_device_mm_to_units(device, &mm);
tp->buttons.top_area.bottom_edge = edges.y;
tp->buttons.top_area.rightbutton_left_edge = edges.x;
mm.x = width * 0.42;
edges = evdev_device_mm_to_units(device, &mm);
tp->buttons.top_area.leftbutton_right_edge = edges.x;
} else {
tp->buttons.top_area.bottom_edge = INT_MIN;
}

View file

@ -285,28 +285,29 @@ void
tp_edge_scroll_init(struct tp_dispatch *tp, struct evdev_device *device)
{
struct tp_touch *t;
int edge_width, edge_height;
double width, height;
bool want_horiz_scroll = true;
struct device_coords edges;
struct phys_coords mm = { 0.0, 0.0 };
evdev_device_get_size(device, &width, &height);
/* Touchpads smaller than 50mm are not tall enough to have a
horizontal scroll area, it takes too much space away. But
clickpads have enough space here anyway because of the
software button area (and all these tiny clickpads were built
when software buttons were a thing, e.g. Lenovo *20 series)
*/
if (!tp->buttons.is_clickpad) {
evdev_device_get_size(device, &width, &height);
if (!tp->buttons.is_clickpad)
want_horiz_scroll = (height >= 50);
}
/* 7mm edge size */
edge_width = device->abs.absinfo_x->resolution * 7;
edge_height = device->abs.absinfo_y->resolution * 7;
mm.x = width - 7;
mm.y = height - 7;
edges = evdev_device_mm_to_units(device, &mm);
tp->scroll.right_edge = device->abs.absinfo_x->maximum - edge_width;
tp->scroll.right_edge = edges.x;
if (want_horiz_scroll)
tp->scroll.bottom_edge = device->abs.absinfo_y->maximum - edge_height;
tp->scroll.bottom_edge = edges.y;
else
tp->scroll.bottom_edge = INT_MAX;

View file

@ -1989,25 +1989,32 @@ static void
tp_init_palmdetect(struct tp_dispatch *tp,
struct evdev_device *device)
{
int width;
double width, height;
struct phys_coords mm = { 0.0, 0.0 };
struct device_coords edges;
tp->palm.right_edge = INT_MAX;
tp->palm.left_edge = INT_MIN;
width = device->abs.dimensions.x;
/* Wacom doesn't have internal touchpads */
if (device->model_flags & EVDEV_MODEL_WACOM_TOUCHPAD)
return;
evdev_device_get_size(device, &width, &height);
/* Enable palm detection on touchpads >= 70 mm. Anything smaller
probably won't need it, until we find out it does */
if (width/device->abs.absinfo_x->resolution < 70)
if (width < 70.0)
return;
/* palm edges are 5% of the width on each side */
tp->palm.right_edge = device->abs.absinfo_x->maximum - width * 0.05;
tp->palm.left_edge = device->abs.absinfo_x->minimum + width * 0.05;
mm.x = width * 0.05;
edges = evdev_device_mm_to_units(device, &mm);
tp->palm.left_edge = edges.x;
mm.x = width * 0.95;
edges = evdev_device_mm_to_units(device, &mm);
tp->palm.right_edge = edges.x;
tp->palm.monitor_trackpoint = true;
}
@ -2031,8 +2038,9 @@ tp_init_thumb(struct tp_dispatch *tp)
struct evdev_device *device = tp->device;
const struct input_absinfo *abs;
double w = 0.0, h = 0.0;
struct device_coords edges;
struct phys_coords mm = { 0.0, 0.0 };
int xres, yres;
int ymax;
double threshold;
if (!tp->buttons.is_clickpad)
@ -2050,10 +2058,13 @@ tp_init_thumb(struct tp_dispatch *tp)
/* detect thumbs by pressure in the bottom 15mm, detect thumbs by
* lingering in the bottom 8mm */
ymax = tp->device->abs.absinfo_y->maximum;
yres = tp->device->abs.absinfo_y->resolution;
tp->thumb.upper_thumb_line = ymax - yres * 15;
tp->thumb.lower_thumb_line = ymax - yres * 8;
mm.y = h * 0.85;
edges = evdev_device_mm_to_units(device, &mm);
tp->thumb.upper_thumb_line = edges.y;
mm.y = h * 0.92;
edges = evdev_device_mm_to_units(device, &mm);
tp->thumb.lower_thumb_line = edges.y;
abs = libevdev_get_abs_info(device->evdev, ABS_MT_PRESSURE);
if (!abs)