diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2015-10-15 22:21:19 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2015-10-15 22:21:19 +0200 |
| commit | f752a10702f20e49bd4da4f1400487fc96dc35f6 (patch) | |
| tree | 25fa13adb81c96fd8a6ab86b421bc8bee2c2594e | |
| parent | 4d29951b7d7f40e77617b1ce7dfec9dfb4c7e235 (diff) | |
| download | vis-f752a10702f20e49bd4da4f1400487fc96dc35f6.tar.gz vis-f752a10702f20e49bd4da4f1400487fc96dc35f6.tar.xz | |
ui: cleanup redrawing
| -rw-r--r-- | editor.c | 4 | ||||
| -rw-r--r-- | ui-curses.c | 118 | ||||
| -rw-r--r-- | ui.h | 1 | ||||
| -rw-r--r-- | view.c | 2 |
4 files changed, 61 insertions, 64 deletions
@@ -165,10 +165,10 @@ static void editor_windows_invalidate(Editor *ed, size_t start, size_t end) { Filerange view = view_viewport_get(win->view); if ((view.start <= start && start <= view.end) || (view.start <= end && end <= view.end)) - win->ui->draw(win->ui); + view_draw(win->view); } } - ed->win->ui->draw(ed->win->ui); + view_draw(ed->win->view); } int editor_tabwidth_get(Editor *ed) { diff --git a/ui-curses.c b/ui-curses.c index cd26508..55edbae 100644 --- a/ui-curses.c +++ b/ui-curses.c @@ -568,6 +568,39 @@ static void ui_window_move(UiCursesWin *win, int x, int y) { mvwin(win->winstatus, y + win->height - 1, x); } +static bool ui_window_draw_sidebar(UiCursesWin *win) { + if (!win->winside) + return true; + const Line *line = view_lines_get(win->view); + int sidebar_width = snprintf(NULL, 0, "%zd", line->lineno + win->height - 2) + 1; + if (win->sidebar_width != sidebar_width) { + win->sidebar_width = sidebar_width; + ui_window_resize(win, win->width, win->height); + ui_window_move(win, win->x, win->y); + return false; + } else { + int i = 0; + size_t prev_lineno = 0; + size_t cursor_lineno = view_cursor_getpos(win->view).line; + werase(win->winside); + for (const Line *l = line; l; l = l->next, i++) { + if (l->lineno && l->lineno != prev_lineno) { + if (win->options & UI_OPTION_LINE_NUMBERS_ABSOLUTE) { + mvwprintw(win->winside, i, 0, "%*u", sidebar_width-1, l->lineno); + } else if (win->options & UI_OPTION_LINE_NUMBERS_RELATIVE) { + size_t rel = l->lineno > cursor_lineno ? + l->lineno - cursor_lineno : + cursor_lineno - l->lineno; + mvwprintw(win->winside, i, 0, "%*u", sidebar_width-1, rel); + } + } + prev_lineno = l->lineno; + } + mvwvline(win->winside, 0, sidebar_width-1, ACS_VLINE, win->height-1); + return true; + } +} + static void ui_window_draw_status(UiWin *w) { UiCursesWin *win = (UiCursesWin*)w; if (!win->winstatus) @@ -594,9 +627,32 @@ static void ui_window_draw_status(UiWin *w) { static void ui_window_draw(UiWin *w) { UiCursesWin *win = (UiCursesWin*)w; + if (!ui_window_draw_sidebar(win)) + return; + wmove(win->win, 0, 0); + int width = view_width_get(win->view); + for (const Line *l = view_lines_get(win->view); l; l = l->next) { + for (int x = 0; x < width; x++) { + int attr = win->styles[l->cells[x].attr]; + if (l->cells[x].cursor && (win->ui->selwin == win || win->ui->prompt_win == win)) + attr = A_NORMAL | A_REVERSE; + if (l->cells[x].selected) + attr |= A_REVERSE; + wattrset(win->win, attr); + waddstr(win->win, l->cells[x].data); + } + /* try to fixup display issues, in theory we should always output a full line */ + int x, y; + getyx(win->win, y, x); + (void)y; + wattrset(win->win, A_NORMAL); + for (; 0 < x && x < width; x++) + waddstr(win->win, " "); + } + wclrtobot(win->win); + if (win->winstatus) - ui_window_draw_status((UiWin*)win); - view_draw(win->view); + ui_window_draw_status(w); } static void ui_window_reload(UiWin *w, File *file) { @@ -607,36 +663,6 @@ static void ui_window_reload(UiWin *w, File *file) { ui_window_draw(w); } -static void ui_window_draw_sidebar(UiCursesWin *win, const Line *line) { - if (!win->winside || !line) - return; - int sidebar_width = snprintf(NULL, 0, "%zd", line->lineno + win->height - 2) + 1; - if (win->sidebar_width != sidebar_width) { - win->sidebar_width = sidebar_width; - ui_window_resize(win, win->width, win->height); - ui_window_move(win, win->x, win->y); - } else { - int i = 0; - size_t prev_lineno = 0; - size_t cursor_lineno = view_cursor_getpos(win->view).line; - werase(win->winside); - for (const Line *l = line; l; l = l->next, i++) { - if (l->lineno && l->lineno != prev_lineno) { - if (win->options & UI_OPTION_LINE_NUMBERS_ABSOLUTE) { - mvwprintw(win->winside, i, 0, "%*u", sidebar_width-1, l->lineno); - } else if (win->options & UI_OPTION_LINE_NUMBERS_RELATIVE) { - size_t rel = l->lineno > cursor_lineno ? - l->lineno - cursor_lineno : - cursor_lineno - l->lineno; - mvwprintw(win->winside, i, 0, "%*u", sidebar_width-1, rel); - } - } - prev_lineno = l->lineno; - } - mvwvline(win->winside, 0, sidebar_width-1, ACS_VLINE, win->height-1); - } -} - static void ui_window_update(UiCursesWin *win) { if (win->winstatus) wnoutrefresh(win->winstatus); @@ -762,33 +788,6 @@ static void ui_window_free(UiWin *w) { free(win); } -static void ui_window_draw_text(UiWin *w, const Line *line) { - UiCursesWin *win = (UiCursesWin*)w; - wmove(win->win, 0, 0); - int width = view_width_get(win->view); - for (const Line *l = line; l; l = l->next) { - for (int x = 0; x < width; x++) { - int attr = win->styles[l->cells[x].attr]; - if (l->cells[x].cursor && (win->ui->selwin == win || win->ui->prompt_win == win)) - attr = A_NORMAL | A_REVERSE; - if (l->cells[x].selected) - attr |= A_REVERSE; - wattrset(win->win, attr); - waddstr(win->win, l->cells[x].data); - } - /* try to fixup display issues, in theory we should always output a full line */ - int x, y; - getyx(win->win, y, x); - (void)y; - wattrset(win->win, A_NORMAL); - for (; 0 < x && x < width; x++) - waddstr(win->win, " "); - } - wclrtobot(win->win); - - ui_window_draw_sidebar(win, line); -} - static void ui_window_focus(UiWin *w) { UiCursesWin *win = (UiCursesWin*)w; UiCursesWin *oldsel = win->ui->selwin; @@ -828,7 +827,6 @@ static UiWin *ui_window_new(Ui *ui, View *view, File *file) { win->uiwin = (UiWin) { .draw = ui_window_draw, .draw_status = ui_window_draw_status, - .draw_text = ui_window_draw_text, .options_set = ui_window_options_set, .options_get = ui_window_options_get, .reload = ui_window_reload, @@ -56,7 +56,6 @@ struct Ui { struct UiWin { void (*draw)(UiWin*); - void (*draw_text)(UiWin*, const Line*); void (*draw_status)(UiWin*); void (*reload)(UiWin*, File*); void (*options_set)(UiWin*, enum UiOption); @@ -519,7 +519,7 @@ void view_draw(View *view) { } if (view->ui) - view->ui->draw_text(view->ui, view->topline); + view->ui->draw(view->ui); } bool view_resize(View *view, int width, int height) { |
