From a7d1e85a0b13b7a6f4d8a7be69410da2cc7d4d03 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 1 May 2016 20:26:59 -0400 Subject: pull the remainder of the libuv code into loop.c --- src/loop.c | 43 +++++++++++++++++++++++++++++++++++++++++++ src/loop.h | 4 ++++ src/pty-unix.c | 33 ++++++++++----------------------- src/window-xlib.c | 35 +++++++++-------------------------- 4 files changed, 66 insertions(+), 49 deletions(-) diff --git a/src/loop.c b/src/loop.c index 0f88c26..dc5a749 100644 --- a/src/loop.c +++ b/src/loop.c @@ -7,6 +7,8 @@ struct runes_loop_timer_data { void (*cb)(RunesTerm*); }; +static void runes_loop_do_work(uv_work_t *req); +static void runes_loop_do_after_work(uv_work_t *req, int status); static void runes_loop_timer_cb(uv_timer_t *handle); static void runes_loop_free_handle(uv_handle_t *handle); @@ -26,6 +28,21 @@ void runes_loop_run(RunesTerm *t) uv_run(loop->loop, UV_RUN_DEFAULT); } +void runes_loop_start_work(RunesTerm *t, void (*work_cb)(RunesTerm*), + int (*after_work_cb)(RunesTerm*)) +{ + void *data; + + data = malloc(sizeof(RunesLoopData)); + ((RunesLoopData *)data)->req.data = data; + ((RunesLoopData *)data)->t = t; + ((RunesLoopData *)data)->work_cb = work_cb; + ((RunesLoopData *)data)->after_work_cb = after_work_cb; + + uv_queue_work( + t->loop.loop, data, runes_loop_do_work, runes_loop_do_after_work); +} + void runes_loop_timer_set(RunesTerm *t, int timeout, int repeat, void (*cb)(RunesTerm*)) { @@ -49,6 +66,32 @@ void runes_loop_cleanup(RunesTerm *t) uv_loop_close(loop->loop); } +static void runes_loop_do_work(uv_work_t *req) +{ + RunesLoopData *data = req->data; + RunesTerm *t = data->t; + + data->work_cb(t); +} + +static void runes_loop_do_after_work(uv_work_t *req, int status) +{ + RunesLoopData *data = req->data; + RunesTerm *t = data->t; + int loop = 0; + + UNUSED(status); + + loop = data->after_work_cb(t); + if (loop) { + uv_queue_work( + t->loop.loop, req, runes_loop_do_work, runes_loop_do_after_work); + } + else { + free(req); + } +} + static void runes_loop_timer_cb(uv_timer_t *handle) { struct runes_loop_timer_data *data = handle->data; diff --git a/src/loop.h b/src/loop.h index 05f3065..3cc8802 100644 --- a/src/loop.h +++ b/src/loop.h @@ -10,10 +10,14 @@ struct runes_loop { struct runes_loop_data { uv_work_t req; RunesTerm *t; + void (*work_cb)(RunesTerm*); + int (*after_work_cb)(RunesTerm*); }; void runes_loop_init(RunesTerm *t); void runes_loop_run(RunesTerm *t); +void runes_loop_start_work(RunesTerm *t, void (*work_cb)(RunesTerm*), + int (*after_work_cb)(RunesTerm*)); void runes_loop_timer_set(RunesTerm *t, int timeout, int repeat, void (*cb)(RunesTerm*)); void runes_loop_cleanup(RunesTerm *t); diff --git a/src/pty-unix.c b/src/pty-unix.c index 5431528..7c06c9b 100644 --- a/src/pty-unix.c +++ b/src/pty-unix.c @@ -8,8 +8,8 @@ #include "runes.h" -static void runes_pty_backend_read(uv_work_t *req); -static void runes_pty_backend_got_data(uv_work_t *req, int status); +static void runes_pty_backend_read(RunesTerm *t); +static int runes_pty_backend_got_data(RunesTerm *t); void runes_pty_backend_spawn_subprocess(RunesTerm *t) { @@ -86,15 +86,8 @@ void runes_pty_backend_spawn_subprocess(RunesTerm *t) void runes_pty_backend_init_loop(RunesTerm *t) { - void *data; - - data = malloc(sizeof(RunesLoopData)); - ((RunesLoopData *)data)->req.data = data; - ((RunesLoopData *)data)->t = t; - - uv_queue_work( - t->loop.loop, data, runes_pty_backend_read, - runes_pty_backend_got_data); + runes_loop_start_work(t, runes_pty_backend_read, + runes_pty_backend_got_data); } void runes_pty_backend_set_window_size(RunesTerm *t) @@ -132,10 +125,8 @@ void runes_pty_backend_cleanup(RunesTerm *t) close(pty->master); } -static void runes_pty_backend_read(uv_work_t *req) +static void runes_pty_backend_read(RunesTerm *t) { - RunesLoopData *data = req->data; - RunesTerm *t = data->t; RunesPtyBackend *pty = &t->pty; runes_window_backend_request_flush(t); @@ -144,26 +135,22 @@ static void runes_pty_backend_read(uv_work_t *req) RUNES_READ_BUFFER_LENGTH - pty->remaininglen); } -static void runes_pty_backend_got_data(uv_work_t *req, int status) +static int runes_pty_backend_got_data(RunesTerm *t) { - RunesLoopData *data = req->data; - RunesTerm *t = data->t; RunesPtyBackend *pty = &t->pty; - UNUSED(status); - if (pty->readlen > 0) { int to_process = pty->readlen + pty->remaininglen; int processed = vt100_screen_process_string( &t->scr, pty->readbuf, to_process); pty->remaininglen = to_process - processed; memmove(pty->readbuf, pty->readbuf + processed, pty->remaininglen); - uv_queue_work( - t->loop.loop, req, runes_pty_backend_read, - runes_pty_backend_got_data); + + return 1; } else { runes_window_backend_request_close(t); - free(req); + + return 0; } } diff --git a/src/window-xlib.c b/src/window-xlib.c index c8b60cf..71eb899 100644 --- a/src/window-xlib.c +++ b/src/window-xlib.c @@ -76,8 +76,8 @@ static struct function_key application_cursor_keys[] = { }; #undef RUNES_KEY -static void runes_window_backend_get_next_event(uv_work_t *req); -static void runes_window_backend_process_event(uv_work_t *req, int status); +static void runes_window_backend_get_next_event(RunesTerm *t); +static int runes_window_backend_process_event(RunesTerm *t); static Bool runes_window_backend_find_flush_events( Display *dpy, XEvent *e, XPointer arg); static void runes_window_backend_resize_window( @@ -227,7 +227,6 @@ void runes_window_backend_init_loop(RunesTerm *t) { RunesWindowBackend *w = &t->w; unsigned long xim_mask, common_mask; - void *data; XGetICValues(w->ic, XNFilterEvents, &xim_mask, NULL); /* we always want to receive keyboard events, and enter/leave window events @@ -248,14 +247,8 @@ void runes_window_backend_init_loop(RunesTerm *t) xim_mask|common_mask|ButtonPressMask|ButtonReleaseMask|PointerMotionMask|ExposureMask); XSetICFocus(w->ic); - data = malloc(sizeof(RunesLoopData)); - ((RunesLoopData *)data)->req.data = data; - ((RunesLoopData *)data)->t = t; - - uv_queue_work( - t->loop.loop, data, - runes_window_backend_get_next_event, - runes_window_backend_process_event); + runes_loop_start_work(t, runes_window_backend_get_next_event, + runes_window_backend_process_event); } void runes_window_backend_request_flush(RunesTerm *t) @@ -350,25 +343,19 @@ void runes_window_backend_cleanup(RunesTerm *t) XCloseDisplay(w->dpy); } -static void runes_window_backend_get_next_event(uv_work_t *req) +static void runes_window_backend_get_next_event(RunesTerm *t) { - RunesLoopData *data = req->data; - RunesTerm *t = data->t; RunesWindowBackend *w = &t->w; XNextEvent(w->dpy, &w->event); } -static void runes_window_backend_process_event(uv_work_t *req, int status) +static int runes_window_backend_process_event(RunesTerm *t) { - RunesLoopData *data = req->data; - RunesTerm *t = data->t; RunesWindowBackend *w = &t->w; XEvent *e = &w->event; int should_close = 0; - UNUSED(status); - if (!XFilterEvent(e, None)) { switch (e->type) { case KeyPress: @@ -434,15 +421,11 @@ static void runes_window_backend_process_event(uv_work_t *req, int status) } } - if (!should_close) { - uv_queue_work( - t->loop.loop, req, runes_window_backend_get_next_event, - runes_window_backend_process_event); - } - else { + if (should_close) { runes_pty_backend_request_close(t); - free(req); } + + return !should_close; } static Bool runes_window_backend_find_flush_events( -- cgit v1.2.3