aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2016-04-30 03:16:30 -0400
committerJesse Luehrs <doy@tozt.net>2016-04-30 03:21:07 -0400
commit04cf8dd207c79ee4331de684d1e9fc2bfa437547 (patch)
tree004afaa7ea1400694ff8563f0991b5e9f880b124
parent2adc1256bafe38d350f83a3e7ccc4e6becf919a1 (diff)
downloadrunes-04cf8dd207c79ee4331de684d1e9fc2bfa437547.tar.gz
runes-04cf8dd207c79ee4331de684d1e9fc2bfa437547.zip
pull event loop handling into its own file
-rw-r--r--Makefile1
-rw-r--r--src/loop.c24
-rw-r--r--src/loop.h17
-rw-r--r--src/pty-unix.c8
-rw-r--r--src/pty-unix.h2
-rw-r--r--src/runes.c2
-rw-r--r--src/runes.h9
-rw-r--r--src/term.c5
-rw-r--r--src/term.h3
-rw-r--r--src/window-xlib.c8
-rw-r--r--src/window-xlib.h2
11 files changed, 61 insertions, 20 deletions
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);