diff options
Diffstat (limited to 'view.c')
| -rw-r--r-- | view.c | 103 |
1 files changed, 100 insertions, 3 deletions
@@ -1,9 +1,12 @@ -#include <string.h> -#include <stdlib.h> -#include <wchar.h> #include <ctype.h> #include <errno.h> #include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <wchar.h> + +#include "vis-core.h" #include "view.h" #include "text.h" #include "text-motions.h" @@ -119,6 +122,100 @@ static void selection_free(Selection*); /* set/move current cursor position to a given (line, column) pair */ static size_t cursor_set(Selection*, Line *line, int col); +void window_status_update(Vis *vis, Win *win) { + char left_parts[4][255] = { "", "", "", "" }; + char right_parts[4][32] = { "", "", "", "" }; + char left[sizeof(left_parts)+LENGTH(left_parts)*8]; + char right[sizeof(right_parts)+LENGTH(right_parts)*8]; + char status[sizeof(left)+sizeof(right)+1]; + size_t left_count = 0; + size_t right_count = 0; + + View *view = win->view; + File *file = win->file; + Text *txt = file->text; + int width = vis_window_width_get(win); + enum UiOption options = view_options_get(view); + bool focused = vis->win == win; + const char *filename = file_name_get(file); + const char *mode = vis->mode->status; + + if (focused && mode) + strcpy(left_parts[left_count++], mode); + + snprintf(left_parts[left_count++], sizeof(left_parts[0]), "%s%s%s", + filename ? filename : "[No Name]", + text_modified(txt) ? " [+]" : "", + vis_macro_recording(vis) ? " @": ""); + + int count = vis_count_get(vis); + const char *keys = buffer_content0(&vis->input_queue); + if (keys && keys[0]) + snprintf(right_parts[right_count++], sizeof(right_parts[0]), "%s", keys); + else if (count != VIS_COUNT_UNKNOWN) + snprintf(right_parts[right_count++], sizeof(right_parts[0]), "%d", count); + + int sel_count = view_selections_count(view); + if (sel_count > 1) { + Selection *s = view_selections_primary_get(view); + int sel_number = view_selections_number(s) + 1; + snprintf(right_parts[right_count++], sizeof(right_parts[0]), + "%d/%d", sel_number, sel_count); + } + + size_t size = text_size(txt); + size_t pos = view_cursor_get(view); + size_t percent = 0; + if (size > 0) { + double tmp = ((double)pos/(double)size)*100; + percent = (size_t)(tmp+1); + } + snprintf(right_parts[right_count++], sizeof(right_parts[0]), + "%zu%%", percent); + + if (!(options & UI_OPTION_LARGE_FILE)) { + Selection *sel = view_selections_primary_get(win->view); + size_t line = view_cursors_line(sel); + size_t col = view_cursors_col(sel); + if (col > UI_LARGE_FILE_LINE_SIZE) { + options |= UI_OPTION_LARGE_FILE; + view_options_set(win->view, options); + } + snprintf(right_parts[right_count++], sizeof(right_parts[0]), + "%zu, %zu", line, col); + } + + int left_len = snprintf(left, sizeof(left), " %s%s%s%s%s%s%s", + left_parts[0], + left_parts[1][0] ? " » " : "", + left_parts[1], + left_parts[2][0] ? " » " : "", + left_parts[2], + left_parts[3][0] ? " » " : "", + left_parts[3]); + + int right_len = snprintf(right, sizeof(right), "%s%s%s%s%s%s%s ", + right_parts[0], + right_parts[1][0] ? " « " : "", + right_parts[1], + right_parts[2][0] ? " « " : "", + right_parts[2], + right_parts[3][0] ? " « " : "", + right_parts[3]); + + if (left_len < 0 || right_len < 0) + return; + int left_width = text_string_width(left, left_len); + int right_width = text_string_width(right, right_len); + + int spaces = width - left_width - right_width; + if (spaces < 1) + spaces = 1; + + snprintf(status, sizeof(status), "%s%*s%s", left, spaces, " ", right); + vis_window_status(win, status); +} + void view_tabwidth_set(View *view, int tabwidth) { if (tabwidth < 1 || tabwidth > 8) return; |
