static void print_vertical_tabbar(struct window *win) { int width = vertical_tabbar_width(win); int h = win->edit_h; int i, n, cur_idx = 0; for (i = 0; i < win->views.count; i++) { if (win->view == win->views.ptrs[i]) { cur_idx = i; break; } } if (win->views.count <= h) { // all tabs fit win->first_tab_idx = 0; } else { int max_y = win->first_tab_idx + h - 1; if (win->first_tab_idx > cur_idx) win->first_tab_idx = cur_idx; if (cur_idx > max_y) win->first_tab_idx += cur_idx - max_y; } buf_reset(win->x, width, 0); n = h; if (n + win->first_tab_idx > win->views.count) n = win->views.count - win->first_tab_idx; for (i = 0; i < n; i++) { int idx = win->first_tab_idx + i; obuf.x = 0; buf_move_cursor(win->x, win->y + i); print_vertical_tab_title(win->views.ptrs[idx], idx, width); } set_builtin_color(BC_TABBAR); for (; i < h; i++) { obuf.x = 0; buf_move_cursor(win->x, win->y + i); buf_clear_eol(); } }
void update_line_numbers(struct window *win, bool force) { struct view *v = win->view; long lines = v->buffer->nl; int i, first, last; int x = win->x + vertical_tabbar_width(win); calculate_line_numbers(win); first = v->vy + 1; last = v->vy + win->edit_h; if (last > lines) last = lines; if (!force && win->line_numbers.first == first && win->line_numbers.last == last) return; win->line_numbers.first = first; win->line_numbers.last = last; buf_reset(win->x, win->w, 0); set_builtin_color(BC_LINENUMBER); for (i = 0; i < win->edit_h; i++) { int line = v->vy + i + 1; int w = win->line_numbers.width - 1; char buf[32]; if (line > lines) { snprintf(buf, sizeof(buf), "%*s ", w, ""); } else { snprintf(buf, sizeof(buf), "%*d ", w, line); } buf_move_cursor(x, win->edit_y + i); buf_add_bytes(buf, win->line_numbers.width); } }