summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0062
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0062')
-rw-r--r--data/vim/patches/8.1.0062371
1 files changed, 371 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0062 b/data/vim/patches/8.1.0062
new file mode 100644
index 000000000..7161478ca
--- /dev/null
+++ b/data/vim/patches/8.1.0062
@@ -0,0 +1,371 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0062
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0062
+Problem: Popup menu broken if a callback changes the window layout. (Qiming
+ Zhao)
+Solution: Recompute the popup menu position if needed. Redraw the ruler
+ even when the popup menu is displayed.
+Files: src/popupmnu.c, src/proto/popupmnu.pro, src/screen.c
+
+
+*** ../vim-8.1.0061/src/popupmnu.c 2018-05-14 23:05:31.000000000 +0200
+--- src/popupmnu.c 2018-06-17 14:41:52.487403691 +0200
+***************
+*** 29,34 ****
+--- 29,40 ----
+ static int pum_row; /* top row of pum */
+ static int pum_col; /* left column of pum */
+
++ static int pum_win_row;
++ static int pum_win_height;
++ static int pum_win_col;
++ static int pum_win_wcol;
++ static int pum_win_width;
++
+ static int pum_do_redraw = FALSE; /* do redraw anyway */
+
+ static int pum_set_selected(int n, int repeat);
+***************
+*** 81,87 ****
+ {
+ int def_width;
+ int max_width;
+- int row;
+ int context_lines;
+ int cursor_col;
+ int above_row;
+--- 87,92 ----
+***************
+*** 103,109 ****
+ validate_cursor_col();
+ pum_array = NULL;
+
+! row = curwin->w_wrow + W_WINROW(curwin);
+
+ #if defined(FEAT_QUICKFIX)
+ FOR_ALL_WINDOWS(pvwin)
+--- 108,120 ----
+ validate_cursor_col();
+ pum_array = NULL;
+
+! // Remember the essential parts of the window position and size, so we
+! // can decide when to reposition the popup menu.
+! pum_win_row = curwin->w_wrow + W_WINROW(curwin);
+! pum_win_height = curwin->w_height;
+! pum_win_col = curwin->w_wincol;
+! pum_win_wcol = curwin->w_wcol;
+! pum_win_width = curwin->w_width;
+
+ #if defined(FEAT_QUICKFIX)
+ FOR_ALL_WINDOWS(pvwin)
+***************
+*** 128,139 ****
+ if (p_ph > 0 && pum_height > p_ph)
+ pum_height = p_ph;
+
+! /* Put the pum below "row" if possible. If there are few lines decide
+ * on where there is more room. */
+! if (row + 2 >= below_row - pum_height
+! && row - above_row > (below_row - above_row) / 2)
+ {
+! /* pum above "row" */
+
+ /* Leave two lines of context if possible */
+ if (curwin->w_wrow - curwin->w_cline_row >= 2)
+--- 139,150 ----
+ if (p_ph > 0 && pum_height > p_ph)
+ pum_height = p_ph;
+
+! /* Put the pum below "pum_win_row" if possible. If there are few lines decide
+ * on where there is more room. */
+! if (pum_win_row + 2 >= below_row - pum_height
+! && pum_win_row - above_row > (below_row - above_row) / 2)
+ {
+! /* pum above "pum_win_row" */
+
+ /* Leave two lines of context if possible */
+ if (curwin->w_wrow - curwin->w_cline_row >= 2)
+***************
+*** 141,155 ****
+ else
+ context_lines = curwin->w_wrow - curwin->w_cline_row;
+
+! if (row >= size + context_lines)
+ {
+! pum_row = row - size - context_lines;
+ pum_height = size;
+ }
+ else
+ {
+ pum_row = 0;
+! pum_height = row - context_lines;
+ }
+ if (p_ph > 0 && pum_height > p_ph)
+ {
+--- 152,166 ----
+ else
+ context_lines = curwin->w_wrow - curwin->w_cline_row;
+
+! if (pum_win_row >= size + context_lines)
+ {
+! pum_row = pum_win_row - size - context_lines;
+ pum_height = size;
+ }
+ else
+ {
+ pum_row = 0;
+! pum_height = pum_win_row - context_lines;
+ }
+ if (p_ph > 0 && pum_height > p_ph)
+ {
+***************
+*** 159,165 ****
+ }
+ else
+ {
+! /* pum below "row" */
+
+ /* Leave two lines of context if possible */
+ if (curwin->w_cline_row
+--- 170,176 ----
+ }
+ else
+ {
+! /* pum below "pum_win_row" */
+
+ /* Leave two lines of context if possible */
+ if (curwin->w_cline_row
+***************
+*** 169,175 ****
+ context_lines = curwin->w_cline_row
+ + curwin->w_cline_height - curwin->w_wrow;
+
+! pum_row = row + context_lines;
+ if (size > below_row - pum_row)
+ pum_height = below_row - pum_row;
+ else
+--- 180,186 ----
+ context_lines = curwin->w_cline_row
+ + curwin->w_cline_height - curwin->w_wrow;
+
+! pum_row = pum_win_row + context_lines;
+ if (size > below_row - pum_row)
+ pum_height = below_row - pum_row;
+ else
+***************
+*** 823,828 ****
+--- 834,875 ----
+ }
+
+ /*
++ * Reposition the popup menu to adjust for window layout changes.
++ */
++ void
++ pum_may_redraw(void)
++ {
++ pumitem_T *array = pum_array;
++ int len = pum_size;
++ int selected = pum_selected;
++
++ if (!pum_visible())
++ return; // nothing to do
++
++ if (pum_win_row == curwin->w_wrow + W_WINROW(curwin)
++ && pum_win_height == curwin->w_height
++ && pum_win_col == curwin->w_wincol
++ && pum_win_width == curwin->w_width)
++ {
++ // window position didn't change, redraw in the same position
++ pum_redraw();
++ }
++ else
++ {
++ int wcol = curwin->w_wcol;
++
++ // Window layout changed, recompute the position.
++ // Use the remembered w_wcol value, the cursor may have moved when a
++ // completion was inserted, but we want the menu in the same position.
++ pum_undisplay();
++ curwin->w_wcol = pum_win_wcol;
++ curwin->w_valid |= VALID_WCOL;
++ pum_display(array, len, selected);
++ curwin->w_wcol = wcol;
++ }
++ }
++
++ /*
+ * Return the height of the popup menu, the number of entries visible.
+ * Only valid when pum_visible() returns TRUE!
+ */
+*** ../vim-8.1.0061/src/proto/popupmnu.pro 2018-05-17 13:52:48.000000000 +0200
+--- src/proto/popupmnu.pro 2018-06-17 14:12:56.177812770 +0200
+***************
+*** 4,9 ****
+--- 4,10 ----
+ void pum_undisplay(void);
+ void pum_clear(void);
+ int pum_visible(void);
++ void pum_may_redraw(void);
+ int pum_get_height(void);
+ int split_message(char_u *mesg, pumitem_T **array);
+ void ui_remove_balloon(void);
+*** ../vim-8.1.0061/src/screen.c 2018-06-16 16:20:48.768597967 +0200
+--- src/screen.c 2018-06-17 14:37:49.760753642 +0200
+***************
+*** 171,177 ****
+ static void win_redr_custom(win_T *wp, int draw_ruler);
+ #endif
+ #ifdef FEAT_CMDL_INFO
+! static void win_redr_ruler(win_T *wp, int always);
+ #endif
+
+ /* Ugly global: overrule attribute used by screen_char() */
+--- 171,177 ----
+ static void win_redr_custom(win_T *wp, int draw_ruler);
+ #endif
+ #ifdef FEAT_CMDL_INFO
+! static void win_redr_ruler(win_T *wp, int always, int ignore_pum);
+ #endif
+
+ /* Ugly global: overrule attribute used by screen_char() */
+***************
+*** 783,790 ****
+ #endif
+ #ifdef FEAT_INS_EXPAND
+ /* May need to redraw the popup menu. */
+! if (pum_visible())
+! pum_redraw();
+ #endif
+
+ /* Reset b_mod_set flags. Going through all windows is probably faster
+--- 783,789 ----
+ #endif
+ #ifdef FEAT_INS_EXPAND
+ /* May need to redraw the popup menu. */
+! pum_may_redraw();
+ #endif
+
+ /* Reset b_mod_set flags. Going through all windows is probably faster
+***************
+*** 7002,7008 ****
+ - 1 + wp->w_wincol), attr);
+
+ #ifdef FEAT_CMDL_INFO
+! win_redr_ruler(wp, TRUE);
+ #endif
+ }
+
+--- 7001,7007 ----
+ - 1 + wp->w_wincol), attr);
+
+ #ifdef FEAT_CMDL_INFO
+! win_redr_ruler(wp, TRUE, ignore_pum);
+ #endif
+ }
+
+***************
+*** 10455,10461 ****
+ /* If the last window has no status line, the ruler is after the mode
+ * message and must be redrawn */
+ if (redrawing() && lastwin->w_status_height == 0)
+! win_redr_ruler(lastwin, TRUE);
+ #endif
+ redraw_cmdline = FALSE;
+ clear_cmdline = FALSE;
+--- 10454,10460 ----
+ /* If the last window has no status line, the ruler is after the mode
+ * message and must be redrawn */
+ if (redrawing() && lastwin->w_status_height == 0)
+! win_redr_ruler(lastwin, TRUE, FALSE);
+ #endif
+ redraw_cmdline = FALSE;
+ clear_cmdline = FALSE;
+***************
+*** 10874,10879 ****
+--- 10873,10879 ----
+ (int)wp->w_width, FALSE);
+ }
+ #endif
++
+ /*
+ * Show current status info in ruler and various other places
+ * If always is FALSE, only show ruler if position has changed.
+***************
+*** 10899,10905 ****
+ else
+ #endif
+ #ifdef FEAT_CMDL_INFO
+! win_redr_ruler(curwin, always);
+ #endif
+
+ #ifdef FEAT_TITLE
+--- 10899,10905 ----
+ else
+ #endif
+ #ifdef FEAT_CMDL_INFO
+! win_redr_ruler(curwin, always, FALSE);
+ #endif
+
+ #ifdef FEAT_TITLE
+***************
+*** 10918,10924 ****
+
+ #ifdef FEAT_CMDL_INFO
+ static void
+! win_redr_ruler(win_T *wp, int always)
+ {
+ #define RULER_BUF_LEN 70
+ char_u buffer[RULER_BUF_LEN];
+--- 10918,10924 ----
+
+ #ifdef FEAT_CMDL_INFO
+ static void
+! win_redr_ruler(win_T *wp, int always, int ignore_pum)
+ {
+ #define RULER_BUF_LEN 70
+ char_u buffer[RULER_BUF_LEN];
+***************
+*** 10951,10958 ****
+ if (wp == lastwin && lastwin->w_status_height == 0)
+ if (edit_submode != NULL)
+ return;
+! /* Don't draw the ruler when the popup menu is visible, it may overlap. */
+! if (pum_visible())
+ return;
+ #endif
+
+--- 10951,10959 ----
+ if (wp == lastwin && lastwin->w_status_height == 0)
+ if (edit_submode != NULL)
+ return;
+! // Don't draw the ruler when the popup menu is visible, it may overlap.
+! // Except when the popup menu will be redrawn anyway.
+! if (!ignore_pum && pum_visible())
+ return;
+ #endif
+
+*** ../vim-8.1.0061/src/version.c 2018-06-16 22:58:11.791025515 +0200
+--- src/version.c 2018-06-17 14:39:53.964061772 +0200
+***************
+*** 763,764 ****
+--- 763,766 ----
+ { /* Add new patch number below this line */
++ /**/
++ 62,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+58. You turn on your computer and turn off your wife.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///