Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 229a543b authored by Christopher Lais's avatar Christopher Lais
Browse files

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

Change-Id: I7d26a406eb200c866b2fbc841424ac698f6d3bf3
parent 517a16b9
Loading
Loading
Loading
Loading
+36 −28
Original line number Diff line number Diff line
@@ -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 */

    e->mt_idx = 0;

    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))) {
    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;