aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--events.c9
-rw-r--r--events.h3
-rw-r--r--runes.c13
-rw-r--r--runes.h11
-rw-r--r--term.c21
-rw-r--r--term.h9
-rw-r--r--window-xlib.c (renamed from xlib.c)68
-rw-r--r--window-xlib.h (renamed from xlib.h)16
9 files changed, 70 insertions, 82 deletions
diff --git a/Makefile b/Makefile
index 66df33a..edbc068 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
OUT = runes
-OBJ = runes.o display.o xlib.o term.o events.o
+OBJ = runes.o display.o term.o events.o window-xlib.o
LIBS = cairo cairo-xlib libuv
CFLAGS ?= -g -Wall -Wextra -Werror
LDFLAGS ?= -g -Wall -Wextra -Werror
diff --git a/events.c b/events.c
index 45fe493..7112b17 100644
--- a/events.c
+++ b/events.c
@@ -1,14 +1,5 @@
#include "runes.h"
-uv_loop_t *runes_loop_create(RunesTerm *t)
-{
- uv_loop_t *loop;
-
- loop = uv_default_loop();
- runes_loop_init(t, loop);
- return loop;
-}
-
void runes_handle_keyboard_event(RunesTerm *t, char *buf, size_t len)
{
runes_display_glyph(t, buf, len);
diff --git a/events.h b/events.h
index 23462d3..de4c5a4 100644
--- a/events.h
+++ b/events.h
@@ -1,12 +1,11 @@
#ifndef _RUNES_EVENTS_H
#define _RUNES_EVENTS_H
-struct loop_data {
+struct runes_loop_data {
uv_work_t req;
RunesTerm *t;
};
-uv_loop_t *runes_loop_create(RunesTerm *t);
void runes_handle_keyboard_event(RunesTerm *t, char *buf, size_t len);
void runes_handle_close_window(RunesTerm *t);
diff --git a/runes.c b/runes.c
index b1a513f..d046727 100644
--- a/runes.c
+++ b/runes.c
@@ -5,20 +5,17 @@
int main (int argc, char *argv[])
{
- RunesTerm *t;
-
- UNUSED(argc);
- UNUSED(argv);
+ RunesTerm t;
setlocale(LC_ALL, "");
- t = runes_term_create(argc, argv);
+ runes_term_init(&t, argc, argv);
- runes_display_init(t);
+ runes_display_init(&t);
- uv_run(t->loop, UV_RUN_DEFAULT);
+ uv_run(t.loop, UV_RUN_DEFAULT);
- runes_term_destroy(t);
+ runes_term_cleanup(&t);
return 0;
}
diff --git a/runes.h b/runes.h
index a3962f6..bf51186 100644
--- a/runes.h
+++ b/runes.h
@@ -6,15 +6,18 @@
struct runes_term;
struct runes_window;
+struct runes_loop_data;
typedef struct runes_term RunesTerm;
-typedef struct runes_window RunesWindow;
+typedef struct runes_window RunesWindowBackend;
+typedef struct runes_loop_data RunesLoopData;
-#include "term.h"
-#include "display.h"
#include "events.h"
-#include "xlib.h"
+#include "window-xlib.h"
+
+#include "term.h"
+#include "display.h"
#define UNUSED(x) ((void)x)
diff --git a/term.c b/term.c
index 8c23619..23e89a9 100644
--- a/term.c
+++ b/term.c
@@ -2,25 +2,18 @@
#include "runes.h"
-RunesTerm *runes_term_create(int argc, char *argv[])
+void runes_term_init(RunesTerm *t, int argc, char *argv[])
{
- RunesTerm *t;
+ t->loop = uv_default_loop();
- t = malloc(sizeof(RunesTerm));
+ runes_window_backend_init(t, argc, argv);
+ t->cr = cairo_create(runes_window_backend_surface_create(t));
- t->w = runes_window_create(argc, argv);
- t->surface = runes_surface_create(t);
- t->cr = cairo_create(t->surface);
- t->loop = runes_loop_create(t);
-
- return t;
+ runes_window_backend_loop_init(t, t->loop);
}
-void runes_term_destroy(RunesTerm *t)
+void runes_term_cleanup(RunesTerm *t)
{
cairo_destroy(t->cr);
- cairo_surface_destroy(t->surface);
- runes_window_destroy(t->w);
-
- free(t);
+ runes_window_backend_cleanup(t);
}
diff --git a/term.h b/term.h
index 68b3f9c..dc00387 100644
--- a/term.h
+++ b/term.h
@@ -2,16 +2,13 @@
#define _RUNES_TERM_H
struct runes_term {
- RunesWindow *w;
- /* RunesBuffer *buf; */
+ RunesWindowBackend w;
- cairo_surface_t *surface;
cairo_t *cr;
-
uv_loop_t *loop;
};
-RunesTerm *runes_term_create(int argc, char *argv[]);
-void runes_term_destroy(RunesTerm *t);
+void runes_term_init(RunesTerm *t, int argc, char *argv[]);
+void runes_term_cleanup(RunesTerm *t);
#endif
diff --git a/xlib.c b/window-xlib.c
index 88ee81f..ea5f61a 100644
--- a/xlib.c
+++ b/window-xlib.c
@@ -17,7 +17,7 @@ static char *atom_names[RUNES_NUM_ATOMS] = {
"UTF8_STRING"
};
-static void runes_init_wm_properties(RunesWindow *w, int argc, char *argv[])
+static void runes_init_wm_properties(RunesWindowBackend *w, int argc, char *argv[])
{
pid_t pid;
XClassHint class_hints = { "runes", "runes" };
@@ -43,13 +43,13 @@ static void runes_init_wm_properties(RunesWindow *w, int argc, char *argv[])
XChangeProperty(w->dpy, w->w, w->atoms[RUNES_ATOM_NET_WM_NAME], w->atoms[RUNES_ATOM_UTF8_STRING], 8, PropModeReplace, (unsigned char *)"runes", 5);
}
-RunesWindow *runes_window_create(int argc, char *argv[])
+void runes_window_backend_init(RunesTerm *t, int argc, char *argv[])
{
- RunesWindow *w;
+ RunesWindowBackend *w;
unsigned long white;
XIM im;
- w = malloc(sizeof(RunesWindow));
+ w = &t->w;
w->dpy = XOpenDisplay(NULL);
white = WhitePixel(w->dpy, DefaultScreen(w->dpy));
@@ -87,39 +87,41 @@ RunesWindow *runes_window_create(int argc, char *argv[])
}
runes_init_wm_properties(w, argc, argv);
-
- return w;
}
-cairo_surface_t *runes_surface_create(RunesTerm *t)
+cairo_surface_t *runes_window_backend_surface_create(RunesTerm *t)
{
+ RunesWindowBackend *w;
Visual *vis;
XWindowAttributes attrs;
- XGetWindowAttributes(t->w->dpy, t->w->w, &attrs);
- vis = DefaultVisual(t->w->dpy, DefaultScreen(t->w->dpy));
- return cairo_xlib_surface_create(t->w->dpy, t->w->w, vis, attrs.width, attrs.height);
+ w = &t->w;
+ XGetWindowAttributes(w->dpy, w->w, &attrs);
+ vis = DefaultVisual(w->dpy, DefaultScreen(w->dpy));
+ return cairo_xlib_surface_create(w->dpy, w->w, vis, attrs.width, attrs.height);
}
static void runes_get_next_event(uv_work_t *req)
{
- struct xlib_loop_data *data;
+ RunesXlibLoopData *data;
- data = (struct xlib_loop_data *)req->data;
- XNextEvent(data->data.t->w->dpy, &data->e);
+ data = (RunesXlibLoopData *)req->data;
+ XNextEvent(data->data.t->w.dpy, &data->e);
}
static void runes_process_event(uv_work_t *req, int status)
{
- struct xlib_loop_data *data;
+ RunesXlibLoopData *data;
XEvent *e;
RunesTerm *t;
+ RunesWindowBackend *w;
UNUSED(status);
- data = ((struct xlib_loop_data *)req->data);
+ data = ((RunesXlibLoopData *)req->data);
e = &data->e;
t = data->data.t;
+ w = &t->w;
if (!XFilterEvent(e, None)) {
switch (e->type) {
@@ -133,7 +135,7 @@ static void runes_process_event(uv_work_t *req, int status)
buf = malloc(len);
for (;;) {
- chars = Xutf8LookupString(t->w->ic, &e->xkey, buf, len - 1, &sym, &s);
+ chars = Xutf8LookupString(w->ic, &e->xkey, buf, len - 1, &sym, &s);
if (s == XBufferOverflow) {
len = chars + 1;
buf = realloc(buf, len);
@@ -148,13 +150,13 @@ static void runes_process_event(uv_work_t *req, int status)
}
case ClientMessage: {
Atom a = e->xclient.data.l[0];
- if (a == t->w->atoms[RUNES_ATOM_WM_DELETE_WINDOW]) {
+ if (a == w->atoms[RUNES_ATOM_WM_DELETE_WINDOW]) {
runes_handle_close_window(t);
}
- else if (a == t->w->atoms[RUNES_ATOM_NET_WM_PING]) {
- e->xclient.window = DefaultRootWindow(t->w->dpy);
+ else if (a == w->atoms[RUNES_ATOM_NET_WM_PING]) {
+ e->xclient.window = DefaultRootWindow(w->dpy);
XSendEvent(
- t->w->dpy, e->xclient.window, False,
+ w->dpy, e->xclient.window, False,
SubstructureNotifyMask | SubstructureRedirectMask,
e
);
@@ -169,34 +171,40 @@ static void runes_process_event(uv_work_t *req, int status)
if (t->loop) {
uv_queue_work(t->loop, req, runes_get_next_event, runes_process_event);
}
+ else {
+ free(req);
+ }
}
-void runes_loop_init(RunesTerm *t, uv_loop_t *loop)
+void runes_window_backend_loop_init(RunesTerm *t, uv_loop_t *loop)
{
+ RunesWindowBackend *w;
unsigned long mask;
void *data;
- XGetICValues(t->w->ic, XNFilterEvents, &mask, NULL);
- XSelectInput(t->w->dpy, t->w->w, mask|KeyPressMask|StructureNotifyMask);
- XSetICFocus(t->w->ic);
+ w = &t->w;
- data = malloc(sizeof(struct xlib_loop_data));
- ((struct loop_data *)data)->req.data = data;
- ((struct loop_data *)data)->t = t;
+ XGetICValues(w->ic, XNFilterEvents, &mask, NULL);
+ XSelectInput(w->dpy, w->w, mask|KeyPressMask|StructureNotifyMask);
+ XSetICFocus(w->ic);
+
+ data = malloc(sizeof(RunesXlibLoopData));
+ ((RunesLoopData *)data)->req.data = data;
+ ((RunesLoopData *)data)->t = t;
uv_queue_work(loop, data, runes_get_next_event, runes_process_event);
}
-void runes_window_destroy(RunesWindow *w)
+void runes_window_backend_cleanup(RunesTerm *t)
{
+ RunesWindowBackend *w;
XIM im;
+ w = &t->w;
im = XIMOfIC(w->ic);
XDestroyIC(w->ic);
XCloseIM(im);
XFreeGC(w->dpy, w->gc);
XDestroyWindow(w->dpy, w->w);
XCloseDisplay(w->dpy);
-
- free(w);
}
diff --git a/xlib.h b/window-xlib.h
index 2039f45..b611cfb 100644
--- a/xlib.h
+++ b/window-xlib.h
@@ -1,4 +1,4 @@
-#ifndef _RUNES_XLIB_H
+#ifndef _RUNES_WINDOW_XLIB_H
#define _RUNES_XLIB_H
#include <X11/Xlib.h>
@@ -23,14 +23,14 @@ struct runes_window {
Atom atoms[RUNES_NUM_ATOMS];
};
-struct xlib_loop_data {
- struct loop_data data;
+typedef struct {
+ RunesLoopData data;
XEvent e;
-};
+} RunesXlibLoopData;
-RunesWindow *runes_window_create(int argc, char *argv[]);
-cairo_surface_t *runes_surface_create(RunesTerm *t);
-void runes_loop_init(RunesTerm *t, uv_loop_t *loop);
-void runes_window_destroy(RunesWindow *w);
+void runes_window_backend_init(RunesTerm *t, int argc, char *argv[]);
+cairo_surface_t *runes_window_backend_surface_create(RunesTerm *t);
+void runes_window_backend_loop_init(RunesTerm *t, uv_loop_t *loop);
+void runes_window_backend_cleanup(RunesTerm *t);
#endif