diff options
| -rw-r--r-- | ui.h | 6 | ||||
| -rw-r--r-- | view.c | 58 | ||||
| -rw-r--r-- | view.h | 2 | ||||
| -rw-r--r-- | vis.c | 10 |
4 files changed, 37 insertions, 39 deletions
@@ -14,9 +14,13 @@ enum UiLayout { }; enum UiOption { - UI_OPTION_LINE_NUMBERS_NONE = 0, UI_OPTION_LINE_NUMBERS_ABSOLUTE = 1 << 0, UI_OPTION_LINE_NUMBERS_RELATIVE = 1 << 1, + UI_OPTION_SYMBOL_SPACE = 1 << 2, + UI_OPTION_SYMBOL_TAB = 1 << 3, + UI_OPTION_SYMBOL_TAB_FILL = 1 << 4, + UI_OPTION_SYMBOL_EOL = 1 << 5, + UI_OPTION_SYMBOL_EOF = 1 << 6, }; #define UI_STYLES_MAX 64 @@ -68,26 +68,26 @@ struct View { Line *line; /* used while drawing view content, line where next char will be drawn */ int col; /* used while drawing view content, column where next char will be drawn */ Syntax *syntax; /* syntax highlighting definitions for this view or NULL */ - SyntaxSymbol *symbols[SYNTAX_SYMBOL_LAST]; /* symbols to use for white spaces etc */ + const SyntaxSymbol *symbols[SYNTAX_SYMBOL_LAST]; /* symbols to use for white spaces etc */ int tabwidth; /* how many spaces should be used to display a tab character */ Cursor *cursors; /* all cursors currently active */ Selection *selections; /* all selected regions */ }; -static SyntaxSymbol symbols_none[] = { - { " " }, /* spaces */ - { " " }, /* tab first cell */ - { " " }, /* tab remaining cells */ - { " " }, /* eol */ - { "~" }, /* eof */ +static const SyntaxSymbol symbols_none[] = { + [SYNTAX_SYMBOL_SPACE] = { " " }, + [SYNTAX_SYMBOL_TAB] = { " " }, + [SYNTAX_SYMBOL_TAB_FILL] = { " " }, + [SYNTAX_SYMBOL_EOL] = { " " }, + [SYNTAX_SYMBOL_EOF] = { "~" }, }; -static SyntaxSymbol symbols_default[] = { - { "\xC2\xB7" }, /* spaces */ - { "\xE2\x96\xB6" }, /* tab first cell */ - { " " }, /* tab remaining cells */ - { "\xE2\x8F\x8E" }, /* eol */ - { "~" }, /* eof */ +static const SyntaxSymbol symbols_default[] = { + [SYNTAX_SYMBOL_SPACE] = { "\xC2\xB7" }, + [SYNTAX_SYMBOL_TAB] = { "\xE2\x96\xB6" }, + [SYNTAX_SYMBOL_TAB_FILL] = { " " }, + [SYNTAX_SYMBOL_EOL] = { "\xE2\x8F\x8E" }, + [SYNTAX_SYMBOL_EOF] = { "~" }, }; static Cell cell_unused; @@ -578,7 +578,7 @@ View *view_new(Text *text, ViewEvent *events) { view->text = text; view->events = events; view->tabwidth = 8; - view_symbols_set(view, 0); + view_options_set(view, 0); if (!view_resize(view, 1, 1)) { view_free(view); @@ -851,9 +851,16 @@ Syntax *view_syntax_get(View *view) { return view->syntax; } -void view_symbols_set(View *view, int flags) { - for (int i = 0; i < LENGTH(view->symbols); i++) { - if (flags & (1 << i)) { +void view_options_set(View *view, enum UiOption options) { + int mapping[] = { + [SYNTAX_SYMBOL_SPACE] = UI_OPTION_SYMBOL_SPACE, + [SYNTAX_SYMBOL_TAB] = UI_OPTION_SYMBOL_TAB, + [SYNTAX_SYMBOL_TAB_FILL] = UI_OPTION_SYMBOL_TAB_FILL, + [SYNTAX_SYMBOL_EOL] = UI_OPTION_SYMBOL_EOL, + [SYNTAX_SYMBOL_EOF] = UI_OPTION_SYMBOL_EOF, + }; + for (int i = 0; i < LENGTH(mapping); i++) { + if (options & mapping[i]) { if (view->syntax && view->syntax->symbols[i].symbol) view->symbols[i] = &view->syntax->symbols[i]; else @@ -862,23 +869,12 @@ void view_symbols_set(View *view, int flags) { view->symbols[i] = &symbols_none[i]; } } -} - -int view_symbols_get(View *view) { - int flags = 0; - for (int i = 0; i < LENGTH(view->symbols); i++) { - if (view->symbols[i] != &symbols_none[i]) - flags |= (1 << i); - } - return flags; -} - -void view_options_set(View *view, enum UiOption options) { - view->ui->options_set(view->ui, options); + if (view->ui) + view->ui->options_set(view->ui, options); } enum UiOption view_options_get(View *view) { - return view->ui->options_get(view->ui); + return view->ui ? view->ui->options_get(view->ui) : 0; } size_t view_screenline_goto(View *view, int n) { @@ -94,8 +94,6 @@ bool view_viewport_down(View *view, int n); /* associate a set of syntax highlighting rules to this window. */ void view_syntax_set(View*, Syntax*); Syntax *view_syntax_get(View*); -void view_symbols_set(View*, int flags); -int view_symbols_get(View*); void view_options_set(View*, enum UiOption options); enum UiOption view_options_get(View*); @@ -1760,11 +1760,11 @@ static bool cmd_set(Filerange *range, enum CmdOpt cmdopt, const char *argv[]) { } char *keys[] = { "spaces", "tabs", "newlines" }; int values[] = { - 1 << SYNTAX_SYMBOL_SPACE, - (1 << SYNTAX_SYMBOL_TAB)|(1 << SYNTAX_SYMBOL_TAB_FILL), - 1 << SYNTAX_SYMBOL_EOL + UI_OPTION_SYMBOL_SPACE, + UI_OPTION_SYMBOL_TAB|UI_OPTION_SYMBOL_TAB_FILL, + UI_OPTION_SYMBOL_EOL, }; - int flags = view_symbols_get(vis->win->view); + int flags = view_options_get(vis->win->view); for (const char **args = &argv[2]; *args; args++) { for (int i = 0; i < LENGTH(keys); i++) { if (strcmp(*args, keys[i]) == 0) { @@ -1781,7 +1781,7 @@ static bool cmd_set(Filerange *range, enum CmdOpt cmdopt, const char *argv[]) { } } } - view_symbols_set(vis->win->view, flags); + view_options_set(vis->win->view, flags); break; case OPTION_NUMBER: { enum UiOption opt = view_options_get(vis->win->view); |
