]> git.neil.brown.name Git - edlib.git/commitdiff
Change mark_same to key off tile rather than point.
authorNeilBrown <neil@brown.name>
Wed, 25 Nov 2015 22:48:48 +0000 (09:48 +1100)
committerNeilBrown <neil@brown.name>
Wed, 25 Nov 2015 22:48:48 +0000 (09:48 +1100)
Thus remove pointp reference from render-lines-notify

Signed-off-by: NeilBrown <neil@brown.name>
core-mark.c
core.h
doc-text.c
render-lines.c

index 80239bc29746f3710e3b43879ebe5f83a7353eb6..2f8f8e4ab015b39fb7279b7be47a49c623ba655e 100644 (file)
@@ -681,15 +681,13 @@ void mark_to_mark(struct doc *d, struct mark *m, struct mark *target)
 
 int mark_same2(struct doc *d, struct mark *m1, struct mark *m2, struct cmd_info *ci)
 {
-       struct point p, *pt = &p;
        struct cmd_info ci2 = {0};
-       p.doc = d;
        if (!ci)
                ci = &ci2;
        ci->key = "doc:mark-same";
        ci->mark = m1;
        ci->mark2 = m2;
-       ci->pointp = &pt;
+       ci->home = d->home;
        ci->extra = 0;
        key_lookup(d->map, ci);
        return ci->extra;
@@ -700,6 +698,24 @@ int mark_same(struct doc *d, struct mark *m1, struct mark *m2)
        return mark_same2(d, m1, m2, NULL);
 }
 
+int mark_same_pane(struct pane *p, struct mark *m1, struct mark *m2,
+                  struct cmd_info *ci)
+{
+       struct cmd_info ci2 = {0};
+
+       if (!ci)
+               ci = &ci2;
+       ci->key = "doc:mark-same";
+       ci->mark = m1;
+       ci->mark2 = m2;
+       ci->extra = 0;
+       ci->focus = p;
+       ci->pointp = NULL;
+       if (key_handle_focus(ci) == 0)
+               return 0;
+       return ci->extra;
+}
+
 /* A 'vmark' is a mark in a particular view.  We can walk around those
  * silently skipping over the points.
  */
diff --git a/core.h b/core.h
index 97f6ffb21d1b506ee70e8556309fb1b75563f373..b11346151fe0dcb1f4ba2c62f3ebfcac21774045 100644 (file)
--- a/core.h
+++ b/core.h
@@ -165,6 +165,8 @@ void point_to_mark(struct point *p, struct mark *m);
 void mark_to_mark(struct doc *d, struct mark *m, struct mark *target);
 int mark_same(struct doc *d, struct mark *m1, struct mark *m2);
 int mark_same2(struct doc *d, struct mark *m1, struct mark *m2, struct cmd_info *ci);
+int mark_same_pane(struct pane *p, struct mark *m1, struct mark *m2,
+                  struct cmd_info *ci);
 struct point *point_new(struct doc *d, struct point **owner);
 struct point *point_dup(struct point *p, struct point **owner);
 wint_t mark_step(struct doc *d, struct mark *m, int forward, int move, struct cmd_info *ci);
index 4f6dcefa557ca8267abe0edee838d0f0019185e4..270af023a32be4eac3f6344103347edf72ba1779 100644 (file)
@@ -1025,8 +1025,9 @@ static int text_ref_same(struct text *t, struct doc_ref *r1, struct doc_ref *r2)
 
 DEF_CMD(text_mark_same)
 {
-       struct doc *d = (*ci->pointp)->doc;
+       struct doc *d = ci->home->data;
        struct text *t = container_of(d, struct text, doc);
+
        ci->extra = text_ref_same(t, &ci->mark->ref, &ci->mark2->ref);
        return 1;
 }
index 52cd6cf15da0892a972948603afcf69fcd210c8a..129797e2740c00c21b7cc080a619ed91eb587bec 100644 (file)
@@ -871,8 +871,9 @@ DEF_CMD(render_lines_notify)
                        struct rl_mark *rm = container_of(ci->mark,
                                                          struct rl_mark, m);
                        struct mark *vm;
-                       struct point **ptp = pane_point(rl->pane);
-                       struct doc *d = (*ptp)->doc;
+                       struct cmd_info ci2 = {0};
+                       struct pane *p = rl->pane;
+
                        if (rm->line) {
                                free(rm->line);
                                rm->line = NULL;
@@ -881,13 +882,13 @@ DEF_CMD(render_lines_notify)
                         * delete it - marks must remain distinct
                         */
                        while ((vm = vmark_prev(&rm->m)) != NULL &&
-                              mark_same(d, &rm->m, vm)) {
+                              mark_same_pane(p, &rm->m, vm, &ci2)) {
                                struct rl_mark *rlm = container_of(vm, struct rl_mark, m);
                                free(rlm->line);
                                mark_free(vm);
                        }
                        while ((vm = vmark_next(&rm->m)) != NULL &&
-                              mark_same(d, &rm->m, vm)) {
+                              mark_same_pane(p, &rm->m, vm, &ci2)) {
                                struct rl_mark *rlm = container_of(vm, struct rl_mark, m);
                                free(rlm->line);
                                mark_free(vm);