summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/popup.txt11
-rw-r--r--src/normal.c35
-rw-r--r--src/popupwin.c10
-rw-r--r--src/screen.c8
-rw-r--r--src/testdir/dumps/Test_popupwin_firstline.dump2
-rw-r--r--src/testdir/dumps/Test_popupwin_scroll_1.dump2
-rw-r--r--src/testdir/dumps/Test_popupwin_scroll_2.dump2
-rw-r--r--src/testdir/dumps/Test_popupwin_scroll_3.dump2
-rw-r--r--src/testdir/dumps/Test_popupwin_scroll_5.dump10
-rw-r--r--src/testdir/dumps/Test_popupwin_scroll_6.dump10
-rw-r--r--src/testdir/dumps/Test_popupwin_scroll_7.dump10
-rw-r--r--src/version.c2
12 files changed, 86 insertions, 18 deletions
diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt
index 21af8f9e2e..f7b9648c0d 100644
--- a/runtime/doc/popup.txt
+++ b/runtime/doc/popup.txt
@@ -85,11 +85,11 @@ That way you can still see where it is, even though you cannot see the text
that it is in.
-
TODO:
-- When the lines do not fit show a scrollbar (like in the popup menu).
-- Use the mouse wheel for scrolling.
-- Have a way to scroll to the botton. (#4577)
+- click near top of scrollbar scrolls down, clear near bottom scrolls up.
+- Allow for setting scrollbar color: scrollbarhighlight,
+ scrollbarthumbhighlight ?
+- Have a way to scroll to the bottom? (#4577)
- Why does 'nrformats' leak from the popup window buffer???
- Disable commands, feedkeys(), CTRL-W, etc. in a popup window.
Use ERROR_IF_POPUP_WINDOW for more commands.
@@ -275,6 +275,8 @@ popup_getpos({id}) *popup_getpos()*
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
+ firstline line of the buffer at top (1 unless scrolled)
+ scrollbar non-zero if a scrollbar is displayed
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
@@ -483,7 +485,6 @@ The second argument of |popup_create()| is a dictionary with options:
Also see "scrollbar".
hidden When TRUE the popup exists but is not displayed; use
`popup_show()` to unhide it.
- {not implemented yet}
tabpage When -1: display the popup on all tab pages.
When 0 (the default): display the popup on the current
tab page.
diff --git a/src/normal.c b/src/normal.c
index cf9026f097..5bd2e5ee4b 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -4521,9 +4521,13 @@ nv_mousescroll(cmdarg_T *cap)
col = mouse_col;
/* find the window at the pointer coordinates */
- wp = mouse_find_win(&row, &col, FAIL_POPUP);
+ wp = mouse_find_win(&row, &col, FIND_POPUP);
if (wp == NULL)
return;
+#ifdef FEAT_TEXT_PROP
+ if (bt_popup(wp->w_buffer) && !wp->w_has_scrollbar)
+ return;
+#endif
curwin = wp;
curbuf = curwin->w_buffer;
}
@@ -4543,10 +4547,35 @@ nv_mousescroll(cmdarg_T *cap)
}
else
{
- cap->count1 = 3;
- cap->count0 = 3;
+ // Don't scroll more than half the window height.
+ if (curwin->w_height < 6)
+ {
+ cap->count1 = curwin->w_height / 2;
+ if (cap->count1 == 0)
+ cap->count1 = 1;
+ }
+ else
+ cap->count1 = 3;
+ cap->count0 = cap->count1;
nv_scroll_line(cap);
}
+#ifdef FEAT_TEXT_PROP
+ if (bt_popup(wp->w_buffer))
+ {
+ int height = wp->w_height;
+
+ curwin->w_firstline = curwin->w_topline;
+ popup_adjust_position(curwin);
+
+ // we don't want the popup to get smaller, decrement the first line
+ // until it doesn't
+ while (curwin->w_firstline > 1 && curwin->w_height < height)
+ {
+ --curwin->w_firstline;
+ popup_adjust_position(curwin);
+ }
+ }
+#endif
}
# ifdef FEAT_GUI
else
diff --git a/src/popupwin.c b/src/popupwin.c
index b9526c7ff9..5611cba6b7 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -1547,6 +1547,7 @@ f_popup_getpos(typval_T *argvars, typval_T *rettv)
dict_add_number(dict, "core_height", wp->w_height);
dict_add_number(dict, "scrollbar", wp->w_has_scrollbar);
+ dict_add_number(dict, "firstline", wp->w_topline);
dict_add_number(dict, "visible",
win_valid(wp) && (wp->w_popup_flags & POPF_HIDDEN) == 0);
}
@@ -2238,12 +2239,13 @@ update_popups(void (*win_update)(win_T *wp))
{
linenr_T linecount = wp->w_buffer->b_ml.ml_line_count;
- sb_thumb_height = wp->w_height * wp->w_height / linecount;
+ sb_thumb_height = (wp->w_height * wp->w_height + linecount / 2)
+ / linecount;
if (sb_thumb_height == 0)
sb_thumb_height = 1;
- sb_thumb_top = ((wp->w_topline * (wp->w_height - sb_thumb_height)
- + (linecount - wp->w_height) / 2))
- / (linecount - (wp->w_height - sb_thumb_height));
+ sb_thumb_top = (wp->w_topline - 1 + (linecount / wp->w_height) / 2)
+ * (wp->w_height - sb_thumb_height)
+ / (linecount - wp->w_height);
}
for (i = wp->w_popup_border[0];
diff --git a/src/screen.c b/src/screen.c
index 56bbee3a72..5136c1301f 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -875,7 +875,7 @@ update_prepare(void)
#endif
#ifdef FEAT_TEXT_PROP
// Update popup_mask if needed.
- may_update_popup_mask(0);
+ may_update_popup_mask(must_redraw);
#endif
}
@@ -1555,7 +1555,11 @@ win_update(win_T *wp)
if (mid_start == 0)
{
mid_end = wp->w_height;
- if (ONE_WINDOW)
+ if (ONE_WINDOW
+#ifdef FEAT_TEXT_PROP
+ && !bt_popup(wp->w_buffer)
+#endif
+ )
{
/* Clear the screen when it was not done by win_del_lines() or
* win_ins_lines() above, "screen_cleared" is FALSE or MAYBE
diff --git a/src/testdir/dumps/Test_popupwin_firstline.dump b/src/testdir/dumps/Test_popupwin_firstline.dump
index 7efcf3ef4e..13712973dd 100644
--- a/src/testdir/dumps/Test_popupwin_firstline.dump
+++ b/src/testdir/dumps/Test_popupwin_firstline.dump
@@ -3,7 +3,7 @@
|3| @73
|4| @33|3+0#0000001#ffd7ff255@4| +0#0000000#a8a8a8255| +0&#ffffff0@33
|5| @33|4+0#0000001#ffd7ff255@1| @2| +0#0000000#0000001| +0&#ffffff0@33
-|6| @33|5+0#0000001#ffd7ff255| @3| +0#0000000#a8a8a8255| +0&#ffffff0@33
+|6| @33|5+0#0000001#ffd7ff255| @3| +0#0000000#0000001| +0&#ffffff0@33
|7| @33|6+0#0000001#ffd7ff255@4| +0#0000000#a8a8a8255| +0&#ffffff0@33
|8| @73
|9| @73
diff --git a/src/testdir/dumps/Test_popupwin_scroll_1.dump b/src/testdir/dumps/Test_popupwin_scroll_1.dump
index dd0e0b37ec..2f623e7d6f 100644
--- a/src/testdir/dumps/Test_popupwin_scroll_1.dump
+++ b/src/testdir/dumps/Test_popupwin_scroll_1.dump
@@ -2,7 +2,7 @@
|2| @73
|3| @73
|4| @31|o+0#0000001#ffd7ff255|n|e| @4| +0#0000000#0000001| +0&#ffffff0@32
-|5| @31|t+0#0000001#ffd7ff255|w|o| @4| +0#0000000#a8a8a8255| +0&#ffffff0@32
+|5| @31|t+0#0000001#ffd7ff255|w|o| @4| +0#0000000#0000001| +0&#ffffff0@32
|6| @31|t+0#0000001#ffd7ff255|h|r|e@1| @2| +0#0000000#a8a8a8255| +0&#ffffff0@32
|7| @31|f+0#0000001#ffd7ff255|o|u|r| @3| +0#0000000#a8a8a8255| +0&#ffffff0@32
|8| @73
diff --git a/src/testdir/dumps/Test_popupwin_scroll_2.dump b/src/testdir/dumps/Test_popupwin_scroll_2.dump
index 21d33da4e1..f081d6a475 100644
--- a/src/testdir/dumps/Test_popupwin_scroll_2.dump
+++ b/src/testdir/dumps/Test_popupwin_scroll_2.dump
@@ -1,7 +1,7 @@
>1+0&#ffffff0| @73
|2| @73
|3| @73
-|4| @31|t+0#0000001#ffd7ff255|w|o| @4| +0#0000000#a8a8a8255| +0&#ffffff0@32
+|4| @31|t+0#0000001#ffd7ff255|w|o| @4| +0#0000000#0000001| +0&#ffffff0@32
|5| @31|t+0#0000001#ffd7ff255|h|r|e@1| @2| +0#0000000#0000001| +0&#ffffff0@32
|6| @31|f+0#0000001#ffd7ff255|o|u|r| @3| +0#0000000#a8a8a8255| +0&#ffffff0@32
|7| @31|f+0#0000001#ffd7ff255|i|v|e| @3| +0#0000000#a8a8a8255| +0&#ffffff0@32
diff --git a/src/testdir/dumps/Test_popupwin_scroll_3.dump b/src/testdir/dumps/Test_popupwin_scroll_3.dump
index 656e058bfb..4a4489677b 100644
--- a/src/testdir/dumps/Test_popupwin_scroll_3.dump
+++ b/src/testdir/dumps/Test_popupwin_scroll_3.dump
@@ -3,7 +3,7 @@
|3| @73
|4| @31|s+0#0000001#ffd7ff255|i|x| @4| +0#0000000#a8a8a8255| +0&#ffffff0@32
|5| @31|s+0#0000001#ffd7ff255|e|v|e|n| @2| +0#0000000#a8a8a8255| +0&#ffffff0@32
-|6| @31|e+0#0000001#ffd7ff255|i|g|h|t| @2| +0#0000000#a8a8a8255| +0&#ffffff0@32
+|6| @31|e+0#0000001#ffd7ff255|i|g|h|t| @2| +0#0000000#0000001| +0&#ffffff0@32
|7| @31|n+0#0000001#ffd7ff255|i|n|e| @3| +0#0000000#0000001| +0&#ffffff0@32
|8| @73
|9| @73
diff --git a/src/testdir/dumps/Test_popupwin_scroll_5.dump b/src/testdir/dumps/Test_popupwin_scroll_5.dump
new file mode 100644
index 0000000000..2ce996443e
--- /dev/null
+++ b/src/testdir/dumps/Test_popupwin_scroll_5.dump
@@ -0,0 +1,10 @@
+>1+0&#ffffff0| @73
+|2| @73
+|3| @73
+|4| @31|o+0#0000001#ffd7ff255|n|e| @4| +0#0000000#0000001| +0&#ffffff0@32
+|5| @31|t+0#0000001#ffd7ff255|w|o| @4| +0#0000000#0000001| +0&#ffffff0@32
+|6| @31|t+0#0000001#ffd7ff255|h|r|e@1| @2| +0#0000000#a8a8a8255| +0&#ffffff0@32
+|7| @31|f+0#0000001#ffd7ff255|o|u|r| @3| +0#0000000#a8a8a8255| +0&#ffffff0@32
+|8| @73
+|9| @73
+|:|c|a|l@1| |S|c|r|o|l@1|U|p|(|)| @40|1|,|1| @10|T|o|p|
diff --git a/src/testdir/dumps/Test_popupwin_scroll_6.dump b/src/testdir/dumps/Test_popupwin_scroll_6.dump
new file mode 100644
index 0000000000..02c5958440
--- /dev/null
+++ b/src/testdir/dumps/Test_popupwin_scroll_6.dump
@@ -0,0 +1,10 @@
+>1+0&#ffffff0| @73
+|2| @73
+|3| @73
+|4| @31|t+0#0000001#ffd7ff255|h|r|e@1| @2| +0#0000000#a8a8a8255| +0&#ffffff0@32
+|5| @31|f+0#0000001#ffd7ff255|o|u|r| @3| +0#0000000#0000001| +0&#ffffff0@32
+|6| @31|f+0#0000001#ffd7ff255|i|v|e| @3| +0#0000000#0000001| +0&#ffffff0@32
+|7| @31|s+0#0000001#ffd7ff255|i|x| @4| +0#0000000#a8a8a8255| +0&#ffffff0@32
+|8| @73
+|9| @73
+|:|c|a|l@1| |S|c|r|o|l@1|D|o|w|n|(|)| @38|1|,|1| @10|T|o|p|
diff --git a/src/testdir/dumps/Test_popupwin_scroll_7.dump b/src/testdir/dumps/Test_popupwin_scroll_7.dump
new file mode 100644
index 0000000000..f4f0363bbf
--- /dev/null
+++ b/src/testdir/dumps/Test_popupwin_scroll_7.dump
@@ -0,0 +1,10 @@
+>1+0&#ffffff0| @73
+|2| @73
+|3| @73
+|4| @31|s+0#0000001#ffd7ff255|i|x| @4| +0#0000000#a8a8a8255| +0&#ffffff0@32
+|5| @31|s+0#0000001#ffd7ff255|e|v|e|n| @2| +0#0000000#a8a8a8255| +0&#ffffff0@32
+|6| @31|e+0#0000001#ffd7ff255|i|g|h|t| @2| +0#0000000#0000001| +0&#ffffff0@32
+|7| @31|n+0#0000001#ffd7ff255|i|n|e| @3| +0#0000000#0000001| +0&#ffffff0@32
+|8| @73
+|9| @73
+|:|c|a|l@1| |S|c|r|o|l@1|D|o|w|n|(|)| @38|1|,|1| @10|T|o|p|
diff --git a/src/version.c b/src/version.c
index fa4e50dea3..b4d568c6d0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -778,6 +778,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1597,
+/**/
1596,
/**/
1595,