aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ui.h6
-rw-r--r--view.c58
-rw-r--r--view.h2
-rw-r--r--vis.c10
4 files changed, 37 insertions, 39 deletions
diff --git a/ui.h b/ui.h
index 1275f37..09eb7bf 100644
--- a/ui.h
+++ b/ui.h
@@ -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
diff --git a/view.c b/view.c
index 02393af..9348753 100644
--- a/view.c
+++ b/view.c
@@ -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) {
diff --git a/view.h b/view.h
index 8fbb15c..70b64d6 100644
--- a/view.h
+++ b/view.h
@@ -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*);
diff --git a/vis.c b/vis.c
index 10ba6b8..5057ab9 100644
--- a/vis.c
+++ b/vis.c
@@ -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);