aboutsummaryrefslogtreecommitdiff
path: root/terminal.c
diff options
context:
space:
mode:
Diffstat (limited to 'terminal.c')
-rw-r--r--terminal.c197
1 files changed, 124 insertions, 73 deletions
diff --git a/terminal.c b/terminal.c
index 8f5e72f..ee2942c 100644
--- a/terminal.c
+++ b/terminal.c
@@ -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);