From 4ae7d92ecc1141e81565f719fb9bb7697da186da Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Fri, 18 Nov 2016 21:14:12 -0500 Subject: [PATCH] implemented double and triple click selections --- inc/edit.h | 2 ++ libedit/view.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ xedit.c | 35 ++--------------------------------- 3 files changed, 49 insertions(+), 33 deletions(-) diff --git a/inc/edit.h b/inc/edit.h index 0d6b3f3..71a4618 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -154,6 +154,8 @@ void view_byrune(View* view, int move); 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_selword(View* view, size_t row, size_t col); +void view_select(View* view, size_t row, size_t col); void view_insert(View* view, Rune rune); void view_delete(View* view); void view_bol(View* view); diff --git a/libedit/view.c b/libedit/view.c index d1f8eca..ef09803 100644 --- a/libedit/view.c +++ b/libedit/view.c @@ -256,6 +256,51 @@ void view_selext(View* view, size_t row, size_t col) { } } +static void selbigword(View* view, Sel* sel) { + Buf* buf = &(view->buffer); + size_t mbeg = sel->end, mend = sel->end; + for (; !risblank(buf_get(buf, mbeg-1)); mbeg--); + for (; !risblank(buf_get(buf, mend)); mend++); + sel->beg = mbeg, sel->end = mend-1; +} + +void view_selword(View* view, size_t row, size_t col) { + view_setcursor(view, row, col); + Sel sel = view->selection; + Buf* buf = &(view->buffer); + selbigword(view, &sel); + sel.end++; + view->selection = sel; +} + +void view_select(View* view, size_t row, size_t col) { + view_setcursor(view, row, col); + Sel sel = view->selection; + Buf* buf = &(view->buffer); + size_t bol = buf_bol(buf, sel.end); + Rune r = buf_get(buf, sel.end); + if (sel.end == bol || r == '\n' || r == RUNE_CRLF) { + sel.beg = bol; + sel.end = buf_eol(buf, sel.end); + } else if (risword(r)) { + sel.beg = buf_bow(buf, sel.end); + sel.end = buf_eow(buf, sel.end++); + } else if (r == '(' || r == ')') { + sel.beg = buf_lscan(buf, sel.end, '('); + sel.end = buf_rscan(buf, sel.end++, ')'); + } else if (r == '[' || r == ']') { + sel.beg = buf_lscan(buf, sel.end, '['); + sel.end = buf_rscan(buf, sel.end++, ']'); + } else if (r == '{' || r == '}') { + sel.beg = buf_lscan(buf, sel.end, '{'); + sel.end = buf_rscan(buf, sel.end++, '}'); + } else { + selbigword(view, &sel); + } + sel.end++; + view->selection = sel; +} + void view_insert(View* view, Rune rune) { if (rune == '\b') { if (num_selected(view->selection)) diff --git a/xedit.c b/xedit.c index 5c75c70..64b0f3a 100644 --- a/xedit.c +++ b/xedit.c @@ -166,11 +166,9 @@ static void mouse_left(enum RegionId id, size_t count, size_t row, size_t col) { if (count == 1) { view_setcursor(getview(id), row, col); } else if (count == 2) { - puts("select"); - //view_select(getview(id), row, col); + view_select(getview(id), row, col); } else if (count == 3) { - puts("select bigword"); - //view_selword(getview(id), row, col); + view_selword(getview(id), row, col); } } @@ -422,35 +420,6 @@ int main(int argc, char** argv) { #if 0 /* Mouse Actions *****************************************************************************/ -void bigword(int x, int y) { - size_t mbeg = SelEnd, mend = SelEnd; - for (; !risblank(buf_get(&Buffer, mbeg-1)); mbeg--); - for (; !risblank(buf_get(&Buffer, mend)); mend++); - SelBeg = mbeg, SelEnd = mend-1; -} - -void selection(int x, int y) { - size_t bol = buf_bol(&Buffer, SelEnd); - Rune r = buf_get(&Buffer, SelEnd); - if (SelEnd == bol || r == '\n' || r == RUNE_CRLF) { - SelBeg = bol; - SelEnd = buf_eol(&Buffer, SelEnd); - } else if (risword(r)) { - SelBeg = buf_bow(&Buffer, SelEnd); - SelEnd = buf_eow(&Buffer, SelEnd++); - } else if (r == '(' || r == ')') { - SelBeg = buf_lscan(&Buffer, SelEnd, '('); - SelEnd = buf_rscan(&Buffer, SelEnd++, ')'); - } else if (r == '[' || r == ']') { - SelBeg = buf_lscan(&Buffer, SelEnd, '['); - SelEnd = buf_rscan(&Buffer, SelEnd++, ']'); - } else if (r == '{' || r == '}') { - SelBeg = buf_lscan(&Buffer, SelEnd, '{'); - SelEnd = buf_rscan(&Buffer, SelEnd++, '}'); - } else { - bigword(x,y); - } -} void search(int x, int y) { //size_t clickpos = screen_getoff(&Buffer, SelEnd, y-1, x); -- 2.54.0