]> granicus.if.org Git - vim/commitdiff
patch 8.1.1608: the evalfunc.c file is too big v8.1.1607
authorBram Moolenaar <Bram@vim.org>
Sat, 29 Jun 2019 05:41:35 +0000 (07:41 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 29 Jun 2019 05:41:35 +0000 (07:41 +0200)
Problem:    The evalfunc.c file is too big.
Solution:   Move sign functionality to sign.c.

runtime/doc/popup.txt
src/normal.c
src/popupwin.c
src/proto/popupwin.pro
src/structs.h
src/testdir/dumps/Test_popupwin_scroll_8.dump [new file with mode: 0644]
src/testdir/dumps/Test_popupwin_scroll_9.dump [new file with mode: 0644]
src/testdir/test_popupwin.vim
src/ui.c
src/version.c

index f7b9648c0dc9320888dc3aa7cfc81f238e30b9ac..8bcad20b460671637fafe224e9515dfa806438cc 100644 (file)
@@ -1,4 +1,4 @@
-*popup.txt*  For Vim version 8.1.  Last change: 2019 Jun 22
+*popup.txt*  For Vim version 8.1.  Last change: 2019 Jun 29
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -86,9 +86,12 @@ that it is in.
 
 
 TODO:
-- click near top of scrollbar scrolls down, clear near bottom scrolls up.
-- Allow for setting scrollbar color: scrollbarhighlight,
-  scrollbarthumbhighlight ?
+- Currently 'buftype' is set to "popup", but all the specifics are on the
+  window.  Can we use a "normal" buffer and put the type on the window? (#4595)
+  What if it's modified and the window closes?
+- Add test for when popup with mask is off the left and off the right of the
+  screen.
+- check padding/border when popup is off the left and right of the screen.
 - 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.
@@ -256,6 +259,8 @@ popup_getoptions({id})                                      *popup_getoptions()*
                zero.  When all values are one then an empty list is included.
 
                "borderhighlight" is not included when all values are empty.
+               "scrollbarhighlight" and "thumbhighlight" are onlu included
+               when set.
 
                "tabpage" will be -1 for a global popup, zero for a popup on
                the current tabpage and a positive number for a popup on
@@ -377,6 +382,8 @@ popup_setoptions({id}, {options})                   *popup_setoptions()*
                        borderhighlight
                        borderchars
                        scrollbar
+                       scrollbarhighlight
+                       thumbhighlight
                        zindex
                        mask
                        time
@@ -534,6 +541,13 @@ The second argument of |popup_create()| is a dictionary with options:
                        otherwise ASCII characters are used.
        scrollbar       non-zero: show a scrollbar when the text doesn't fit.
                        zero: do not show a scrollbar.  Default is non-zero.
+                       Also see |popup-scrollbar|.
+       scrollbarhighlight  Highlight group name for the scrollbar. The
+                       background color is what matters.  When not given then
+                       PmenuSbar is used.
+       thumbhighlight  Highlight group name for the scrollbar thumb. The
+                       background color is what matters.  When not given then
+                       PmenuThumb is used.
        zindex          Priority for the popup, default 50.  Minimum value is
                        1, maximum value is 32000.
        mask            A list of lists with coordinates, defining parts of
@@ -639,6 +653,17 @@ If the popup is force-closed, e.g. because the cursor moved or CTRL-C was
 pressed, the number -1 is passed to the callback.
 
 
+POPUP SCROLLBAR                                                *popup-scrollbar*
+
+If the text does not fit in the popup a scrollbar is displayed on the right of
+the window.  This can be disabled by setting the "scrollbar" option to zero.
+When the scrollbar is displayed mouse scroll events, while the mouse pointer
+is on the popup, will cause the text to scroll up or down as you would expect.
+A click in the upper halve of the scrollbar will scroll the text one line
+down.  A click in the lower halve wil scroll the text one line up.  However,
+this is limited so that the popup does not get smaller.
+
+
 POPUP MASK                                             *popup-mask*
 
 To minimize the text that the popup covers, parts of it can be made
index 0ab3db43004c619dab9958af6e6dc2f14b4d7aae..2015fd8dc9b22fbe8ff29613a08f811fad20a0c5 100644 (file)
@@ -4561,20 +4561,7 @@ nv_mousescroll(cmdarg_T *cap)
        }
 #ifdef FEAT_TEXT_PROP
        if (bt_popup(curwin->w_buffer))
-       {
-           int     height = curwin->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);
-           }
-       }
+           popup_set_firstline(curwin);
 #endif
     }
 # ifdef FEAT_GUI
