return __vmark_prev(tl);
}
-struct mark *vmark_first(struct doc *d, int view)
+struct mark *do_vmark_first(struct doc *d, int view)
{
struct tlist_head *tl;
return NULL;
}
-struct mark *vmark_last(struct doc *d, int view)
+struct mark *do_vmark_last(struct doc *d, int view)
{
struct tlist_head *tl;
return NULL;
}
+static int vmark_get(struct pane *p, int view,
+ struct mark **first, struct mark **last, struct mark **point)
+{
+ struct cmd_info ci = {0};
+
+ ci.key = "doc:vmark-get";
+ ci.focus = p;
+ ci.numeric = view;
+ if (point)
+ ci.extra = 1;
+ if (key_handle_focus(&ci) == 0)
+ return 0;
+ if (first)
+ *first = ci.mark;
+ if (point)
+ *point = ci.mark2;
+ else if (last)
+ *last = ci.mark2;
+ return 1;
+}
+
+struct mark *vmark_first(struct pane *p, int view)
+{
+ struct mark *first = NULL;
+ if (vmark_get(p, view, &first, NULL, NULL) == 0)
+ return 0;
+ return first;
+}
+
+struct mark *vmark_last(struct pane *p, int view)
+{
+ struct mark *last = NULL;
+ if (vmark_get(p, view, NULL, &last, NULL) == 0)
+ return 0;
+ return last;
+}
+
+struct mark *vmark_at_point(struct pane *p, int view)
+{
+ struct mark *point = NULL;
+ if (vmark_get(p, view, NULL, NULL, &point) == 0)
+ return 0;
+ return point;
+}
+
struct mark *vmark_matching(struct pane *p, struct mark *m)
{
/* Find a nearby mark in the same view with the same ref */
return NULL;
}
-struct mark *vmark_at_point(struct point *pt, int view)
+struct mark *do_vmark_at_point(struct point *pt, int view)
{
struct tlist_head *tl;
struct mark *m;
void point_free(struct point *p);
struct mark *vmark_next(struct mark *m);
struct mark *vmark_prev(struct mark *m);
-struct mark *vmark_first(struct doc *d, int view);
-struct mark *vmark_last(struct doc *d, int view);
+struct mark *do_vmark_first(struct doc *d, int view);
+struct mark *do_vmark_last(struct doc *d, int view);
struct mark *vmark_matching(struct pane *p, struct mark *m);
-struct mark *vmark_at_point(struct point *pt, int view);
+struct mark *do_vmark_at_point(struct point *pt, int view);
+struct mark *vmark_first(struct pane *p, int view);
+struct mark *vmark_last(struct pane *p, int view);
+struct mark *vmark_at_point(struct pane *p, int view);
static inline int mark_ordered(struct mark *m1, struct mark *m2)
{
int lines_above = 0, lines_below = 0;
d = (*ptp)->doc;
- top = container_of(vmark_first(d, rl->typenum), struct rl_mark, m);
- bot = container_of(vmark_last(d, rl->typenum), struct rl_mark, m);
+ top = container_of(vmark_first(p, rl->typenum), struct rl_mark, m);
+ bot = container_of(vmark_last(p, rl->typenum), struct rl_mark, m);
m = call_render_line_prev(p, ptp, mark_at_point(*ptp, rl->typenum),
0, &rl->top_sol);
if (!m)
rl->header_lines = y;
}
y -= rl->skip_lines;
- m = container_of(vmark_first(d, rl->typenum), struct rl_mark, m);
+ m = container_of(vmark_first(p, rl->typenum), struct rl_mark, m);
p->cx = p->cy = -1;
rl->cursor_line = 0;
{
struct pane *p = ci->home;
struct rl_data *rl = p->data;
- struct doc *d;
struct mark *m;
char *a;
a = pane_attr_get(p, "render-wrap");
rl->do_wrap = (!a || strcmp(a, "yes") == 0);
- d = (*ci->pointp)->doc;
-
- m = vmark_first(d, rl->typenum);
+ m = vmark_first(p, rl->typenum);
if (rl->top_sol && m)
m = call_render_line_prev(p, ci->pointp, mark_dup(m, 0), 0,
&rl->top_sol);
{
struct pane *p = ci->home;
struct rl_data *rl = p->data;
- struct doc *d;
struct mark *m;
- d = (*ci->pointp)->doc;
-
- while ((m = vmark_first(d, rl->typenum)) != NULL) {
+ while ((m = vmark_first(p, rl->typenum)) != NULL) {
struct rl_mark *rm = container_of(m, struct rl_mark, m);
free(rm->line);
mark_free(m);
int rpt = RPT_NUM(ci);
struct rl_data *rl = p->data;
struct point **ptp = ci->pointp;
- struct doc *d = (*ptp)->doc;
struct mark *top;
int pagesize = 1;
- top = vmark_first(d, rl->typenum);
+ top = vmark_first(p, rl->typenum);
if (!top)
return 0;
if (strcmp(ci->key, "Move-View-Large") == 0)
if ((rpt+pagesize-1)/pagesize !=
(rpt+pagesize-y-1)/pagesize)
/* Have cross a full page, can discard old lines */
- while ((old = vmark_first(d, rl->typenum)) != NULL &&
+ while ((old = vmark_first(p, rl->typenum)) != NULL &&
old != top) {
rm = container_of(old, struct rl_mark, m);
free(rm->line);
{
struct pane *p = ci->home;
struct point **ptp = ci->pointp;
- struct doc *d = (*ptp)->doc;
struct rl_data *rl = p->data;
struct rl_mark *m;
int y = rl->header_lines - rl->skip_lines;
render_lines_other_move_func(ci);
- m = container_of(vmark_first(d, rl->typenum), struct rl_mark, m);
+ m = container_of(vmark_first(p, rl->typenum), struct rl_mark, m);
while (y <= ci->hy && m && m->line) {
int cx = ci->hx, cy = ci->hy, o = -1;
struct pane *p = ci->home;
struct rl_data *rl = p->data;
struct point *pt = *ci->pointp;
- struct doc *d = pt->doc;
struct mark *top, *bot;
rl->ignore_point = 1;
- top = vmark_first(d, rl->typenum);
- bot = vmark_last(d, rl->typenum);
+ top = vmark_first(p, rl->typenum);
+ bot = vmark_last(p, rl->typenum);
if (top && bot &&
mark_ordered(top, &pt->m) &&
mark_ordered(&pt->m, bot))
if (target_x >= 0 || target_y >= 0) {
struct rl_mark *start =
- container_of(vmark_at_point(*ci->pointp, rl->typenum),
+ container_of(vmark_at_point(p, rl->typenum),
struct rl_mark, m);
int y = 0;
if (!start || !start->line) {
{
struct pane *p = ci->home;
struct rl_data *rl = p->data;
- struct doc *d = (*ci->pointp)->doc;
struct mark *m;
- for (m = vmark_first(d, rl->typenum);
+ for (m = vmark_first(p, rl->typenum);
m;
m = vmark_next(m)) {
struct rl_mark *rm = container_of(m, struct rl_mark, m);