int blend;
int flags;
int zindex;
+ char_u *title;
char_u *scrollbar_highlight;
char_u *thumb_highlight;
char_u *border_highlight[4];
str = dict_get_string(dict, "title", FALSE);
if (str != NULL)
{
- vim_free(wp->w_popup_title);
- wp->w_popup_title = vim_strsave(str);
+ char_u *title = vim_strsave(str);
+
+ if (title != NULL)
+ {
+ vim_free(wp->w_popup_title);
+ wp->w_popup_title = title;
+ }
}
nr = dict_get_bool(dict, "wrap", -1);
str = tv_get_string(&li->li_tv);
if (*str != NUL)
{
- vim_free(wp->w_border_highlight[i]);
- wp->w_border_highlight[i] = vim_strsave(str);
+ char_u *hl = vim_strsave(str);
+
+ if (hl != NULL)
+ {
+ vim_free(wp->w_border_highlight[i]);
+ wp->w_border_highlight[i] = hl;
+ }
}
}
if (list->lv_len == 1 && wp->w_border_highlight[0] != NULL)
for (i = 1; i < 4; ++i)
{
- vim_free(wp->w_border_highlight[i]);
- wp->w_border_highlight[i] =
- vim_strsave(wp->w_border_highlight[0]);
+ char_u *hl = vim_strsave(wp->w_border_highlight[0]);
+
+ if (hl != NULL)
+ {
+ vim_free(wp->w_border_highlight[i]);
+ wp->w_border_highlight[i] = hl;
+ }
}
}
}
style->blend = wp->w_popup_blend;
style->flags = wp->w_popup_flags;
style->zindex = wp->w_zindex;
+ style->title = wp->w_popup_title;
style->scrollbar_highlight = wp->w_scrollbar_highlight;
style->thumb_highlight = wp->w_thumb_highlight;
for (i = 0; i < 4; i++)
if (style->firstline != wp->w_firstline
|| style->flags != wp->w_popup_flags
+ || style->title != wp->w_popup_title
|| style->scrollbar_highlight != wp->w_scrollbar_highlight
|| style->thumb_highlight != wp->w_thumb_highlight)
return true;
call StopVimInTerminal(buf)
endfunc
+func Test_popup_setoptions_title_redraw()
+ CheckScreendump
+
+ " Changing the title with popup_setoptions() must redraw the popup right
+ " away, without waiting for a later event such as a cursor movement.
+ let lines =<< trim END
+ let g:id = popup_create('hello', #{title: 'title-1', border: []})
+ redraw
+ END
+ call writefile(lines, 'XtestPopupTitleRedraw', 'D')
+ let buf = RunVimInTerminal('-S XtestPopupTitleRedraw', #{rows: 10})
+
+ call VerifyScreenDump(buf, 'Test_popupwin_setoptions_title_1', {})
+
+ " No other event happens between popup_setoptions() and the dump.
+ call term_sendkeys(buf, ":call popup_setoptions(g:id, #{title: 'title-2'})\<CR>")
+ call VerifyScreenDump(buf, 'Test_popupwin_setoptions_title_2', {})
+
+ call StopVimInTerminal(buf)
+endfunc
+
" this tests that we don't get stuck with an error in "win_execute()"
func Test_popup_filter_win_execute_error()
CheckScreendump