minui: clean up some stuff, and avoid multiple key events on N1

Change-Id: I7d26a406eb200c866b2fbc841424ac698f6d3bf3
This commit is contained in:
Christopher Lais 2010-11-27 22:37:50 -06:00
parent 517a16b98f
commit 229a543bb3

View File

@ -32,6 +32,8 @@
#define VIBRATOR_TIMEOUT_FILE "/sys/class/timed_output/vibrator/enable"
#define VIBRATOR_TIME_MS 50
#define PRESS_THRESHHOLD 10
enum {
DOWN_NOT,
DOWN_SENT,
@ -46,7 +48,7 @@ struct virtualkey {
struct position {
int x, y;
int synced;
int pressed;
struct input_absinfo xi, yi;
};
@ -57,7 +59,7 @@ struct ev {
int vk_count;
struct position p, mt_p;
int down;
int sent, mt_idx;
};
static struct pollfd ev_fds[MAX_DEVICES];
@ -141,15 +143,16 @@ static int vk_init(struct ev *e)
if (e->vk_count <= 0)
return -1;
e->down = DOWN_NOT;
e->sent = 0;
e->mt_idx = 0;
ioctl(e->fd->fd, EVIOCGABS(ABS_X), &e->p.xi);
ioctl(e->fd->fd, EVIOCGABS(ABS_Y), &e->p.yi);
e->p.synced = 0;
e->p.pressed = 0;
ioctl(e->fd->fd, EVIOCGABS(ABS_MT_POSITION_X), &e->mt_p.xi);
ioctl(e->fd->fd, EVIOCGABS(ABS_MT_POSITION_Y), &e->mt_p.yi);
e->mt_p.synced = 0;
e->mt_p.pressed = 0;
e->vks = malloc(sizeof(*e->vks) * e->vk_count);
@ -252,34 +255,33 @@ static int vk_modify(struct ev *e, struct input_event *ev)
int x, y;
if (ev->type == EV_KEY) {
if (ev->code == BTN_TOUCH && !ev->value)
e->down = DOWN_RELEASED;
if (ev->code == BTN_TOUCH)
e->p.pressed = ev->value;
return 0;
}
if (ev->type == EV_ABS) {
switch (ev->code) {
case ABS_X:
e->p.synced = 1;
e->p.x = ev->value;
return !vk_inside_display(e->p.x, &e->p.xi, gr_fb_width());
case ABS_Y:
e->p.synced = 1;
e->p.y = ev->value;
return !vk_inside_display(e->p.y, &e->p.yi, gr_fb_height());
case ABS_MT_POSITION_X:
if (e->mt_p.synced & 2) return 1;
e->mt_p.synced = 1;
if (e->mt_idx) return 1;
e->mt_p.x = ev->value;
return !vk_inside_display(e->mt_p.x, &e->mt_p.xi, gr_fb_width());
case ABS_MT_POSITION_Y:
if (e->mt_p.synced & 2) return 1;
e->mt_p.synced = 1;
if (e->mt_idx) return 1;
e->mt_p.y = ev->value;
return !vk_inside_display(e->mt_p.y, &e->mt_p.yi, gr_fb_height());
case ABS_MT_TOUCH_MAJOR:
if (e->mt_p.synced & 2) return 1;
if (!ev->value) e->down = DOWN_RELEASED;
if (e->mt_idx) return 1;
if (e->sent)
e->mt_p.pressed = (ev->value > 0);
else
e->mt_p.pressed = (ev->value > PRESS_THRESHHOLD);
return 0;
}
@ -291,35 +293,41 @@ static int vk_modify(struct ev *e, struct input_event *ev)
if (ev->code == SYN_MT_REPORT) {
/* Ignore the rest of the points */
e->mt_p.synced |= 2;
return 0;
++e->mt_idx;
return 1;
}
if (ev->code != SYN_REPORT)
return 0;
if (e->down == DOWN_RELEASED) {
e->down = DOWN_NOT;
/* TODO: Send emulated key release? */
return 1;
}
/* Report complete */
if (!(e->p.synced && vk_tp_to_screen(&e->p, &x, &y)) &&
!((e->mt_p.synced & 1) && vk_tp_to_screen(&e->mt_p, &x, &y))) {
e->mt_idx = 0;
if (!e->p.pressed && !e->mt_p.pressed) {
/* No touch */
e->sent = 0;
return 0;
}
e->p.synced = e->mt_p.synced = 0;
if (!(e->p.pressed && vk_tp_to_screen(&e->p, &x, &y)) &&
!(e->mt_p.pressed && vk_tp_to_screen(&e->mt_p, &x, &y))) {
/* No touch inside vk area */
return 0;
}
if (e->down)
if (e->sent) {
/* We've already sent a fake key for this touch */
return 1;
}
/* The screen is being touched on the vk area */
e->sent = 1;
for (i = 0; i < e->vk_count; ++i) {
int xd = ABS(e->vks[i].centerx - x);
int yd = ABS(e->vks[i].centery - y);
if (xd < e->vks[i].width/2 && yd < e->vks[i].height/2) {
/* Fake a key event */
e->down = DOWN_SENT;
ev->type = EV_KEY;
ev->code = e->vks[i].scancode;
ev->value = 1;