Commit 3b28df4
Changed files (1)
kilo.c
@@ -61,11 +61,31 @@ char editor_read_key() {
return c;
}
+int get_cursor_position(int *rows, int *cols) {
+ char buf[32];
+ unsigned int i = 0;
+
+ if (write(STDOUT_FILENO, "\x1b[6n", 4) != 4) return -1;
+
+ 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 (sscanf(&buf[2], "%d;%d", rows, cols) != 2) return -1;
+
+ 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;
+ 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;