# HG changeset patch # User Bram Moolenaar # Date 1559168105 -7200 # Node ID 032d5335987ef9361ce3659aa907088d9478d69a # Parent 2185324ec26b96493d4103aa2eee0e1f2eeca5b3 patch 8.1.1421: drawing "~" line in popup window commit https://github.com/vim/vim/commit/1714696600f2859f897f4ffb33cedb5de09eded3 Author: Bram Moolenaar Date: Thu May 30 00:12:11 2019 +0200 patch 8.1.1421: drawing "~" line in popup window Problem: Drawing "~" line in popup window. Solution: Just draw text in the last line of the popup window. diff --git a/src/popupwin.c b/src/popupwin.c --- a/src/popupwin.c +++ b/src/popupwin.c @@ -151,7 +151,7 @@ add_popup_dicts(buf_T *buf, list_T *l) /* * Adjust the position and size of the popup to fit on the screen. */ - static void + void popup_adjust_position(win_T *wp) { linenr_T lnum; @@ -209,6 +209,8 @@ popup_adjust_position(win_T *wp) wp->w_height = wp->w_maxheight; if (wp->w_height > Rows - wp->w_winrow) wp->w_height = Rows - wp->w_winrow; + + wp->w_popup_last_changedtick = CHANGEDTICK(wp->w_buffer); } /* diff --git a/src/proto/popupwin.pro b/src/proto/popupwin.pro --- a/src/proto/popupwin.pro +++ b/src/proto/popupwin.pro @@ -1,13 +1,14 @@ /* popupwin.c */ +void popup_adjust_position(win_T *wp); void f_popup_create(typval_T *argvars, typval_T *rettv); int popup_any_visible(void); void f_popup_close(typval_T *argvars, typval_T *rettv); void f_popup_hide(typval_T *argvars, typval_T *rettv); -void f_popup_getposition(typval_T *argvars, typval_T *rettv); void f_popup_show(typval_T *argvars, typval_T *rettv); void popup_close(int id); void popup_close_tabpage(tabpage_T *tp, int id); void close_all_popups(void); void ex_popupclear(exarg_T *eap); void f_popup_move(typval_T *argvars, typval_T *rettv); +void f_popup_getposition(typval_T *argvars, typval_T *rettv); /* vim: set ft=c : */ diff --git a/src/screen.c b/src/screen.c --- a/src/screen.c +++ b/src/screen.c @@ -1030,6 +1030,12 @@ update_popups(void) if (lowest_wp == NULL) break; + + // Recompute the position if the text changed. + if (lowest_wp->w_popup_last_changedtick + != CHANGEDTICK(lowest_wp->w_buffer)) + popup_adjust_position(lowest_wp); + win_update(lowest_wp); lowest_wp->w_popup_flags |= POPF_REDRAWN; } @@ -2119,6 +2125,9 @@ win_update(win_T *wp) && wp->w_lines[idx].wl_lnum == lnum && lnum > wp->w_topline && !(dy_flags & (DY_LASTLINE | DY_TRUNCATE)) +#ifdef FEAT_TEXT_PROP + && !bt_popup(wp->w_buffer) +#endif && srow + wp->w_lines[idx].wl_size > wp->w_height #ifdef FEAT_DIFF && diff_check_fill(wp, lnum) == 0 @@ -2274,6 +2283,13 @@ win_update(win_T *wp) wp->w_filler_rows = wp->w_height - srow; } #endif +#ifdef FEAT_TEXT_PROP + else if (bt_popup(wp->w_buffer)) + { + // popup line that doesn't fit is left as-is + wp->w_botline = lnum; + } +#endif else if (dy_flags & DY_TRUNCATE) /* 'display' has "truncate" */ { int scr_row = W_WINROW(wp) + wp->w_height - 1; @@ -2334,7 +2350,11 @@ win_update(win_T *wp) // Make sure the rest of the screen is blank // put '~'s on rows that aren't part of the file. - win_draw_end(wp, '~', ' ', FALSE, row, wp->w_height, HLF_EOB); + win_draw_end(wp, +#ifdef FEAT_TEXT_PROP + bt_popup(wp->w_buffer) ? ' ' : +#endif + '~', ' ', FALSE, row, wp->w_height, HLF_EOB); } #ifdef SYN_TIME_LIMIT diff --git a/src/structs.h b/src/structs.h --- a/src/structs.h +++ b/src/structs.h @@ -2881,6 +2881,8 @@ struct window_S int w_maxwidth; // "maxwidth" for popup window int w_wantline; // "line" for popup window int w_wantcol; // "col" for popup window + varnumber_T w_popup_last_changedtick; // b:changedtick when position was + // computed # if defined(FEAT_TIMERS) timer_T *w_popup_timer; // timer for closing popup window # endif diff --git a/src/testdir/dumps/Test_popupwin_05.dump b/src/testdir/dumps/Test_popupwin_05.dump --- a/src/testdir/dumps/Test_popupwin_05.dump +++ b/src/testdir/dumps/Test_popupwin_05.dump @@ -3,7 +3,7 @@ |~| @73 |~| @6|o+0#0000001#ffd7ff255|t|h|e|r| |t|a|b| @5| +0#4040ff13#ffffff0@51 |~| @6|a+0#0000001#ffd7ff255| |c+0#ff404010&|o|m@1|e|n|t| +0#0000001&|l|i|n|e| | +0#4040ff13#ffffff0@51 -|~| @6|~+0&#ffd7ff255| @13| +0&#ffffff0@51 +|~| @6| +0&#ffd7ff255@14| +0&#ffffff0@51 |~| @73 |~| @73 |~| @73 diff --git a/src/testdir/dumps/Test_popupwin_06.dump b/src/testdir/dumps/Test_popupwin_06.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_06.dump @@ -0,0 +1,10 @@ +> +0&#ffffff0@74 +|~+0#4040ff13&| @73 +|~| @73 +|~| @6|o+0#0000001#ffd7ff255|t|h|e|r| |t|a|b| @15| +0#4040ff13#ffffff0@41 +|~| @6|a+0#0000001#ffd7ff255| |c+0#ff404010&|o|m@1|e|n|t| +0#0000001&|l|i|n|e| @10| +0#4040ff13#ffffff0@41 +|~| @6|t+0#0000001#ffd7ff255|h|i|s| |l|i|n|e| |w|i|l@1| |n|o|t| |f|i|t| |h|e| +0#4040ff13#ffffff0@41 +|~| @73 +|~| @73 +|~| @73 +|:+0#0000000&|r|e|d|r|a|w| @49|0|,|0|-|1| @8|A|l@1| 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 @@ -41,11 +41,16 @@ func Test_simple_popup() call term_sendkeys(buf, ":quit!\") call VerifyScreenDump(buf, 'Test_popupwin_04', {}) - " resize popup + " resize popup, show empty line at bottom call term_sendkeys(buf, ":call popup_move(popupwin, {'minwidth': 15, 'maxwidth': 25, 'minheight': 3, 'maxheight': 5})\") call term_sendkeys(buf, ":redraw\") call VerifyScreenDump(buf, 'Test_popupwin_05', {}) + " show not fitting line at bottom + call term_sendkeys(buf, ":call setbufline(winbufnr(popupwin), 3, 'this line will not fit here')\") + call term_sendkeys(buf, ":redraw\") + call VerifyScreenDump(buf, 'Test_popupwin_06', {}) + " clean up call StopVimInTerminal(buf) call delete('XtestPopup') 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 */ /**/ + 1421, +/**/ 1420, /**/ 1419,