From 271ab508da3565dd3a333f96748518c6cd4c2a29 Mon Sep 17 00:00:00 2001 From: Tyrel Souza <923113+tyrelsouza@users.noreply.github.com> Date: Wed, 20 Oct 2021 23:37:39 -0400 Subject: [PATCH] inputs --- kilo.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 121 insertions(+), 6 deletions(-) diff --git a/kilo.c b/kilo.c index 1e7400b..59aa7ad 100644 --- a/kilo.c +++ b/kilo.c @@ -9,9 +9,21 @@ #include /** defines ***/ -#define KILO_VERSION "0.0.1" +#define TYREL_VERSION "0.0.1" #define CTRL_KEY(k) ((k) & 0x1f) +enum editorKey { + ARROW_LEFT = 1000, + ARROW_RIGHT, + ARROW_UP, + ARROW_DOWN, + DEL_KEY, + HOME_KEY, + END_KEY, + PAGE_UP, + PAGE_DOWN +}; + /*** data ***/ struct editorConfig { @@ -52,13 +64,66 @@ void enableRawMode() { if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw) == -1) die("tcsetattr"); } -char editorReadKey() { +int editorReadKey() { int nread; char c; while ((nread = read(STDIN_FILENO, &c, 1)) != 1) { if (nread == -1 && errno != EAGAIN) die("read"); } - return c; + + if (c == '\x1b') { + char seq[3]; + if (read(STDIN_FILENO, &seq[0], 1) != 1) return '\x1b'; + if (read(STDIN_FILENO, &seq[1], 1) != 1) return '\x1b'; + if (seq[0] == '[') { + if (seq[1] >= '0' && seq[1] <= '9') { + if (read(STDIN_FILENO, &seq[2], 1) != 1) return '\x1b'; + if (seq[2] == '~') { + switch (seq[1]) { + case '1': + return HOME_KEY; + case '3': + return DEL_KEY; + case '4': + return END_KEY; + case '5': + return PAGE_UP; + case '6': + return PAGE_DOWN; + case '7': + return HOME_KEY; + case '8': + return END_KEY; + } + } + } else { + switch (seq[1]) { + case 'A': + return ARROW_UP; + case 'B': + return ARROW_DOWN; + case 'C': + return ARROW_RIGHT; + case 'D': + return ARROW_LEFT; + case 'H': + return HOME_KEY; + case 'F': + return END_KEY; + } + } + } else if (seq[0] == 'O') { + switch (seq[1]) { + case 'H': + return HOME_KEY; + case 'F': + return END_KEY; + } + } + return '\x1b'; + } else { + return c; + } } int getCursorPosition(int *rows, int *cols) { @@ -116,7 +181,7 @@ void editorDrawRows(struct abuf *ab) { for (y = 0; y < E.screenrows; y++) { if (y == E.screenrows / 3) { char welcome[80]; - int welcomelen = snprintf(welcome, sizeof welcome, "Kilo Editor -- version %s", KILO_VERSION); + int welcomelen = snprintf(welcome, sizeof welcome, "Tyrel Editor -- version %s", TYREL_VERSION); int padding = (E.screencols - welcomelen) / 2; if (padding) { abAppend(ab, "~", 1); @@ -140,7 +205,10 @@ void editorRefreshScreen() { abAppend(&ab, "\x1b[?25l", 6); abAppend(&ab, "\x1b[H", 3); // Cursor Position home editorDrawRows(&ab); - abAppend(&ab, "\x1b[H", 3); // Cursor Position home + + char buf[32]; + snprintf(buf, sizeof(buf), "\x1b[%d;%dH", E.cy + 1, E.cx + 1); + abAppend(&ab, buf, strlen(buf)); abAppend(&ab, "\x1b[?25h", 6); write(STDOUT_FILENO, ab.b, ab.len); @@ -149,14 +217,61 @@ void editorRefreshScreen() { /*** input ***/ +void editorMoveCursor(int key) { + switch (key) { + case ARROW_LEFT: + if (E.cx != 0) { + E.cx--; + } + break; + case ARROW_RIGHT: + if (E.cx != E.screencols - 1) { + E.cx++; + } + break; + case ARROW_UP: + if (E.cy != 0) { + E.cy--; + } + break; + case ARROW_DOWN: + if (E.cy != E.screenrows - 1) { + E.cy++; + } + break; + } +} + void editorProcessKeypress() { - char c = editorReadKey(); + int c = editorReadKey(); switch (c) { case CTRL_KEY('q'): write(STDOUT_FILENO, "\x1b[2J", 4); write(STDOUT_FILENO, "\x1b[H", 3); exit(0); break; + + case HOME_KEY: + E.cx = 0; + break; + + case END_KEY: + E.cx = E.screencols - 1; + break; + + case PAGE_UP: + case PAGE_DOWN: { + int times = E.screenrows; + while (times--) + editorMoveCursor(c == PAGE_UP ? ARROW_UP : ARROW_DOWN); + } + break; + case ARROW_UP: + case ARROW_DOWN: + case ARROW_LEFT: + case ARROW_RIGHT: + editorMoveCursor(c); + break; } }