diff options
Diffstat (limited to 'data/vim/patches/8.1.1443')
-rw-r--r-- | data/vim/patches/8.1.1443 | 501 |
1 files changed, 501 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1443 b/data/vim/patches/8.1.1443 new file mode 100644 index 000000000..3f3199aa0 --- /dev/null +++ b/data/vim/patches/8.1.1443 @@ -0,0 +1,501 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.1443 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.1443 +Problem: Popup window padding and border not implemented yet. +Solution: Implement padding and border. Add core position and size to + popup_getpos(). +Files: src/structs.h, src/popupwin.c, src/screen.c, + src/testdir/test_popupwin.vim, + src/testdir/dumps/Test_popupwin_20.dump, runtime/doc/popup.txt + + +*** ../vim-8.1.1442/src/structs.h 2019-06-01 17:13:15.880517743 +0200 +--- src/structs.h 2019-06-01 18:13:59.147913309 +0200 +*************** +*** 2888,2893 **** +--- 2888,2895 ---- + int w_maxwidth; // "maxwidth" for popup window + int w_wantline; // "line" for popup window + int w_wantcol; // "col" for popup window ++ int w_popup_padding[4]; // popup padding top/right/bot/left ++ int w_popup_border[4]; // popup border top/right/bot/left + varnumber_T w_popup_last_changedtick; // b:changedtick when position was + // computed + callback_T w_filter_cb; // popup filter callback +*** ../vim-8.1.1442/src/popupwin.c 2019-06-01 17:13:15.880517743 +0200 +--- src/popupwin.c 2019-06-01 20:08:02.521743824 +0200 +*************** +*** 101,106 **** +--- 101,138 ---- + } + } + ++ static void ++ get_padding_border(dict_T *dict, int *array, char *name, int max_val) ++ { ++ dictitem_T *di; ++ ++ vim_memset(array, 0, sizeof(int) * 4); ++ di = dict_find(dict, (char_u *)name, -1); ++ if (di != NULL) ++ { ++ if (di->di_tv.v_type != VAR_LIST) ++ emsg(_(e_listreq)); ++ else ++ { ++ list_T *list = di->di_tv.vval.v_list; ++ listitem_T *li; ++ int i; ++ int nr; ++ ++ for (i = 0; i < 4; ++i) ++ array[i] = 1; ++ if (list != NULL) ++ for (i = 0, li = list->lv_first; i < 4 && i < list->lv_len; ++ ++i, li = li->li_next) ++ { ++ nr = (int)tv_get_number(&li->li_tv); ++ if (nr >= 0) ++ array[i] = nr > max_val ? max_val : nr; ++ } ++ } ++ } ++ } ++ + /* + * Go through the options in "dict" and apply them to buffer "buf" displayed in + * popup window "wp". +*************** +*** 176,181 **** +--- 208,216 ---- + if (callback.cb_name != NULL) + set_callback(&wp->w_filter_cb, &callback); + } ++ ++ get_padding_border(dict, wp->w_popup_padding, "padding", 999); ++ get_padding_border(dict, wp->w_popup_border, "border", 1); + } + + /* +*************** +*** 700,715 **** + dict_T *dict; + int id = (int)tv_get_number(argvars); + win_T *wp = find_popup_win(id); + + if (rettv_dict_alloc(rettv) == OK) + { + if (wp == NULL) + return; // invalid {id} + dict = rettv->vval.v_dict; + dict_add_number(dict, "line", wp->w_winrow + 1); + dict_add_number(dict, "col", wp->w_wincol + 1); +! dict_add_number(dict, "width", wp->w_width); +! dict_add_number(dict, "height", wp->w_height); + dict_add_number(dict, "visible", + (wp->w_popup_flags & POPF_HIDDEN) == 0); + } +--- 735,762 ---- + dict_T *dict; + int id = (int)tv_get_number(argvars); + win_T *wp = find_popup_win(id); ++ int top_extra; ++ int left_extra; + + if (rettv_dict_alloc(rettv) == OK) + { + if (wp == NULL) + return; // invalid {id} ++ top_extra = wp->w_popup_border[0] + wp->w_popup_padding[0]; ++ left_extra = wp->w_popup_border[3] + wp->w_popup_padding[3]; ++ + dict = rettv->vval.v_dict; ++ + dict_add_number(dict, "line", wp->w_winrow + 1); + dict_add_number(dict, "col", wp->w_wincol + 1); +! dict_add_number(dict, "width", wp->w_width + left_extra + wp->w_popup_border[1] + wp->w_popup_padding[1]); +! dict_add_number(dict, "height", wp->w_height + top_extra + wp->w_popup_border[2] + wp->w_popup_padding[2]); +! +! dict_add_number(dict, "core_line", wp->w_winrow + 1 + top_extra); +! dict_add_number(dict, "core_col", wp->w_wincol + 1 + left_extra); +! dict_add_number(dict, "core_width", wp->w_width); +! dict_add_number(dict, "core_height", wp->w_height); +! + dict_add_number(dict, "visible", + (wp->w_popup_flags & POPF_HIDDEN) == 0); + } +*** ../vim-8.1.1442/src/screen.c 2019-06-01 18:11:18.084962963 +0200 +--- src/screen.c 2019-06-01 19:51:24.793577381 +0200 +*************** +*** 991,1001 **** +--- 991,1036 ---- + } + #endif + ++ /* ++ * Get 'wincolor' attribute for window "wp". If not set and "wp" is a popup ++ * window then get the "Pmenu" highlight attribute. ++ */ ++ static int ++ get_wcr_attr(win_T *wp) ++ { ++ int wcr_attr = 0; ++ ++ if (*wp->w_p_wcr != NUL) ++ wcr_attr = syn_name2attr(wp->w_p_wcr); + #ifdef FEAT_TEXT_PROP ++ if (bt_popup(wp->w_buffer) && wcr_attr == 0) ++ wcr_attr = HL_ATTR(HLF_PNI); ++ #endif ++ return wcr_attr; ++ } ++ ++ #ifdef FEAT_TEXT_PROP ++ /* ++ * Return a string of "len" spaces in IObuff. ++ */ ++ static char_u * ++ get_spaces(int len) ++ { ++ vim_memset(IObuff, ' ', (size_t)len); ++ IObuff[len] = NUL; ++ return IObuff; ++ } ++ + static void + update_popups(void) + { + win_T *wp; ++ int top_off; ++ int left_off; ++ int total_width; ++ int total_height; ++ int popup_attr; ++ int row; + + // Find the window with the lowest zindex that hasn't been updated yet, + // so that the window with a higher zindex is drawn later, thus goes on +*************** +*** 1008,1035 **** + if (wp->w_popup_last_changedtick != CHANGEDTICK(wp->w_buffer)) + popup_adjust_position(wp); + + win_update(wp); +- } +- } +- #endif + +! /* +! * Get 'wincolor' attribute for window "wp". If not set and "wp" is a popup +! * window then get the "Pmenu" highlight attribute. +! */ +! static int +! get_wcr_attr(win_T *wp) +! { +! int wcr_attr = 0; + +! if (*wp->w_p_wcr != NUL) +! wcr_attr = syn_name2attr(wp->w_p_wcr); +! #ifdef FEAT_TEXT_PROP +! if (bt_popup(wp->w_buffer) && wcr_attr == 0) +! wcr_attr = HL_ATTR(HLF_PNI); +! #endif +! return wcr_attr; + } + + #if defined(FEAT_GUI) || defined(PROTO) + /* +--- 1043,1139 ---- + if (wp->w_popup_last_changedtick != CHANGEDTICK(wp->w_buffer)) + popup_adjust_position(wp); + ++ // adjust w_winrow and w_wincol for border and padding, since ++ // win_update() doesn't handle them. ++ top_off = wp->w_popup_padding[0] + wp->w_popup_border[0]; ++ left_off = wp->w_popup_padding[3] + wp->w_popup_border[3]; ++ wp->w_winrow += top_off; ++ wp->w_wincol += left_off; ++ ++ // Draw the popup text. + win_update(wp); + +! wp->w_winrow -= top_off; +! wp->w_wincol -= left_off; + +! total_width = wp->w_popup_border[3] + wp->w_popup_padding[3] +! + wp->w_width + wp->w_popup_padding[1] + wp->w_popup_border[1]; +! total_height = wp->w_popup_border[0] + wp->w_popup_padding[0] +! + wp->w_height + wp->w_popup_padding[2] + wp->w_popup_border[2]; +! popup_attr = get_wcr_attr(wp); +! +! if (wp->w_popup_border[0] > 0) +! { +! // top border +! screen_fill(wp->w_winrow, wp->w_winrow + 1, +! wp->w_wincol, +! wp->w_wincol + total_width, +! wp->w_popup_border[3] != 0 ? '+' : '-', +! '-', popup_attr); +! if (wp->w_popup_border[1] > 0) +! screen_puts((char_u *)"+", wp->w_winrow, +! wp->w_wincol + total_width - 1, popup_attr); +! } +! +! if (wp->w_popup_padding[0] > 0) +! { +! // top padding +! row = wp->w_winrow + wp->w_popup_border[0]; +! screen_fill(row, row + wp->w_popup_padding[0], +! wp->w_wincol + wp->w_popup_border[3], +! wp->w_wincol + total_width - wp->w_popup_border[1], +! ' ', ' ', popup_attr); +! } +! +! for (row = wp->w_winrow + wp->w_popup_border[0]; +! row < wp->w_winrow + total_height - wp->w_popup_border[2]; +! ++row) +! { +! // left border +! if (wp->w_popup_border[3] > 0) +! screen_puts((char_u *)"|", row, wp->w_wincol, popup_attr); +! // left padding +! if (wp->w_popup_padding[3] > 0) +! screen_puts(get_spaces(wp->w_popup_padding[3]), row, +! wp->w_wincol + wp->w_popup_border[3], popup_attr); +! // right border +! if (wp->w_popup_border[1] > 0) +! screen_puts((char_u *)"|", row, +! wp->w_wincol + total_width - 1, popup_attr); +! // right padding +! if (wp->w_popup_padding[1] > 0) +! screen_puts(get_spaces(wp->w_popup_padding[1]), row, +! wp->w_wincol + wp->w_popup_border[3] +! + wp->w_popup_padding[3] + wp->w_width, popup_attr); +! } +! +! if (wp->w_popup_padding[2] > 0) +! { +! // bottom padding +! row = wp->w_winrow + wp->w_popup_border[0] +! + wp->w_popup_padding[0] + wp->w_height; +! screen_fill(row, row + wp->w_popup_padding[2], +! wp->w_wincol + wp->w_popup_border[3], +! wp->w_wincol + total_width - wp->w_popup_border[1], +! ' ', ' ', popup_attr); +! } +! +! if (wp->w_popup_border[2] > 0) +! { +! // bottom border +! row = wp->w_winrow + total_height - 1; +! screen_fill(row , row + 1, +! wp->w_wincol, +! wp->w_wincol + total_width, +! wp->w_popup_border[3] != 0 ? '+' : '-', +! '-', popup_attr); +! if (wp->w_popup_border[1] > 0) +! screen_puts((char_u *)"+", row, +! wp->w_wincol + total_width - 1, popup_attr); +! } +! } + } ++ #endif + + #if defined(FEAT_GUI) || defined(PROTO) + /* +*** ../vim-8.1.1442/src/testdir/test_popupwin.vim 2019-06-01 17:13:15.884517713 +0200 +--- src/testdir/test_popupwin.vim 2019-06-01 20:14:48.550674542 +0200 +*************** +*** 56,61 **** +--- 56,109 ---- + call delete('XtestPopup') + endfunc + ++ func Test_popup_with_border_and_padding() ++ if !CanRunVimInTerminal() ++ return ++ endif ++ call writefile([ ++ \ "call setline(1, range(1, 100))", ++ \ "call popup_create('hello border', {'line': 2, 'col': 3, 'border': []})", ++ \ "call popup_create('hello padding', {'line': 2, 'col': 23, 'padding': []})", ++ \ "call popup_create('hello both', {'line': 2, 'col': 43, 'border': [], 'padding': []})", ++ \ "call popup_create('border TL', {'line': 6, 'col': 3, 'border': [1, 0, 0, 4]})", ++ \ "call popup_create('paddings', {'line': 6, 'col': 23, 'padding': [1, 3, 2, 4]})", ++ \], 'XtestPopupBorder') ++ let buf = RunVimInTerminal('-S XtestPopupBorder', {'rows': 15}) ++ call VerifyScreenDump(buf, 'Test_popupwin_20', {}) ++ ++ " clean up ++ call StopVimInTerminal(buf) ++ call delete('XtestPopupBorder') ++ ++ let with_border_or_padding = { ++ \ 'line': 2, ++ \ 'core_line': 3, ++ \ 'col': 3, ++ \ 'core_col': 4, ++ \ 'width': 14, ++ \ 'core_width': 12, ++ \ 'height': 3, ++ \ 'core_height': 1, ++ \ 'visible': 1} ++ let winid = popup_create('hello border', {'line': 2, 'col': 3, 'border': []})", ++ call assert_equal(with_border_or_padding, popup_getpos(winid)) ++ ++ let winid = popup_create('hello paddng', {'line': 2, 'col': 3, 'padding': []}) ++ call assert_equal(with_border_or_padding, popup_getpos(winid)) ++ ++ let winid = popup_create('hello both', {'line': 3, 'col': 8, 'border': [], 'padding': []}) ++ call assert_equal({ ++ \ 'line': 3, ++ \ 'core_line': 5, ++ \ 'col': 8, ++ \ 'core_col': 10, ++ \ 'width': 14, ++ \ 'core_width': 10, ++ \ 'height': 5, ++ \ 'core_height': 1, ++ \ 'visible': 1}, popup_getpos(winid)) ++ endfunc ++ + func Test_popup_with_syntax_win_execute() + if !CanRunVimInTerminal() + return +*** ../vim-8.1.1442/src/testdir/dumps/Test_popupwin_20.dump 2019-06-01 20:15:43.158268775 +0200 +--- src/testdir/dumps/Test_popupwin_20.dump 2019-06-01 20:05:11.907075294 +0200 +*************** +*** 0 **** +--- 1,15 ---- ++ >1+0&#ffffff0| @73 ++ |2| |++0#0000001#ffd7ff255|-@11|+| +0#0000000#ffffff0@5| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@4|++0#0000001#ffd7ff255|-@11|+| +0#0000000#ffffff0@18 ++ |3| ||+0#0000001#ffd7ff255|h|e|l@1|o| |b|o|r|d|e|r||| +0#0000000#ffffff0@5| +0#0000001#ffd7ff255|h|e|l@1|o| |p|a|d@1|i|n|g| | +0#0000000#ffffff0@4||+0#0000001#ffd7ff255| @11||| +0#0000000#ffffff0@18 ++ |4| |++0#0000001#ffd7ff255|-@11|+| +0#0000000#ffffff0@5| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@4||+0#0000001#ffd7ff255| |h|e|l@1|o| |b|o|t|h| ||| +0#0000000#ffffff0@18 ++ |5| @40||+0#0000001#ffd7ff255| @11||| +0#0000000#ffffff0@18 ++ |6| |++0#0000001#ffd7ff255|-@8| +0#0000000#ffffff0@9| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@4|++0#0000001#ffd7ff255|-@11|+| +0#0000000#ffffff0@18 ++ |7| ||+0#0000001#ffd7ff255|b|o|r|d|e|r| |T|L| +0#0000000#ffffff0@9| +0#0000001#ffd7ff255@3|p|a|d@1|i|n|g|s| @2| +0#0000000#ffffff0@37 ++ |8| @20| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@37 ++ |9| @20| +0#0000001#ffd7ff255@14| +0#0000000#ffffff0@37 ++ |1|0| @72 ++ |1@1| @72 ++ |1|2| @72 ++ |1|3| @72 ++ |1|4| @72 ++ @57|1|,|1| @10|T|o|p| +*** ../vim-8.1.1442/runtime/doc/popup.txt 2019-06-01 17:13:15.880517743 +0200 +--- runtime/doc/popup.txt 2019-06-01 19:56:04.131671695 +0200 +*************** +*** 90,100 **** + + IMPLEMENTATION: + - Code is in popupwin.c +- - Invoke filter with character before mapping? +- - Handle screen resize in screenalloc(). (Ben Jackson, #4467) + - Why does 'nrformats' leak from the popup window buffer??? +- - Implement padding +- - Implement border + - Make redrawing more efficient and avoid flicker. + Store popup info in a mask, use the mask in screen_line() + Keep mask until next update_screen(), find differences and redraw affected +--- 90,96 ---- +*************** +*** 103,109 **** + Fix redrawing problem when scrolling non-current window + Fix redrawing the statusline on top of a popup + - Disable commands, feedkeys(), CTRL-W, etc. in a popup window. +! Use NOT_IN_POPUP_WINDOW. + - Figure out the size and position better. + if wrapping splits a double-wide character + if wrapping inserts indent +--- 99,106 ---- + Fix redrawing problem when scrolling non-current window + Fix redrawing the statusline on top of a popup + - Disable commands, feedkeys(), CTRL-W, etc. in a popup window. +! Use NOT_IN_POPUP_WINDOW for more commands. +! - Invoke filter with character before mapping? + - Figure out the size and position better. + if wrapping splits a double-wide character + if wrapping inserts indent +*************** +*** 255,266 **** + with these entries: + col screen column of the popup, one-based + line screen line of the popup, one-based +! width width of the popup in screen cells +! height height of the popup in screen cells + visible one if the popup is displayed, zero if hidden + Note that these are the actual screen positions. They differ + from the values in `popup_getoptions()` for the sizing and + positioning mechanism applied. + If popup window {id} is not found an empty Dict is returned. + + +--- 252,270 ---- + with these entries: + col screen column of the popup, one-based + line screen line of the popup, one-based +! width width of the whole popup in screen cells +! height height of the whole popup in screen cells +! core_col screen column of the text box +! core_line screen line of the text box +! core_width width of the text box in screen cells +! core_height height of the text box in screen cells + visible one if the popup is displayed, zero if hidden + Note that these are the actual screen positions. They differ + from the values in `popup_getoptions()` for the sizing and + positioning mechanism applied. ++ ++ The "core_" values exclude the padding and border. ++ + If popup window {id} is not found an empty Dict is returned. + + +*************** +*** 361,371 **** + padding uses the 'wincolor' highlight; Example: [1, 2, + 1, 3] has 1 line of padding above, 2 columns on the + right, 1 line below and 3 columns on the left +- {not implemented yet} + border list with numbers, defining the border thickness + above/right/below/left of the popup (similar to CSS); + an empty list uses a border of 1 all around +- {not implemented yet} + borderhighlight highlight group name to use for the border + {not implemented yet} + borderchars list with characters, defining the character to use +--- 365,374 ---- + padding uses the 'wincolor' highlight; Example: [1, 2, + 1, 3] has 1 line of padding above, 2 columns on the + right, 1 line below and 3 columns on the left + border list with numbers, defining the border thickness + above/right/below/left of the popup (similar to CSS); ++ only values of zero and non-zero are recognized; + an empty list uses a border of 1 all around + borderhighlight highlight group name to use for the border + {not implemented yet} + borderchars list with characters, defining the character to use +*** ../vim-8.1.1442/src/version.c 2019-06-01 18:11:18.084962963 +0200 +--- src/version.c 2019-06-01 19:53:24.984758045 +0200 +*************** +*** 769,770 **** +--- 769,772 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1443, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +79. All of your most erotic dreams have a scrollbar at the right side. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |