1
0
forked from aniani/vim

patch 8.1.1407: popup_create() does not support text properties

Problem:    Popup_create() does not support text properties.
Solution:   Support the third form of the text argument.
This commit is contained in:
Bram Moolenaar
2019-05-26 23:32:06 +02:00
parent 2cd0dce898
commit 7a8d0278bd
10 changed files with 162 additions and 49 deletions

View File

@@ -142,23 +142,8 @@ get_bufnr_from_arg(typval_T *arg, buf_T **buf)
void
f_prop_add(typval_T *argvars, typval_T *rettv UNUSED)
{
linenr_T lnum;
linenr_T start_lnum;
linenr_T end_lnum;
colnr_T start_col;
colnr_T end_col;
dict_T *dict;
char_u *type_name;
proptype_T *type;
buf_T *buf = curbuf;
int id = 0;
char_u *newtext;
int proplen;
size_t textlen;
char_u *props = NULL;
char_u *newprops;
textprop_T tmp_prop;
int i;
start_lnum = tv_get_number(&argvars[0]);
start_col = tv_get_number(&argvars[1]);
@@ -172,7 +157,38 @@ f_prop_add(typval_T *argvars, typval_T *rettv UNUSED)
emsg(_(e_dictreq));
return;
}
dict = argvars[2].vval.v_dict;
prop_add_common(start_lnum, start_col, argvars[2].vval.v_dict,
curbuf, &argvars[2]);
}
/*
* Shared between prop_add() and popup_create().
* "dict_arg" is the function argument of a dict containing "bufnr".
* it is NULL for popup_create().
*/
void
prop_add_common(
linenr_T start_lnum,
colnr_T start_col,
dict_T *dict,
buf_T *default_buf,
typval_T *dict_arg)
{
linenr_T lnum;
linenr_T end_lnum;
colnr_T end_col;
char_u *type_name;
proptype_T *type;
buf_T *buf = default_buf;
int id = 0;
char_u *newtext;
int proplen;
size_t textlen;
char_u *props = NULL;
char_u *newprops;
textprop_T tmp_prop;
int i;
if (dict == NULL || dict_find(dict, (char_u *)"type", -1) == NULL)
{
@@ -221,7 +237,7 @@ f_prop_add(typval_T *argvars, typval_T *rettv UNUSED)
if (dict_find(dict, (char_u *)"id", -1) != NULL)
id = dict_get_number(dict, (char_u *)"id");
if (get_bufnr_from_arg(&argvars[2], &buf) == FAIL)
if (dict_arg != NULL && get_bufnr_from_arg(dict_arg, &buf) == FAIL)
return;
type = lookup_prop_type(type_name, buf);
@@ -278,12 +294,12 @@ f_prop_add(typval_T *argvars, typval_T *rettv UNUSED)
mch_memmove(newtext, buf->b_ml.ml_line_ptr, textlen);
// Find the index where to insert the new property.
// Since the text properties are not aligned properly when stored with the
// text, we need to copy them as bytes before using it as a struct.
// Since the text properties are not aligned properly when stored with
// the text, we need to copy them as bytes before using it as a struct.
for (i = 0; i < proplen; ++i)
{
mch_memmove(&tmp_prop, props + i * sizeof(textprop_T),
sizeof(textprop_T));
sizeof(textprop_T));
if (tmp_prop.tp_col >= col)
break;
}
@@ -298,7 +314,7 @@ f_prop_add(typval_T *argvars, typval_T *rettv UNUSED)
tmp_prop.tp_flags = (lnum > start_lnum ? TP_FLAG_CONT_PREV : 0)
| (lnum < end_lnum ? TP_FLAG_CONT_NEXT : 0);
mch_memmove(newprops + i * sizeof(textprop_T), &tmp_prop,
sizeof(textprop_T));
sizeof(textprop_T));
if (i < proplen)
mch_memmove(newprops + (i + 1) * sizeof(textprop_T),