Created a demo to show libtermkey in a GLib-based program

This commit is contained in:
Paul LeoNerd Evans 2012-04-01 20:04:01 +01:00
parent 6070de26f1
commit a29d9f0f3c
3 changed files with 79 additions and 1 deletions

View File

@ -1,6 +1,7 @@
termkey.h
demo
demo-async
demo-glib
termkey_getkey.3
termkey_waitkey.3
*.lo

View File

@ -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 $@ $^

65
demo-glib.c Normal file
View File

@ -0,0 +1,65 @@
#include <stdio.h>
#include <glib.h>
#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);
}