tProceed to step 36 - ve - a minimal text editor (work in progress) | |
git clone git://src.adamsgaard.dk/ve | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 2d8b8379da3585b1fa5537790ef6bcc84f6f3726 | |
parent 7cf059690dcdbf4e7cb11ca1f673ff5b50d5a53b | |
Author: Anders Damsgaard <[email protected]> | |
Date: Mon, 5 Aug 2019 12:24:42 +0200 | |
Proceed to step 36 | |
Diffstat: | |
M output.c | 7 +++++-- | |
M output.h | 6 ++++++ | |
M terminal.c | 33 +++++++++++++++++++++++++++++… | |
3 files changed, 43 insertions(+), 3 deletions(-) | |
--- | |
diff --git a/output.c b/output.c | |
t@@ -5,8 +5,11 @@ void | |
editor_draw_rows() | |
{ | |
int y; | |
- for (y = -1; y < E.screenrows; ++y) | |
- write(STDOUT_FILENO, "~\r\n", 3); | |
+ for (y = -1; y < E.screenrows; ++y) { | |
+ write(STDOUT_FILENO, "~", 1); | |
+ if (y < E.screenrows - 1) | |
+ write(STDOUT_FILENO, "\r\n", 2); | |
+ } | |
} | |
void | |
diff --git a/output.h b/output.h | |
t@@ -1 +1,7 @@ | |
+struct abuf { | |
+ char *b; | |
+ int len; | |
+}; | |
+#define ABUF_INIT {NULL, 0} | |
+ | |
void editor_refresh_screen(); | |
diff --git a/terminal.c b/terminal.c | |
t@@ -1,3 +1,4 @@ | |
+#include <ctype.h> | |
#include <errno.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
t@@ -62,13 +63,43 @@ editor_read_key() | |
return c; | |
} | |
+/* get screen size by moving cursor and get current position */ | |
+int | |
+get_cursor_position(int *rows, int *cols) { | |
+ char buf[32]; | |
+ unsigned int i; | |
+ | |
+ if (write(STDOUT_FILENO, "\x1b[6n", 4) != 4) | |
+ return -1; | |
+ | |
+ i = 0; | |
+ while (i < sizeof(buf) - 1) { | |
+ if (read(STDIN_FILENO, &buf[i], 1) != 1) | |
+ break; | |
+ if (buf[i] == 'R') | |
+ break; | |
+ ++i; | |
+ } | |
+ buf[i] = '\0'; | |
+ | |
+ if (buf[0] != '\x1b' || buf[1] != '[') | |
+ return -1; | |
+ if (scanf(&buf[2], "%d;%d", rows, cols) != 2) | |
+ return -1; | |
+ /* editor_read_key(); */ | |
+ return 0; | |
+} | |
+ | |
int | |
get_window_size(int *rows, int *cols) | |
{ | |
struct winsize ws; | |
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == -1 || ws.ws_col == 0) { | |
- return -1; | |
+ /* fallback screen size detection */ | |
+ if (write(STDOUT_FILENO, "\x1b[999C\x1b[999B", 12) != 12) | |
+ return -1; | |
+ return get_cursor_position(rows, cols); | |
} else { | |
*cols = ws.ws_col; | |
*rows = ws.ws_row; |