aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2016-05-01 20:26:59 -0400
committerJesse Luehrs <doy@tozt.net>2016-05-01 20:26:59 -0400
commita7d1e85a0b13b7a6f4d8a7be69410da2cc7d4d03 (patch)
tree41c03510783083c0bcfe6f97a86091b48ed684bd
parent7ca8e65901c9fbf74f7fbe1c3514d41382ac7c02 (diff)
downloadrunes-a7d1e85a0b13b7a6f4d8a7be69410da2cc7d4d03.tar.gz
runes-a7d1e85a0b13b7a6f4d8a7be69410da2cc7d4d03.zip
pull the remainder of the libuv code into loop.c
-rw-r--r--src/loop.c43
-rw-r--r--src/loop.h4
-rw-r--r--src/pty-unix.c33
-rw-r--r--src/window-xlib.c35
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(