From: Michael D. Lowis Date: Sat, 19 Nov 2016 02:14:12 +0000 (-0500) Subject: implemented double and triple click selections X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=4ae7d92ecc1141e81565f719fb9bb7697da186da;p=projs%2Ftide.git implemented double and triple click selections --- 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);