tGet and store screen size - ve - a minimal text editor (work in progress)
(HTM) git clone git://src.adamsgaard.dk/ve
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 7cf059690dcdbf4e7cb11ca1f673ff5b50d5a53b
(DIR) parent c477e00e088231070ea6f83ca1ad48f1b8c1ee49
(HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
Date: Mon, 5 Aug 2019 12:05:44 +0200
Get and store screen size
Diffstat:
M input.c | 3 +++
M main.c | 5 ++++-
M output.c | 15 +++++++++++++++
M terminal.c | 33 +++++++++++++++++++++++++++----
M terminal.h | 12 ++++++++++++
5 files changed, 63 insertions(+), 5 deletions(-)
---
(DIR) diff --git a/input.c b/input.c
t@@ -1,3 +1,4 @@
+#include <unistd.h>
#include <stdlib.h>
#include "terminal.h"
t@@ -9,6 +10,8 @@ editor_process_keypress()
char c = editor_read_key();
switch (c) {
case CTRL_KEY('q'):
+ write(STDOUT_FILENO, "\x1b[2J", 4);
+ write(STDOUT_FILENO, "\x1b[H", 3);
exit(0);
break;
}
(DIR) diff --git a/main.c b/main.c
t@@ -3,10 +3,13 @@
#include "input.h"
int
-main(int argc, char* argv[])
+/* main(int argc, char* argv[]) */
+main()
{
enable_raw_mode();
+ init_editor();
while (1) {
+ editor_refresh_screen();
editor_process_keypress();
}
return 0;
(DIR) diff --git a/output.c b/output.c
t@@ -1,7 +1,22 @@
#include <unistd.h>
+#include "terminal.h"
+
+void
+editor_draw_rows()
+{
+ int y;
+ for (y = -1; y < E.screenrows; ++y)
+ write(STDOUT_FILENO, "~\r\n", 3);
+}
void
editor_refresh_screen()
{
+ /* VT100 escape sequence */
+ /* http://vt100.net/docs/vt100-ug/chapter3.html */
write(STDOUT_FILENO, "\x1b[2J", 4);
+ /* http://vt100.net/docs/vt100-ug/chapter3.html#CUP */
+ write(STDOUT_FILENO, "\x1b[H", 3); /* reposition cursor to top-left */
+ editor_draw_rows();
+ write(STDOUT_FILENO, "\x1b[H", 3); /* reposition cursor to top-left */
}
(DIR) diff --git a/terminal.c b/terminal.c
t@@ -3,12 +3,17 @@
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>
+#include <sys/ioctl.h>
+#include "terminal.h"
-struct termios orig_termios;
+struct editor_config E;
void
die(const char *s)
{
+ /* clear screen on exit */
+ write(STDOUT_FILENO, "\x1b[2J", 4);
+ write(STDOUT_FILENO, "\x1b[H", 3);
perror(s);
exit(1);
}
t@@ -16,7 +21,7 @@ die(const char *s)
void
disable_raw_mode()
{
- if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios) == -1)
+ if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &E.orig_termios) == -1)
die("tcsetattr in disable_raw_mode()");
}
t@@ -25,12 +30,12 @@ enable_raw_mode()
{
struct termios raw;
- if (tcgetattr(STDIN_FILENO, &orig_termios) == -1)
+ if (tcgetattr(STDIN_FILENO, &E.orig_termios) == -1)
die("tcgetattr in enable_raw_mode()");
atexit(disable_raw_mode);
/* fix modifier keys, set 8 bits per char, ignore interrupts */
- raw = orig_termios;
+ raw = E.orig_termios;
raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
raw.c_oflag &= ~(OPOST);
raw.c_cflag |= (CS8);
t@@ -56,3 +61,23 @@ editor_read_key()
}
return c;
}
+
+int
+get_window_size(int *rows, int *cols)
+{
+ struct winsize ws;
+
+ if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == -1 || ws.ws_col == 0) {
+ return -1;
+ } else {
+ *cols = ws.ws_col;
+ *rows = ws.ws_row;
+ return 0;
+ }
+}
+
+void
+init_editor() {
+ if (get_window_size(&E.screenrows, &E.screencols) == -1)
+ die("get_window_size");
+}
(DIR) diff --git a/terminal.h b/terminal.h
t@@ -1,4 +1,16 @@
+#include <termios.h>
+
+struct editor_config {
+ int screenrows;
+ int screencols;
+ struct termios orig_termios;
+};
+
+extern struct editor_config E;
+
void die(const char *s);
void disable_raw_mode();
void enable_raw_mode();
char editor_read_key();
+int get_window_size(int *rows, int *cols);
+void init_editor();