From cecfaca55f24f6628beb9a918b10b7ffab266535 Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 23 Jul 2010 18:25:13 +0200 Subject: glib curses input-event added (replacement for g_timeout) --- src/g_curses_input.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/g_curses_input.c (limited to 'src/g_curses_input.c') diff --git a/src/g_curses_input.c b/src/g_curses_input.c new file mode 100644 index 0000000..d84ddee --- /dev/null +++ b/src/g_curses_input.c @@ -0,0 +1,65 @@ +#include +#include +#include "interface.h" + +typedef struct _GCursesInput { + GSource source; + WINDOW *win; +} GCursesInput; + +static gboolean check(GSource *source) +{ + GCursesInput *curses_input = (GCursesInput*) source; + static int i = 0; + i++; + gint ch = wgetch(curses_input->win); + if (ch != ERR) + ungetch(ch); + return ch != ERR; +} + +static gboolean prepare(GSource *source, gint *timeout_) +{ + *timeout_ = 2; + return check(source); +} + +static gboolean dispatch(GSource *source, GSourceFunc callback, gpointer user_data) +{ + GCursesInput *curses_input = (GCursesInput*) source; + return callback((gpointer)curses_input->win) ? TRUE : FALSE; +} + +static GSourceFuncs SourceFuncs = +{ + .prepare = prepare, + .check = check, + .dispatch = dispatch, + .finalize = NULL, + .closure_callback = NULL, .closure_marshal = NULL +}; + +GSource *g_curses_input_source_new(WINDOW *win) { + GSource *source = g_source_new(&SourceFuncs, sizeof(GCursesInput)); + GCursesInput *curses_input = (GCursesInput*) source; + curses_input->win = win; + nodelay(win, TRUE); /* important! make wgetch non-blocking */ + return source; +} + +guint g_curses_input_add_full(gint priority, WINDOW *win, GSourceFunc function, gpointer data, GDestroyNotify notify) +{ + g_return_val_if_fail(function != NULL, 0); + GSource *source = g_curses_input_source_new(win); + if (priority != G_PRIORITY_DEFAULT) + g_source_set_priority (source, priority); + g_source_set_callback(source, function, data, notify); + guint id = g_source_attach(source, NULL); + g_source_unref(source); + return id; +} + +guint g_curses_input_add(WINDOW *win, GSourceFunc function, gpointer data) +{ + return g_curses_input_add_full(G_PRIORITY_DEFAULT, win, function, data, NULL); +} -- cgit