summaryrefslogtreecommitdiff
path: root/src/g_curses_input.c
diff options
context:
space:
mode:
authorben <benjaminfranzke@googlemail.com>2010-07-23 18:25:13 +0200
committerben <benjaminfranzke@googlemail.com>2010-07-23 18:25:13 +0200
commitcecfaca55f24f6628beb9a918b10b7ffab266535 (patch)
tree1377e23aaf26f2fe546a8fbd24e882f34299718d /src/g_curses_input.c
parent7eba2fb8fac9f45273f206516070c2ad14e1dfb9 (diff)
downloadpa-sink-ctl-cecfaca55f24f6628beb9a918b10b7ffab266535.tar.gz
pa-sink-ctl-cecfaca55f24f6628beb9a918b10b7ffab266535.tar.bz2
pa-sink-ctl-cecfaca55f24f6628beb9a918b10b7ffab266535.zip
glib curses input-event added (replacement for g_timeout)
Diffstat (limited to 'src/g_curses_input.c')
-rw-r--r--src/g_curses_input.c65
1 files changed, 65 insertions, 0 deletions
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 <curses.h>
+#include <glib.h>
+#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);
+}