static const char *ui_getkey(Ui *ui) { UiCurses *uic = (UiCurses*)ui; TermKeyKey key; TermKeyResult ret = termkey_getkey(uic->termkey, &key); if (ret == TERMKEY_RES_EOF) { int tty = open("/dev/tty", O_RDWR); if (tty == -1) goto fatal; if (tty != STDIN_FILENO && dup2(tty, STDIN_FILENO) == -1) goto fatal; termkey_destroy(uic->termkey); if (!(uic->termkey = ui_termkey_new(STDIN_FILENO))) goto fatal; return NULL; } if (ret == TERMKEY_RES_AGAIN) { struct pollfd fd; fd.fd = STDIN_FILENO; fd.events = POLLIN; if (poll(&fd, 1, termkey_get_waittime(uic->termkey)) == 0) ret = termkey_getkey_force(uic->termkey, &key); } if (ret != TERMKEY_RES_KEY) return NULL; termkey_strfkey(uic->termkey, uic->key, sizeof(uic->key), &key, TERMKEY_FORMAT_VIM); return uic->key; fatal: ui_die_msg(ui, "Failed to re-open stdin as /dev/tty\n"); return NULL; }
static const char *ui_getkey(Ui *ui) { UiCurses *uic = (UiCurses*)ui; TermKeyKey key; TermKeyResult ret = termkey_getkey(uic->termkey, &key); if (ret == TERMKEY_RES_AGAIN) { struct pollfd fd; fd.fd = STDIN_FILENO; fd.events = POLLIN; if (poll(&fd, 1, termkey_get_waittime(uic->termkey)) == 0) ret = termkey_getkey_force(uic->termkey, &key); } if (ret != TERMKEY_RES_KEY) return NULL; termkey_strfkey(uic->termkey, uic->key, sizeof(uic->key), &key, TERMKEY_FORMAT_VIM); return uic->key; }
const char *KeyConfig::GetKeyBind(const char *context, const char *action) const { KeyBinds::const_iterator i = binds.find(context); if (i == binds.end()) return NULL; for (KeyBindContext::const_iterator j = i->second.begin(); j != i->second.end(); j++) if (!j->second.compare(action)) { TermKeyKey key = j->first; static char out[256]; termkey_strfkey(COREMANAGER->GetTermKeyHandle(), out, sizeof(out), &key, TERMKEY_FORMAT_CARETCTRL); return out; } return _("<unbound>"); }
int main(int argc, char *argv[]) { TermKey *tk; TermKeyKey key; char buffer[16]; size_t len; plan_tests(44); tk = termkey_new_abstract("vt100", 0); key.type = TERMKEY_TYPE_UNICODE; key.code.codepoint = 'A'; key.modifiers = 0; key.utf8[0] = 0; len = termkey_strfkey(tk, buffer, sizeof buffer, &key, 0); is_int(len, 1, "length for unicode/A/0"); is_str(buffer, "A", "buffer for unicode/A/0"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_WRAPBRACKET); is_int(len, 1, "length for unicode/A/0 wrapbracket"); is_str(buffer, "A", "buffer for unicode/A/0 wrapbracket"); key.type = TERMKEY_TYPE_UNICODE; key.code.codepoint = 'b'; key.modifiers = TERMKEY_KEYMOD_CTRL; key.utf8[0] = 0; len = termkey_strfkey(tk, buffer, sizeof buffer, &key, 0); is_int(len, 3, "length for unicode/b/CTRL"); is_str(buffer, "C-b", "buffer for unicode/b/CTRL"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_LONGMOD); is_int(len, 6, "length for unicode/b/CTRL longmod"); is_str(buffer, "Ctrl-b", "buffer for unicode/b/CTRL longmod"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_LONGMOD|TERMKEY_FORMAT_SPACEMOD); is_int(len, 6, "length for unicode/b/CTRL longmod|spacemod"); is_str(buffer, "Ctrl b", "buffer for unicode/b/CTRL longmod|spacemod"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_LONGMOD|TERMKEY_FORMAT_LOWERMOD); is_int(len, 6, "length for unicode/b/CTRL longmod|lowermod"); is_str(buffer, "ctrl-b", "buffer for unicode/b/CTRL longmod|lowermod"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_LONGMOD|TERMKEY_FORMAT_SPACEMOD|TERMKEY_FORMAT_LOWERMOD); is_int(len, 6, "length for unicode/b/CTRL longmod|spacemod|lowermode"); is_str(buffer, "ctrl b", "buffer for unicode/b/CTRL longmod|spacemod|lowermode"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_CARETCTRL); is_int(len, 2, "length for unicode/b/CTRL caretctrl"); is_str(buffer, "^B", "buffer for unicode/b/CTRL caretctrl"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_WRAPBRACKET); is_int(len, 5, "length for unicode/b/CTRL wrapbracket"); is_str(buffer, "<C-b>", "buffer for unicode/b/CTRL wrapbracket"); key.type = TERMKEY_TYPE_UNICODE; key.code.codepoint = 'c'; key.modifiers = TERMKEY_KEYMOD_ALT; key.utf8[0] = 0; len = termkey_strfkey(tk, buffer, sizeof buffer, &key, 0); is_int(len, 3, "length for unicode/c/ALT"); is_str(buffer, "A-c", "buffer for unicode/c/ALT"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_LONGMOD); is_int(len, 5, "length for unicode/c/ALT longmod"); is_str(buffer, "Alt-c", "buffer for unicode/c/ALT longmod"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_ALTISMETA); is_int(len, 3, "length for unicode/c/ALT altismeta"); is_str(buffer, "M-c", "buffer for unicode/c/ALT altismeta"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_LONGMOD|TERMKEY_FORMAT_ALTISMETA); is_int(len, 6, "length for unicode/c/ALT longmod|altismeta"); is_str(buffer, "Meta-c", "buffer for unicode/c/ALT longmod|altismeta"); key.type = TERMKEY_TYPE_KEYSYM; key.code.sym = TERMKEY_SYM_UP; key.modifiers = 0; len = termkey_strfkey(tk, buffer, sizeof buffer, &key, 0); is_int(len, 2, "length for sym/Up/0"); is_str(buffer, "Up", "buffer for sym/Up/0"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_WRAPBRACKET); is_int(len, 4, "length for sym/Up/0 wrapbracket"); is_str(buffer, "<Up>", "buffer for sym/Up/0 wrapbracket"); key.type = TERMKEY_TYPE_KEYSYM; key.code.sym = TERMKEY_SYM_PAGEUP; key.modifiers = 0; len = termkey_strfkey(tk, buffer, sizeof buffer, &key, 0); is_int(len, 6, "length for sym/PageUp/0"); is_str(buffer, "PageUp", "buffer for sym/PageUp/0"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_LOWERSPACE); is_int(len, 7, "length for sym/PageUp/0 lowerspace"); is_str(buffer, "page up", "buffer for sym/PageUp/0 lowerspace"); /* If size of buffer is too small, strfkey should return something consistent */ len = termkey_strfkey(tk, buffer, 4, &key, 0); is_int(len, 6, "length for sym/PageUp/0"); is_str(buffer, "Pag", "buffer of len 4 for sym/PageUp/0"); len = termkey_strfkey(tk, buffer, 4, &key, TERMKEY_FORMAT_LOWERSPACE); is_int(len, 7, "length for sym/PageUp/0 lowerspace"); is_str(buffer, "pag", "buffer of len 4 for sym/PageUp/0 lowerspace"); key.type = TERMKEY_TYPE_FUNCTION; key.code.number = 5; key.modifiers = 0; len = termkey_strfkey(tk, buffer, sizeof buffer, &key, 0); is_int(len, 2, "length for func/5/0"); is_str(buffer, "F5", "buffer for func/5/0"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_WRAPBRACKET); is_int(len, 4, "length for func/5/0 wrapbracket"); is_str(buffer, "<F5>", "buffer for func/5/0 wrapbracket"); len = termkey_strfkey(tk, buffer, sizeof buffer, &key, TERMKEY_FORMAT_LOWERSPACE); is_int(len, 2, "length for func/5/0 lowerspace"); is_str(buffer, "f5", "buffer for func/5/0 lowerspace"); termkey_destroy(tk); return exit_status(); }
/* Previous name for this function * No longer declared in termkey.h but it remains in the compiled library for * backward-compatibility reasons. */ size_t termkey_snprint_key(TermKey *tk, char *buffer, size_t len, TermKeyKey *key, TermKeyFormat format) { return termkey_strfkey(tk, buffer, len, key, format); }
int main(int argc, char *argv[]) { TERMKEY_CHECK_VERSION; int mouse = 0; int mouse_proto = 0; TermKeyFormat format = TERMKEY_FORMAT_VIM; char buffer[50]; TermKey *tk; int opt; while((opt = getopt(argc, argv, "m::p:")) != -1) { switch(opt) { case 'm': if(optarg) mouse = atoi(optarg); else mouse = 1000; break; case 'p': mouse_proto = atoi(optarg); break; default: fprintf(stderr, "Usage: %s [-m]\n", argv[0]); return 1; } } tk = termkey_new(0, TERMKEY_FLAG_SPACESYMBOL|TERMKEY_FLAG_CTRLC); if(!tk) { fprintf(stderr, "Cannot allocate termkey instance\n"); exit(1); } TermKeyResult ret; TermKeyKey key; if(mouse) { printf("\033[?%dhMouse mode active\n", mouse); if(mouse_proto) printf("\033[?%dh", mouse_proto); } while((ret = termkey_waitkey(tk, &key)) != TERMKEY_RES_EOF) { if(ret == TERMKEY_RES_KEY) { termkey_strfkey(tk, buffer, sizeof buffer, &key, format); if(key.type == TERMKEY_TYPE_MOUSE) { int line, col; termkey_interpret_mouse(tk, &key, NULL, NULL, &line, &col); printf("%s at line=%d, col=%d)\n", buffer, line, col); } else if(key.type == TERMKEY_TYPE_POSITION) { int line, col; termkey_interpret_position(tk, &key, &line, &col); printf("Cursor position report at line=%d, col=%d)\n", line, col); } else { printf("%s\n", buffer); } if(key.type == TERMKEY_TYPE_UNICODE && key.modifiers & TERMKEY_KEYMOD_CTRL && (key.code.codepoint == 'C' || key.code.codepoint == 'c')) break; if(key.type == TERMKEY_TYPE_UNICODE && key.modifiers == 0 && key.code.codepoint == '?') { printf("\033[6n"); fflush(stdout); } } else if(ret == TERMKEY_RES_ERROR) { if(errno != EINTR) { perror("termkey_waitkey"); break; } printf("Interrupted by signal\n"); } } if(mouse) printf("\033[?%dlMouse mode deactivated\n", mouse); termkey_destroy(tk); }
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); }