]> granicus.if.org Git - vim/commitdiff
patch 8.1.1597: cannot scroll a popup window with the mouse v8.1.1597
authorBram Moolenaar <Bram@vim.org>
Wed, 26 Jun 2019 01:40:36 +0000 (03:40 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 26 Jun 2019 01:40:36 +0000 (03:40 +0200)
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.

12 files changed:
runtime/doc/popup.txt
src/normal.c
src/popupwin.c
src/screen.c
src/testdir/dumps/Test_popupwin_firstline.dump
src/testdir/dumps/Test_popupwin_scroll_1.dump
src/testdir/dumps/Test_popupwin_scroll_2.dump
src/testdir/dumps/Test_popupwin_scroll_3.dump
src/testdir/dumps/Test_popupwin_scroll_5.dump [new file with mode: 0644]
src/testdir/dumps/Test_popupwin_scroll_6.dump [new file with mode: 0644]
src/testdir/dumps/Test_popupwin_scroll_7.dump [new file with mode: 0644]
src/version.c

index 21af8f9e2e240bfb14af8a7f62de85be6982be1b..f7b9648c0dc9320888dc3aa7cfc81f238e30b9ac 100644 (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.
 
 
-
 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.
index cf9026f0976250361dc99e011f2920297f246aa2..5bd2e5ee4bd7935228a9659f8fa35a8b64635593 100644 (file)
@@ -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
index b9526c7ff9491e8075a23b12bf2f53396cc1079f..5611cba6b7fb1a1ee4cbd821452485655c8ef753 100644 (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, "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];
index 56bbee3a7248269c1be179375deaa872f04966aa..5136c1301f91994c4ee85addd75b28aa13845b8a 100644 (file)
@@ -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
index 7efcf3ef4e43ce9388ef27c86fea145fd14ef4e1..13712973dddff83c57fac175e0c7f277783a0eaa 100644 (file)
@@ -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
index dd0e0b37ec03107a5a046b7dd07ff8d7070a7865..2f623e7d6f716d511317d83b5c8ff0a9368082b3 100644 (file)
@@ -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
index 21d33da4e1c8da8b82dc2cf3d50513e0dfd052cb..f081d6a47526a1c82a118734421a69d8aecf274c 100644 (file)
@@ -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
index 656e058bfbc35300eca4906aa3b8afc57aa99468..4a4489677befb6e357d38283015bc28ba6a6f300 100644 (file)
@@ -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 (file)
index 0000000..2ce9964
--- /dev/null
@@ -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 (file)
index 0000000..02c5958
--- /dev/null
@@ -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 (file)
index 0000000..f4f0363
--- /dev/null
@@ -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| 
index fa4e50dea3e13bca4750ba62e7d621e902b2ffec..b4d568c6d05b79f14c071403c0e8aa66e59cae7a 100644 (file)
@@ -777,6 +777,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1597,
 /**/
     1596,
 /**/