# HG changeset patch # User Bram Moolenaar # Date 1561787106 -7200 # Node ID 11f3cf51d43b3d3c98447f49679c84c5365535c8 # Parent 57771dafd31777a9d130c1d5b52139cce1919ec6 patch 8.1.1608: the evalfunc.c file is too big commit https://github.com/vim/vim/commit/f9c85f580b3792f6b95107412972f5360d412ef0 Author: Bram Moolenaar Date: Sat Jun 29 07:41:35 2019 +0200 patch 8.1.1608: the evalfunc.c file is too big Problem: The evalfunc.c file is too big. Solution: Move sign functionality to sign.c. diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt --- a/runtime/doc/popup.txt +++ b/runtime/doc/popup.txt @@ -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_getopt 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}) *pop borderhighlight borderchars scrollbar + scrollbarhighlight + thumbhighlight zindex mask time @@ -534,6 +541,13 @@ The second argument of |popup_create()| 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. becau 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 diff --git a/src/normal.c b/src/normal.c --- a/src/normal.c +++ b/src/normal.c @@ -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 diff --git a/src/popupwin.c b/src/popupwin.c --- a/src/popupwin.c +++ b/src/popupwin.c @@ -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; } /* diff --git a/src/proto/popupwin.pro b/src/proto/popupwin.pro --- a/src/proto/popupwin.pro +++ b/src/proto/popupwin.pro @@ -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); diff --git a/src/structs.h b/src/structs.h --- a/src/structs.h +++ b/src/structs.h @@ -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 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_scroll_8.dump @@ -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 --- /dev/null +++ b/src/testdir/dumps/Test_popupwin_scroll_9.dump @@ -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| diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim --- a/src/testdir/test_popupwin.vim +++ b/src/testdir/test_popupwin.vim @@ -1436,7 +1436,15 @@ func Test_popup_scrollbar() func ScrollDown() call feedkeys("\\", "xt") endfunc + func ClickTop() + call feedkeys("\\", "xt") + endfunc + func ClickBot() + call feedkeys("\\", "xt") + endfunc map :call test_setmouse(5, 36) + map :call test_setmouse(4, 42) + map :call test_setmouse(7, 42) 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()\") call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {}) + call term_sendkeys(buf, ":call ClickTop()\") + sleep 100m + call term_sendkeys(buf, ":call ClickTop()\") + call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {}) + + call term_sendkeys(buf, ":call ClickBot()\") + call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {}) + " clean up call StopVimInTerminal(buf) call delete('XtestPopupScroll') diff --git a/src/ui.c b/src/ui.c --- 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, mou { 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) 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 */ /**/ + 1607, +/**/ 1606, /**/ 1605,