diff options
| -rw-r--r-- | vui.c | 69 | ||||
| -rw-r--r-- | vui.h | 4 |
2 files changed, 39 insertions, 34 deletions
@@ -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) { @@ -121,6 +121,10 @@ VuiWindow *vui_win(void); void vui_init(void); void vui_fini(void); +void vui_enable(void); +void vui_disable(void); + +void vui_redraw(void); void vui_blit(void); void vui_clear(void); void vui_scroll(int dx, int dy); |