index aa0bda3c96a2b277942b2760a86ed4160116d50d..96263bca4f6eaeacf927e4e52c8510fbf671bfd2 100644 (file)
@@ -234,6 +234,58 @@ popup_drag(win_T *wp)
     popup_adjust_position(wp);
 }
 
+/*
+ * Set w_firstline to match the current "wp->w_topline".
+ */
+    void
+popup_set_firstline(win_T *wp)
+{
+    int            height = wp->w_height;
+
+    wp->w_firstline = wp->w_topline;
+    popup_adjust_position(wp);
+
+    // we don't want the popup to get smaller, decrement the first line
+    // until it doesn't
+    while (wp->w_firstline > 1 && wp->w_height < height)
+    {
+       --wp->w_firstline;
+       popup_adjust_position(wp);
+    }
+}
+
+/*
+ * Handle a click in a popup window, if it is in the scrollbar.
+ */
+    void
+popup_handle_scrollbar_click(win_T *wp, int row, int col)
+{
+    int            height = popup_height(wp);
+    int            old_topline = wp->w_topline;
+
+    if (wp->w_has_scrollbar == 0)
+       return;
+    if (row >= wp->w_popup_border[0]
+           && row < height - wp->w_popup_border[2]
+           && col == popup_width(wp) - 1)
+    {
+       if (row >= height / 2)
+       {
+           // Click in lower half, scroll down.
+           if (wp->w_topline < wp->w_buffer->b_ml.ml_line_count)
+               ++wp->w_topline;
+       }
+       else if (wp->w_topline > 1)
+           // click on upper half, scroll up.
+           --wp->w_topline;
+       if (wp->w_topline != old_topline)
+       {
+           popup_set_firstline(wp);
+           redraw_win_later(wp, NOT_VALID);
+       }
+    }
+}
+
 #if defined(FEAT_TIMERS)
     static void
 popup_add_timeout(win_T *wp, int time)
