0
0
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:
Bram Moolenaar
2019-06-26 03:40:36 +02:00
parent c2a4316500
commit 68acb41f99
12 changed files with 86 additions and 18 deletions

View File

@@ -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.

View File

@@ -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
{ {
// 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->count1 = 3;
cap->count0 = 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

View File

@@ -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];

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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|

View 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|

View 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|

View File

@@ -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,
/**/ /**/