mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.1.1597: cannot scroll a popup window with the mouse
Problem: Cannot scroll a popup window with the mouse. Solution: If the popup window has a scrollbar let the mouse scroll wheel scroll the window.
This commit is contained in:
@@ -85,11 +85,11 @@ That way you can still see where it is, even though you cannot see the text
|
|||||||
that it is in.
|
that it is in.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- When the lines do not fit show a scrollbar (like in the popup menu).
|
- click near top of scrollbar scrolls down, clear near bottom scrolls up.
|
||||||
- Use the mouse wheel for scrolling.
|
- Allow for setting scrollbar color: scrollbarhighlight,
|
||||||
- Have a way to scroll to the botton. (#4577)
|
scrollbarthumbhighlight ?
|
||||||
|
- Have a way to scroll to the bottom? (#4577)
|
||||||
- Why does 'nrformats' leak from the popup window buffer???
|
- Why does 'nrformats' leak from the popup window buffer???
|
||||||
- Disable commands, feedkeys(), CTRL-W, etc. in a popup window.
|
- Disable commands, feedkeys(), CTRL-W, etc. in a popup window.
|
||||||
Use ERROR_IF_POPUP_WINDOW for more commands.
|
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_line screen line of the text box
|
||||||
core_width width of the text box in screen cells
|
core_width width of the text box in screen cells
|
||||||
core_height height 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
|
visible one if the popup is displayed, zero if hidden
|
||||||
Note that these are the actual screen positions. They differ
|
Note that these are the actual screen positions. They differ
|
||||||
from the values in `popup_getoptions()` for the sizing and
|
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".
|
Also see "scrollbar".
|
||||||
hidden When TRUE the popup exists but is not displayed; use
|
hidden When TRUE the popup exists but is not displayed; use
|
||||||
`popup_show()` to unhide it.
|
`popup_show()` to unhide it.
|
||||||
{not implemented yet}
|
|
||||||
tabpage When -1: display the popup on all tab pages.
|
tabpage When -1: display the popup on all tab pages.
|
||||||
When 0 (the default): display the popup on the current
|
When 0 (the default): display the popup on the current
|
||||||
tab page.
|
tab page.
|
||||||
|
35
src/normal.c
35
src/normal.c
@@ -4521,9 +4521,13 @@ nv_mousescroll(cmdarg_T *cap)
|
|||||||
col = mouse_col;
|
col = mouse_col;
|
||||||
|
|
||||||
/* find the window at the pointer coordinates */
|
/* 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)
|
if (wp == NULL)
|
||||||
return;
|
return;
|
||||||
|
#ifdef FEAT_TEXT_PROP
|
||||||
|
if (bt_popup(wp->w_buffer) && !wp->w_has_scrollbar)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
curwin = wp;
|
curwin = wp;
|
||||||
curbuf = curwin->w_buffer;
|
curbuf = curwin->w_buffer;
|
||||||
}
|
}
|
||||||
@@ -4543,10 +4547,35 @@ nv_mousescroll(cmdarg_T *cap)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cap->count1 = 3;
|
// Don't scroll more than half the window height.
|
||||||
cap->count0 = 3;
|
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);
|
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
|
# ifdef FEAT_GUI
|
||||||
else
|
else
|
||||||
|
@@ -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, "core_height", wp->w_height);
|
||||||
|
|
||||||
dict_add_number(dict, "scrollbar", wp->w_has_scrollbar);
|
dict_add_number(dict, "scrollbar", wp->w_has_scrollbar);
|
||||||
|
dict_add_number(dict, "firstline", wp->w_topline);
|
||||||
dict_add_number(dict, "visible",
|
dict_add_number(dict, "visible",
|
||||||
win_valid(wp) && (wp->w_popup_flags & POPF_HIDDEN) == 0);
|
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;
|
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)
|
if (sb_thumb_height == 0)
|
||||||
sb_thumb_height = 1;
|
sb_thumb_height = 1;
|
||||||
sb_thumb_top = ((wp->w_topline * (wp->w_height - sb_thumb_height)
|
sb_thumb_top = (wp->w_topline - 1 + (linecount / wp->w_height) / 2)
|
||||||
+ (linecount - wp->w_height) / 2))
|
* (wp->w_height - sb_thumb_height)
|
||||||
/ (linecount - (wp->w_height - sb_thumb_height));
|
/ (linecount - wp->w_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = wp->w_popup_border[0];
|
for (i = wp->w_popup_border[0];
|
||||||
|
@@ -875,7 +875,7 @@ update_prepare(void)
|
|||||||
#endif
|
#endif
|
||||||
#ifdef FEAT_TEXT_PROP
|
#ifdef FEAT_TEXT_PROP
|
||||||
// Update popup_mask if needed.
|
// Update popup_mask if needed.
|
||||||
may_update_popup_mask(0);
|
may_update_popup_mask(must_redraw);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1555,7 +1555,11 @@ win_update(win_T *wp)
|
|||||||
if (mid_start == 0)
|
if (mid_start == 0)
|
||||||
{
|
{
|
||||||
mid_end = wp->w_height;
|
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
|
/* Clear the screen when it was not done by win_del_lines() or
|
||||||
* win_ins_lines() above, "screen_cleared" is FALSE or MAYBE
|
* win_ins_lines() above, "screen_cleared" is FALSE or MAYBE
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
|3| @73
|
|3| @73
|
||||||
|4| @33|3+0#0000001#ffd7ff255@4| +0#0000000#a8a8a8255| +0&#ffffff0@33
|
|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
|
|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
|
|7| @33|6+0#0000001#ffd7ff255@4| +0#0000000#a8a8a8255| +0&#ffffff0@33
|
||||||
|8| @73
|
|8| @73
|
||||||
|9| @73
|
|9| @73
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|2| @73
|
|2| @73
|
||||||
|3| @73
|
|3| @73
|
||||||
|4| @31|o+0#0000001#ffd7ff255|n|e| @4| +0#0000000#0000001| +0&#ffffff0@32
|
|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
|
|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
|
|7| @31|f+0#0000001#ffd7ff255|o|u|r| @3| +0#0000000#a8a8a8255| +0&#ffffff0@32
|
||||||
|8| @73
|
|8| @73
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
>1+0&#ffffff0| @73
|
>1+0&#ffffff0| @73
|
||||||
|2| @73
|
|2| @73
|
||||||
|3| @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
|
|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
|
|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
|
|7| @31|f+0#0000001#ffd7ff255|i|v|e| @3| +0#0000000#a8a8a8255| +0&#ffffff0@32
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
|3| @73
|
|3| @73
|
||||||
|4| @31|s+0#0000001#ffd7ff255|i|x| @4| +0#0000000#a8a8a8255| +0&#ffffff0@32
|
|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
|
|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
|
|7| @31|n+0#0000001#ffd7ff255|i|n|e| @3| +0#0000000#0000001| +0&#ffffff0@32
|
||||||
|8| @73
|
|8| @73
|
||||||
|9| @73
|
|9| @73
|
||||||
|
10
src/testdir/dumps/Test_popupwin_scroll_5.dump
Normal file
10
src/testdir/dumps/Test_popupwin_scroll_5.dump
Normal file
@@ -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|
|
10
src/testdir/dumps/Test_popupwin_scroll_6.dump
Normal file
10
src/testdir/dumps/Test_popupwin_scroll_6.dump
Normal file
@@ -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|
|
10
src/testdir/dumps/Test_popupwin_scroll_7.dump
Normal file
10
src/testdir/dumps/Test_popupwin_scroll_7.dump
Normal file
@@ -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|
|
@@ -777,6 +777,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1597,
|
||||||
/**/
|
/**/
|
||||||
1596,
|
1596,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user