if (strcmp(ci->key, "doc:dup-point") == 0) {
struct mark *pt = dd->point;
+ struct mark *m;
if (ci->mark && ci->mark->viewnum == MARK_POINT)
pt = ci->mark;
- ci->mark = NULL;
- if (pt) {
- if (ci->extra == MARK_POINT)
- ci->mark = point_dup(pt);
- else if (ci->extra == MARK_UNGROUPED)
- ci->mark = mark_dup(pt, 1);
- else
- ci->mark = do_mark_at_point(dd->doc, pt,
- ci->extra);
- }
- return 1;
+
+ if (!pt || !ci->comm2)
+ return -1;
+
+ if (ci->extra == MARK_POINT)
+ m = point_dup(pt);
+ else if (ci->extra == MARK_UNGROUPED)
+ m = mark_dup(pt, 1);
+ else
+ m = do_mark_at_point(dd->doc, pt,
+ ci->extra);
+
+ return comm_call(ci->comm2, "callback:dup-point", ci->focus,
+ 0, m, NULL, 0);
}
if (strcmp(ci->key, "Move-to") == 0) {
return ret;
}
+DEF_CMD(dup_point_callback)
+{
+ struct call_return *cr = container_of(ci->comm, struct call_return, c);
+ cr->m = ci->mark;
+ return 1;
+}
+
struct mark *mark_at_point(struct pane *p, struct mark *pm, int view)
{
- return call_mark("doc:dup-point", p, 0, pm, view);
+ struct call_return cr;
+ int ret;
+
+ cr.c = dup_point_callback;
+ cr.m = NULL;
+ ret = call_comm("doc:dup-point", p, 0, pm, NULL, view, &cr.c);
+ if (ret <= 0)
+ return NULL;
+ return cr.m;
}
struct mark *point_dup(struct mark *p)
return key_handle_focus(&ci);
}
+struct call_return {
+ struct command c;
+ struct mark *m;
+};
+
static inline int call_comm(char *key, struct pane *focus, int numeric, struct mark *m,
char *str, int extra, struct command *comm)
{
return key_handle_focus(&ci);
}
-static inline struct mark *call_mark(char *key, struct pane *focus, int numeric,
- struct mark *m, int extra)
+static inline int comm_call(struct command *comm, char *key, struct pane *focus,
+ int numeric, struct mark *m, char *str, int extra)
{
struct cmd_info ci = {0};
ci.key = key;
ci.focus = focus;
ci.numeric = numeric;
- ci.extra = extra;
ci.mark = m;
- if (!key_handle_focus(&ci))
- return NULL;
- return ci.mark;
+ ci.str = str;
+ ci.extra = extra;
+ ci.comm = comm;
+ return comm->func(&ci);
}
static inline struct pane *call_pane(char *key, struct pane *focus, int numeric,