summaryrefslogtreecommitdiff
path: root/vui.c
diff options
context:
space:
mode:
authorWormHeamer2025-12-31 00:13:42 -0500
committerWormHeamer2025-12-31 00:13:42 -0500
commitb4edb16e7611f90cd541ce470f2e16532de3aee5 (patch)
tree21c01e325b3c82dc03d3e8008b2c3619f715d29a /vui.c
parent58759488928bd626025d97325726eaf0b4db9f97 (diff)
add vui_enable(), vui_disable()
Diffstat (limited to 'vui.c')
-rw-r--r--vui.c69
1 files changed, 35 insertions, 34 deletions
diff --git a/vui.c b/vui.c
index 379fdb9..299b394 100644
--- a/vui.c
+++ b/vui.c
@@ -35,7 +35,6 @@ static void attr_chg(VuiAttr *ptr, VuiAttr to);
static inline void curs_move(unsigned *restrict ptr_x, unsigned *restrict ptr_y, unsigned dst_x, unsigned dst_y);
static void on_resized(int _);
-static void adjust_win_size(void);
static void resize_win(unsigned nw, unsigned nh);
/* buffer handling */
@@ -177,15 +176,6 @@ static void resize_win(unsigned nw, unsigned nh) {
win.height = nh;
}
-static void adjust_win_size(void) {
- unsigned w, h;
- vui_getwinsz(&w, &h);
- if (w != COLS || h != LINES) {
- resize_win(w, h);
- win.redraw_all = 1;
- }
-}
-
void vui_curs_vis(int vis) {
win.curs_vis = vis;
if (vis) {
@@ -211,14 +201,23 @@ void vui_curs_shape(VuiCursorShape sh) {
/* does sigaction allow for a context pointer? */
static void on_resized(int signo) {
(void)signo;
- adjust_win_size();
- if (win.redraw_fn) {
- win.redraw_fn(win.redraw_ctx);
- }
- vui_blit();
+ vui_redraw();
}
-void vui_init(void) {
+static void free_buf(VuiBuffer *buf) {
+ free(buf->chr);
+ free(buf->attr);
+ buf->chr = NULL;
+ buf->attr = NULL;
+ buf->width = 0;
+ buf->height = 0;
+}
+
+static inline int bchr_equiv(VuiBuffer *a, VuiBuffer *b, unsigned i) {
+ return a->chr[i] == b->chr[i] && a->attr[i] == b->attr[i];
+}
+
+void vui_enable(void) {
tcgetattr(STDIN_FILENO, &vui_tos_src);
vui_tos_raw = vui_tos_src;
vui_tos_raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
@@ -226,28 +225,30 @@ void vui_init(void) {
vui_tos_raw.c_oflag &= ~(OPOST);
vui_tos_raw.c_cflag |= (CS8);
tcsetattr(STDIN_FILENO, TCSANOW, &vui_tos_raw);
-
- /* set white:black to default */
- printf(CSI "40;37m" CSI "8]");
- vui_curs_vis(0);
- win.redraw_all = 1;
-
- adjust_win_size();
- sigaction(SIGWINCH, &(struct sigaction) { .sa_handler = on_resized }, NULL);
}
+void vui_disable(void) {
+ tcsetattr(STDIN_FILENO, TCSANOW, &vui_tos_src);
+ printf("\x1b[H\x1b[2J");
+ fflush(stdout);
+}
-static void free_buf(VuiBuffer *buf) {
- free(buf->chr);
- free(buf->attr);
- buf->chr = NULL;
- buf->attr = NULL;
- buf->width = 0;
- buf->height = 0;
+void vui_redraw(void) {
+ unsigned w, h;
+ vui_getwinsz(&w, &h);
+ if (w != COLS || h != LINES) resize_win(w, h);
+ win.redraw_all = 1;
+ if (win.redraw_fn) win.redraw_fn(win.redraw_ctx);
+ vui_blit();
}
-static inline int bchr_equiv(VuiBuffer *a, VuiBuffer *b, unsigned i) {
- return a->chr[i] == b->chr[i] && a->attr[i] == b->attr[i];
+void vui_init(void) {
+ /* set white:black to default */
+ printf(CSI "40;37m" CSI "8]");
+ vui_curs_vis(0);
+ vui_enable();
+ vui_redraw();
+ sigaction(SIGWINCH, &(struct sigaction) { .sa_handler = on_resized }, NULL);
}
void vui_fini(void) {
@@ -259,7 +260,7 @@ void vui_fini(void) {
vui_out = NULL;
vui_out_cap = 0;
printf(CSI "0m" CSI "H" CSI "2J");
- tcsetattr(STDIN_FILENO, TCSANOW, &vui_tos_src);
+ vui_disable();
}
static void vui_out_fit(size_t n) {