changeset 22886:38324d4f1c94 v8.2.1990

patch 8.2.1990: cursor position wrong in terminal popup with finished job Commit: https://github.com/vim/vim/commit/6a07644db30cb5f3d0c6dc5eb2c348b6289da553 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Nov 15 20:32:58 2020 +0100 patch 8.2.1990: cursor position wrong in terminal popup with finished job Problem: Cursor position wrong in terminal popup with finished job. Solution: Only add the top and left offset when not done already. (closes #7298)
author Bram Moolenaar <Bram@vim.org>
date Sun, 15 Nov 2020 20:45:03 +0100
parents dc9330ed5a5c
children d2fdcc5ed237
files src/drawline.c src/move.c src/popupwin.c src/structs.h src/terminal.c src/testdir/dumps/Test_terminal_popup_m1.dump src/version.c
diffstat 7 files changed, 42 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/drawline.c
+++ b/src/drawline.c
@@ -2455,6 +2455,7 @@ win_line(
 	    wp->w_wrow = row;
 	    did_wcol = TRUE;
 	    curwin->w_valid |= VALID_WCOL|VALID_WROW|VALID_VIRTCOL;
+	    curwin->w_flags &= ~(WFLAG_WCOL_OFF_ADDED | WFLAG_WROW_OFF_ADDED);
 	}
 #endif
 
--- a/src/move.c
+++ b/src/move.c
@@ -868,6 +868,7 @@ validate_cursor_col(void)
 	curwin->w_wcol = col;
 
 	curwin->w_valid |= VALID_WCOL;
+	curwin->w_flags &= ~WFLAG_WCOL_OFF_ADDED;
     }
 }
 
