point_free(ci->home->point);
return 1;
}
+
+ if (strcmp(ci->key, "PointDup") == 0) {
+ struct point *pt = NULL;
+ if (ci->home->point)
+ point_dup(ci->home->point, &pt);
+ ci->mark = &pt->m;
+ return 1;
+ }
+
return key_lookup(d->map, ci);
}
if (key_handle_focus(&ci2) == 0)
return 0;
esi = malloc(sizeof(*esi));
- while (ci2.focus && ! ci2.focus->point)
- ci2.focus = ci2.focus->parent;
- if (!ci2.focus) {
+ esi->target = ci2.focus;
+ memset(&ci2, 0, sizeof(ci2));
+ ci2.key = "PointDup";
+ ci2.focus = esi->target;
+ key_handle_focus(&ci2);
+ if (!ci2.mark) {
free(esi);
- return 0;
+ return -1;
}
- esi->target = ci2.focus;
- point_dup(esi->target->point, &esi->end);
- esi->start = mark_dup(&esi->end->m, 1);
+ esi->end = container_of(ci2.mark, struct point, m);
+ esi->end->owner = &esi->end;
+
+ esi->start = mark_dup(ci2.mark, 1);
esi->s = NULL;
esi->matched = 0;
esi->search = ci->focus;