summaryrefslogtreecommitdiffstats
path: root/src/change.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-05-11 21:14:24 +0200
committerBram Moolenaar <Bram@vim.org>2019-05-11 21:14:24 +0200
commita334772967de25764ed7b11d768e8b977818d0c6 (patch)
tree1f5b7b787eb7b18e2adb6aee66843837d64cdb99 /src/change.c
parent6d2399bd1053b367e13cc2b8991d3ff0bf724c7c (diff)
patch 8.1.1321: no docs or tests for listener functionsv8.1.1321
Problem: No docs or tests for listener functions. Solution: Add help and tests for listener_add() and listener_remove(). Invoke the callbacks before redrawing.
Diffstat (limited to 'src/change.c')
-rw-r--r--src/change.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/src/change.c b/src/change.c
index 06d20f4ac2..27ea9ac8fb 100644
--- a/src/change.c
+++ b/src/change.c
@@ -184,7 +184,7 @@ may_record_change(
dict_add_number(dict, "lnum", (varnumber_T)lnum);
dict_add_number(dict, "end", (varnumber_T)lnume);
dict_add_number(dict, "added", (varnumber_T)xtra);
- dict_add_number(dict, "col", (varnumber_T)col);
+ dict_add_number(dict, "col", (varnumber_T)col + 1);
list_append_dict(recorded_changes, dict);
}
@@ -198,19 +198,27 @@ f_listener_add(typval_T *argvars, typval_T *rettv)
char_u *callback;
partial_T *partial;
listener_T *lnr;
+ buf_T *buf = curbuf;
callback = get_callback(&argvars[0], &partial);
if (callback == NULL)
return;
+ if (argvars[1].v_type != VAR_UNKNOWN)
+ {
+ buf = get_buf_arg(&argvars[1]);
+ if (buf == NULL)
+ return;
+ }
+
lnr = (listener_T *)alloc_clear((sizeof(listener_T)));
if (lnr == NULL)
{
free_callback(callback, partial);
return;
}
- lnr->lr_next = curbuf->b_listener;
- curbuf->b_listener = lnr;
+ lnr->lr_next = buf->b_listener;
+ buf->b_listener = lnr;
if (partial == NULL)
lnr->lr_callback = vim_strsave(callback);
@@ -232,22 +240,23 @@ f_listener_remove(typval_T *argvars, typval_T *rettv UNUSED)
listener_T *next;
listener_T *prev = NULL;
int id = tv_get_number(argvars);
- buf_T *buf = curbuf;
+ buf_T *buf;
- for (lnr = buf->b_listener; lnr != NULL; lnr = next)
- {
- next = lnr->lr_next;
- if (lnr->lr_id == id)
+ for (buf = firstbuf; buf != NULL; buf = buf->b_next)
+ for (lnr = buf->b_listener; lnr != NULL; lnr = next)
{
- if (prev != NULL)
- prev->lr_next = lnr->lr_next;
- else
- buf->b_listener = lnr->lr_next;
- free_callback(lnr->lr_callback, lnr->lr_partial);
- vim_free(lnr);
+ next = lnr->lr_next;
+ if (lnr->lr_id == id)
+ {
+ if (prev != NULL)
+ prev->lr_next = lnr->lr_next;
+ else
+ buf->b_listener = lnr->lr_next;
+ free_callback(lnr->lr_callback, lnr->lr_partial);
+ vim_free(lnr);
+ }
+ prev = lnr;
}
- prev = lnr;
- }
}
/*