]> git.mdlowis.com Git - projs/tide.git/commitdiff
added right click search functionality
authorMichael D. Lowis <mike@mdlowis.com>
Sun, 23 Oct 2016 00:48:20 +0000 (20:48 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Sun, 23 Oct 2016 00:48:20 +0000 (20:48 -0400)
buf.c
edit.h
mouse.c

diff --git a/buf.c b/buf.c
index 601fcccba99ee0d99951f27e90032ec1cf2f1665..cb3ae83078056e1616e583f776071ef291f2e29b 100644 (file)
--- 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 1c59866756d8c2232a338dd217c80fca54f34d40..96d399eb001346c386384d488f2b15911ba0b7e4 100644 (file)
--- 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 87546e5c446cb3a87a7733e277d7864904a7cb7f..5499058336449041c980095ee98df5477b28b21f 100644 (file)
--- 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,
     },