Patch 8.0.1161
Problem:    Popup menu drawing problem when resizing terminal.
Solution:   Redraw after resizing also when a popup menu is visible. (Ozaki
            Kiichi, closes #2110)
Files:      src/popupmnu.c, src/term.c, src/testdir/shared.vim,
            src/testdir/test_popup.vim


*** ../vim-8.0.1160/src/popupmnu.c      2017-09-22 15:20:27.740148617 +0200
--- src/popupmnu.c      2017-09-29 22:05:53.175959579 +0200
***************
*** 64,269 ****
      win_T     *pvwin;
  #endif
  
! redo:
!     def_width = PUM_DEF_WIDTH;
!     max_width = 0;
!     kind_width = 0;
!     extra_width = 0;
!     above_row = 0;
!     below_row = cmdline_row;
! 
!     /* Pretend the pum is already there to avoid that must_redraw is set when
!      * 'cuc' is on. */
!     pum_array = (pumitem_T *)1;
!     validate_cursor_col();
!     pum_array = NULL;
  
!     row = curwin->w_wrow + W_WINROW(curwin);
  
  #if defined(FEAT_QUICKFIX)
!     FOR_ALL_WINDOWS(pvwin)
!       if (pvwin->w_p_pvw)
!           break;
!     if (pvwin != NULL)
!     {
!       if (W_WINROW(pvwin) < W_WINROW(curwin))
!           above_row = W_WINROW(pvwin) + pvwin->w_height;
!       else if (W_WINROW(pvwin) > W_WINROW(curwin) + curwin->w_height)
!           below_row = W_WINROW(pvwin);
!     }
! #endif
! 
!     /*
!      * Figure out the size and position of the pum.
!      */
!     if (size < PUM_DEF_HEIGHT)
!       pum_height = size;
!     else
!       pum_height = PUM_DEF_HEIGHT;
!     if (p_ph > 0 && pum_height > p_ph)
!       pum_height = p_ph;
! 
!     /* Put the pum below "row" if possible.  If there are few lines decide on
!      * where there is more room. */
!     if (row + 2 >= below_row - pum_height
!                           && row - above_row > (below_row - above_row) / 2)
!     {
!       /* pum above "row" */
! 
!       /* Leave two lines of context if possible */
!       if (curwin->w_wrow - curwin->w_cline_row >= 2)
!           context_lines = 2;
!       else
!           context_lines = curwin->w_wrow - curwin->w_cline_row;
  
!       if (row >= size + context_lines)
!       {
!           pum_row = row - size - context_lines;
            pum_height = size;
-       }
        else
!       {
!           pum_row = 0;
!           pum_height = row - context_lines;
!       }
        if (p_ph > 0 && pum_height > p_ph)
-       {
-           pum_row += pum_height - p_ph;
            pum_height = p_ph;
-       }
-     }
-     else
-     {
-       /* pum below "row" */
  
!       /* Leave two lines of context if possible */
!       if (curwin->w_cline_row + curwin->w_cline_height - curwin->w_wrow >= 3)
!           context_lines = 3;
!       else
!           context_lines = curwin->w_cline_row
!                               + curwin->w_cline_height - curwin->w_wrow;
! 
!       pum_row = row + context_lines;
!       if (size > below_row - pum_row)
!           pum_height = below_row - pum_row;
        else
!           pum_height = size;
!       if (p_ph > 0 && pum_height > p_ph)
!           pum_height = p_ph;
!     }
! 
!     /* don't display when we only have room for one line */
!     if (pum_height < 1 || (pum_height == 1 && size > 1))
!       return;
  
  #if defined(FEAT_QUICKFIX)
!     /* If there is a preview window at the above avoid drawing over it. */
!     if (pvwin != NULL && pum_row < above_row && pum_height > above_row)
!     {
!       pum_row += above_row;
!       pum_height -= above_row;
!     }
  #endif
  
!     /* Compute the width of the widest match and the widest extra. */
!     for (i = 0; i < size; ++i)
!     {
!       w = vim_strsize(array[i].pum_text);
!       if (max_width < w)
!           max_width = w;
!       if (array[i].pum_kind != NULL)
!       {
!           w = vim_strsize(array[i].pum_kind) + 1;
!           if (kind_width < w)
!               kind_width = w;
!       }
!       if (array[i].pum_extra != NULL)
!       {
!           w = vim_strsize(array[i].pum_extra) + 1;
!           if (extra_width < w)
!               extra_width = w;
!       }
!     }
!     pum_base_width = max_width;
!     pum_kind_width = kind_width;
  
!     /* Calculate column */
  #ifdef FEAT_RIGHTLEFT
!     if (curwin->w_p_rl)
!       col = curwin->w_wincol + curwin->w_width - curwin->w_wcol - 1;
!     else
  #endif
!       col = curwin->w_wincol + curwin->w_wcol;
  
!     /* if there are more items than room we need a scrollbar */
!     if (pum_height < size)
!     {
!       pum_scrollbar = 1;
!       ++max_width;
!     }
!     else
!       pum_scrollbar = 0;
  
!     if (def_width < max_width)
!       def_width = max_width;
  
!     if (((col < Columns - PUM_DEF_WIDTH || col < Columns - max_width)
  #ifdef FEAT_RIGHTLEFT
!               && !curwin->w_p_rl)
!           || (curwin->w_p_rl && (col > PUM_DEF_WIDTH || col > max_width)
  #endif
!        ))
!     {
!       /* align pum column with "col" */
!       pum_col = col;
  
  #ifdef FEAT_RIGHTLEFT
!       if (curwin->w_p_rl)
!           pum_width = pum_col - pum_scrollbar + 1;
!       else
! #endif
!           pum_width = Columns - pum_col - pum_scrollbar;
! 
!       if (pum_width > max_width + kind_width + extra_width + 1
!                                                && pum_width > PUM_DEF_WIDTH)
!       {
!           pum_width = max_width + kind_width + extra_width + 1;
!           if (pum_width < PUM_DEF_WIDTH)
!               pum_width = PUM_DEF_WIDTH;
        }
!     }
!     else if (Columns < def_width)
!     {
!       /* not enough room, will use what we have */
  #ifdef FEAT_RIGHTLEFT
!       if (curwin->w_p_rl)
!           pum_col = Columns - 1;
!       else
  #endif
!           pum_col = 0;
!       pum_width = Columns - 1;
!     }
!     else
!     {
!       if (max_width > PUM_DEF_WIDTH)
!           max_width = PUM_DEF_WIDTH;  /* truncate */
! #ifdef FEAT_RIGHTLEFT
!       if (curwin->w_p_rl)
!           pum_col = max_width - 1;
        else
  #endif
!           pum_col = Columns - max_width;
!       pum_width = max_width - pum_scrollbar;
!     }
! 
!     pum_array = array;
!     pum_size = size;
! 
!     /* Set selected item and redraw.  If the window size changed need to redo
!      * the positioning.  Limit this to two times, when there is not much
!      * room the window size will keep changing. */
!     if (pum_set_selected(selected, redo_count) && ++redo_count <= 2)
!       goto redo;
  }
  
  /*
--- 64,270 ----
      win_T     *pvwin;
  #endif
  
!     do
!     {
!       def_width = PUM_DEF_WIDTH;
!       max_width = 0;
!       kind_width = 0;
!       extra_width = 0;
!       above_row = 0;
!       below_row = cmdline_row;
! 
!       /* Pretend the pum is already there to avoid that must_redraw is set
!        * when 'cuc' is on. */
!       pum_array = (pumitem_T *)1;
!       validate_cursor_col();
!       pum_array = NULL;
  
