# HG changeset patch # User Christian Brabandt # Date 1478286904 -3600 # Node ID 7d10572eaba4eee80f4c98cc406bfcc849bbae41 # Parent a1545399059ecec0fa54fcf87cd87bb6f8ff6f21 commit https://github.com/vim/vim/commit/91e44a3305ef6bf2d43496c351dcff0a45c6bfb8 Author: Bram Moolenaar Date: Fri Nov 4 20:08:52 2016 +0100 patch 8.0.0058 Problem: Positioning of the popup menu is not good. Solution: Position it better. (Hirohito Higashi) diff --git a/src/popupmnu.c b/src/popupmnu.c --- 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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 58, +/**/ 57, /**/ 56,