From 850f17a9db337275cc6717ff815ae37d7a8335bd Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Sat, 22 Oct 2016 20:48:20 -0400 Subject: [PATCH] added right click search functionality --- buf.c | 32 ++++++++++++++++++++++++++++++++ edit.h | 1 + mouse.c | 14 +++++++++++--- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/buf.c b/buf.c index 601fccc..cb3ae83 100644 --- a/buf.c +++ b/buf.c @@ -161,6 +161,38 @@ unsigned buf_rscan(Buf* buf, unsigned off, Rune r) return off; } +int range_match(Buf* buf, unsigned dbeg, unsigned dend, unsigned mbeg, unsigned mend) +{ + unsigned n1 = dend-dbeg, n2 = mend-mbeg; + if (n1 != n2) return n1-n2; + for (; n1; n1--, dbeg++, mbeg++) { + int cmp = buf_get(buf, dbeg) - buf_get(buf, mbeg); + if (cmp != 0) return cmp; + } + return 0; +} + +void buf_find(Buf* buf, unsigned* beg, unsigned* end) +{ + unsigned dbeg = *beg, dend = *end; + unsigned mbeg = dend+1, mend = mbeg + (dend-dbeg); + while (mend != dbeg) { + if ((buf_get(buf, mbeg) == buf_get(buf, dbeg)) && + (buf_get(buf, mend) == buf_get(buf, dend)) && + (0 == range_match(buf,dbeg,dend,mbeg,mend))) + { + *beg = mbeg; + *end = mend; + break; + } + mbeg++, mend++; + if (mend >= buf_end(buf)) { + unsigned n = mend-mbeg; + mbeg = 0, mend = n; + } + } +} + unsigned buf_end(Buf* buf) { size_t bufsz = buf->bufend - buf->bufstart; size_t gapsz = buf->gapend - buf->gapstart; diff --git a/edit.h b/edit.h index 1c59866..96d399e 100644 --- a/edit.h +++ b/edit.h @@ -69,6 +69,7 @@ unsigned buf_bow(Buf* buf, unsigned pos); unsigned buf_eow(Buf* buf, unsigned pos); unsigned buf_lscan(Buf* buf, unsigned pos, Rune r); unsigned buf_rscan(Buf* buf, unsigned pos, Rune r); +void buf_find(Buf* buf, unsigned* beg, unsigned* end); unsigned buf_end(Buf* buf); unsigned buf_byrune(Buf* buf, unsigned pos, int count); diff --git a/mouse.c b/mouse.c index 87546e5..5499058 100644 --- a/mouse.c +++ b/mouse.c @@ -6,9 +6,9 @@ void unused(MouseEvent* mevnt) { void move_cursor(MouseEvent* mevnt) { if (mevnt->y == 0) return; - DotEnd = screen_getoff(&Buffer, DotEnd, mevnt->y-1, mevnt->x); + DotBeg = DotEnd = screen_getoff(&Buffer, DotEnd, mevnt->y-1, mevnt->x); TargetCol = buf_getcol(&Buffer, DotEnd); - DotBeg = DotEnd; + //DotBeg = DotEnd; } void select(MouseEvent* mevnt) { @@ -39,6 +39,14 @@ void select(MouseEvent* mevnt) { } } +void search(MouseEvent* mevnt) { + if (DotBeg == DotEnd) { + move_cursor(mevnt); + select(mevnt); + } + buf_find(&Buffer, &DotBeg, &DotEnd); +} + void scrollup(MouseEvent* mevnt) { (void)mevnt; DotBeg = DotEnd = buf_byline(&Buffer, DotEnd, -ScrollLines); @@ -74,7 +82,7 @@ void (*Actions[5][3])(MouseEvent* mevnt) = { [TRIPLE_CLICK] = unused, }, [MOUSE_RIGHT] = { - [SINGLE_CLICK] = unused, + [SINGLE_CLICK] = search, [DOUBLE_CLICK] = unused, [TRIPLE_CLICK] = unused, }, -- 2.49.0