aboutsummaryrefslogtreecommitdiffstats
path: root/src
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 /src
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
Diffstat (limited to 'src')
-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);