!       row = curwin->w_wrow + W_WINROW(curwin);
  
  #if defined(FEAT_QUICKFIX)
!       FOR_ALL_WINDOWS(pvwin)
!           if (pvwin->w_p_pvw)
!               break;
!       if (pvwin != NULL)
!       {
!           if (W_WINROW(pvwin) < W_WINROW(curwin))
!               above_row = W_WINROW(pvwin) + pvwin->w_height;
!           else if (W_WINROW(pvwin) > W_WINROW(curwin) + curwin->w_height)
!               below_row = W_WINROW(pvwin);
!       }
! #endif
  
!       /*
!        * Figure out the size and position of the pum.
!        */
!       if (size < PUM_DEF_HEIGHT)
            pum_height = size;
        else
!           pum_height = PUM_DEF_HEIGHT;
        if (p_ph > 0 && pum_height > p_ph)
            pum_height = p_ph;
  
!       /* Put the pum below "row" if possible.  If there are few lines decide
!        * on where there is more room. */
!       if (row + 2 >= below_row - pum_height
!                               && row - above_row > (below_row - above_row) / 
2)
!       {
!           /* pum above "row" */
! 
!           /* Leave two lines of context if possible */
!           if (curwin->w_wrow - curwin->w_cline_row >= 2)
!               context_lines = 2;
!           else
!               context_lines = curwin->w_wrow - curwin->w_cline_row;
! 
!           if (row >= size + context_lines)
!           {
!               pum_row = row - size - context_lines;
!               pum_height = size;
!           }
!           else
!           {
!               pum_row = 0;
!               pum_height = row - context_lines;
!           }
!           if (p_ph > 0 && pum_height > p_ph)
!           {
!               pum_row += pum_height - p_ph;
!               pum_height = p_ph;
!           }
!       }
        else
