# HG changeset patch # User Bram Moolenaar # Date 1561513504 -7200 # Node ID 983950357c40be10323f5dd29f7b6978d70a2d35 # Parent 44d92eb813b449515097e71e8200ec41d0722f22 patch 8.1.1597: cannot scroll a popup window with the mouse commit https://github.com/vim/vim/commit/68acb41f990405cb5ccd33fcba71a5d499c82974 Author: Bram Moolenaar Date: Wed Jun 26 03:40:36 2019 +0200 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. diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt --- a/runtime/doc/popup.txt +++ b/runtime/doc/popup.txt @@ -85,11 +85,11 @@ That way you can still see where it is, 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()| 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 --- 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 --- a/src/popupwin.c +++ b/src/popupwin.c @@ -1547,6 +1547,7 @@ f_popup_getpos(typval_T *argvars, typval 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 * { 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 --- 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 --- 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 --- 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 --- 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 --- 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 --- /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 --- /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 --- /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 --- 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,