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

Commit bc29063b authored by Dima Zavin's avatar Dima Zavin
Browse files

minui: events: refactor event acquisition



Events are now delivered through a callback mechanism during
a call to ev_dispatch(). This will allow us to extend the events
code to handle other devices/fds, not just input. One such example
is the ability to process uevents.

During initialization, we provide an input callback to ev_init
that gets called when a new event is encountered during dispatch.

ev_get has been removed and replaced with ev_get_input() helper
function that can be called from inside the callback to attempt
to get an input event.

The existing client of ev_get in recovery has been split up such
that the input thread just calls ev_wait(); ev_dispatch(); and
the input_callback handles individual events by using the
ev_get_input() helper.

Change-Id: I24d8e71bd1533876b4ab1ae751ba200fea43c049
Signed-off-by: default avatarDima Zavin <dima@android.com>
parent 4daf48a1
Loading
Loading
Loading
Loading
+36 −13
Original line number Original line Diff line number Diff line
@@ -26,10 +26,18 @@


#define MAX_DEVICES 16
#define MAX_DEVICES 16


struct fd_info {
    ev_callback cb;
    void *data;
};

static struct pollfd ev_fds[MAX_DEVICES];
static struct pollfd ev_fds[MAX_DEVICES];
static struct fd_info ev_fdinfo[MAX_DEVICES];

static unsigned ev_count = 0;
static unsigned ev_count = 0;
static unsigned ev_dev_count = 0;


int ev_init(void)
int ev_init(ev_callback input_cb, void *data)
{
{
    DIR *dir;
    DIR *dir;
    struct dirent *de;
    struct dirent *de;
@@ -45,6 +53,8 @@ int ev_init(void)


            ev_fds[ev_count].fd = fd;
            ev_fds[ev_count].fd = fd;
            ev_fds[ev_count].events = POLLIN;
            ev_fds[ev_count].events = POLLIN;
            ev_fdinfo[ev_count].cb = input_cb;
            ev_fdinfo[ev_count].data = data;
            ev_count++;
            ev_count++;
            if(ev_count == MAX_DEVICES) break;
            if(ev_count == MAX_DEVICES) break;
        }
        }
@@ -60,23 +70,36 @@ void ev_exit(void)
    }
    }
}
}


int ev_get(struct input_event *ev, unsigned dont_wait)
int ev_wait(int timeout)
{
{
    int r;
    int r;
    unsigned n;


    do {
    r = poll(ev_fds, ev_count, timeout);
        r = poll(ev_fds, ev_count, dont_wait ? 0 : -1);
    if (r <= 0)
        return -1;
    return 0;
}

void ev_dispatch(void)
{
    unsigned n;
    int ret;


        if(r > 0) {
    for (n = 0; n < ev_count; n++) {
    for (n = 0; n < ev_count; n++) {
                if(ev_fds[n].revents & POLLIN) {
        ev_callback cb = ev_fdinfo[n].cb;
                    r = read(ev_fds[n].fd, ev, sizeof(*ev));
        if (cb && (ev_fds[n].revents & ev_fds[n].events))
                    if(r == sizeof(*ev)) return 0;
            cb(ev_fds[n].fd, ev_fds[n].revents, ev_fdinfo[n].data);
                }
    }
    }
}
}
    } while(dont_wait == 0);


int ev_get_input(int fd, short revents, struct input_event *ev)
{
    int r;

    if (revents & POLLIN) {
        r = read(fd, ev, sizeof(*ev));
        if (r == sizeof(*ev))
            return 0;
    }
    return -1;
    return -1;
}
}
+13 −2
Original line number Original line Diff line number Diff line
@@ -45,9 +45,20 @@ unsigned int gr_get_height(gr_surface surface);
// see http://www.mjmwired.net/kernel/Documentation/input/ for info.
// see http://www.mjmwired.net/kernel/Documentation/input/ for info.
struct input_event;
struct input_event;


