]> git.neil.brown.name Git - edlib.git/commitdiff
Remove dependence of search on pane_point.
authorNeilBrown <neil@brown.name>
Thu, 26 Nov 2015 01:02:56 +0000 (12:02 +1100)
committerNeilBrown <neil@brown.name>
Thu, 26 Nov 2015 01:02:56 +0000 (12:02 +1100)
This requires PointDup being able to provide a simple mark,
and a new function to find the document pane.

Signed-off-by: NeilBrown <neil@brown.name>
core-doc.c
core.h
emacs-search.c
lib-search.c
mode-emacs.c

index c100b81d1f933c1d8326264b570a1b5f794ff5e8..0e723b5c87b84bf9a3ee336732adcf7f635cbd2d 100644 (file)
@@ -171,9 +171,15 @@ DEF_CMD(doc_handle)
 
        if (strcmp(ci->key, "PointDup") == 0) {
                struct point *pt = NULL;
-               if (ci->home->point)
-                       point_dup(ci->home->point, &pt);
-               ci->mark = &pt->m;
+               ci->mark = NULL;
+               if (ci->home->point) {
+                       if (ci->extra == MARK_POINT) {
+                               point_dup(ci->home->point, &pt);
+                               ci->mark = &pt->m;
+                       }
+                       if (ci->extra == MARK_UNGROUPED)
+                               ci->mark = mark_dup(&ci->home->point->m, 1);
+               }
                return 1;
        }
 
diff --git a/core.h b/core.h
index ce7bed8f4b491967b605131aa0b4aa2d0dea7704..4ca0ff9eb815d90dd523117783bbf672fe7066bc 100644 (file)
--- a/core.h
+++ b/core.h
@@ -445,3 +445,14 @@ static inline int doc_find_view(struct pane *p, struct command *c)
        return ci.extra;
 }
 
+static inline struct pane *doc_get_pane(struct pane *p)
+{
+       struct cmd_info ci = {0};
+       ci.focus = p;
+       ci.key = "doc:find-view";
+       ci.comm2 = NULL;
+       if (key_handle_focus(&ci) == 0)
+               return NULL;
+       return ci.home;
+}
+
index 24e62d5f157f94c8114e8651518636466b664b44..5efcf9855a405a91ded9ce791249828265b4d3a3 100644 (file)
@@ -169,7 +169,7 @@ REDEF_CMD(search_again)
 
        /* TEMP HACK - please fix */
        doc_set_attr(esi->end, "highlight", NULL);
-       ci2.pointp = &esi->end;
+       ci2.focus = esi->target;
        ci2.mark = mark_dup(esi->start, 1);
        ci2.str = doc_getstr(esi->search, NULL);
        ci2.key = "text-search";
@@ -233,6 +233,7 @@ DEF_CMD(emacs_search)
        esi->target = ci2.focus;
        memset(&ci2, 0, sizeof(ci2));
        ci2.key = "PointDup";
+       ci2.extra = MARK_POINT;
        ci2.focus = esi->target;
        key_handle_focus(&ci2);
        if (!ci2.mark) {
index 1aa1f2811194b9923a5c440a623129216aad2a78..31dc40bb9efe573b1c32d3cbdb1540ee29e5be5f 100644 (file)
 
 DEF_CMD(text_search)
 {
-       struct point *pt;
        struct mark *m;
+       struct pane *dp;
        struct doc *d;
        unsigned short *rxl;
        struct match_state *st;
        int since_start, len;
 
-       if (!ci->pointp || !ci->str|| !ci->mark)
-               return 0;
-       pt = *ci->pointp;
-       d = pt->doc;
+       if (!ci->str|| !ci->mark)
+               return -1;
+
+       dp = doc_get_pane(ci->focus);
+       if (!dp)
+               return -1;
+       d = dp->data;
 
        m = ci->mark;
        rxl = rxl_parse(ci->str, NULL, 0);
index 8c60d6ae02b2d6a19ecd5be06bbc1ffd778fc55c..ae5c2d764c740e846261ed95b728c97578f8aab6 100644 (file)
@@ -580,8 +580,15 @@ DEF_CMD(emacs_search)
 
        if (!ci->str || !ci->str[0])
                return -1;
-       ci2.pointp = pane_point(ci->focus);
-       m = mark_dup(&(*ci2.pointp)->m, 1);
+
+       ci2.key = "PointDup";
+       ci2.focus = ci->home;
+       ci2.extra = MARK_UNGROUPED;
+       key_handle_focus(&ci2);
+       m = ci2.mark;
+
+       memset(&ci2, 0, sizeof(ci2));
+       ci2.focus = ci->home;
        ci2.mark = m;
        ci2.str = ci->str;
        ci2.key = "text-search";