Add support to handle terminal resizing
Got stuck on a bug for a while, fix was to check for errors when using system calls. Lesson learned.
This commit is contained in:
parent
b755aad0b4
commit
c10f4a243b
4 changed files with 34 additions and 9 deletions
|
@ -4,9 +4,9 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
#include "erow.h"
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
struct erow;
|
||||||
struct buffer {
|
struct buffer {
|
||||||
char *filename;
|
char *filename;
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
#ifndef CURSOR_H
|
#ifndef CURSOR_H
|
||||||
#define CURSOR_H
|
#define CURSOR_H
|
||||||
|
|
||||||
#include "buffer.h"
|
struct buffer;
|
||||||
|
|
||||||
void cursor_move(struct buffer *buffer, int dx, int dy);
|
void cursor_move(struct buffer *buffer, int dx, int dy);
|
||||||
|
|
||||||
#endif // CURSOR_H
|
#endif // CURSOR_H
|
||||||
|
|
16
src/kilo.c
16
src/kilo.c
|
@ -1,4 +1,7 @@
|
||||||
|
#define _POSIX_C_SOURCE 199309L
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <signal.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -15,6 +18,7 @@
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
void editor_init(char *filename);
|
void editor_init(char *filename);
|
||||||
|
void editor_resize();
|
||||||
|
|
||||||
struct editor_state E;
|
struct editor_state E;
|
||||||
|
|
||||||
|
@ -39,7 +43,6 @@ void editor_init(char *filename) {
|
||||||
|
|
||||||
if (terminal_get_win_size(&E.screenrows, &E.screencols) == -1)
|
if (terminal_get_win_size(&E.screenrows, &E.screencols) == -1)
|
||||||
die("term_get_win_size");
|
die("term_get_win_size");
|
||||||
E.screenrows -= 2;
|
|
||||||
E.quit_times = 3;
|
E.quit_times = 3;
|
||||||
|
|
||||||
E.current_buf = buffer_create();
|
E.current_buf = buffer_create();
|
||||||
|
@ -48,6 +51,10 @@ void editor_init(char *filename) {
|
||||||
|
|
||||||
editor_set_message("Welcome to kilo! | CTRL-Q: Quit | CTRL-S: SAVE");
|
editor_set_message("Welcome to kilo! | CTRL-Q: Quit | CTRL-S: SAVE");
|
||||||
terminal_clear();
|
terminal_clear();
|
||||||
|
|
||||||
|
struct sigaction sa;
|
||||||
|
sa.sa_handler = editor_resize;
|
||||||
|
sigaction(SIGWINCH, &sa, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void editor_set_message(const char *fmt, ...) {
|
void editor_set_message(const char *fmt, ...) {
|
||||||
|
@ -112,3 +119,10 @@ success:
|
||||||
editor_set_message("");
|
editor_set_message("");
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void editor_resize() {
|
||||||
|
if (terminal_get_win_size(&E.screenrows, &E.screencols) == -1)
|
||||||
|
die("term_get_win_size");
|
||||||
|
|
||||||
|
ui_draw_screen();
|
||||||
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ ERRCODE terminal_get_win_size(int *row, int *col) {
|
||||||
struct winsize ws;
|
struct winsize ws;
|
||||||
|
|
||||||
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1 && ws.ws_col != 0) {
|
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) != -1 && ws.ws_col != 0) {
|
||||||
*row = ws.ws_row;
|
*row = ws.ws_row - 2;
|
||||||
*col = ws.ws_col;
|
*col = ws.ws_col;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -56,7 +56,14 @@ ERRCODE terminal_get_win_size(int *row, int *col) {
|
||||||
// Fallback implementation
|
// Fallback implementation
|
||||||
if (write(STDOUT_FILENO, "\x1b[999C\x1b[999B", 12) != 12) return -1;
|
if (write(STDOUT_FILENO, "\x1b[999C\x1b[999B", 12) != 12) return -1;
|
||||||
|
|
||||||
return terminal_get_cursor_pos(row, col);
|
int _row, _col;
|
||||||
|
ERRCODE get_err = terminal_get_cursor_pos(&_row, &_col);
|
||||||
|
if (get_err == 0) {
|
||||||
|
*row = _row - 2;
|
||||||
|
*col = _col;
|
||||||
|
}
|
||||||
|
|
||||||
|
return get_err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,8 +97,13 @@ ERRCODE terminal_set_cursor_pos(int row, int col) {
|
||||||
|
|
||||||
KEY terminal_read_key(void) {
|
KEY terminal_read_key(void) {
|
||||||
char c;
|
char c;
|
||||||
int n;
|
|
||||||
while (read(STDIN_FILENO, &c, 1) == 0);
|
ssize_t read_return = 0;
|
||||||
|
while (read_return == 0)
|
||||||
|
read_return = read(STDIN_FILENO, &c, 1);
|
||||||
|
|
||||||
|
if (read_return == -1)
|
||||||
|
return NOP;
|
||||||
|
|
||||||
if (c == '\x1b') {
|
if (c == '\x1b') {
|
||||||
char buf[8] = { '\0' };
|
char buf[8] = { '\0' };
|
||||||
|
@ -105,7 +117,7 @@ KEY terminal_read_key(void) {
|
||||||
char escape_char;
|
char escape_char;
|
||||||
int escape_int;
|
int escape_int;
|
||||||
|
|
||||||
n = 0;
|
int n = 0;
|
||||||
sscanf(buf, "[%c%n", &escape_char, &n);
|
sscanf(buf, "[%c%n", &escape_char, &n);
|
||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
switch (escape_char) {
|
switch (escape_char) {
|
||||||
|
|
Reference in a new issue