diff --git a/.bzrignore b/.bzrignore index 3333951..030eb3c 100644 --- a/.bzrignore +++ b/.bzrignore @@ -1,6 +1,7 @@ termkey.h demo demo-async +demo-glib termkey_getkey.3 termkey_waitkey.3 *.lo diff --git a/Makefile b/Makefile index 472bada..14efe91 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,12 @@ endif OBJECTS=termkey.lo driver-csi.lo driver-ti.lo LIBRARY=libtermkey.la +DEMOS=demo demo-async + +ifeq ($(shell pkg-config glib-2.0 && echo 1),1) + DEMOS+=demo-glib +endif + TESTSOURCES=$(wildcard t/[0-9]*.c) TESTFILES=$(TESTSOURCES:.c=.t) @@ -49,7 +55,7 @@ MANDIR=$(PREFIX)/share/man MAN3DIR=$(MANDIR)/man3 MAN7DIR=$(MANDIR)/man7 -all: $(LIBRARY) demo demo-async +all: $(LIBRARY) $(DEMOS) %.lo: %.c termkey.h termkey-internal.h $(LIBTOOL) --mode=compile --tag=CC gcc $(CFLAGS) -o $@ -c $< @@ -63,6 +69,12 @@ demo: $(LIBRARY) demo.lo demo-async: $(LIBRARY) demo-async.lo $(LIBTOOL) --mode=link --tag=CC gcc -o $@ $^ +demo-glib.lo: demo-glib.c termkey.h + $(LIBTOOL) --mode=compile --tag=CC gcc -o $@ -c $< $(shell pkg-config glib-2.0 --cflags) + +demo-glib: $(LIBRARY) demo-glib.lo + $(LIBTOOL) --mode=link --tag=CC gcc -o $@ $^ $(shell pkg-config glib-2.0 --libs) + t/%.t: t/%.c $(LIBRARY) t/taplib.lo $(LIBTOOL) --mode=link --tag=CC gcc -o $@ $^ diff --git a/demo-glib.c b/demo-glib.c new file mode 100644 index 0000000..7dc8d87 --- /dev/null +++ b/demo-glib.c @@ -0,0 +1,65 @@ +#include +#include + +#include "termkey.h" + +static TermKey *tk; +static int timeout_id; + +static void on_key(TermKey *tk, TermKeyKey *key) +{ + char buffer[50]; + termkey_strfkey(tk, buffer, sizeof buffer, key, TERMKEY_FORMAT_VIM); + printf("%s\n", buffer); +} + +static gboolean key_timer(gpointer data) +{ + TermKeyKey key; + + if(termkey_getkey_force(tk, &key) == TERMKEY_RES_KEY) + on_key(tk, &key); + + return FALSE; +} + +static gboolean stdin_io(GIOChannel *source, GIOCondition condition, gpointer data) +{ + if(condition && G_IO_IN) { + if(timeout_id) + g_source_remove(timeout_id); + + termkey_advisereadable(tk); + + TermKeyResult ret; + TermKeyKey key; + while((ret = termkey_getkey(tk, &key)) == TERMKEY_RES_KEY) { + on_key(tk, &key); + } + + if(ret == TERMKEY_RES_AGAIN) + timeout_id = g_timeout_add(termkey_get_waittime(tk), key_timer, NULL); + } + + return TRUE; +} + +int main(int argc, char *argv[]) +{ + TERMKEY_CHECK_VERSION; + + tk = termkey_new(0, 0); + + if(!tk) { + fprintf(stderr, "Cannot allocate termkey instance\n"); + exit(1); + } + + GMainLoop *loop = g_main_loop_new(NULL, FALSE); + + g_io_add_watch(g_io_channel_unix_new(0), G_IO_IN, stdin_io, NULL); + + g_main_loop_run(loop); + + termkey_destroy(tk); +}