@@ -1180,7 +1181,10 @@ curs_columns(
     {
 	curwin->w_wrow += popup_top_extra(curwin);
 	curwin->w_wcol += popup_left_extra(curwin);
+	curwin->w_flags |= WFLAG_WCOL_OFF_ADDED + WFLAG_WROW_OFF_ADDED;
     }
+    else
+	curwin->w_flags &= ~(WFLAG_WCOL_OFF_ADDED + WFLAG_WROW_OFF_ADDED);
 #endif
 
     // now w_leftcol is valid, avoid check_cursor_moved() thinking otherwise
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -3743,13 +3743,17 @@ update_popups(void (*win_update)(win_T *
 
 	wp->w_winrow -= top_off;
 	wp->w_wincol -= left_extra;
-	// cursor position matters in terminal in job mode
-#ifdef FEAT_TERMINAL
-	if (wp != curwin || !term_in_normal_mode())
-#endif
+
+	// Add offset for border and padding if not done already.
+	if ((wp->w_flags & WFLAG_WCOL_OFF_ADDED) == 0)
+	{
+	    wp->w_wcol += left_extra;
+	    wp->w_flags |= WFLAG_WCOL_OFF_ADDED;
+	}
+	if ((wp->w_flags & WFLAG_WROW_OFF_ADDED) == 0)
 	{
 	    wp->w_wrow += top_off;
-	    wp->w_wcol += left_extra;
+	    wp->w_flags |= WFLAG_WROW_OFF_ADDED;
 	}
 
 	total_width = popup_width(wp);
--- a/src/structs.h
+++ b/src/structs.h
@@ -3348,6 +3348,10 @@ struct window_S
 				    // top of the window
     char	w_topline_was_set;  // flag set to TRUE when topline is set,
 				    // e.g. by winrestview()
+
+    linenr_T	w_botline;	    // number of the line below the bottom of
+				    // the window
+
 #ifdef FEAT_DIFF
     int		w_topfill;	    // number of filler lines above w_topline
     int		w_old_topfill;	    // w_topfill at last redraw
@@ -3361,6 +3365,12 @@ struct window_S
     colnr_T	w_skipcol;	    // starting column when a single line
 				    // doesn't fit in the window
 
+    int		w_empty_rows;	    // number of ~ rows in window
+#ifdef FEAT_DIFF
+    int		w_filler_rows;	    // number of filler rows at the end of the
+				    // window
+#endif
+
     /*
      * Layout of the window in the screen.
      * May need to add "msg_scrolled" to "w_winrow" in rare situations.
@@ -3368,11 +3378,14 @@ struct window_S
     int		w_winrow;	    // first row of window in screen
     int		w_height;	    // number of rows in window, excluding
 				    // status/command/winbar line(s)
+
     int		w_status_height;    // number of status lines (0 or 1)
     int		w_wincol;	    // Leftmost column of window in screen.
     int		w_width;	    // Width of window, excluding separation.
     int		w_vsep_width;	    // Number of separator columns (0 or 1).
+
     pos_save_T	w_save_cursor;	    // backup of cursor pos and topline
+
 #ifdef FEAT_PROP_POPUP
     int		w_popup_flags;	    // POPF_ values
     int		w_popup_handled;    // POPUP_HANDLE[0-9] flags
@@ -3433,9 +3446,15 @@ struct window_S
 # if defined(FEAT_TIMERS)
     timer_T	*w_popup_timer;	    // timer for closing popup window
 # endif
+
+    int		w_flags;	    // WFLAG_ flags
+
+# define WFLAG_WCOL_OFF_ADDED	1   // popup border and padding were added to
+				    // w_wcol
+# define WFLAG_WROW_OFF_ADDED	2   // popup border and padding were added to
+				    // w_wrow
 #endif
 
-
     /*
      * === start of cached values ====
      */
@@ -3475,14 +3494,6 @@ struct window_S
      */
     int		w_wrow, w_wcol;	    // cursor position in window
 
-    linenr_T	w_botline;	    // number of the line below the bottom of
-				    // the window
-    int		w_empty_rows;	    // number of ~ rows in window
-#ifdef FEAT_DIFF
-    int		w_filler_rows;	    // number of filler rows at the end of the
-				    // window
-#endif
-
     /*
      * Info about the lines currently in the window is remembered to avoid
      * recomputing it every time.  The allocated size of w_lines[] is Rows.
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -2208,7 +2208,10 @@ position_cursor(win_T *wp, VTermPos *pos
     {
 	wp->w_wrow += popup_top_extra(curwin);
 	wp->w_wcol += popup_left_extra(curwin);
-    }
+	wp->w_flags |= WFLAG_WCOL_OFF_ADDED | WFLAG_WROW_OFF_ADDED;
+    }
+    else
+	wp->w_flags &= ~(WFLAG_WCOL_OFF_ADDED | WFLAG_WROW_OFF_ADDED);
 #endif
     wp->w_valid |= (VALID_WCOL|VALID_WROW);
 }
--- a/src/testdir/dumps/Test_terminal_popup_m1.dump
+++ b/src/testdir/dumps/Test_terminal_popup_m1.dump
@@ -5,8 +5,8 @@
 |4| @24|╔+0#0000001#ffd7ff255|═@19|╗| +0#0000000#ffffff0@26
 |5| @24|║+0#0000001#ffd7ff255|a|n|o|t|h|e|r| |t|e|x|t| @7|║| +0#0000000#ffffff0@26
 |6| @24|║+0#0000001#ffd7ff255|t|o| |s|h|o|w| @12|║| +0#0000000#ffffff0@26
-|7| @24|║+0#0000001#ffd7ff255|i|n| |a| |p|o|p|u|p| |w|i|n|d|o|w| @2|║| +0#0000000#ffffff0@26
-|8| @24|║+0#0000001#ffd7ff255| +0#4040ff13&> @18|║+0#0000001&| +0#0000000#ffffff0@26
+|7| @24|║+0#0000001#ffd7ff255>i|n| |a| |p|o|p|u|p| |w|i|n|d|o|w| @2|║| +0#0000000#ffffff0@26
+|8| @24|║+0#0000001#ffd7ff255| +0#4040ff13&@19|║+0#0000001&| +0#0000000#ffffff0@26
 |9| @24|║+0#0000001#ffd7ff255| +0#4040ff13&@19|║+0#0000001&| +0#0000000#ffffff0@26
 |1|0| @23|╚+0#0000001#ffd7ff255|═@19|╝| +0#0000000#ffffff0@26
 |1@1| @72
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1990,
+/**/
     1989,
 /**/
     1988,