Patch 8.1.1607
Problem:    Popup window scrollbar does not respond to click.
Solution:   Mouse click in scrollbar scrolls by one line.
Files:      src/popupwin.c, src/proto/popupwin.pro, src/structs.h, src/ui.c,
            src/normal.c, runtime/doc/popup.txt,
            src/testdir/dumps/Test_popupwin_scroll_8.dump,
            src/testdir/dumps/Test_popupwin_scroll_9.dump


*** ../vim-8.1.1607/src/popupwin.c      2019-06-29 07:27:10.854648332 +0200
--- src/popupwin.c      2019-06-29 06:28:23.717538142 +0200
***************
*** 234,239 ****
--- 234,291 ----
      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,637 ****
  {
      return wp->w_width
        + wp->w_popup_padding[3] + wp->w_popup_border[3]
!       + wp->w_popup_padding[1] + wp->w_popup_border[1];
  }
  
  /*
--- 683,690 ----
  {
      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_has_scrollbar;
  }
  
  /*
*** ../vim-8.1.1607/src/proto/popupwin.pro      2019-06-29 07:27:10.854648332 
+0200
--- src/proto/popupwin.pro      2019-06-29 06:27:59.745639954 +0200
***************
*** 2,7 ****
--- 2,9 ----
  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);
*** ../vim-8.1.1607/src/structs.h       2019-06-29 07:27:10.854648332 +0200
--- src/structs.h       2019-06-29 06:07:42.882757458 +0200
***************
*** 2903,2909 ****
      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
      char_u    *w_scrollbar_highlight; // "scrollbarhighlight"
      char_u    *w_thumb_highlight; // "thumbhighlight"
      int               w_popup_padding[4]; // popup padding top/right/bot/left
--- 2903,2909 ----
      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;    // 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
*** ../vim-8.1.1607/src/ui.c    2019-06-29 07:27:10.854648332 +0200
--- src/ui.c    2019-06-29 06:07:42.882757458 +0200
***************
*** 2998,3004 ****
            return IN_OTHER_WIN;
  #endif
  #ifdef FEAT_TEXT_PROP
!       // Continue a modeless selection in a popup window.
        if (in_popup_win)
        {
            if (popup_dragwin != NULL)
--- 2998,3004 ----
            return IN_OTHER_WIN;
  #endif
  #ifdef FEAT_TEXT_PROP
!       // Continue a modeless selection in a popup window or dragging it.
        if (in_popup_win)
        {
            if (popup_dragwin != NULL)
***************
*** 3056,3061 ****
--- 3056,3064 ----
                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,3523 ****
        {
            if (*rowp >= wp->w_winrow && *rowp < wp->w_winrow + popup_height(wp)
                    && *colp >= wp->w_wincol
!                                        && *colp < wp->w_wincol + 
popup_width(wp))
                pwp = wp;
        }
        if (pwp != NULL)
--- 3520,3526 ----
        {
            if (*rowp >= wp->w_winrow && *rowp < wp->w_winrow + popup_height(wp)
                    && *colp >= wp->w_wincol
!                                   && *colp < wp->w_wincol + popup_width(wp))
                pwp = wp;
        }
        if (pwp != NULL)
*** ../vim-8.1.1607/src/normal.c        2019-06-29 07:27:10.854648332 +0200
--- src/normal.c        2019-06-29 06:28:33.969494606 +0200
***************
*** 4561,4580 ****
        }
  #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);
!           }
!       }
  #endif
      }
  # ifdef FEAT_GUI
--- 4561,4567 ----
        }
  #ifdef FEAT_TEXT_PROP
        if (bt_popup(curwin->w_buffer))
!           popup_set_firstline(curwin);
  #endif
      }
  # ifdef FEAT_GUI
*** ../vim-8.1.1607/runtime/doc/popup.txt       2019-06-29 07:27:10.854648332 
+0200
--- runtime/doc/popup.txt       2019-06-29 06:53:01.928130508 +0200
***************
*** 86,94 ****
  
  
  TODO:
! - 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.
--- 86,97 ----
  
  
  TODO:
! - 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,261 ****
--- 259,266 ----
                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,382 ****
--- 382,389 ----
                        borderhighlight
                        borderchars
                        scrollbar
+                       scrollbarhighlight
+                       thumbhighlight
                        zindex
                        mask
                        time
***************
*** 534,539 ****
--- 541,553 ----
                        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,644 ****
--- 653,669 ----
  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
*** ../vim-8.1.1607/src/testdir/dumps/Test_popupwin_scroll_8.dump       
2019-06-29 07:27:10.854648332 +0200
--- src/testdir/dumps/Test_popupwin_scroll_8.dump       2019-06-29 
07:15:41.897843726 +0200
***************
*** 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| 
*** ../vim-8.1.1607/src/testdir/dumps/Test_popupwin_scroll_9.dump       
2019-06-29 07:22:21.167965265 +0200
--- src/testdir/dumps/Test_popupwin_scroll_9.dump       2019-06-29 
07:15:42.945838648 +0200
***************
*** 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| 
*** ../vim-8.1.1607/src/version.c       2019-06-29 03:42:32.060749532 +0200
--- src/version.c       2019-06-29 07:34:02.868807713 +0200
***************
*** 779,780 ****
--- 779,782 ----
  {   /* Add new patch number below this line */
+ /**/
+     1607,
  /**/

-- 
Facepalm statement #6: "Estland is a fantasy place, just like Middle Earth and
Madagaskar"

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/201906290545.x5T5jmSQ032349%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui