Commit 3b28df4

mo khan <mo.khan@gmail.com>
2021-01-22 04:19:06
implement fallback mechanism for determining screen size
1 parent e51265e
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;