1
0
forked from aniani/vim

patch 8.1.1321: no docs or tests for listener functions

Problem:    No docs or tests for listener functions.
Solution:   Add help and tests for listener_add() and listener_remove().
            Invoke the callbacks before redrawing.
This commit is contained in:
Bram Moolenaar
2019-05-11 21:14:24 +02:00
parent 6d2399bd10
commit a334772967
9 changed files with 165 additions and 19 deletions

View File

@@ -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;
}
}
/*