From 2e102a11afe9b256f0f9cf5391faf445fd40430a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Tue, 19 Apr 2016 14:10:13 +0200 Subject: Initial import of test branch from vis repository --- util/.gitignore | 1 + util/Makefile | 23 ++++++++ util/README.md | 11 ++++ util/keys.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ util/test | 1 + 5 files changed, 197 insertions(+) create mode 100644 util/.gitignore create mode 100644 util/Makefile create mode 100644 util/README.md create mode 100644 util/keys.c create mode 100644 util/test (limited to 'util') diff --git a/util/.gitignore b/util/.gitignore new file mode 100644 index 0000000..f8e3d19 --- /dev/null +++ b/util/.gitignore @@ -0,0 +1 @@ +/keys \ No newline at end of file diff --git a/util/Makefile b/util/Makefile new file mode 100644 index 0000000..cec7b21 --- /dev/null +++ b/util/Makefile @@ -0,0 +1,23 @@ +-include ../../config.mk + +DEPS_ROOT = ../../dependency/install +DEPS_PREFIX = $(DEPS_ROOT)/usr +DEPS_LIB = $(DEPS_PREFIX)/lib +DEPS_INC = $(DEPS_PREFIX)/include + +CFLAGS_TERMKEY ?= $(shell pkg-config --cflags termkey || echo "-I/usr/local/include") +LDFLAGS_TERMKEY ?= $(shell pkg-config --libs termkey || echo "-ltermkey") + +keys: keys.c + @echo Compiling keys utility + $(CC) $(CFLAGS_TERMKEY) keys.c $(LDFLAGS_TERMKEY) -o keys + +keys-local: keys.c + @echo Compiling keys utility locally + $(CC) -I$(DEPS_INC) keys.c -L$(DEPS_LIB) $(LDFLAGS_TERMKEY) $(LDFLAGS_CURSES) -o keys + +clean: + @echo cleaning + @rm -f keys + +.PHONY: clean keys-local diff --git a/util/README.md b/util/README.md new file mode 100644 index 0000000..3425336 --- /dev/null +++ b/util/README.md @@ -0,0 +1,11 @@ +Utility to turn symbolic keys into terminal input +------------------------------------------------- + +This is a small helper utility which translates symbolic keys, as provided +by [libtermkey](http://www.leonerd.org.uk/code/libtermkey/) and also used +to specify key bindings within vis, to their corresponding codes understood +by terminal programs. + +Type `make` to build the utility. `make keys-local` links the utility against +a locally built version of libtermkey as produced by the top level `make local` +Makefile target. diff --git a/util/keys.c b/util/keys.c new file mode 100644 index 0000000..4940400 --- /dev/null +++ b/util/keys.c @@ -0,0 +1,161 @@ +#include +#include +#include +#include +#include + +static TermKey *termkey; + +static void die(const char *errstr, ...) { + va_list ap; + va_start(ap, errstr); + vfprintf(stderr, errstr, ap); + va_end(ap); + exit(EXIT_FAILURE); +} + +static void print(const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + vfprintf(stdout, fmt, ap); + fflush(stdout); + va_end(ap); +} + +static void delay(void) { + usleep(termkey_get_waittime(termkey)*10000); +} + +static void printkey(TermKeyKey *key) { + switch (key->type) { + case TERMKEY_TYPE_UNICODE: + if (key->modifiers & TERMKEY_KEYMOD_SHIFT) + ; + if (key->modifiers & TERMKEY_KEYMOD_CTRL) + key->utf8[0] &= 0x1f; + if (key->modifiers & TERMKEY_KEYMOD_ALT) + ; + print("%s", key->utf8); + break; + case TERMKEY_TYPE_FUNCTION: + break; + case TERMKEY_TYPE_KEYSYM: + switch (key->code.sym) { + case TERMKEY_SYM_UNKNOWN: + case TERMKEY_SYM_NONE: + die("Unknown key sym\n"); + case TERMKEY_SYM_BACKSPACE: + print("\b"); + break; + case TERMKEY_SYM_TAB: + if (key->modifiers & TERMKEY_KEYMOD_SHIFT) + print("\033[Z"); + else + print("\t"); + break; + case TERMKEY_SYM_ENTER: + print("\n"); + break; + case TERMKEY_SYM_ESCAPE: + print("\033"); + delay(); + break; + case TERMKEY_SYM_SPACE: + print(" "); + break; + case TERMKEY_SYM_UP: + print("\033OA"); + break; + case TERMKEY_SYM_DOWN: + print("\033OB"); + break; + case TERMKEY_SYM_RIGHT: + print("\033OC"); + break; + case TERMKEY_SYM_LEFT: + print("\033OD"); + break; + case TERMKEY_SYM_DEL: + case TERMKEY_SYM_BEGIN: + case TERMKEY_SYM_FIND: + case TERMKEY_SYM_INSERT: + case TERMKEY_SYM_DELETE: + case TERMKEY_SYM_SELECT: + case TERMKEY_SYM_PAGEUP: + case TERMKEY_SYM_PAGEDOWN: + case TERMKEY_SYM_HOME: + case TERMKEY_SYM_END: + case TERMKEY_SYM_CANCEL: + case TERMKEY_SYM_CLEAR: + case TERMKEY_SYM_CLOSE: + case TERMKEY_SYM_COMMAND: + case TERMKEY_SYM_COPY: + case TERMKEY_SYM_EXIT: + case TERMKEY_SYM_HELP: + case TERMKEY_SYM_MARK: + case TERMKEY_SYM_MESSAGE: + case TERMKEY_SYM_MOVE: + case TERMKEY_SYM_OPEN: + case TERMKEY_SYM_OPTIONS: + case TERMKEY_SYM_PRINT: + case TERMKEY_SYM_REDO: + case TERMKEY_SYM_REFERENCE: + case TERMKEY_SYM_REFRESH: + case TERMKEY_SYM_REPLACE: + case TERMKEY_SYM_RESTART: + case TERMKEY_SYM_RESUME: + case TERMKEY_SYM_SAVE: + case TERMKEY_SYM_SUSPEND: + case TERMKEY_SYM_UNDO: + case TERMKEY_SYM_KP0: + case TERMKEY_SYM_KP1: + case TERMKEY_SYM_KP2: + case TERMKEY_SYM_KP3: + case TERMKEY_SYM_KP4: + case TERMKEY_SYM_KP5: + case TERMKEY_SYM_KP6: + case TERMKEY_SYM_KP7: + case TERMKEY_SYM_KP8: + case TERMKEY_SYM_KP9: + case TERMKEY_SYM_KPENTER: + case TERMKEY_SYM_KPPLUS: + case TERMKEY_SYM_KPMINUS: + case TERMKEY_SYM_KPMULT: + case TERMKEY_SYM_KPDIV: + case TERMKEY_SYM_KPCOMMA: + case TERMKEY_SYM_KPPERIOD: + case TERMKEY_SYM_KPEQUALS: + break; + } + break; + } +} + +int main(int argc, char *argv[]) { + char buf[1024]; + FILE *file = stdin; + char *term = getenv("TERM"); + if (!term) + term = "xterm"; + if (!(termkey = termkey_new_abstract(term, TERMKEY_FLAG_UTF8))) + die("Failed to initialize libtermkey\n"); + while (fgets(buf, sizeof buf, file)) { + TermKeyKey key; + const char *keys = buf, *next; + while (*keys) { + if (*keys == '\n') { + keys++; + } else if (*keys == '<' && (next = termkey_strpkey(termkey, keys+1, &key, TERMKEY_FORMAT_VIM)) && *next == '>') { + printkey(&key); + keys = next+1; + } else if ((next = termkey_strpkey(termkey, keys, &key, TERMKEY_FORMAT_VIM))) { + printkey(&key); + keys = next; + } else { + die("Failed to parse keys: %s\n", keys); + } + } + } + + return 0; +} diff --git a/util/test b/util/test new file mode 100644 index 0000000..7a99010 --- /dev/null +++ b/util/test @@ -0,0 +1 @@ + \ No newline at end of file -- cgit v1.2.3