summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-05-30 00:12:11 +0200
committerBram Moolenaar <Bram@vim.org>2019-05-30 00:12:11 +0200
commit1714696600f2859f897f4ffb33cedb5de09eded3 (patch)
treecd4985f53968b61908af690ec981fd5b853538b6
parent88c4e1f06905983870175a473683e81312d14c64 (diff)
patch 8.1.1421: drawing "~" line in popup windowv8.1.1421
Problem: Drawing "~" line in popup window. Solution: Just draw text in the last line of the popup window.
-rw-r--r--src/popupwin.c4
-rw-r--r--src/proto/popupwin.pro3
-rw-r--r--src/screen.c22
-rw-r--r--src/structs.h2
-rw-r--r--src/testdir/dumps/Test_popupwin_05.dump2
-rw-r--r--src/testdir/dumps/Test_popupwin_06.dump10
-rw-r--r--src/testdir/test_popupwin.vim7
-rw-r--r--src/version.c2
8 files changed, 47 insertions, 5 deletions
diff --git a/src/popupwin.c b/src/popupwin.c
index 9465008737..64309ff8b7 100644
--- 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
index 37b5273226..83b5f2ccb8 100644
--- 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
index de0833a679..5f3947bf9e 100644
--- 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
index 79681cc2a8..9f63949208 100644
--- 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
index bfb50f0f00..2c74d7469e 100644
--- 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
index 0000000000..3dfcbc2f84
--- /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
index a2d2e803b1..4511cd1ac0 100644
--- 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!\<CR>")
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})\<CR>")
call term_sendkeys(buf, ":redraw\<CR>")
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')\<CR>")
+ call term_sendkeys(buf, ":redraw\<CR>")
+ call VerifyScreenDump(buf, 'Test_popupwin_06', {})
+
" clean up
call StopVimInTerminal(buf)
call delete('XtestPopup')
diff --git a/src/version.c b/src/version.c
index 00eaacb5b4..ca48793031 100644
--- 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,