diff src/popupwin.c @ 18027:56032a704448 v8.1.2009

patch 8.1.2009: cursorline highlighting not updated in popup window Commit: https://github.com/vim/vim/commit/3d2a3cbce873af861031a01e02694dcfae0c4582 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Sep 8 17:12:01 2019 +0200 patch 8.1.2009: cursorline highlighting not updated in popup window Problem: Cursorline highlighting not updated in popup window. (Marko Mahni?) Solution: Check if the cursor position changed. (closes #4912)
author Bram Moolenaar <Bram@vim.org>
date Sun, 08 Sep 2019 17:15:03 +0200
parents 6006bb74bd52
children 364a9be6a21e
line wrap: on
line diff
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -542,8 +542,15 @@ popup_show_curline(win_T *wp)
 {
     if (wp->w_cursor.lnum < wp->w_topline)
 	wp->w_topline = wp->w_cursor.lnum;
-    else if (wp->w_cursor.lnum >= wp->w_botline)
+    else if (wp->w_cursor.lnum >= wp->w_botline
+					  && (curwin->w_valid & VALID_BOTLINE))
+    {
 	wp->w_topline = wp->w_cursor.lnum - wp->w_height + 1;
+	if (wp->w_topline < 1)
+	    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;
+    }
 
     // Don't use "firstline" now.
     wp->w_firstline = 0;
@@ -593,6 +600,7 @@ popup_highlight_curline(win_T *wp)
     }
     else
 	sign_undefine_by_name(sign_name, FALSE);
+    wp->w_popup_last_curline = wp->w_cursor.lnum;
 }
 
 /*
@@ -1059,6 +1067,11 @@ popup_adjust_position(win_T *wp)
     wp->w_popup_leftoff = 0;
     wp->w_popup_rightoff = 0;
 
+    // May need to update the "cursorline" highlighting, which may also change
+    // "topline"
+    if (wp->w_popup_last_curline != wp->w_cursor.lnum)
+	popup_highlight_curline(wp);
+
     // If no line was specified default to vertical centering.
     if (wantline == 0)
 	center_vert = TRUE;
@@ -1159,7 +1172,9 @@ popup_adjust_position(win_T *wp)
     // start at the desired first line
     if (wp->w_firstline > 0)
 	wp->w_topline = wp->w_firstline;
-    if (wp->w_topline > wp->w_buffer->b_ml.ml_line_count)
+    if (wp->w_topline < 1)
+	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;
 
     // Compute width based on longest text line and the 'wrap' option.
@@ -2998,6 +3013,7 @@ check_popup_unhidden(win_T *wp)
  * Return TRUE if popup_adjust_position() needs to be called for "wp".
  * That is when the buffer in the popup was changed, or the popup is following
  * a textprop and the referenced buffer was changed.
+ * Or when the cursor line changed and "cursorline" is set.
  */
     static int
 popup_need_position_adjust(win_T *wp)
@@ -3007,7 +3023,9 @@ popup_need_position_adjust(win_T *wp)
     if (win_valid(wp->w_popup_prop_win))
 	return wp->w_popup_prop_changedtick
 				!= CHANGEDTICK(wp->w_popup_prop_win->w_buffer)
-		|| wp->w_popup_prop_topline != wp->w_popup_prop_win->w_topline;
+		|| wp->w_popup_prop_topline != wp->w_popup_prop_win->w_topline
+		|| ((wp->w_popup_flags & POPF_CURSORLINE)
+			&& wp->w_cursor.lnum != wp->w_popup_last_curline);
     return FALSE;
 }