Hi Bram and list, I found a few issues to the display position of the pop-up menu with preview window.
1) Popup menu often drawing over the preview window. 2) Sometimes, popup menu is displayed in the narrow room side. Preparation before reproduction on Linux: - start terminal emulator (e.g. PuTTY) and set to size 80x24 - goto vim/src/ directory. $ cd (yourvimpath)/vim/src - Prepare test_vimrc. $ cat test_vimrc filetype plugin indent on syntax on colorscheme desert set ttm=50 Step to reproduce for case 1: - Start Vim $ vim -Nu test_vimrc screen.c - Type the following command. :new|wincmd w|norm!2} - Enter insert mode and start omni completion. iex_<C-X><C-O> Expected behavior: - Popup menu doesn't drawing over the preview window. See attached file: case1_expect.png (We can see the preview window after type <Esc>) Actual behavior: - Popup menu drawing over the preview window. See attached file: case1_actual.png Step to reproduce for case 2: - Start Vim $ vim -Nu test_vimrc screen.c - Type the following command. :call feedkeys(":pedit +resize\\ 5\<CR>2}2\<C-E>") - Enter insert mode and start omni completion. iex_<C-X><C-O> Expected behavior: - popup menu is displayed in the above (narrow room side). See attached file: case2_expect.png Actual behavior: - Popup menu is displayed in the below (wide room side). See attached file: case2_actual.png I wrote a patch. Please check attached file. NOTE: I removed the following comment. Because other case always popup menu drawing over the status line. So my patch follow it. [popupmnu.c : roughly 90 line] /* When the preview window is at the bottom stop just above it. * Also avoid drawing over the status line so that it's clear there * is a window boundary. */ -- Best regards, Hirohito Higashi (a.k.a. h_east) -- -- 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 vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
diff --git a/src/popupmnu.c b/src/popupmnu.c index b479b00..6a75686 100644 --- a/src/popupmnu.c +++ b/src/popupmnu.c @@ -54,18 +54,21 @@ pum_display( int kind_width; int extra_width; int i; - int top_clear; int row; int context_lines; int col; - int above_row = cmdline_row; + int above_row; + int below_row; int redo_count = 0; + win_T *pvwin; 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. */ @@ -76,18 +79,16 @@ redo: row = curwin->w_wrow + W_WINROW(curwin); #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) - if (firstwin->w_p_pvw) - top_clear = firstwin->w_height; - else -#endif - top_clear = 0; - -#if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) - /* When the preview window is at the bottom stop just above it. Also - * avoid drawing over the status line so that it's clear there is a window - * boundary. */ - if (lastwin->w_p_pvw) - above_row -= lastwin->w_height + lastwin->w_status_height + 1; + 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 /* @@ -102,8 +103,7 @@ redo: /* Put the pum below "row" if possible. If there are few lines decide on * where there is more room. */ - if (row + 2 >= above_row - pum_height - && row > (above_row - top_clear) / 2) + if (row - above_row >= below_row - row) { /* pum above "row" */ @@ -141,8 +141,8 @@ redo: + curwin->w_cline_height - curwin->w_wrow; pum_row = row + context_lines; - if (size > above_row - pum_row) - pum_height = above_row - pum_row; + if (size > below_row - pum_row) + pum_height = below_row - pum_row; else pum_height = size; if (p_ph > 0 && pum_height > p_ph) @@ -154,13 +154,11 @@ redo: return; #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) - /* If there is a preview window at the top avoid drawing over it. */ - if (firstwin->w_p_pvw - && pum_row < firstwin->w_height - && pum_height > firstwin->w_height + 4) + /* 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 += firstwin->w_height; - pum_height -= firstwin->w_height; + pum_row += above_row; + pum_height -= above_row; } #endif