From a86a4657d2deba66cd86e8f6476b8d6b8250fe88 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Wed, 16 Nov 2016 17:53:12 -0500 Subject: [PATCH] updated view to only sync to the cursor location when it moves. This will allow scrolling without moving the cursor or selection --- Welcome.md | 5 ++ inc/edit.h | 25 ++----- libedit/screen.c | 188 ----------------------------------------------- libedit/view.c | 14 ++-- xedit | Bin 0 -> 57612 bytes 5 files changed, 18 insertions(+), 214 deletions(-) create mode 100644 Welcome.md delete mode 100644 libedit/screen.c create mode 100755 xedit diff --git a/Welcome.md b/Welcome.md new file mode 100644 index 0000000..25eba9d --- /dev/null +++ b/Welcome.md @@ -0,0 +1,5 @@ +# Mouse Shortcuts + +# Keyboard Shortcuts + +# Tag Commands diff --git a/inc/edit.h b/inc/edit.h index da2bf33..bd4b3da 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -137,20 +137,16 @@ typedef struct { } Row; typedef struct { - //size_t posx; - //size_t posy; - //size_t height; - //size_t width; - size_t nrows; /* number of rows in the view */ - size_t ncols; /* number of columns in the view */ - Row** rows; /* array of row data structures */ - Buf buffer; /* the buffer used to populate the view */ - Sel selection; /* range of currently selected text */ + bool sync_needed; /* determines whether the view needs to be synced with cursor */ + size_t nrows; /* number of rows in the view */ + size_t ncols; /* number of columns in the view */ + Row** rows; /* array of row data structures */ + Buf buffer; /* the buffer used to populate the view */ + Sel selection; /* range of currently selected text */ } View; void view_init(View* view, char* file); void view_resize(View* view, size_t nrows, size_t ncols); -//void view_resize(View* view, size_t x, size_t y, size_t height, size_t width, size_t fheight, size_t fwidth); void view_update(View* view, size_t* csrx, size_t* csry); Row* view_getrow(View* view, size_t row); void view_byrune(View* view, int move); @@ -165,15 +161,6 @@ void view_insert(View* view, Rune rune); //size_t view_setcell(View* view, size_t row, size_t col, uint32_t attr, Rune r); //UGlyph* view_getglyph(View* view, size_t row, size_t col, size_t* scrwidth); -void screen_update(Buf* buf, unsigned crsr, unsigned* csrx, unsigned* csry); -unsigned screen_getoff(Buf* buf, unsigned pos, unsigned row, unsigned col); -void screen_setsize(Buf* buf, unsigned nrows, unsigned ncols); -void screen_getsize(unsigned* nrows, unsigned* ncols); -Row* screen_getrow(unsigned row); -void screen_clearrow(unsigned row); -unsigned screen_setcell(unsigned row, unsigned col, uint32_t attr, Rune r); -UGlyph* screen_getglyph(unsigned row, unsigned col, unsigned* scrwidth); - /* Command Executions *****************************************************************************/ typedef struct { diff --git a/libedit/screen.c b/libedit/screen.c deleted file mode 100644 index cd1c3ae..0000000 --- a/libedit/screen.c +++ /dev/null @@ -1,188 +0,0 @@ -#include -#include -#include - -static unsigned NumRows = 0; -static unsigned NumCols = 0; -static Row** Rows; - -#define ATTR_NORMAL (CLR_BASE03 << 8 | CLR_BASE0) -#define ATTR_SELECTED (CLR_BASE0 << 8 | CLR_BASE03) - -static unsigned fill_row(Buf* buf, unsigned row, unsigned pos) { - screen_getrow(row)->off = pos; - screen_clearrow(row); - for (unsigned x = 0; x < NumCols;) { - uint32_t attr = (SelBeg <= pos && pos < SelEnd ? ATTR_SELECTED : ATTR_NORMAL); - Rune r = buf_get(buf, pos++); - x += screen_setcell(row, x, attr, r); - if (buf_iseol(buf, pos-1)) break; - } - return pos; -} - -static void screen_reflow(Buf* buf) { - unsigned pos = Rows[0]->off; - for (unsigned y = 0; y < NumRows; y++) - pos = fill_row(buf, y, pos); -} - -void screen_setsize(Buf* buf, unsigned nrows, unsigned ncols) { - if (NumRows == nrows && NumCols == ncols) return; - /* free the old row data */ - if (Rows) { - for (unsigned i = 0; i < NumRows; i++) - free(Rows[i]); - free(Rows); - } - /* create the new row data */ - Rows = calloc(nrows, sizeof(Row*)); - for (unsigned i = 0; i < nrows; i++) - Rows[i] = calloc(1, sizeof(Row) + (ncols * sizeof(UGlyph))); - /* update dimensions */ - NumRows = nrows; - NumCols = ncols; - /* populate the screen buffer */ - screen_reflow(buf); -} - -unsigned screen_getoff(Buf* buf, unsigned pos, unsigned row, unsigned col) { - Row* scrrow = screen_getrow(row); - if (!scrrow) return pos; - pos = scrrow->off; - if (col > scrrow->len) { - pos = (scrrow->off + scrrow->rlen - 1); - } else { - /* multi column runes are followed by \0 slots so if we clicked on a \0 - slot, slide backwards to the real rune. */ - for (; !scrrow->cols[col].rune && col > 0; col--); - /* now lets count the number of runes up to the one we clicked on */ - for (unsigned i = 0; i < col; i++) - if (scrrow->cols[i].rune) - pos++; - } - if (pos >= buf_end(buf)) - return buf_end(buf)-1; - return pos; -} - -void screen_getsize(unsigned* nrows, unsigned* ncols) { - *nrows = NumRows, *ncols = NumCols; -} - -Row* screen_getrow(unsigned row) { - return (row < NumRows ? Rows[row] : NULL); -} - -void screen_clearrow(unsigned row) { - Row* scrrow = screen_getrow(row); - if (!scrrow) return; - for (unsigned i = 0; i < NumCols; i++) - scrrow->cols[i].rune = (Rune)' '; - scrrow->rlen = 0; - scrrow->len = 0; -} - -unsigned screen_setcell(unsigned row, unsigned col, uint32_t attr, Rune r) { - if (row >= NumRows || col >= NumCols) return 0; - Row* scrrow = screen_getrow(row); - int ncols = runewidth(col, r); - /* write the rune to the screen buf */ - scrrow->cols[col].attr = attr; - if (r == '\t' || r == '\n' || r == RUNE_CRLF) - scrrow->cols[col].rune = ' '; - else - scrrow->cols[col].rune = r; - /* Update lengths */ - scrrow->rlen += 1; - for (int i = 1; i < ncols; i++) { - scrrow->cols[col].attr = attr; - scrrow->cols[col+i].rune = '\0'; - } - if ((col + ncols) > scrrow->len) - scrrow->len = col + ncols; - return ncols; -} - -UGlyph* screen_getglyph(unsigned row, unsigned col, unsigned* scrwidth) { - if (row >= NumRows || col >= NumCols) return 0; - Row* scrrow = screen_getrow(row); - UGlyph* glyph = &(scrrow->cols[col]); - *scrwidth = 1; - for (col++; !scrrow->cols[col].rune; col++) - *scrwidth += 1; - return glyph; -} - -static unsigned prev_screen_line(Buf* buf, unsigned bol, unsigned off) { - unsigned pos = bol; - while (true) { - unsigned x; - for (x = 0; x < NumCols && (pos + x) < off; x++) - x += runewidth(x, buf_get(buf, pos+x)); - if ((pos + x) >= off) break; - pos += x; - } - return pos; -} - -static void scroll_up(Buf* buf, unsigned csr, unsigned first) { - while (csr < first) { - unsigned bol = buf_bol(buf, first); - unsigned prevln = (first == bol ? buf_byline(buf, bol, -1) : bol); - prevln = prev_screen_line(buf, prevln, first); - /* delete the last row and shift the others */ - free(Rows[NumRows - 1]); - memmove(&Rows[1], &Rows[0], sizeof(Row*) * (NumRows-1)); - Rows[0] = calloc(1, sizeof(Row) + (NumCols * sizeof(UGlyph))); - Rows[0]->off = prevln; - /* fill in row content */ - fill_row(buf, 0, Rows[0]->off); - first = Rows[0]->off; - } -} - -static void scroll_dn(Buf* buf, unsigned csr, unsigned last) { - while (csr > last) { - /* delete the first row and shift the others */ - free(Rows[0]); - memmove(&Rows[0], &Rows[1], sizeof(Row*) * (NumRows-1)); - Rows[NumRows-1] = calloc(1, sizeof(Row) + (NumCols * sizeof(UGlyph))); - Rows[NumRows-1]->off = (Rows[NumRows-2]->off + Rows[NumRows-2]->rlen); - /* fill in row content */ - fill_row(buf, NumRows-1, Rows[NumRows-1]->off); - last = Rows[NumRows-1]->off + Rows[NumRows-1]->rlen - 1; - } -} - -static void sync_view(Buf* buf, unsigned csr) { - unsigned first = Rows[0]->off; - unsigned last = Rows[NumRows-1]->off + Rows[NumRows-1]->rlen - 1; - if (csr < first) { - scroll_up(buf, csr, first); - } else if (csr > last) { - scroll_dn(buf, csr, last); - } -} - -void screen_update(Buf* buf, unsigned csr, unsigned* csrx, unsigned* csry) { - /* scroll the view and reflow the screen lines */ - sync_view(buf, csr); - screen_reflow(buf); - /* find the cursor on the new screen */ - for (unsigned y = 0; y < NumRows; y++) { - unsigned start = Rows[y]->off; - unsigned end = Rows[y]->off + Rows[y]->rlen - 1; - if (start <= csr && csr <= end) { - unsigned pos = start; - for (unsigned x = 0; x < NumCols;) { - if (pos == csr) { - *csry = y, *csrx = x; - break; - } - x += runewidth(x, buf_get(buf,pos++)); - } - break; - } - } -} diff --git a/libedit/view.c b/libedit/view.c index 3b5f8ff..29917aa 100644 --- a/libedit/view.c +++ b/libedit/view.c @@ -121,6 +121,7 @@ static void sync_view(View* view, size_t csr) { } else if (csr > last) { scroll_dn(view, csr, last); } + view->sync_needed = false; } static size_t getoffset(View* view, size_t row, size_t col) { @@ -168,16 +169,14 @@ void view_resize(View* view, size_t nrows, size_t ncols) { view->rows[0]->off = off; view->nrows = nrows; view->ncols = ncols; - /* populate the screen buffer */ - reflow(view); - sync_view(view, view->selection.end); } void view_update(View* view, size_t* csrx, size_t* csry) { size_t csr = view->selection.end; /* scroll the view and reflow the screen lines */ - sync_view(view, view->selection.end); reflow(view); + if (view->sync_needed) + sync_view(view, csr); /* find the cursor on the new screen */ for (size_t y = 0; y < view->nrows; y++) { size_t start = view->rows[y]->off; @@ -205,7 +204,7 @@ void view_byrune(View* view, int move) { sel.beg = sel.end = buf_byrune(&(view->buffer), sel.end, move); sel.col = buf_getcol(&(view->buffer), sel.end); view->selection = sel; - sync_view(view, view->selection.end); + view->sync_needed = true; } void view_byline(View* view, int move) { @@ -213,7 +212,7 @@ void view_byline(View* view, int move) { sel.beg = sel.end = buf_byline(&(view->buffer), sel.end, move); sel.beg = sel.end = buf_setcol(&(view->buffer), sel.end, sel.col); view->selection = sel; - sync_view(view, view->selection.end); + view->sync_needed = true; } void view_setcursor(View* view, size_t row, size_t col) { @@ -242,7 +241,7 @@ void view_insert(View* view, Rune rune) { } view->selection.beg = view->selection.end; view->selection.col = buf_getcol(&(view->buffer), view->selection.end); - sync_view(view, view->selection.end); + view->sync_needed = true; } void view_delete(View* view) { @@ -252,4 +251,5 @@ void view_delete(View* view) { // buf_del(&Buffer, SelBeg); //SelEnd = SelBeg; //TargetCol = buf_getcol(&Buffer, SelEnd); + //view->sync_needed = true; } diff --git a/xedit b/xedit new file mode 100755 index 0000000000000000000000000000000000000000..f2aab65900147afa0b0ae779307ddb42a2166f86 GIT binary patch literal 57612 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