/* Picks window to use for suggestion box and prepares it for displaying data. * Sets *height to number of suggestions to display. Returns picked window. */ static WINDOW * prepare_suggestion_box(int *height) { WINDOW *win; const col_attr_t col = cfg.cs.color[SUGGEST_BOX_COLOR]; const int count = vle_compl_get_count(); if((cfg.sug.flags & SF_OTHERPANE) && curr_stats.number_of_windows == 2) { win = other_view->win; *height = MIN(count, getmaxy(win)); } else { const int max_height = getmaxy(stdscr) - getmaxy(status_bar) - ui_stat_job_bar_height() - 2; *height = MIN(count, max_height); wresize(stat_win, *height, getmaxx(stdscr)); ui_stat_reposition(getmaxy(status_bar), 1); win = stat_win; } /* Clear preview before displaying suggestion for the first time for specific * input if active preview needs special cleanup. */ if(!suggestions_are_visible && curr_stats.preview.on && curr_stats.preview.cleanup_cmd != NULL) { qv_cleanup(other_view, curr_stats.preview.cleanup_cmd); } ui_set_bg(win, &col, -1); werase(win); return win; }
void ui_stat_update(view_t *view, int lazy_redraw) { if(!cfg.display_statusline || view != curr_view) { return; } /* Don't redraw anything until :restart command is finished. */ if(curr_stats.restart_in_progress) { return; } ui_stat_job_bar_check_for_updates(); if(cfg.status_line[0] == '\0') { update_stat_window_old(view, lazy_redraw); return; } const int width = getmaxx(stdscr); wresize(stat_win, 1, width); ui_set_bg(stat_win, &cfg.cs.color[STATUS_LINE_COLOR], cfg.cs.pair[STATUS_LINE_COLOR]); werase(stat_win); checked_wmove(stat_win, 0, 0); cchar_t default_attr; setcchar(&default_attr, L" ", cfg.cs.color[STATUS_LINE_COLOR].attr, cfg.cs.pair[STATUS_LINE_COLOR], NULL); LineWithAttrs result = expand_status_line_macros(view, cfg.status_line); assert(strlen(result.attrs) == utf8_strsw(result.line) && "Broken attrs!"); result.line = break_in_two(result.line, width, "%="); result.attrs = break_in_two(result.attrs, width, "="); print_with_attrs(stat_win, result.line, result.attrs, &default_attr); free(result.line); free(result.attrs); refresh_window(stat_win, lazy_redraw); }
/* Formats status line in the "old way" (before introduction of 'statusline' * option). */ static void update_stat_window_old(view_t *view, int lazy_redraw) { const dir_entry_t *const curr = get_current_entry(view); char name_buf[160*2 + 1]; char perm_buf[26]; char size_buf[64]; char id_buf[52]; int x; int cur_x; size_t print_width; char *filename; if(curr == NULL || fentry_is_fake(curr)) { werase(stat_win); refresh_window(stat_win, lazy_redraw); return; } x = getmaxx(stdscr); wresize(stat_win, 1, x); ui_set_bg(stat_win, &cfg.cs.color[STATUS_LINE_COLOR], cfg.cs.pair[STATUS_LINE_COLOR]); filename = get_current_file_name(view); print_width = utf8_strsnlen(filename, 20 + MAX(0, x - 83)); copy_str(name_buf, MIN(sizeof(name_buf), print_width + 1), filename); friendly_size_notation(fentry_get_size(view, curr), sizeof(size_buf), size_buf); get_uid_string(curr, 0, sizeof(id_buf), id_buf); if(id_buf[0] != '\0') strcat(id_buf, ":"); get_gid_string(curr, 0, sizeof(id_buf) - strlen(id_buf), id_buf + strlen(id_buf)); #ifndef _WIN32 get_perm_string(perm_buf, sizeof(perm_buf), curr->mode); #else copy_str(perm_buf, sizeof(perm_buf), attr_str_long(curr->attrs)); #endif werase(stat_win); cur_x = 2; checked_wmove(stat_win, 0, cur_x); wprint(stat_win, name_buf); cur_x += 22; if(x > 83) cur_x += x - 83; mvwaddstr(stat_win, 0, cur_x, size_buf); cur_x += 12; mvwaddstr(stat_win, 0, cur_x, perm_buf); cur_x += 11; snprintf(name_buf, sizeof(name_buf), "%d %s filtered", view->filtered, (view->filtered == 1) ? "file" : "files"); if(view->filtered > 0) mvwaddstr(stat_win, 0, x - (strlen(name_buf) + 2), name_buf); if(cur_x + strlen(id_buf) + 1 > x - (strlen(name_buf) + 2)) break_at(id_buf, ':'); if(cur_x + strlen(id_buf) + 1 > x - (strlen(name_buf) + 2)) id_buf[0] = '\0'; mvwaddstr(stat_win, 0, cur_x, id_buf); refresh_window(stat_win, lazy_redraw); }