From 04cf8dd207c79ee4331de684d1e9fc2bfa437547 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 30 Apr 2016 03:16:30 -0400 Subject: pull event loop handling into its own file --- Makefile | 1 + src/loop.c | 24 ++++++++++++++++++++++++ src/loop.h | 17 +++++++++++++++++ src/pty-unix.c | 8 +++++--- src/pty-unix.h | 2 +- src/runes.c | 2 +- src/runes.h | 9 ++++----- src/term.c | 5 ++--- src/term.h | 3 +-- src/window-xlib.c | 8 ++++---- src/window-xlib.h | 2 +- 11 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 src/loop.c create mode 100644 src/loop.h diff --git a/Makefile b/Makefile index bbccdad..99a5289 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ OBJ = $(BUILD)runes.o \ $(BUILD)config.o \ $(BUILD)window-xlib.o \ $(BUILD)pty-unix.o \ + $(BUILD)loop.o \ $(BUILD)util.o LIBS = cairo cairo-xlib libuv pangocairo CFLAGS ?= -g -Wall -Wextra -Werror diff --git a/src/loop.c b/src/loop.c new file mode 100644 index 0000000..e361600 --- /dev/null +++ b/src/loop.c @@ -0,0 +1,24 @@ +#include "runes.h" + +void runes_loop_init(RunesTerm *t) +{ + 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) +{ + RunesLoop *loop = &t->loop; + + uv_run(loop->loop, UV_RUN_DEFAULT); +} + +void runes_loop_cleanup(RunesTerm *t) +{ + RunesLoop *loop = &t->loop; + + uv_loop_close(loop->loop); +} diff --git a/src/loop.h b/src/loop.h new file mode 100644 index 0000000..4f06cd7 --- /dev/null +++ b/src/loop.h @@ -0,0 +1,17 @@ +#ifndef _RUNES_LOOP_H +#define _RUNES_LOOP_H + +struct runes_loop { + uv_loop_t *loop; +}; + +struct runes_loop_data { + uv_work_t req; + RunesTerm *t; +}; + +void runes_loop_init(RunesTerm *t); +void runes_loop_run(RunesTerm *t); +void runes_loop_cleanup(RunesTerm *t); + +#endif diff --git a/src/pty-unix.c b/src/pty-unix.c index 242280f..663d224 100644 --- a/src/pty-unix.c +++ b/src/pty-unix.c @@ -84,7 +84,7 @@ void runes_pty_backend_spawn_subprocess(RunesTerm *t) } } -void runes_pty_backend_start_loop(RunesTerm *t) +void runes_pty_backend_init_loop(RunesTerm *t) { void *data; @@ -93,7 +93,8 @@ void runes_pty_backend_start_loop(RunesTerm *t) ((RunesLoopData *)data)->t = t; uv_queue_work( - t->loop, data, runes_pty_backend_read, runes_pty_backend_got_data); + t->loop.loop, data, runes_pty_backend_read, + runes_pty_backend_got_data); } void runes_pty_backend_set_window_size(RunesTerm *t) @@ -158,7 +159,8 @@ static void runes_pty_backend_got_data(uv_work_t *req, int status) pty->remaininglen = to_process - processed; memmove(pty->readbuf, pty->readbuf + processed, pty->remaininglen); uv_queue_work( - t->loop, req, runes_pty_backend_read, runes_pty_backend_got_data); + t->loop.loop, req, runes_pty_backend_read, + runes_pty_backend_got_data); } else { runes_window_backend_request_close(t); diff --git a/src/pty-unix.h b/src/pty-unix.h index cf9fdf6..e8ee185 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_start_loop(RunesTerm *t); +void runes_pty_backend_init_loop(RunesTerm *t); 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 b71add6..c424ef6 100644 --- a/src/runes.c +++ b/src/runes.c @@ -10,7 +10,7 @@ int main (int argc, char *argv[]) runes_term_init(&t, argc, argv); - uv_run(t.loop, UV_RUN_DEFAULT); + runes_loop_run(&t); runes_term_cleanup(&t); diff --git a/src/runes.h b/src/runes.h index 6012983..5bc91d4 100644 --- a/src/runes.h +++ b/src/runes.h @@ -13,6 +13,7 @@ struct runes_window; struct runes_pty; struct runes_config; struct runes_display; +struct runes_loop; struct runes_loop_data; typedef struct runes_term RunesTerm; @@ -20,15 +21,13 @@ typedef struct runes_window RunesWindowBackend; typedef struct runes_pty RunesPtyBackend; typedef struct runes_config RunesConfig; typedef struct runes_display RunesDisplay; +typedef struct runes_loop RunesLoop; typedef struct runes_loop_data RunesLoopData; -struct runes_loop_data { - uv_work_t req; - RunesTerm *t; -}; - #include "util.h" +#include "loop.h" + #include "window-xlib.h" #include "pty-unix.h" diff --git a/src/term.c b/src/term.c index d5791e1..6a66460 100644 --- a/src/term.c +++ b/src/term.c @@ -16,13 +16,12 @@ 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); - t->loop = uv_default_loop(); - runes_window_backend_start_loop(t); - runes_pty_backend_start_loop(t); + runes_loop_init(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 4a052d4..7393b0a 100644 --- a/src/term.h +++ b/src/term.h @@ -7,8 +7,7 @@ struct runes_term { VT100Screen scr; RunesConfig config; RunesDisplay display; - - uv_loop_t *loop; + RunesLoop loop; }; void runes_term_init(RunesTerm *t, int argc, char *argv[]); diff --git a/src/window-xlib.c b/src/window-xlib.c index 041183a..d1f261c 100644 --- a/src/window-xlib.c +++ b/src/window-xlib.c @@ -224,7 +224,7 @@ void runes_window_backend_create_window(RunesTerm *t, int argc, char *argv[]) XMapWindow(w->dpy, w->border_w); } -void runes_window_backend_start_loop(RunesTerm *t) +void runes_window_backend_init_loop(RunesTerm *t) { RunesWindowBackend *w = &t->w; unsigned long xim_mask, common_mask; @@ -254,7 +254,7 @@ void runes_window_backend_start_loop(RunesTerm *t) ((RunesLoopData *)data)->t = t; uv_queue_work( - t->loop, data, + t->loop.loop, data, runes_window_backend_get_next_event, runes_window_backend_process_event); } @@ -436,7 +436,7 @@ static void runes_window_backend_process_event(uv_work_t *req, int status) if (!should_close) { uv_queue_work( - t->loop, req, runes_window_backend_get_next_event, + t->loop.loop, req, runes_window_backend_get_next_event, runes_window_backend_process_event); } else { @@ -562,7 +562,7 @@ static void runes_window_backend_visual_bell(RunesTerm *t) XFlush(w->dpy); timer_req = malloc(sizeof(uv_timer_t)); - uv_timer_init(t->loop, timer_req); + uv_timer_init(t->loop.loop, timer_req); timer_req->data = (void *)t; uv_timer_start( timer_req, runes_window_backend_reset_visual_bell, 20, 0); diff --git a/src/window-xlib.h b/src/window-xlib.h index e4efeff..e376f91 100644 --- a/src/window-xlib.h +++ b/src/window-xlib.h @@ -37,7 +37,7 @@ typedef struct { } RunesXlibLoopData; void runes_window_backend_create_window(RunesTerm *t, int argc, char *argv[]); -void runes_window_backend_start_loop(RunesTerm *t); +void runes_window_backend_init_loop(RunesTerm *t); 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