int ev_init(void);
typedef int (*ev_callback)(int fd, short revents, void *data);

int ev_init(ev_callback input_cb, void *data);
void ev_exit(void);
void ev_exit(void);
int ev_get(struct input_event *ev, unsigned dont_wait);

/* timeout has the same semantics as for poll
 *    0 : don't block
 *  < 0 : block forever
 *  > 0 : block for 'timeout' milliseconds
 */
int ev_wait(int timeout);

int ev_get_input(int fd, short revents, struct input_event *ev);
void ev_dispatch(void);


// Resources
// Resources


+72 −60
Original line number Original line Diff line number Diff line
@@ -295,19 +295,20 @@ static void *progress_thread(void *cookie)
    return NULL;
    return NULL;
}
}


// Reads input events, handles special hot keys, and adds to the key queue.
static int rel_sum = 0;
static void *input_thread(void *cookie)

static int input_callback(int fd, short revents, void *data)
{
{
    int rel_sum = 0;
    int fake_key = 0;
    for (;;) {
        // wait for the next key event
    struct input_event ev;
    struct input_event ev;
        do {
    int ret;
            ev_get(&ev, 0);
    int fake_key = 0;

    ret = ev_get_input(fd, revents, &ev);
    if (ret)
        return -1;


    if (ev.type == EV_SYN) {
    if (ev.type == EV_SYN) {
                continue;
        return 0;
    } else if (ev.type == EV_REL) {
    } else if (ev.type == EV_REL) {
        if (ev.code == REL_Y) {
        if (ev.code == REL_Y) {
            // accumulate the up or down motion reported by
            // accumulate the up or down motion reported by
@@ -332,7 +333,9 @@ static void *input_thread(void *cookie)
    } else {
    } else {
        rel_sum = 0;
        rel_sum = 0;
    }
    }
        } while (ev.type != EV_KEY || ev.code > KEY_MAX);

    if (ev.type != EV_KEY || ev.code > KEY_MAX)
        return 0;


    pthread_mutex_lock(&key_queue_mutex);
    pthread_mutex_lock(&key_queue_mutex);
    if (!fake_key) {
    if (!fake_key) {
@@ -341,7 +344,6 @@ static void *input_thread(void *cookie)
        // table.
        // table.
        key_pressed[ev.code] = ev.value;
        key_pressed[ev.code] = ev.value;
    }
    }
        fake_key = 0;
    const int queue_max = sizeof(key_queue) / sizeof(key_queue[0]);
    const int queue_max = sizeof(key_queue) / sizeof(key_queue[0]);
    if (ev.value > 0 && key_queue_len < queue_max) {
    if (ev.value > 0 && key_queue_len < queue_max) {
        key_queue[key_queue_len++] = ev.code;
        key_queue[key_queue_len++] = ev.code;
@@ -360,6 +362,16 @@ static void *input_thread(void *cookie)
    if (ev.value > 0 && device_reboot_now(key_pressed, ev.code)) {
    if (ev.value > 0 && device_reboot_now(key_pressed, ev.code)) {
        android_reboot(ANDROID_RB_RESTART, 0, 0);
        android_reboot(ANDROID_RB_RESTART, 0, 0);
    }
    }

    return 0;
}

// Reads input events, handles special hot keys, and adds to the key queue.
static void *input_thread(void *cookie)
{
    for (;;) {
        if (!ev_wait(-1))
            ev_dispatch();
    }
    }
    return NULL;
    return NULL;
}
}
@@ -367,7 +379,7 @@ static void *input_thread(void *cookie)
void ui_init(void)
void ui_init(void)
{
{
    gr_init();
    gr_init();
    ev_init();
    ev_init(input_callback, NULL);


    text_col = text_row = 0;
    text_col = text_row = 0;
    text_rows = gr_fb_height() / CHAR_HEIGHT;
    text_rows = gr_fb_height() / CHAR_HEIGHT;