static UiWin *ui_window_new(Ui *ui, View *view, File *file, enum UiOption options) { UiCurses *uic = (UiCurses*)ui; UiCursesWin *win = calloc(1, sizeof(UiCursesWin)); if (!win) return NULL; win->uiwin = (UiWin) { .draw = ui_window_draw, .draw_status = ui_window_draw_status, .options_set = ui_window_options_set, .options_get = ui_window_options_get, .reload = ui_window_reload, .syntax_style = ui_window_syntax_style, }; if (!(win->win = newwin(0, 0, 0, 0))) { ui_window_free((UiWin*)win); return NULL; } for (int i = 0; i < UI_STYLE_MAX; i++) { win->styles[i] = (CellStyle) { .fg = -1, .bg = -1, .attr = A_NORMAL, }; } win->styles[UI_STYLE_CURSOR].attr |= A_REVERSE; win->styles[UI_STYLE_CURSOR_PRIMARY].attr |= A_REVERSE|A_BLINK; win->styles[UI_STYLE_SELECTION].attr |= A_REVERSE; win->styles[UI_STYLE_COLOR_COLUMN].attr |= A_REVERSE; win->ui = uic; win->view = view; win->file = file; view_ui(view, &win->uiwin); if (uic->windows) uic->windows->prev = win; win->next = uic->windows; uic->windows = win; ui_window_options_set((UiWin*)win, options); return &win->uiwin; } __attribute__((noreturn)) static void ui_die(Ui *ui, const char *msg, va_list ap) { UiCurses *uic = (UiCurses*)ui; endwin(); if (uic->termkey) termkey_stop(uic->termkey); vfprintf(stderr, msg, ap); exit(EXIT_FAILURE); }
void ui_curses_free(Ui *ui) { UiCurses *uic = (UiCurses*)ui; if (!uic) return; while (uic->windows) ui_window_free((UiWin*)uic->windows); endwin(); if (uic->termkey) termkey_destroy(uic->termkey); free(uic); }
void ui_curses_free(Ui *ui) { UiCurses *uic = (UiCurses*)ui; if (!uic) return; while (uic->windows) ui_window_free((UiWin*)uic->windows); endwin(); if (uic->termkey) termkey_destroy(uic->termkey); tcsetattr(STDERR_FILENO, TCSANOW, &uic->tio); free(uic); }