!       {
!           /* pum below "row" */
! 
!           /* Leave two lines of context if possible */
!           if (curwin->w_cline_row
!                               + curwin->w_cline_height - curwin->w_wrow >= 3)
!               context_lines = 3;
!           else
!               context_lines = curwin->w_cline_row
!                                   + curwin->w_cline_height - curwin->w_wrow;
! 
!           pum_row = row + context_lines;
!           if (size > below_row - pum_row)
!               pum_height = below_row - pum_row;
!           else
!               pum_height = size;
!           if (p_ph > 0 && pum_height > p_ph)
!               pum_height = p_ph;
!       }
! 
!       /* don't display when we only have room for one line */
!       if (pum_height < 1 || (pum_height == 1 && size > 1))
!           return;
  
  #if defined(FEAT_QUICKFIX)
!       /* If there is a preview window at the above avoid drawing over it. */
!       if (pvwin != NULL && pum_row < above_row && pum_height > above_row)
!       {
!           pum_row += above_row;
!           pum_height -= above_row;
!       }
  #endif
  
!       /* Compute the width of the widest match and the widest extra. */
!       for (i = 0; i < size; ++i)
!       {
!           w = vim_strsize(array[i].pum_text);
!           if (max_width < w)
!               max_width = w;
!           if (array[i].pum_kind != NULL)
!           {
!               w = vim_strsize(array[i].pum_kind) + 1;
!               if (kind_width < w)
!                   kind_width = w;
!           }
!           if (array[i].pum_extra != NULL)
!           {
!               w = vim_strsize(array[i].pum_extra) + 1;
!               if (extra_width < w)
!                   extra_width = w;
!           }
!       }
!       pum_base_width = max_width;
!       pum_kind_width = kind_width;
  
!       /* Calculate column */
  #ifdef FEAT_RIGHTLEFT
!       if (curwin->w_p_rl)
!           col = curwin->w_wincol + curwin->w_width - curwin->w_wcol - 1;
!       else
  #endif
!           col = curwin->w_wincol + curwin->w_wcol;
  
!       /* if there are more items than room we need a scrollbar */
!       if (pum_height < size)
!       {
!           pum_scrollbar = 1;
!           ++max_width;
!       }
!       else
!           pum_scrollbar = 0;
  
!       if (def_width < max_width)
!           def_width = max_width;
  
!       if (((col < Columns - PUM_DEF_WIDTH || col < Columns - max_width)
  #ifdef FEAT_RIGHTLEFT
!                   && !curwin->w_p_rl)
!               || (curwin->w_p_rl && (col > PUM_DEF_WIDTH || col > max_width)
  #endif
!          ))
!       {
!           /* align pum column with "col" */
!           pum_col = col;
  
  #ifdef FEAT_RIGHTLEFT
!           if (curwin->w_p_rl)
!               pum_width = pum_col - pum_scrollbar + 1;
!           else
! #endif
!               pum_width = Columns - pum_col - pum_scrollbar;
! 
!           if (pum_width > max_width + kind_width + extra_width + 1
!                                                    && pum_width > 
PUM_DEF_WIDTH)
!           {
!               pum_width = max_width + kind_width + extra_width + 1;
!               if (pum_width < PUM_DEF_WIDTH)
!                   pum_width = PUM_DEF_WIDTH;
!           }
        }
!       else if (Columns < def_width)
!       {
!           /* not enough room, will use what we have */
  #ifdef FEAT_RIGHTLEFT
!           if (curwin->w_p_rl)
!               pum_col = Columns - 1;
!           else
  #endif
!               pum_col = 0;
!           pum_width = Columns - 1;
!       }
        else
+       {
+           if (max_width > PUM_DEF_WIDTH)
+               max_width = PUM_DEF_WIDTH;      /* truncate */
+ #ifdef FEAT_RIGHTLEFT
+           if (curwin->w_p_rl)
+               pum_col = max_width - 1;
+           else
  #endif
!               pum_col = Columns - max_width;
!           pum_width = max_width - pum_scrollbar;
!       }
! 
!       pum_array = array;
!       pum_size = size;
! 
!       /* Set selected item and redraw.  If the window size changed need to
!        * redo the positioning.  Limit this to two times, when there is not
!        * much room the window size will keep changing. */
!     } while (pum_set_selected(selected, redo_count) && ++redo_count <= 2);
  }
  
  /*
*** ../vim-8.0.1160/src/term.c  2017-09-22 14:35:46.596623391 +0200
--- src/term.c  2017-09-29 22:01:05.709784147 +0200
***************
*** 3271,3281 ****
                if (pum_visible())
                {
                    redraw_later(NOT_VALID);
!                   ins_compl_show_pum(); /* This includes the redraw. */
                }
-               else
  #endif