@@ -631,7 +683,8 @@ popup_width(win_T *wp)
 {
     return wp->w_width
        + wp->w_popup_padding[3] + wp->w_popup_border[3]
-       + wp->w_popup_padding[1] + wp->w_popup_border[1];
+       + wp->w_popup_padding[1] + wp->w_popup_border[1]
+       + wp->w_has_scrollbar;
 }
 
 /*
index 2f669468ffab45dc6fe205be5e9b2f8223e554e0..7ac8612cd7725292fb19c1c394320b9e92181f5c 100644 (file)
@@ -2,6 +2,8 @@
 int popup_on_border(win_T *wp, int row, int col);
 void popup_start_drag(win_T *wp);
 void popup_drag(win_T *wp);
+void popup_set_firstline(win_T *wp);
+void popup_handle_scrollbar_click(win_T *wp, int row, int col);
 int popup_height(win_T *wp);
 int popup_width(win_T *wp);
 void popup_adjust_position(win_T *wp);
index b368c9e9683b11a169622d779b376e2a3f04e6ec..208a11ece610a0c555a594dc8713e5d1cc9385a8 100644 (file)
@@ -2903,7 +2903,7 @@ struct window_S
     int                w_wantcol;          // "col" for popup window
     int                w_firstline;        // "firstline" for popup window
     int                w_want_scrollbar;   // when zero don't use a scrollbar
-    int                w_has_scrollbar;    // scrollbar displayed
+    int                w_has_scrollbar;    // 1 if scrollbar displayed, 0 otherwise
     char_u     *w_scrollbar_highlight; // "scrollbarhighlight"
     char_u     *w_thumb_highlight; // "thumbhighlight"
     int                w_popup_padding[4]; // popup padding top/right/bot/left
diff --git a/src/testdir/dumps/Test_popupwin_scroll_8.dump b/src/testdir/dumps/Test_popupwin_scroll_8.dump
new file mode 100644 (file)
index 0000000..34b1638
--- /dev/null
@@ -0,0 +1,10 @@
+>1+0&#ffffff0| @73
+|2| @73
+|3| @73
+|4| @31|f+0#0000001#ffd7ff255|o|u|r| @3| +0#0000000#ff404010| +0&#ffffff0@32
+|5| @31|f+0#0000001#ffd7ff255|i|v|e| @3| +0#0000000#4040ff13| +0&#ffffff0@32
+|6| @31|s+0#0000001#ffd7ff255|i|x| @4| +0#0000000#4040ff13| +0&#ffffff0@32
+|7| @31|s+0#0000001#ffd7ff255|e|v|e|n| @2| +0#0000000#ff404010| +0&#ffffff0@32
+|8| @73
+|9| @73
+|:|c|a|l@1| |C|l|i|c|k|T|o|p|(|)| @40|1|,|1| @10|T|o|p| 
diff --git a/src/testdir/dumps/Test_popupwin_scroll_9.dump b/src/testdir/dumps/Test_popupwin_scroll_9.dump
new file mode 100644 (file)
index 0000000..d2b7134
--- /dev/null
@@ -0,0 +1,10 @@
+>1+0&#ffffff0| @73
+|2| @73
+|3| @73
+|4| @31|f+0#0000001#ffd7ff255|i|v|e| @3| +0#0000000#ff404010| +0&#ffffff0@32
+|5| @31|s+0#0000001#ffd7ff255|i|x| @4| +0#0000000#ff404010| +0&#ffffff0@32
+|6| @31|s+0#0000001#ffd7ff255|e|v|e|n| @2| +0#0000000#4040ff13| +0&#ffffff0@32
+|7| @31|e+0#0000001#ffd7ff255|i|g|h|t| @2| +0#0000000#4040ff13| +0&#ffffff0@32
+|8| @73
+|9| @73
+|:|c|a|l@1| |C|l|i|c|k|B|o|t|(|)| @40|1|,|1| @10|T|o|p| 
index 1cb0734ec91926bb337caa755da824262cf0edfe..f4bc33cb1196c4be1c27284494fce7cd22460bfe 100644 (file)
@@ -1436,7 +1436,15 @@ func Test_popup_scrollbar()
     func ScrollDown()
       call feedkeys("\<F3>\<ScrollWheelDown>", "xt")
     endfunc
+    func ClickTop()
+      call feedkeys("\<F4>\<LeftMouse>", "xt")
+    endfunc
+    func ClickBot()
+      call feedkeys("\<F5>\<LeftMouse>", "xt")
+    endfunc
     map <silent> <F3> :call test_setmouse(5, 36)<CR>
+    map <silent> <F4> :call test_setmouse(4, 42)<CR>
+    map <silent> <F5> :call test_setmouse(7, 42)<CR>
   END
   call writefile(lines, 'XtestPopupScroll')
   let buf = RunVimInTerminal('-S XtestPopupScroll', {'rows': 10})
@@ -1464,6 +1472,14 @@ func Test_popup_scrollbar()
   call term_sendkeys(buf, ":call ScrollDown()\<CR>")
   call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {})
 
+  call term_sendkeys(buf, ":call ClickTop()\<CR>")
+  sleep 100m
+  call term_sendkeys(buf, ":call ClickTop()\<CR>")
+  call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {})
+
+  call term_sendkeys(buf, ":call ClickBot()\<CR>")
+  call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {})
+
   " clean up
   call StopVimInTerminal(buf)
   call delete('XtestPopupScroll')
index 00e8887dcdd301fbac6352bad6fdcbe729df7d3f..d09e0ab90d99a748c97f4121b389e1620ae0faf8 100644 (file)
--- a/src/ui.c
+++ b/src/ui.c
@@ -2998,7 +2998,7 @@ retnomove:
            return IN_OTHER_WIN;
 #endif
 #ifdef FEAT_TEXT_PROP
-       // Continue a modeless selection in a popup window.
+       // Continue a modeless selection in a popup window or dragging it.
        if (in_popup_win)
        {
            if (popup_dragwin != NULL)
@@ -3056,6 +3056,9 @@ retnomove:
                popup_start_drag(wp);
                return IN_UNKNOWN;
            }
+           if (which_button == MOUSE_LEFT)
+               // If the click is in the scrollbar, may scroll up/down.
+               popup_handle_scrollbar_click(wp, row, col);
 # ifdef FEAT_CLIPBOARD
            return IN_OTHER_WIN;
 # else
@@ -3517,7 +3520,7 @@ mouse_find_win(int *rowp, int *colp, mouse_find_T popup UNUSED)
        {
            if (*rowp >= wp->w_winrow && *rowp < wp->w_winrow + popup_height(wp)
                    && *colp >= wp->w_wincol
-                                        && *colp < wp->w_wincol + popup_width(wp))
+                                   && *colp < wp->w_wincol + popup_width(wp))
                pwp = wp;
        }
        if (pwp != NULL)
index aa0b8be7e3d005b39247e2369715086135cee615..f1bf2629224663e383b1a95cc64d606d0000f290 100644 (file)
@@ -777,6 +777,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1607,
 /**/
     1606,
 /**/