aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2016-05-01 20:48:59 -0400
committerJesse Luehrs <doy@tozt.net>2016-05-01 20:48:59 -0400
commit3e8d4ab0235aba332c8183462de4106795496b20 (patch)
tree87f2feb164c1aaab777ff10e60bb99781f3e434b
parenta7d1e85a0b13b7a6f4d8a7be69410da2cc7d4d03 (diff)
downloadrunes-3e8d4ab0235aba332c8183462de4106795496b20.tar.gz
runes-3e8d4ab0235aba332c8183462de4106795496b20.zip
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
-rw-r--r--src/loop.c43
-rw-r--r--src/loop.h15
-rw-r--r--src/pty-unix.c4
-rw-r--r--src/pty-unix.h2
-rw-r--r--src/runes.c7
-rw-r--r--src/term.c5
-rw-r--r--src/term.h4
-rw-r--r--src/window-xlib.c7
-rw-r--r--src/window-xlib.h2
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);