From: Michael D. Lowis Date: Thu, 17 Nov 2016 01:19:13 +0000 (-0500) Subject: implemented expected behavior for backspace, delete, and insert with selection X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=4228702c8b846736f6c74b78545bf9b9e0677a16;p=projs%2Ftide.git implemented expected behavior for backspace, delete, and insert with selection --- diff --git a/inc/edit.h b/inc/edit.h index 0e15682..c7e1a5f 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -154,6 +154,7 @@ void view_byline(View* view, int move); void view_setcursor(View* view, size_t row, size_t col); void view_selext(View* view, size_t row, size_t col); void view_insert(View* view, Rune rune); +void view_delete(View* view); //size_t view_getoff(View* view, size_t pos, size_t row, size_t col); //void view_getsize(View* view, size_t* nrows, size_t* ncols); diff --git a/libedit/view.c b/libedit/view.c index b22d809..8877a17 100644 --- a/libedit/view.c +++ b/libedit/view.c @@ -36,12 +36,21 @@ static size_t setcell(View* view, size_t row, size_t col, uint32_t attr, Rune r) return ncols; } -static bool in_selection(Sel sel, size_t off) { - if (sel.end < sel.beg) { - size_t temp = sel.beg; - sel.beg = sel.end; - sel.end = temp; +static void selswap(Sel* sel) { + if (sel->end < sel->beg) { + size_t temp = sel->beg; + sel->beg = sel->end; + sel->end = temp; } +} + +static size_t num_selected(Sel sel) { + selswap(&sel); + return (sel.end - sel.beg); +} + +static bool in_selection(Sel sel, size_t off) { + selswap(&sel); return (sel.beg <= off && off < sel.end); } @@ -232,12 +241,16 @@ void view_selext(View* view, size_t row, size_t col) { void view_insert(View* view, Rune rune) { if (rune == '\b') { - if (view->selection.end > 0) + if (num_selected(view->selection)) + view_delete(view); + else if (view->selection.end > 0) buf_del(&(view->buffer), --view->selection.end); } else { /* ignore non-printable control characters */ if (!isspace(rune) && rune < 0x20) return; + if (num_selected(view->selection)) + view_delete(view); buf_ins(&(view->buffer), view->selection.end++, rune); } view->selection.beg = view->selection.end; @@ -246,11 +259,15 @@ void view_insert(View* view, Rune rune) { } void view_delete(View* view) { - //if (SelEnd == buf_end(&Buffer)) return; - //size_t n = SelEnd - SelBeg; - //for (size_t i = 0; i < n; i++) - // buf_del(&Buffer, SelBeg); - //SelEnd = SelBeg; - //TargetCol = buf_getcol(&Buffer, SelEnd); - //view->sync_needed = true; + Sel sel = view->selection; + selswap(&sel); + size_t num = num_selected(view->selection); + if (num == 0) + buf_del(&(view->buffer), sel.beg); + else + for (size_t i = 0; i < num; i++) + buf_del(&(view->buffer), sel.beg); + view->selection.beg = view->selection.end = sel.beg; + view->selection.col = buf_getcol(&(view->buffer), view->selection.end); + view->sync_needed = true; } diff --git a/xedit b/xedit deleted file mode 100755 index 1fcba5c..0000000 Binary files a/xedit and /dev/null differ diff --git a/xedit.c b/xedit.c index 9a43390..da1689a 100644 --- a/xedit.c +++ b/xedit.c @@ -56,6 +56,10 @@ static enum RegionId getregion(size_t x, size_t y) { } /* UI Callbacks *****************************************************************************/ +static void delete(void) { + view_delete(currview()); +} + static void cursor_up(void) { view_byline(currview(), -1); } @@ -172,6 +176,7 @@ static void mouse_handler(MouseAct act, MouseBtn btn, int x, int y) { /* Keyboard Bindings *****************************************************************************/ static KeyBinding Insert[] = { + { KEY_DELETE, delete }, { KEY_UP, cursor_up }, { KEY_DOWN, cursor_dn }, { KEY_LEFT, cursor_left }, @@ -186,7 +191,6 @@ static KeyBinding Insert[] = { //{ KEY_CTRL_V, paste }, //{ KEY_HOME, cursor_bol }, //{ KEY_END, cursor_eol }, - //{ KEY_DELETE, delete }, //{ KEY_BACKSPACE, backspace }, { 0, NULL } };