diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-06-12 19:40:43 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-06-15 15:51:43 +0200 |
| commit | 83206fa91345d24881146f1caed88050594797e1 (patch) | |
| tree | 00e89505fa86757027593df8d0cec8e22b301f0e /view.c | |
| parent | 6a5d72f10cffb5bd2ae832c909cf75aab7db8666 (diff) | |
| download | vis-83206fa91345d24881146f1caed88050594797e1.tar.gz vis-83206fa91345d24881146f1caed88050594797e1.tar.xz | |
vis: rename uses of Cursor to Selection
Diffstat (limited to 'view.c')
| -rw-r--r-- | view.c | 589 |
1 files changed, 293 insertions, 296 deletions
@@ -43,27 +43,24 @@ typedef struct { Mark cursor; } SelectionRegion; -struct Cursor { /* cursor position */ - Mark cursor; /* other selection endpoint where it changes */ - Mark anchor; /* position where the selection was created */ - bool anchored; /* whether anchor remains fixed */ - size_t pos; /* in bytes from the start of the file */ - int row, col; /* in terms of zero based screen coordinates */ - int lastcol; /* remembered column used when moving across lines */ - Line *line; /* screen line on which cursor currently resides */ - int generation; /* used to filter out newly created cursors during iteration */ - int number; /* how many cursors are located before this one */ +struct Selection { + Mark cursor; /* other selection endpoint where it changes */ + Mark anchor; /* position where the selection was created */ + bool anchored; /* whether anchor remains fixed */ + size_t pos; /* in bytes from the start of the file */ + int row, col; /* in terms of zero based screen coordinates */ + int lastcol; /* remembered column used when moving across lines */ + Line *line; /* screen line on which cursor currently resides */ + int generation; /* used to filter out newly created cursors during iteration */ + int number; /* how many cursors are located before this one */ SelectionRegion region; /* saved selection region */ - View *view; /* associated view to which this cursor belongs */ - Cursor *prev, *next;/* previous/next cursors ordered by location at creation time */ + View *view; /* associated view to which this cursor belongs */ + Selection *prev, *next; /* previous/next cursors ordered by location at creation time */ }; -/* Viewable area, showing part of a file. Keeps track of cursors and selections. - * At all times there exists at least one cursor, which is placed in the visible viewport. - * Additional cursors can be created and positioned anywhere in the file. */ struct View { Text *text; /* underlying text management */ - UiWin *ui; + UiWin *ui; /* corresponding ui window */ Cell cell_blank; /* used for empty/blank cells */ int width, height; /* size of display area */ size_t start, end; /* currently displayed area [start, end] in bytes from the start of the file */ @@ -74,16 +71,16 @@ struct View { Line *topline; /* top of the view, first line currently shown */ Line *lastline; /* last currently used line, always <= bottomline */ Line *bottomline; /* bottom of view, might be unused if lastline < bottomline */ - Cursor *cursor; /* main cursor, always placed within the visible viewport */ - Cursor *cursor_latest; /* most recently created cursor */ - Cursor *cursor_dead;/* main cursor which was disposed, will be removed when another cursor is created */ - int cursor_count; /* how many cursors do currently exist */ + Selection *selection; /* primary selection, always placed within the visible viewport */ + Selection *selection_latest; /* most recently created cursor */ + Selection *selection_dead; /* primary cursor which was disposed, will be removed when another cursor is created */ + int selection_count; /* how many cursors do currently exist */ 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 */ 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 */ - int cursor_generation; /* used to filter out newly created cursors during iteration */ + Selection *selections; /* all cursors currently active */ + int selection_generation; /* used to filter out newly created cursors during iteration */ bool need_update; /* whether view has been redrawn */ bool large_file; /* optimize for displaying large files */ int colorcolumn; @@ -115,9 +112,9 @@ static bool view_viewport_down(View *view, int n); static void view_clear(View *view); static bool view_addch(View *view, Cell *cell); -static void view_cursors_free(Cursor *c); +static void selection_free(Selection*); /* set/move current cursor position to a given (line, column) pair */ -static size_t cursor_set(Cursor *cursor, Line *line, int col); +static size_t cursor_set(Selection*, Line *line, int col); void view_tabwidth_set(View *view, int tabwidth) { view->tabwidth = tabwidth; @@ -263,24 +260,24 @@ static bool view_addch(View *view, Cell *cell) { } } -static void cursor_to(Cursor *c, size_t pos) { - Text *txt = c->view->text; - c->cursor = text_mark_set(txt, pos); - if (!c->anchored) - c->anchor = c->cursor; - if (pos != c->pos) - c->lastcol = 0; - c->pos = pos; - if (!view_coord_get(c->view, pos, &c->line, &c->row, &c->col)) { - if (c->view->cursor == c) { - c->line = c->view->topline; - c->row = 0; - c->col = 0; +static void cursor_to(Selection *s, size_t pos) { + Text *txt = s->view->text; + s->cursor = text_mark_set(txt, pos); + if (!s->anchored) + s->anchor = s->cursor; + if (pos != s->pos) + s->lastcol = 0; + s->pos = pos; + if (!view_coord_get(s->view, pos, &s->line, &s->row, &s->col)) { + if (s->view->selection == s) { + s->line = s->view->topline; + s->row = 0; + s->col = 0; } return; } // TODO: minimize number of redraws - view_draw(c->view); + view_draw(s->view); } bool view_coord_get(View *view, size_t pos, Line **retline, int *retrow, int *retcol) { @@ -324,7 +321,7 @@ bool view_coord_get(View *view, size_t pos, Line **retline, int *retrow, int *re /* move the cursor to the character at pos bytes from the begining of the file. * if pos is not in the current viewport, redraw the view to make it visible */ void view_cursor_to(View *view, size_t pos) { - view_cursors_to(view->cursor, pos); + view_cursors_to(view->selection, pos); } /* redraw the complete with data starting from view->start bytes into the file. @@ -422,13 +419,13 @@ void view_draw(View *view) { } /* resync position of cursors within visible area */ - for (Cursor *c = view->cursors; c; c = c->next) { - size_t pos = view_cursors_pos(c); - if (!view_coord_get(view, pos, &c->line, &c->row, &c->col) && - c == view->cursor) { - c->line = view->topline; - c->row = 0; - c->col = 0; + for (Selection *s = view->selections; s; s = s->next) { + size_t pos = view_cursors_pos(s); + if (!view_coord_get(view, pos, &s->line, &s->row, &s->col) && + s == view->selection) { + s->line = view->topline; + s->row = 0; + s->col = 0; } } @@ -485,8 +482,8 @@ int view_width_get(View *view) { void view_free(View *view) { if (!view) return; - while (view->cursors) - view_cursors_free(view->cursors); + while (view->selections) + selection_free(view->selections); free(view->lines); free(view); } @@ -531,13 +528,13 @@ void view_ui(View *view, UiWin* ui) { view->ui = ui; } -static size_t cursor_set(Cursor *cursor, Line *line, int col) { +static size_t cursor_set(Selection *sel, Line *line, int col) { int row = 0; - View *view = cursor->view; + View *view = sel->view; size_t pos = view->start; /* get row number and file offset at start of the given line */ - for (Line *cur = view->topline; cur && cur != line; cur = cur->next) { - pos += cur->len; + for (Line *l = view->topline; l && l != line; l = l->next) { + pos += l->len; row++; } @@ -548,11 +545,11 @@ static size_t cursor_set(Cursor *cursor, Line *line, int col) { for (int i = 0; i < col; i++) pos += line->cells[i].len; - cursor->col = col; - cursor->row = row; - cursor->line = line; + sel->col = col; + sel->row = row; + sel->line = line; - cursor_to(cursor, pos); + cursor_to(sel, pos); return pos; } @@ -600,19 +597,19 @@ static bool view_viewport_up(View *view, int n) { } void view_redraw_top(View *view) { - Line *line = view->cursor->line; + Line *line = view->selection->line; for (Line *cur = view->topline; cur && cur != line; cur = cur->next) view->start += cur->len; view_draw(view); - view_cursor_to(view, view->cursor->pos); + view_cursor_to(view, view->selection->pos); } void view_redraw_center(View *view) { int center = view->height / 2; - size_t pos = view->cursor->pos; + size_t pos = view->selection->pos; for (int i = 0; i < 2; i++) { int linenr = 0; - Line *line = view->cursor->line; + Line *line = view->selection->line; for (Line *cur = view->topline; cur && cur != line; cur = cur->next) linenr++; if (linenr < center) { @@ -630,81 +627,81 @@ void view_redraw_center(View *view) { } void view_redraw_bottom(View *view) { - Line *line = view->cursor->line; + Line *line = view->selection->line; if (line == view->lastline) return; - size_t pos = view->cursor->pos; + size_t pos = view->selection->pos; view_viewport_up(view, view->height); while (pos >= view->end && view_viewport_down(view, 1)); - cursor_to(view->cursor, pos); + cursor_to(view->selection, pos); } size_t view_slide_up(View *view, int lines) { - Cursor *cursor = view->cursor; + Selection *sel = view->selection; if (view_viewport_down(view, lines)) { - if (cursor->line == view->topline) - cursor_set(cursor, view->topline, cursor->col); + if (sel->line == view->topline) + cursor_set(sel, view->topline, sel->col); else - view_cursor_to(view, cursor->pos); + view_cursor_to(view, sel->pos); } else { - view_screenline_down(cursor); + view_screenline_down(sel); } - return cursor->pos; + return sel->pos; } size_t view_slide_down(View *view, int lines) { - Cursor *cursor = view->cursor; - bool lastline = cursor->line == view->lastline; - size_t col = cursor->col; + Selection *sel = view->selection; + bool lastline = sel->line == view->lastline; + size_t col = sel->col; if (view_viewport_up(view, lines)) { if (lastline) - cursor_set(cursor, view->lastline, col); + cursor_set(sel, view->lastline, col); else - view_cursor_to(view, cursor->pos); + view_cursor_to(view, sel->pos); } else { - view_screenline_up(cursor); + view_screenline_up(sel); } - return cursor->pos; + return sel->pos; } size_t view_scroll_up(View *view, int lines) { - Cursor *cursor = view->cursor; + Selection *sel = view->selection; if (view_viewport_up(view, lines)) { - Line *line = cursor->line < view->lastline ? cursor->line : view->lastline; - cursor_set(cursor, line, view->cursor->col); + Line *line = sel->line < view->lastline ? sel->line : view->lastline; + cursor_set(sel, line, view->selection->col); } else { view_cursor_to(view, 0); } - return cursor->pos; + return sel->pos; } size_t view_scroll_page_up(View *view) { - Cursor *cursor = view->cursor; + Selection *sel = view->selection; if (view->start == 0) { view_cursor_to(view, 0); } else { view_cursor_to(view, view->start-1); view_redraw_bottom(view); - view_screenline_begin(cursor); + view_screenline_begin(sel); } - return cursor->pos; + return sel->pos; } size_t view_scroll_page_down(View *view) { view_scroll_down(view, view->height); - return view_screenline_begin(view->cursor); + return view_screenline_begin(view->selection); } size_t view_scroll_halfpage_up(View *view) { - Cursor *cursor = view->cursor; + Selection *sel = view->selection; if (view->start == 0) { view_cursor_to(view, 0); } else { view_cursor_to(view, view->start-1); view_redraw_center(view); - view_screenline_begin(cursor); + view_screenline_begin(sel); } - return cursor->pos; + return sel->pos; } size_t view_scroll_halfpage_down(View *view) { @@ -712,101 +709,101 @@ size_t view_scroll_halfpage_down(View *view) { size_t pos = view_scroll_down(view, view->height/2); if (pos < text_size(view->text)) view_cursor_to(view, end); - return view->cursor->pos; + return view->selection->pos; } size_t view_scroll_down(View *view, int lines) { - Cursor *cursor = view->cursor; + Selection *sel = view->selection; if (view_viewport_down(view, lines)) { - Line *line = cursor->line > view->topline ? cursor->line : view->topline; - cursor_set(cursor, line, cursor->col); + Line *line = sel->line > view->topline ? sel->line : view->topline; + cursor_set(sel, line, sel->col); } else { view_cursor_to(view, text_size(view->text)); } - return cursor->pos; + return sel->pos; } -size_t view_line_up(Cursor *cursor) { - View *view = cursor->view; - int lastcol = cursor->lastcol; +size_t view_line_up(Selection *sel) { + View *view = sel->view; + int lastcol = sel->lastcol; if (!lastcol) - lastcol = cursor->col; - size_t pos = text_line_up(cursor->view->text, cursor->pos); - bool offscreen = view->cursor == cursor && pos < view->start; - view_cursors_to(cursor, pos); + lastcol = sel->col; + size_t pos = text_line_up(sel->view->text, sel->pos); + bool offscreen = view->selection == sel && pos < view->start; + view_cursors_to(sel, pos); if (offscreen) view_redraw_top(view); - if (cursor->line) - cursor_set(cursor, cursor->line, lastcol); - cursor->lastcol = lastcol; - return cursor->pos; + if (sel->line) + cursor_set(sel, sel->line, lastcol); + sel->lastcol = lastcol; + return sel->pos; } -size_t view_line_down(Cursor *cursor) { - View *view = cursor->view; - int lastcol = cursor->lastcol; +size_t view_line_down(Selection *sel) { + View *view = sel->view; + int lastcol = sel->lastcol; if (!lastcol) - lastcol = cursor->col; - size_t pos = text_line_down(cursor->view->text, cursor->pos); - bool offscreen = view->cursor == cursor && pos > view->end; - view_cursors_to(cursor, pos); + lastcol = sel->col; + size_t pos = text_line_down(sel->view->text, sel->pos); + bool offscreen = view->selection == sel && pos > view->end; + view_cursors_to(sel, pos); if (offscreen) view_redraw_bottom(view); - if (cursor->line) - cursor_set(cursor, cursor->line, lastcol); - cursor->lastcol = lastcol; - return cursor->pos; + if (sel->line) + cursor_set(sel, sel->line, lastcol); + sel->lastcol = lastcol; + return sel->pos; } -size_t view_screenline_up(Cursor *cursor) { - if (!cursor->line) - return view_line_up(cursor); - int lastcol = cursor->lastcol; +size_t view_screenline_up(Selection *sel) { + if (!sel->line) + return view_line_up(sel); + int lastcol = sel->lastcol; if (!lastcol) - lastcol = cursor->col; - if (!cursor->line->prev) - view_scroll_up(cursor->view, 1); - if (cursor->line->prev) - cursor_set(cursor, cursor->line->prev, lastcol); - cursor->lastcol = lastcol; - return cursor->pos; -} - -size_t view_screenline_down(Cursor *cursor) { - if (!cursor->line) - return view_line_down(cursor); - int lastcol = cursor->lastcol; + lastcol = sel->col; + if (!sel->line->prev) + view_scroll_up(sel->view, 1); + if (sel->line->prev) + cursor_set(sel, sel->line->prev, lastcol); + sel->lastcol = lastcol; + return sel->pos; +} + +size_t view_screenline_down(Selection *sel) { + if (!sel->line) + return view_line_down(sel); + int lastcol = sel->lastcol; if (!lastcol) - lastcol = cursor->col; - if (!cursor->line->next && cursor->line == cursor->view->bottomline) - view_scroll_down(cursor->view, 1); - if (cursor->line->next) - cursor_set(cursor, cursor->line->next, lastcol); - cursor->lastcol = lastcol; - return cursor->pos; + lastcol = sel->col; + if (!sel->line->next && sel->line == sel->view->bottomline) + view_scroll_down(sel->view, 1); + if (sel->line->next) + cursor_set(sel, sel->line->next, lastcol); + sel->lastcol = lastcol; + return sel->pos; } -size_t view_screenline_begin(Cursor *cursor) { - if (!cursor->line) - return cursor->pos; - return cursor_set(cursor, cursor->line, 0); +size_t view_screenline_begin(Selection *sel) { + if (!sel->line) + return sel->pos; + return cursor_set(sel, sel->line, 0); } -size_t view_screenline_middle(Cursor *cursor) { - if (!cursor->line) - return cursor->pos; - return cursor_set(cursor, cursor->line, cursor->line->width / 2); +size_t view_screenline_middle(Selection *sel) { + if (!sel->line) + return sel->pos; + return cursor_set(sel, sel->line, sel->line->width / 2); } -size_t view_screenline_end(Cursor *cursor) { - if (!cursor->line) - return cursor->pos; - int col = cursor->line->width - 1; - return cursor_set(cursor, cursor->line, col >= 0 ? col : 0); +size_t view_screenline_end(Selection *sel) { + if (!sel->line) + return sel->pos; + int col = sel->line->width - 1; + return cursor_set(sel, sel->line, col >= 0 ? col : 0); } size_t view_cursor_get(View *view) { - return view_cursors_pos(view->cursor); + return view_cursors_pos(view->selection); } Line *view_lines_first(View *view) { @@ -817,12 +814,12 @@ Line *view_lines_last(View *view) { return view->lastline; } -Line *view_cursors_line_get(Cursor *c) { - return c->line; +Line *view_cursors_line_get(Selection *sel) { + return sel->line; } void view_scroll_to(View *view, size_t pos) { - view_cursors_scroll_to(view->cursor, pos); + view_cursors_scroll_to(view->selection, pos); } void view_options_set(View *view, enum UiOption options) { @@ -867,22 +864,22 @@ size_t view_screenline_goto(View *view, int n) { return pos; } -static Cursor *cursors_new(View *view, size_t pos, bool force) { - Cursor *c = calloc(1, sizeof(*c)); - if (!c) +static Selection *selections_new(View *view, size_t pos, bool force) { + Selection *s = calloc(1, sizeof(*s)); + if (!s) return NULL; - c->view = view; - c->generation = view->cursor_generation; - if (!view->cursors) { - view->cursor = c; - view->cursor_latest = c; - view->cursors = c; - view->cursor_count = 1; - return c; + s->view = view; + s->generation = view->selection_generation; + if (!view->selections) { + view->selection = s; + view->selection_latest = s; + view->selections = s; + view->selection_count = 1; + return s; } - Cursor *prev = NULL, *next = NULL; - Cursor *latest = view->cursor_latest ? view->cursor_latest : view->cursor; + Selection *prev = NULL, *next = NULL; + Selection *latest = view->selection_latest ? view->selection_latest : view->selection; size_t cur = view_cursors_pos(latest); if (pos == cur) { prev = latest; @@ -906,51 +903,51 @@ static Cursor *cursors_new(View *view, size_t pos, bool force) { if (pos == cur && !force) goto err; - for (Cursor *after = next; after; after = after->next) + for (Selection *after = next; after; after = after->next) after->number++; - c->prev = prev; - c->next = next; + s->prev = prev; + s->next = next; if (next) - next->prev = c; + next->prev = s; if (prev) { - prev->next = c; - c->number = prev->number + 1; + prev->next = s; + s->number = prev->number + 1; } else { - view->cursors = c; + view->selections = s; } - view->cursor_latest = c; - view->cursor_count++; - view_selections_dispose(view->cursor_dead); - view_cursors_to(c, pos); - return c; + view->selection_latest = s; + view->selection_count++; + view_selections_dispose(view->selection_dead); + view_cursors_to(s, pos); + return s; err: - free(c); + free(s); return NULL; } -Cursor *view_selections_new(View *view, size_t pos) { - return cursors_new(view, pos, false); +Selection *view_selections_new(View *view, size_t pos) { + return selections_new(view, pos, false); } -Cursor *view_selections_new_force(View *view, size_t pos) { - return cursors_new(view, pos, true); +Selection *view_selections_new_force(View *view, size_t pos) { + return selections_new(view, pos, true); } int view_selections_count(View *view) { - return view->cursor_count; + return view->selection_count; } -int view_selections_number(Cursor *c) { - return c->number; +int view_selections_number(Selection *sel) { + return sel->number; } int view_selections_column_count(View *view) { Text *txt = view->text; int cpl_max = 0, cpl = 0; /* cursors per line */ size_t line_prev = 0; - for (Cursor *c = view->cursors; c; c = c->next) { - size_t pos = view_cursors_pos(c); + for (Selection *sel = view->selections; sel; sel = sel->next) { + size_t pos = view_cursors_pos(sel); size_t line = text_lineno_by_pos(txt, pos); if (line == line_prev) cpl++; @@ -963,20 +960,20 @@ int view_selections_column_count(View *view) { return cpl_max; } -static Cursor *cursors_column_next(View *view, Cursor *c, int column) { +static Selection *selections_column_next(View *view, Selection *sel, int column) { size_t line_cur = 0; int column_cur = 0; Text *txt = view->text; - if (c) { - size_t pos = view_cursors_pos(c); + if (sel) { + size_t pos = view_cursors_pos(sel); line_cur = text_lineno_by_pos(txt, pos); column_cur = INT_MIN; } else { - c = view->cursors; + sel = view->selections; } - for (; c; c = c->next) { - size_t pos = view_cursors_pos(c); + for (; sel; sel = sel->next) { + size_t pos = view_cursors_pos(sel); size_t line = text_lineno_by_pos(txt, pos); if (line != line_cur) { line_cur = line; @@ -985,147 +982,147 @@ static Cursor *cursors_column_next(View *view, Cursor *c, int column) { column_cur++; } if (column == column_cur) - return c; + return sel; } return NULL; } -Cursor *view_selections_column(View *view, int column) { - return cursors_column_next(view, NULL, column); +Selection *view_selections_column(View *view, int column) { + return selections_column_next(view, NULL, column); } -Cursor *view_selections_column_next(Cursor *c, int column) { - return cursors_column_next(c->view, c, column); +Selection *view_selections_column_next(Selection *sel, int column) { + return selections_column_next(sel->view, sel, column); } -static void view_cursors_free(Cursor *c) { - if (!c) +static void selection_free(Selection *s) { + if (!s) return; - for (Cursor *after = c->next; after; after = after->next) + for (Selection *after = s->next; after; after = after->next) after->number--; - if (c->prev) - c->prev->next = c->next; - if (c->next) - c->next->prev = c->prev; - if (c->view->cursors == c) - c->view->cursors = c->next; - if (c->view->cursor == c) - c->view->cursor = c->next ? c->next : c->prev; - if (c->view->cursor_dead == c) - c->view->cursor_dead = NULL; - if (c->view->cursor_latest == c) - c->view->cursor_latest = c->prev ? c->prev : c->next; - c->view->cursor_count--; - free(c); -} - -bool view_selections_dispose(Cursor *c) { - if (!c) + if (s->prev) + s->prev->next = s->next; + if (s->next) + s->next->prev = s->prev; + if (s->view->selections == s) + s->view->selections = s->next; + if (s->view->selection == s) + s->view->selection = s->next ? s->next : s->prev; + if (s->view->selection_dead == s) + s->view->selection_dead = NULL; + if (s->view->selection_latest == s) + s->view->selection_latest = s->prev ? s->prev : s->next; + s->view->selection_count--; + free(s); +} + +bool view_selections_dispose(Selection *sel) { + if (!sel) return true; - View *view = c->view; - if (!view->cursors || !view->cursors->next) + View *view = sel->view; + if (!view->selections || !view->selections->next) return false; - view_cursors_free(c); - view_selections_primary_set(view->cursor); + selection_free(sel); + view_selections_primary_set(view->selection); return true; } -bool view_selections_dispose_force(Cursor *c) { - if (view_selections_dispose(c)) +bool view_selections_dispose_force(Selection *sel) { + if (view_selections_dispose(sel)) return true; - View *view = c->view; - if (view->cursor_dead) + View *view = sel->view; + if (view->selection_dead) return false; - view_selection_clear(c); - view->cursor_dead = c; + view_selection_clear(sel); + view->selection_dead = sel; return true; } -Cursor *view_selection_disposed(View *view) { - Cursor *c = view->cursor_dead; - view->cursor_dead = NULL; - return c; +Selection *view_selection_disposed(View *view) { + Selection *sel = view->selection_dead; + view->selection_dead = NULL; + return sel; } -Cursor *view_selections(View *view) { - view->cursor_generation++; - return view->cursors; +Selection *view_selections(View *view) { + view->selection_generation++; + return view->selections; } -Cursor *view_selections_primary_get(View *view) { - view->cursor_generation++; - return view->cursor; +Selection *view_selections_primary_get(View *view) { + view->selection_generation++; + return view->selection; } -void view_selections_primary_set(Cursor *c) { - if (!c) +void view_selections_primary_set(Selection *s) { + if (!s) return; - c->view->cursor = c; + s->view->selection = s; } -Cursor *view_selections_prev(Cursor *c) { - View *view = c->view; - for (c = c->prev; c; c = c->prev) { - if (c->generation != view->cursor_generation) - return c; +Selection *view_selections_prev(Selection *s) { + View *view = s->view; + for (s = s->prev; s; s = s->prev) { + if (s->generation != view->selection_generation) + return s; } - view->cursor_generation++; + view->selection_generation++; return NULL; } -Cursor *view_selections_next(Cursor *c) { - View *view = c->view; - for (c = c->next; c; c = c->next) { - if (c->generation != view->cursor_generation) - return c; +Selection *view_selections_next(Selection *s) { + View *view = s->view; + for (s = s->next; s; s = s->next) { + if (s->generation != view->selection_generation) + return s; } - view->cursor_generation++; + view->selection_generation++; return NULL; } -size_t view_cursors_pos(Cursor *c) { - return text_mark_get(c->view->text, c->cursor); +size_t view_cursors_pos(Selection *s) { + return text_mark_get(s->view->text, s->cursor); } -size_t view_cursors_line(Cursor *c) { - size_t pos = view_cursors_pos(c); - return text_lineno_by_pos(c->view->text, pos); +size_t view_cursors_line(Selection *s) { + size_t pos = view_cursors_pos(s); + return text_lineno_by_pos(s->view->text, pos); } -size_t view_cursors_col(Cursor *c) { - size_t pos = view_cursors_pos(c); - return text_line_char_get(c->view->text, pos) + 1; +size_t view_cursors_col(Selection *s) { + size_t pos = view_cursors_pos(s); + return text_line_char_get(s->view->text, pos) + 1; } -int view_cursors_cell_get(Cursor *c) { - return c->line ? c->col : -1; +int view_cursors_cell_get(Selection *s) { + return s->line ? s->col : -1; } -int view_cursors_cell_set(Cursor *c, int cell) { - if (!c->line || cell < 0) +int view_cursors_cell_set(Selection *s, int cell) { + if (!s->line || cell < 0) return -1; - cursor_set(c, c->line, cell); - return c->col; + cursor_set(s, s->line, cell); + return s->col; } -void view_cursors_scroll_to(Cursor *c, size_t pos) { - View *view = c->view; - if (view->cursor == c) { +void view_cursors_scroll_to(Selection *s, size_t pos) { + View *view = s->view; + if (view->selection == s) { view_draw(view); while (pos < view->start && view_viewport_up(view, 1)); while (pos > view->end && view_viewport_down(view, 1)); } - view_cursors_to(c, pos); + view_cursors_to(s, pos); } -void view_cursors_to(Cursor *c, size_t pos) { - View *view = c->view; +void view_cursors_to(Selection *s, size_t pos) { + View *view = s->view; if (pos == EPOS) return; size_t size = text_size(view->text); if (pos > size) pos = size; - if (c->view->cursor == c) { + if (s->view->selection == s) { /* make sure we redraw changes to the very first character of the window */ if (view->start == pos) view->start_last = 0; @@ -1151,27 +1148,27 @@ void view_cursors_to(Cursor *c, size_t pos) { } } - cursor_to(c, pos); + cursor_to(s, pos); } -void view_cursors_place(Cursor *c, size_t line, size_t col) { - Text *txt = c->view->text; +void view_cursors_place(Selection *s, size_t line, size_t col) { + Text *txt = s->view->text; size_t pos = text_pos_by_lineno(txt, line); pos = text_line_char_set(txt, pos, col > 0 ? col-1 : col); - view_cursors_to(c, pos); + view_cursors_to(s, pos); } -void view_selections_anchor(Cursor *c) { - c->anchored = true; +void view_selections_anchor(Selection *s) { + s->anchored = true; } -void view_selection_clear(Cursor *c) { - c->anchored = false; - c->anchor = c->cursor; - c->view->need_update = true; +void view_selection_clear(Selection *s) { + s->anchored = false; + s->anchor = s->cursor; + s->view->need_update = true; } -void view_selections_flip(Cursor *s) { +void view_selections_flip(Selection *s) { Mark temp = s->anchor; s->anchor = s->cursor; s->cursor = temp; @@ -1183,22 +1180,22 @@ bool view_selections_anchored(Selection *s) { } void view_selections_clear_all(View *view) { - for (Cursor *c = view->cursors; c; c = c->next) - view_selection_clear(c); + for (Selection *s = view->selections; s; s = s->next) + view_selection_clear(s); view_draw(view); } void view_selections_dispose_all(View *view) { - for (Cursor *c = view->cursors, *next; c; c = next) { - next = c->next; - if (c != view->cursor) - view_cursors_free(c); + for (Selection *s = view->selections, *next; s; s = next) { + next = s->next; + if (s != view->selection) + selection_free(s); } view_draw(view); } Filerange view_selection_get(View *view) { - return view_selections_get(view->cursor); + return view_selections_get(view->selection); } Filerange view_selections_get(Selection *s) { |
