diff options
Diffstat (limited to 'terminal.c')
| -rw-r--r-- | terminal.c | 197 |
1 files changed, 124 insertions, 73 deletions
@@ -20,54 +20,112 @@ typedef struct { } keyname_t; static keyname_t key_names[] = { - {KEY_SPACE, "Space"}, {KEY_BACKSPACE2, "Backspace"}, - {KEY_F1, "F1"}, {KEY_F2, "F2"}, {KEY_F3, "F3"}, {KEY_F4, "F4"}, {KEY_F5, "F5"}, - {KEY_F6, "F6"}, {KEY_F7, "F7"}, {KEY_F8, "F8"}, {KEY_F9, "F9"}, {KEY_F10, "F10"}, - {KEY_F11, "F11"}, {KEY_F12, "F12"}, - {KEY_INSERT, "Insert"}, {KEY_DELETE, "Delete"}, - {KEY_HOME, "Home"}, {KEY_END, "End"}, - {KEY_PGUP, "PgUp"}, {KEY_PGUP, "Page Up"}, - {KEY_PGDN, "PgDn"}, {KEY_PGDN, "Page Down"}, - {KEY_ARROW_UP, "Up"}, {KEY_ARROW_DOWN, "Down"}, {KEY_ARROW_LEFT, "Left"}, {KEY_ARROW_RIGHT, "Right"}, - {MOUSE_LEFT_PRESS, "Left press"}, {MOUSE_RIGHT_PRESS, "Right press"}, {MOUSE_MIDDLE_PRESS, "Middle press"}, - {MOUSE_LEFT_DRAG, "Left drag"}, {MOUSE_RIGHT_DRAG, "Right drag"}, {MOUSE_MIDDLE_DRAG, "Middle drag"}, - {MOUSE_LEFT_RELEASE, "Left click"}, {MOUSE_RIGHT_RELEASE, "Right click"}, {MOUSE_MIDDLE_RELEASE, "Middle click"}, - {MOUSE_LEFT_RELEASE, "Left up"}, {MOUSE_RIGHT_RELEASE, "Right up"}, {MOUSE_MIDDLE_RELEASE, "Middle up"}, - {MOUSE_LEFT_RELEASE, "Left release"}, {MOUSE_RIGHT_RELEASE, "Right release"}, {MOUSE_MIDDLE_RELEASE, "Middle release"}, - {MOUSE_LEFT_DOUBLE, "Double left click"}, {MOUSE_RIGHT_DOUBLE, "Double right click"}, {MOUSE_MIDDLE_DOUBLE, "Double middle click"}, - {MOUSE_WHEEL_RELEASE, "Mouse wheel up"}, {MOUSE_WHEEL_PRESS, "Mouse wheel down"}, - {KEY_TAB, "Tab"}, {KEY_ENTER, "Enter"}, {KEY_ENTER, "Return"}, - {KEY_CTRL_A, "Ctrl-a"}, {KEY_CTRL_B, "Ctrl-b"}, {KEY_CTRL_C, "Ctrl-c"}, - {KEY_CTRL_D, "Ctrl-d"}, {KEY_CTRL_E, "Ctrl-e"}, {KEY_CTRL_F, "Ctrl-f"}, - {KEY_CTRL_G, "Ctrl-g"}, {KEY_CTRL_H, "Ctrl-h"}, {KEY_CTRL_I, "Ctrl-i"}, - {KEY_CTRL_J, "Ctrl-j"}, {KEY_CTRL_K, "Ctrl-k"}, {KEY_CTRL_L, "Ctrl-l"}, - {KEY_CTRL_M, "Ctrl-m"}, {KEY_CTRL_N, "Ctrl-n"}, {KEY_CTRL_O, "Ctrl-o"}, - {KEY_CTRL_P, "Ctrl-p"}, {KEY_CTRL_Q, "Ctrl-q"}, {KEY_CTRL_R, "Ctrl-r"}, - {KEY_CTRL_S, "Ctrl-s"}, {KEY_CTRL_T, "Ctrl-t"}, {KEY_CTRL_U, "Ctrl-u"}, - {KEY_CTRL_V, "Ctrl-v"}, {KEY_CTRL_W, "Ctrl-w"}, {KEY_CTRL_X, "Ctrl-x"}, - {KEY_CTRL_Y, "Ctrl-y"}, {KEY_CTRL_Z, "Ctrl-z"}, - {KEY_ESC, "Esc"}, {KEY_ESC, "Escape"}, - {KEY_CTRL_TILDE, "Ctrl-~"}, {KEY_CTRL_BACKSLASH, "Ctrl-\\"}, - {KEY_CTRL_LSQ_BRACKET, "Ctrl-]"}, {KEY_CTRL_RSQ_BRACKET, "Ctrl-]"}, - {KEY_CTRL_UNDERSCORE, "Ctrl-_"}, {KEY_CTRL_SLASH, "Ctrl-/"}, - {KEY_CTRL_AT, "Ctrl-@"}, {KEY_CTRL_CARET, "Ctrl-^"}, + {KEY_SPACE, "Space"}, + {KEY_BACKSPACE2, "Backspace"}, + {KEY_F1, "F1"}, + {KEY_F2, "F2"}, + {KEY_F3, "F3"}, + {KEY_F4, "F4"}, + {KEY_F5, "F5"}, + {KEY_F6, "F6"}, + {KEY_F7, "F7"}, + {KEY_F8, "F8"}, + {KEY_F9, "F9"}, + {KEY_F10, "F10"}, + {KEY_F11, "F11"}, + {KEY_F12, "F12"}, + {KEY_INSERT, "Insert"}, + {KEY_DELETE, "Delete"}, + {KEY_HOME, "Home"}, + {KEY_END, "End"}, + {KEY_PGUP, "PgUp"}, + {KEY_PGUP, "Page Up"}, + {KEY_PGDN, "PgDn"}, + {KEY_PGDN, "Page Down"}, + {KEY_ARROW_UP, "Up"}, + {KEY_ARROW_DOWN, "Down"}, + {KEY_ARROW_LEFT, "Left"}, + {KEY_ARROW_RIGHT, "Right"}, + {MOUSE_LEFT_PRESS, "Left press"}, + {MOUSE_RIGHT_PRESS, "Right press"}, + {MOUSE_MIDDLE_PRESS, "Middle press"}, + {MOUSE_LEFT_DRAG, "Left drag"}, + {MOUSE_RIGHT_DRAG, "Right drag"}, + {MOUSE_MIDDLE_DRAG, "Middle drag"}, + {MOUSE_LEFT_RELEASE, "Left click"}, + {MOUSE_RIGHT_RELEASE, "Right click"}, + {MOUSE_MIDDLE_RELEASE, "Middle click"}, + {MOUSE_LEFT_RELEASE, "Left up"}, + {MOUSE_RIGHT_RELEASE, "Right up"}, + {MOUSE_MIDDLE_RELEASE, "Middle up"}, + {MOUSE_LEFT_RELEASE, "Left release"}, + {MOUSE_RIGHT_RELEASE, "Right release"}, + {MOUSE_MIDDLE_RELEASE, "Middle release"}, + {MOUSE_LEFT_DOUBLE, "Double left click"}, + {MOUSE_RIGHT_DOUBLE, "Double right click"}, + {MOUSE_MIDDLE_DOUBLE, "Double middle click"}, + {MOUSE_WHEEL_RELEASE, "Mouse wheel up"}, + {MOUSE_WHEEL_PRESS, "Mouse wheel down"}, + {KEY_TAB, "Tab"}, + {KEY_ENTER, "Enter"}, + {KEY_ENTER, "Return"}, + {KEY_CTRL_A, "Ctrl-a"}, + {KEY_CTRL_B, "Ctrl-b"}, + {KEY_CTRL_C, "Ctrl-c"}, + {KEY_CTRL_D, "Ctrl-d"}, + {KEY_CTRL_E, "Ctrl-e"}, + {KEY_CTRL_F, "Ctrl-f"}, + {KEY_CTRL_G, "Ctrl-g"}, + {KEY_CTRL_H, "Ctrl-h"}, + {KEY_CTRL_I, "Ctrl-i"}, + {KEY_CTRL_J, "Ctrl-j"}, + {KEY_CTRL_K, "Ctrl-k"}, + {KEY_CTRL_L, "Ctrl-l"}, + {KEY_CTRL_M, "Ctrl-m"}, + {KEY_CTRL_N, "Ctrl-n"}, + {KEY_CTRL_O, "Ctrl-o"}, + {KEY_CTRL_P, "Ctrl-p"}, + {KEY_CTRL_Q, "Ctrl-q"}, + {KEY_CTRL_R, "Ctrl-r"}, + {KEY_CTRL_S, "Ctrl-s"}, + {KEY_CTRL_T, "Ctrl-t"}, + {KEY_CTRL_U, "Ctrl-u"}, + {KEY_CTRL_V, "Ctrl-v"}, + {KEY_CTRL_W, "Ctrl-w"}, + {KEY_CTRL_X, "Ctrl-x"}, + {KEY_CTRL_Y, "Ctrl-y"}, + {KEY_CTRL_Z, "Ctrl-z"}, + {KEY_ESC, "Esc"}, + {KEY_ESC, "Escape"}, + {KEY_CTRL_TILDE, "Ctrl-~"}, + {KEY_CTRL_BACKSLASH, "Ctrl-\\"}, + {KEY_CTRL_LSQ_BRACKET, "Ctrl-]"}, + {KEY_CTRL_RSQ_BRACKET, "Ctrl-]"}, + {KEY_CTRL_UNDERSCORE, "Ctrl-_"}, + {KEY_CTRL_SLASH, "Ctrl-/"}, + {KEY_CTRL_AT, "Ctrl-@"}, + {KEY_CTRL_CARET, "Ctrl-^"}, {KEY_CTRL_BACKTICK, "Ctrl-`"}, - {KEY_CTRL_2, "Ctrl-2"}, {KEY_CTRL_3, "Ctrl-3"}, {KEY_CTRL_4, "Ctrl-4"}, - {KEY_CTRL_5, "Ctrl-5"}, {KEY_CTRL_6, "Ctrl-6"}, {KEY_CTRL_7, "Ctrl-7"}, - {KEY_CTRL_5, "Ctrl-8"}, {KEY_CTRL_6, "Ctrl-9"}, - {':', "Colon"}, {',', "Comma"}, + {KEY_CTRL_2, "Ctrl-2"}, + {KEY_CTRL_3, "Ctrl-3"}, + {KEY_CTRL_4, "Ctrl-4"}, + {KEY_CTRL_5, "Ctrl-5"}, + {KEY_CTRL_6, "Ctrl-6"}, + {KEY_CTRL_7, "Ctrl-7"}, + {KEY_CTRL_5, "Ctrl-8"}, + {KEY_CTRL_6, "Ctrl-9"}, + {':', "Colon"}, + {',', "Comma"}, }; -static int nextchar(int fd) -{ +static int nextchar(int fd) { char c; return read(fd, &c, 1) == 1 ? c : -1; } -static int nextnum(int fd, int c, int *n) -{ +static int nextnum(int fd, int c, int *n) { for (*n = 0; '0' <= c && c <= '9'; c = nextchar(fd)) - *n = 10*(*n) + (c - '0'); + *n = 10 * (*n) + (c - '0'); return c; } @@ -76,23 +134,20 @@ static int nextnum(int fd, int c, int *n) // If mouse_x or mouse_y are non-null and a mouse event occurs, they will be // set to the position of the mouse (0-indexed). // -int bgetkey(FILE *in, int *mouse_x, int *mouse_y) -{ +int bgetkey(FILE *in, int *mouse_x, int *mouse_y) { if (mouse_x) *mouse_x = -1; if (mouse_y) *mouse_y = -1; int fd = fileno(in); int numcode = 0, modifiers = 0; int c = nextchar(fd); - if (c == '\x1b') - goto escape; + if (c == '\x1b') goto escape; return c; - escape: +escape: c = nextchar(fd); // Actual escape key: - if (c < 0) - return KEY_ESC; + if (c < 0) return KEY_ESC; switch (c) { case '\x1b': return KEY_ESC; @@ -102,9 +157,8 @@ int bgetkey(FILE *in, int *mouse_x, int *mouse_y) default: return MOD_ALT | c; } - CSI_start: - if (c == -1) - return MOD_ALT | '['; +CSI_start: + if (c == -1) return MOD_ALT | '['; switch (c) { case 'A': return modifiers | KEY_ARROW_UP; @@ -162,7 +216,7 @@ int bgetkey(FILE *in, int *mouse_x, int *mouse_y) if (buttons & 8) modifiers |= MOD_META; if (buttons & 16) modifiers |= MOD_CTRL; int key = -1; - switch (buttons & ~(4|8|16)) { + switch (buttons & ~(4 | 8 | 16)) { case 0: key = c == 'm' ? MOUSE_LEFT_RELEASE : MOUSE_LEFT_PRESS; break; case 1: key = c == 'm' ? MOUSE_MIDDLE_RELEASE : MOUSE_MIDDLE_PRESS; break; case 2: key = c == 'm' ? MOUSE_RIGHT_RELEASE : MOUSE_RIGHT_PRESS; break; @@ -179,8 +233,8 @@ int bgetkey(FILE *in, int *mouse_x, int *mouse_y) struct timespec clicktime; clock_gettime(CLOCK_MONOTONIC, &clicktime); if (key == lastclick) { - double dt_ms = 1e3*(double)(clicktime.tv_sec - lastclicktime.tv_sec) - + 1e-6*(double)(clicktime.tv_nsec - lastclicktime.tv_nsec); + double dt_ms = 1e3 * (double)(clicktime.tv_sec - lastclicktime.tv_sec) + + 1e-6 * (double)(clicktime.tv_nsec - lastclicktime.tv_nsec); if (dt_ms < DOUBLECLICK_THRESHOLD) { switch (key) { case MOUSE_LEFT_RELEASE: key = MOUSE_LEFT_DOUBLE; break; @@ -208,10 +262,10 @@ int bgetkey(FILE *in, int *mouse_x, int *mouse_y) } return -1; - DCS: +DCS: return -1; - SS3: +SS3: switch (nextchar(fd)) { case 'P': return KEY_F1; case 'Q': return KEY_F2; @@ -225,40 +279,37 @@ int bgetkey(FILE *in, int *mouse_x, int *mouse_y) // // Populate `buf` with the name of a key. // -char *bkeyname(int key, char *buf) -{ +char *bkeyname(int key, char *buf) { if (key & MOD_META) buf = stpcpy(buf, "Super-"); if (key & MOD_CTRL) buf = stpcpy(buf, "Ctrl-"); if (key & MOD_ALT) buf = stpcpy(buf, "Alt-"); if (key & MOD_SHIFT) buf = stpcpy(buf, "Shift-"); key &= ~(MOD_META | MOD_CTRL | MOD_ALT | MOD_SHIFT); - for (size_t i = 0; i < sizeof(key_names)/sizeof(key_names[0]); i++) { + for (size_t i = 0; i < sizeof(key_names) / sizeof(key_names[0]); i++) { if (key_names[i].key == key) { return stpcpy(buf, key_names[i].name); } } - if (' ' < key && key <= '~') - return buf + sprintf(buf, "%c", key); - else - return buf + sprintf(buf, "\\x%02X", (unsigned int)key); + if (' ' < key && key <= '~') return buf + sprintf(buf, "%c", key); + else return buf + sprintf(buf, "\\x%02X", (unsigned int)key); } // // Return the key with the given name, if one exists, otherwise -1. -// (i.e. bkeywithname("Space") == ' ', bkeywithname("x") == 'x', bkeywithname("F1") == KEY_F1, bkeywithname("???") == -1) +// (i.e. bkeywithname("Space") == ' ', bkeywithname("x") == 'x', bkeywithname("F1") == KEY_F1, bkeywithname("???") == +// -1) // -int bkeywithname(const char *name) -{ +int bkeywithname(const char *name) { int modifiers = 0; - static const struct { const char *prefix; int modifier; } modnames[] = { - {"Super-", MOD_META}, {"Ctrl-", MOD_CTRL}, {"Alt-", MOD_ALT}, {"Shift-", MOD_SHIFT} - }; - check_names: - for (size_t i = 0; i < sizeof(key_names)/sizeof(key_names[0]); i++) { - if (strcmp(key_names[i].name, name) == 0) - return modifiers | key_names[i].key; + static const struct { + const char *prefix; + int modifier; + } modnames[] = {{"Super-", MOD_META}, {"Ctrl-", MOD_CTRL}, {"Alt-", MOD_ALT}, {"Shift-", MOD_SHIFT}}; +check_names: + for (size_t i = 0; i < sizeof(key_names) / sizeof(key_names[0]); i++) { + if (strcmp(key_names[i].name, name) == 0) return modifiers | key_names[i].key; } - for (size_t i = 0; i < sizeof(modnames)/sizeof(modnames[0]); i++) { + for (size_t i = 0; i < sizeof(modnames) / sizeof(modnames[0]); i++) { if (strncmp(name, modnames[i].prefix, strlen(modnames[i].prefix)) == 0) { modifiers |= modnames[i].modifier; name += strlen(modnames[i].prefix); |
