# HG changeset patch # User Bram Moolenaar # Date 1558898104 -7200 # Node ID 306766ed0f70eccd4e1a26fae9fb00815139ecb3 # Parent 384375708770e710117cee44a5e29db706b09e39 patch 8.1.1405: "highlight" option of popup windows not supported commit https://github.com/vim/vim/commit/20c023aee0ceafac9431fb8ab8d169747b5140dd Author: Bram Moolenaar Date: Sun May 26 21:03:24 2019 +0200 patch 8.1.1405: "highlight" option of popup windows not supported Problem: "highlight" option of popup windows not supported. Solution: Implement the "highlight" option. diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt --- a/runtime/doc/popup.txt +++ b/runtime/doc/popup.txt @@ -322,8 +322,7 @@ The second argument of |popup_create()| wrap TRUE to make the lines wrap (default TRUE) {not implemented yet} highlight highlight group name to use for the text, stored in - 'wincolor' - {not implemented yet} + the 'wincolor' option border list with numbers, defining the border thickness above/right/below/left of the popup; an empty list uses a border of 1 all around diff --git a/src/diff.c b/src/diff.c --- a/src/diff.c +++ b/src/diff.c @@ -1447,18 +1447,14 @@ diff_win_options( wp->w_p_wrap_save = wp->w_p_wrap; wp->w_p_wrap = FALSE; # ifdef FEAT_FOLDING - curwin = wp; - curbuf = curwin->w_buffer; if (!wp->w_p_diff) { if (wp->w_p_diff_saved) free_string_option(wp->w_p_fdm_save); wp->w_p_fdm_save = vim_strsave(wp->w_p_fdm); } - set_string_option_direct((char_u *)"fdm", -1, (char_u *)"diff", + set_string_option_direct_in_win(wp, (char_u *)"fdm", -1, (char_u *)"diff", OPT_LOCAL|OPT_FREE, 0); - curwin = old_curwin; - curbuf = curwin->w_buffer; if (!wp->w_p_diff) { wp->w_p_fdc_save = wp->w_p_fdc; diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -5954,6 +5954,54 @@ set_string_option_direct( } /* + * Like set_string_option_direct(), but for a window-local option in "wp". + * Blocks autocommands to avoid the old curwin becoming invalid. + */ + void +set_string_option_direct_in_win( + win_T *wp, + char_u *name, + int opt_idx, + char_u *val, + int opt_flags, + int set_sid) +{ + win_T *save_curwin = curwin; + + block_autocmds(); + curwin = wp; + curbuf = curwin->w_buffer; + set_string_option_direct(name, opt_idx, val, opt_flags, set_sid); + curwin = save_curwin; + curbuf = curwin->w_buffer; + unblock_autocmds(); +} + +/* + * Like set_string_option_direct(), but for a buffer-local option in "buf". + * Blocks autocommands to avoid the old curbuf becoming invalid. + */ + void +set_string_option_direct_in_buf( + buf_T *buf, + char_u *name, + int opt_idx, + char_u *val, + int opt_flags, + int set_sid) +{ + buf_T *save_curbuf = curbuf; + + block_autocmds(); + curbuf = buf; + curwin->w_buffer = curbuf; + set_string_option_direct(name, opt_idx, val, opt_flags, set_sid); + curbuf = save_curbuf; + curwin->w_buffer = curbuf; + unblock_autocmds(); +} + +/* * Set global value for string option when it's a local option. */ static void diff --git a/src/popupwin.c b/src/popupwin.c --- a/src/popupwin.c +++ b/src/popupwin.c @@ -23,6 +23,7 @@ apply_options(win_T *wp, buf_T *buf UNUSED, dict_T *dict) { int nr; + char_u *str; wp->w_maxwidth = dict_get_number(dict, (char_u *)"maxwidth"); wp->w_maxheight = dict_get_number(dict, (char_u *)"maxheight"); @@ -52,6 +53,10 @@ apply_options(win_T *wp, buf_T *buf UNUS } #endif + str = dict_get_string(dict, (char_u *)"highlight", TRUE); + if (str != NULL) + set_string_option_direct_in_win(wp, (char_u *)"wincolor", -1, + str, OPT_FREE|OPT_LOCAL, 0); } /* @@ -94,12 +99,10 @@ f_popup_create(typval_T *argvars, typval if (buf == NULL) return; ml_open(buf); - curbuf = buf; - set_string_option_direct((char_u *)"buftype", -1, + set_string_option_direct_in_buf(buf, (char_u *)"buftype", -1, (char_u *)"popup", OPT_FREE|OPT_LOCAL, 0); - set_string_option_direct((char_u *)"bufhidden", -1, + set_string_option_direct_in_buf(buf, (char_u *)"bufhidden", -1, (char_u *)"hide", OPT_FREE|OPT_LOCAL, 0); - curbuf = curwin->w_buffer; buf->b_p_ul = -1; // no undo buf->b_p_swf = FALSE; // no swap file buf->b_p_bl = FALSE; // unlisted buffer diff --git a/src/proto/option.pro b/src/proto/option.pro --- a/src/proto/option.pro +++ b/src/proto/option.pro @@ -21,6 +21,8 @@ int get_term_opt_idx(char_u **p); int set_term_option_alloced(char_u **p); int was_set_insecurely(char_u *opt, int opt_flags); void set_string_option_direct(char_u *name, int opt_idx, char_u *val, int opt_flags, int set_sid); +void set_string_option_direct_in_win(win_T *wp, char_u *name, int opt_idx, char_u *val, int opt_flags, int set_sid); +void set_string_option_direct_in_buf(buf_T *buf, char_u *name, int opt_idx, char_u *val, int opt_flags, int set_sid); int valid_spellang(char_u *val); char *check_colorcolumn(win_T *wp); char *check_stl_option(char_u *s); diff --git a/src/testdir/dumps/Test_popupwin_01.dump b/src/testdir/dumps/Test_popupwin_01.dump --- a/src/testdir/dumps/Test_popupwin_01.dump +++ b/src/testdir/dumps/Test_popupwin_01.dump @@ -1,8 +1,8 @@ >1+0&#ffffff0| @73 |2| @73 -|3| @8|h+0fd7ff255|e|l@1|o| |t|h|e|r|e| @8|r+0#0000001#ffd7ff255| |o|n|e| @8| +0#0000000#ffffff0@30 -|4| @22|a+0#0000001#ffd7ff255|n|o|t|h|e|r| |t|w|o| @8| +0#0000000#ffffff0@30 -|5| @22|a+0#0000001#ffd7ff255|n|o|t|h|e|r| |t|h|r|e@1| @6| +0#0000000#ffffff0@30 +|3| @8|h+0fd7ff255|e|l@1|o| |t|h|e|r|e| @8|r+0&#afffff255| |o|n|e| @8| +0&#ffffff0@30 +|4| @22|a+0&#afffff255|n|o|t|h|e|r| |t|w|o| @8| +0&#ffffff0@30 +|5| @22|a+0&#afffff255|n|o|t|h|e|r| |t|h|r|e@1| @6| +0&#ffffff0@30 |6| @73 |7| @73 |8| @73 diff --git a/src/testdir/dumps/Test_popupwin_03.dump b/src/testdir/dumps/Test_popupwin_03.dump --- a/src/testdir/dumps/Test_popupwin_03.dump +++ b/src/testdir/dumps/Test_popupwin_03.dump @@ -1,8 +1,8 @@ | +2&#ffffff0|+| |[|N|o| |N|a|m|e|]| | +8#0000001#e0e0e08|[|N|o| |N|a|m|e|]| | +1#0000000#ffffff0@49|X+8#0000001#e0e0e08 >1+0#0000000#ffffff0| @73 -|2| @8|h+0fd7ff255|e|l@1|o| |t|h|e|r|e| @8|r+0#0000001#ffd7ff255| |o|n|e| @8| +0#0000000#ffffff0@30 -|3| @22|a+0#0000001#ffd7ff255|n|o|t|h|e|r| |t|w|o| @8| +0#0000000#ffffff0@30 -|4| @22|a+0#0000001#ffd7ff255|n|o|t|h|e|r| |t|h|r|e@1| @6| +0#0000000#ffffff0@30 +|2| @8|h+0fd7ff255|e|l@1|o| |t|h|e|r|e| @8|r+0&#afffff255| |o|n|e| @8| +0&#ffffff0@30 +|3| @22|a+0&#afffff255|n|o|t|h|e|r| |t|w|o| @8| +0&#ffffff0@30 +|4| @22|a+0&#afffff255|n|o|t|h|e|r| |t|h|r|e@1| @6| +0&#ffffff0@30 |5| @73 |6| @73 |7| @73 diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -12,10 +12,11 @@ func Test_simple_popup() endif call writefile([ \ "call setline(1, range(1, 100))", - \ "let winid = popup_create('hello there', {'line': 3, 'col': 11})", - \ "hi PopupColor ctermbg=lightblue", - \ "call setwinvar(winid, '&wincolor', 'PopupColor')", + \ "hi PopupColor1 ctermbg=lightblue", + \ "hi PopupColor2 ctermbg=lightcyan", + \ "let winid = popup_create('hello there', {'line': 3, 'col': 11, 'highlight': 'PopupColor1'})", \ "let winid2 = popup_create(['another one', 'another two', 'another three'], {'line': 3, 'col': 25})", + \ "call setwinvar(winid2, '&wincolor', 'PopupColor2')", \], 'XtestPopup') let buf = RunVimInTerminal('-S XtestPopup', {'rows': 10}) call VerifyScreenDump(buf, 'Test_popupwin_01', {}) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -768,6 +768,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1405, +/**/ 1404, /**/ 1403,