diff src/popupwin.c @ 18339:a776385eac9f v8.1.2164

patch 8.1.2164: stuck when using "j" in a popupwin with popup_filter_menu Commit: https://github.com/vim/vim/commit/7b3d93966709998011e2eb3b84414ff454161b37 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Oct 16 22:17:07 2019 +0200 patch 8.1.2164: stuck when using "j" in a popupwin with popup_filter_menu Problem: Stuck when using "j" in a popupwin with popup_filter_menu if a line wraps. Solution: Check the cursor line is visible. (closes #4577)
author Bram Moolenaar <Bram@vim.org>
date Wed, 16 Oct 2019 22:30:04 +0200
parents 9e696b8fee7d
children ba5d8c5d77d7
line wrap: on
line diff
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -535,7 +535,7 @@ check_highlight(dict_T *dict, char *name
 }
 
 /*
- * Scroll to show the line with the cursor.  This assumes lines don't wrap.
+ * Scroll to show the line with the cursor.
  */
     static void
 popup_show_curline(win_T *wp)
@@ -550,6 +550,11 @@ popup_show_curline(win_T *wp)
 	    wp->w_topline = 1;
 	else if (wp->w_topline > wp->w_buffer->b_ml.ml_line_count)
 	    wp->w_topline = wp->w_buffer->b_ml.ml_line_count;
+	while (wp->w_topline < wp->w_cursor.lnum
+		&& wp->w_topline < wp->w_buffer->b_ml.ml_line_count
+		&& plines_m_win(wp, wp->w_topline, wp->w_cursor.lnum)
+								> wp->w_height)
+	    ++wp->w_topline;
     }
 
     // Don't use "firstline" now.
@@ -1041,6 +1046,7 @@ popup_adjust_position(win_T *wp)
     linenr_T	lnum;
     int		wrapped = 0;
     int		maxwidth;
+    int		used_maxwidth = FALSE;
     int		maxspace;
     int		center_vert = FALSE;
     int		center_hor = FALSE;
@@ -1208,6 +1214,7 @@ popup_adjust_position(win_T *wp)
 		++wrapped;
 		len -= maxwidth;
 		wp->w_width = maxwidth;
+		used_maxwidth = TRUE;
 	    }
 	}
 	else if (len > maxwidth
@@ -1259,6 +1266,8 @@ popup_adjust_position(win_T *wp)
     {
 	++right_extra;
 	++extra_width;
+	if (used_maxwidth)
+	    maxwidth -= 2;  // try to show the scrollbar
     }
 
     minwidth = wp->w_minwidth;