From 68acb41f990405cb5ccd33fcba71a5d499c82974 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 26 Jun 2019 03:40:36 +0200 Subject: [PATCH] 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. --- runtime/doc/popup.txt | 11 +++--- src/normal.c | 35 +++++++++++++++++-- src/popupwin.c | 10 +++--- src/screen.c | 8 +++-- .../dumps/Test_popupwin_firstline.dump | 2 +- src/testdir/dumps/Test_popupwin_scroll_1.dump | 2 +- src/testdir/dumps/Test_popupwin_scroll_2.dump | 2 +- src/testdir/dumps/Test_popupwin_scroll_3.dump | 2 +- src/testdir/dumps/Test_popupwin_scroll_5.dump | 10 ++++++ src/testdir/dumps/Test_popupwin_scroll_6.dump | 10 ++++++ src/testdir/dumps/Test_popupwin_scroll_7.dump | 10 ++++++ src/version.c | 2 ++ 12 files changed, 86 insertions(+), 18 deletions(-) create mode 100644 src/testdir/dumps/Test_popupwin_scroll_5.dump create mode 100644 src/testdir/dumps/Test_popupwin_scroll_6.dump create mode 100644 src/testdir/dumps/Test_popupwin_scroll_7.dump 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 @@ -777,6 +777,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1597, /**/ 1596, /**/