From 3e8d4ab0235aba332c8183462de4106795496b20 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 1 May 2016 20:48:59 -0400 Subject: the event loop should own the terminal, not the other way around this way, we should be able to have multiple terminals in the same process --- src/loop.c | 43 ++++++++++++++++++++++--------------------- src/loop.h | 15 +++++++++------ src/pty-unix.c | 4 ++-- src/pty-unix.h | 2 +- src/runes.c | 7 +++++-- src/term.c | 5 ++--- src/term.h | 4 ++-- src/window-xlib.c | 7 ++++--- src/window-xlib.h | 2 +- 9 files changed, 48 insertions(+), 41 deletions(-) diff --git a/src/loop.c b/src/loop.c index dc5a749..cb141d5 100644 --- a/src/loop.c +++ b/src/loop.c @@ -12,41 +12,43 @@ 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); -void runes_loop_init(RunesTerm *t) +void runes_loop_init(RunesLoop *loop) { - RunesLoop *loop = &t->loop; - loop->loop = uv_default_loop(); - runes_window_backend_init_loop(t); - runes_pty_backend_init_loop(t); } -void runes_loop_run(RunesTerm *t) +void runes_loop_init_term(RunesLoop *loop, RunesTerm *t) { - RunesLoop *loop = &t->loop; + t->loop = loop; + runes_window_backend_init_loop(t, loop); + runes_pty_backend_init_loop(t, loop); +} +void runes_loop_run(RunesLoop *loop) +{ uv_run(loop->loop, UV_RUN_DEFAULT); } -void runes_loop_start_work(RunesTerm *t, void (*work_cb)(RunesTerm*), +void runes_loop_start_work(RunesLoop *loop, RunesTerm *t, + void (*work_cb)(RunesTerm*), int (*after_work_cb)(RunesTerm*)) { void *data; data = malloc(sizeof(RunesLoopData)); ((RunesLoopData *)data)->req.data = data; + ((RunesLoopData *)data)->loop = loop; ((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); + uv_queue_work(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*)) +void runes_loop_timer_set(RunesLoop *loop, int timeout, int repeat, + RunesTerm *t, void (*cb)(RunesTerm*)) { - RunesLoop *loop = &t->loop; uv_timer_t *timer_req; struct runes_loop_timer_data *timer_data; @@ -59,10 +61,8 @@ void runes_loop_timer_set(RunesTerm *t, int timeout, int repeat, uv_timer_start(timer_req, runes_loop_timer_cb, timeout, repeat); } -void runes_loop_cleanup(RunesTerm *t) +void runes_loop_cleanup(RunesLoop *loop) { - RunesLoop *loop = &t->loop; - uv_loop_close(loop->loop); } @@ -77,15 +77,16 @@ static void runes_loop_do_work(uv_work_t *req) static void runes_loop_do_after_work(uv_work_t *req, int status) { RunesLoopData *data = req->data; + RunesLoop *loop = data->loop; RunesTerm *t = data->t; - int loop = 0; + int should_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); + should_loop = data->after_work_cb(t); + if (should_loop) { + uv_queue_work(loop->loop, req, runes_loop_do_work, + runes_loop_do_after_work); } else { free(req); diff --git a/src/loop.h b/src/loop.h index 3cc8802..625457c 100644 --- a/src/loop.h +++ b/src/loop.h @@ -9,17 +9,20 @@ struct runes_loop { struct runes_loop_data { uv_work_t req; + RunesLoop *loop; 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*), +void runes_loop_init(RunesLoop *loop); +void runes_loop_init_term(RunesLoop *loop, RunesTerm *t); +void runes_loop_run(RunesLoop *loop); +void runes_loop_start_work(RunesLoop *loop, 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); +void runes_loop_timer_set(RunesLoop *loop, int timeout, int repeat, + RunesTerm *t, void (*cb)(RunesTerm*)); +void runes_loop_cleanup(RunesLoop *loop); #endif diff --git a/src/pty-unix.c b/src/pty-unix.c index 7c06c9b..69cc99c 100644 --- a/src/pty-unix.c +++ b/src/pty-unix.c @@ -84,9 +84,9 @@ void runes_pty_backend_spawn_subprocess(RunesTerm *t) } } -void runes_pty_backend_init_loop(RunesTerm *t) +void runes_pty_backend_init_loop(RunesTerm *t, RunesLoop *loop) { - runes_loop_start_work(t, runes_pty_backend_read, + runes_loop_start_work(loop, t, runes_pty_backend_read, runes_pty_backend_got_data); } diff --git a/src/pty-unix.h b/src/pty-unix.h index e8ee185..22abaae 100644 --- a/src/pty-unix.h +++ b/src/pty-unix.h @@ -12,7 +12,7 @@ struct runes_pty { }; void runes_pty_backend_spawn_subprocess(RunesTerm *t); -void runes_pty_backend_init_loop(RunesTerm *t); +void runes_pty_backend_init_loop(RunesTerm *t, RunesLoop *loop); void runes_pty_backend_set_window_size(RunesTerm *t); void runes_pty_backend_write(RunesTerm *t, char *buf, size_t len); void runes_pty_backend_request_close(RunesTerm *t); diff --git a/src/runes.c b/src/runes.c index c424ef6..393fda1 100644 --- a/src/runes.c +++ b/src/runes.c @@ -4,15 +4,18 @@ int main (int argc, char *argv[]) { + RunesLoop loop; RunesTerm t; setlocale(LC_ALL, ""); - runes_term_init(&t, argc, argv); + runes_loop_init(&loop); + runes_term_init(&t, &loop, argc, argv); - runes_loop_run(&t); + runes_loop_run(&loop); runes_term_cleanup(&t); + runes_loop_cleanup(&loop); return 0; } diff --git a/src/term.c b/src/term.c index 6a66460..44cd4ac 100644 --- a/src/term.c +++ b/src/term.c @@ -2,7 +2,7 @@ #include "runes.h" -void runes_term_init(RunesTerm *t, int argc, char *argv[]) +void runes_term_init(RunesTerm *t, RunesLoop *loop, int argc, char *argv[]) { memset((void *)t, 0, sizeof(*t)); @@ -16,12 +16,11 @@ void runes_term_init(RunesTerm *t, int argc, char *argv[]) vt100_screen_set_scrollback_length(&t->scr, t->config.scrollback_length); runes_display_set_window_size(t); - runes_loop_init(t); + runes_loop_init_term(loop, t); } void runes_term_cleanup(RunesTerm *t) { - runes_loop_cleanup(t); runes_config_cleanup(t); runes_display_cleanup(t); vt100_screen_cleanup(&t->scr); diff --git a/src/term.h b/src/term.h index be3ae99..e9e6b27 100644 --- a/src/term.h +++ b/src/term.h @@ -9,10 +9,10 @@ struct runes_term { VT100Screen scr; RunesConfig config; RunesDisplay display; - RunesLoop loop; + RunesLoop *loop; }; -void runes_term_init(RunesTerm *t, int argc, char *argv[]); +void runes_term_init(RunesTerm *t, RunesLoop *loop, int argc, char *argv[]); void runes_term_cleanup(RunesTerm *t); #endif diff --git a/src/window-xlib.c b/src/window-xlib.c index 71eb899..dfa15b9 100644 --- a/src/window-xlib.c +++ b/src/window-xlib.c @@ -223,7 +223,7 @@ void runes_window_backend_create_window(RunesTerm *t, int argc, char *argv[]) XMapWindow(w->dpy, w->border_w); } -void runes_window_backend_init_loop(RunesTerm *t) +void runes_window_backend_init_loop(RunesTerm *t, RunesLoop *loop) { RunesWindowBackend *w = &t->w; unsigned long xim_mask, common_mask; @@ -247,7 +247,7 @@ void runes_window_backend_init_loop(RunesTerm *t) xim_mask|common_mask|ButtonPressMask|ButtonReleaseMask|PointerMotionMask|ExposureMask); XSetICFocus(w->ic); - runes_loop_start_work(t, runes_window_backend_get_next_event, + runes_loop_start_work(loop, t, runes_window_backend_get_next_event, runes_window_backend_process_event); } @@ -542,7 +542,8 @@ static void runes_window_backend_visual_bell(RunesTerm *t) cairo_surface_flush(cairo_get_target(w->backend_cr)); XFlush(w->dpy); - runes_loop_timer_set(t, 20, 0, runes_window_backend_reset_visual_bell); + runes_loop_timer_set(t->loop, 20, 0, t, + runes_window_backend_reset_visual_bell); } } diff --git a/src/window-xlib.h b/src/window-xlib.h index 22130e3..8bc0fb6 100644 --- a/src/window-xlib.h +++ b/src/window-xlib.h @@ -34,7 +34,7 @@ struct runes_window { }; void runes_window_backend_create_window(RunesTerm *t, int argc, char *argv[]); -void runes_window_backend_init_loop(RunesTerm *t); +void runes_window_backend_init_loop(RunesTerm *t, RunesLoop *loop); void runes_window_backend_request_flush(RunesTerm *t); void runes_window_backend_request_close(RunesTerm *t); unsigned long runes_window_backend_get_window_id(RunesTerm *t); -- cgit v1.2.3-54-g00ecf