!                   update_screen(NOT_VALID);
                if (redrawing())
                    setcursor();
            }
--- 3271,3280 ----
                if (pum_visible())
                {
                    redraw_later(NOT_VALID);
!                   ins_compl_show_pum();
                }
  #endif
!               update_screen(NOT_VALID);
                if (redrawing())
                    setcursor();
            }
*** ../vim-8.0.1160/src/testdir/shared.vim      2017-09-04 20:34:15.122492847 
+0200
--- src/testdir/shared.vim      2017-09-29 22:11:32.861805687 +0200
***************
*** 1,5 ****
--- 1,10 ----
  " Functions shared by several tests.
  
+ " Only load this script once.
+ if exists('*WaitFor')
+   finish
+ endif
+ 
  " Get the name of the Python executable.
  " Also keeps it in s:python.
  func PythonProg()
*** ../vim-8.0.1160/src/testdir/test_popup.vim  2017-06-24 15:39:03.587409087 
+0200
--- src/testdir/test_popup.vim  2017-09-29 22:38:01.027716083 +0200
***************
*** 1,5 ****
--- 1,7 ----
  " Test for completion menu
  
+ source shared.vim
+ 
  let g:months = ['January', 'February', 'March', 'April', 'May', 'June', 
'July', 'August', 'September', 'October', 'November', 'December']
  let g:setting = ''
  
***************
*** 36,41 ****
--- 38,44 ----
  func! Test_popup_complete()
    new
    inoremap <f5> <c-r>=ListMonths()<cr>
+   set belloff=all
  
    " <C-E> - select original typed text before the completion started
    call feedkeys("aJu\<f5>\<down>\<c-e>\<esc>", 'tx')
***************
*** 212,217 ****
--- 215,221 ----
    call feedkeys("aM\<f5>\<enter>\<esc>", 'tx')
    call assert_equal(["March", "M", "March"], getline(1,4))
    %d
+   set belloff&
  endfu
  
  
***************
*** 513,518 ****
--- 517,523 ----
  
  func Test_completion_respect_bs_option()
    new
+   set belloff=all
    let li = ["aaa", "aaa12345", "aaaabcdef", "aaaABC"]
  
    set bs=indent,eol
***************
*** 528,533 ****
--- 533,539 ----
    call feedkeys("A\<C-X>\<C-N>\<C-P>\<BS>\<BS>\<BS>\<Esc>", "tx")
    call assert_equal('', getline(1))
  
+   set belloff&
    bw!
  endfunc
  
***************
*** 614,619 ****
--- 620,626 ----
  
  func Test_complete_CTRLN_startofbuffer()
    new
+   set belloff=all
    call setline(1, [ 'organize(cupboard, 3, 2);',
          \ 'prioritize(bureau, 8, 7);',
          \ 'realize(bannister, 4, 4);',
***************
*** 624,629 ****
--- 631,663 ----
          \ 'railing.moralize(3,9);']
    call feedkeys("qai\<c-n>\<c-n>.\<esc>3wdW\<cr>q3@a", 'tx')
    call assert_equal(expected, getline(1,'$'))
+   set belloff&
+   bwipe!
+ endfunc
+ 
+ func Test_popup_and_window_resize()
+   if !has('terminal') || has('gui_running')
+     return
+   endif
+   let h = winheight(0)
+   if h < 15
+     return
+   endif
+   let g:buf = term_start([$VIMPROG, '--clean', '-c', 'set noswapfile'], 
{'term_rows': h / 3})
+   call term_sendkeys(g:buf, (h / 3 - 1)."o\<esc>G")
+   call term_sendkeys(g:buf, "i\<c-x>")
+   call term_wait(g:buf, 100)
+   call term_sendkeys(g:buf, "\<c-v>")
+   call term_wait(g:buf, 100)
+   call assert_match('^!\s*$', term_getline(g:buf, 1))
+   exe 'resize +' . (h - 1)
+   call term_wait(g:buf, 100)
+   redraw!
+   call WaitFor('"" == term_getline(g:buf, 1)')
+   call assert_equal('', term_getline(g:buf, 1))
+   sleep 100m
+   call WaitFor('"^!" =~ term_getline(g:buf, term_getcursor(g:buf)[0] + 1)')
+   call assert_match('^!\s*$', term_getline(g:buf, term_getcursor(g:buf)[0] + 
1))
    bwipe!
  endfunc
  
*** ../vim-8.0.1160/src/version.c       2017-09-29 21:29:13.305914951 +0200
--- src/version.c       2017-09-29 22:07:01.919523510 +0200
***************
*** 763,764 ****
--- 763,766 ----
  {   /* Add new patch number below this line */
+ /**/
+     1161,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
224. You set up your own Web page. You set up a Web page for each
     of your kids... and your pets.

 /// 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].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui