summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0228
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0228')
-rw-r--r--data/vim/patches/8.1.0228569
1 files changed, 569 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0228 b/data/vim/patches/8.1.0228
new file mode 100644
index 000000000..6c1ab54c7
--- /dev/null
+++ b/data/vim/patches/8.1.0228
@@ -0,0 +1,569 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0228
+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.0228
+Problem: Dropping files is ignored while Vim is busy.
+Solution: Postpone the effect of dropping files until it's safe.
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/gui.c, src/gui.h,
+ src/screen.c, src/main.c, src/gui_mac.c
+
+
+*** ../vim-8.1.0227/src/ex_docmd.c 2018-07-28 17:07:48.608154066 +0200
+--- src/ex_docmd.c 2018-07-29 17:22:20.940320176 +0200
+***************
+*** 7859,7915 ****
+ do_shell(NULL, 0);
+ }
+
+! #if defined(HAVE_DROP_FILE) \
+! || (defined(FEAT_GUI_GTK) && defined(FEAT_DND)) \
+! || defined(FEAT_GUI_MSWIN) \
+! || defined(FEAT_GUI_MAC) \
+! || defined(PROTO)
+
+! /*
+! * Handle a file drop. The code is here because a drop is *nearly* like an
+! * :args command, but not quite (we have a list of exact filenames, so we
+! * don't want to (a) parse a command line, or (b) expand wildcards. So the
+! * code is very similar to :args and hence needs access to a lot of the static
+! * functions in this file.
+! *
+! * The list should be allocated using alloc(), as should each item in the
+! * list. This function takes over responsibility for freeing the list.
+! *
+! * XXX The list is made into the argument list. This is freed using
+! * FreeWild(), which does a series of vim_free() calls.
+! */
+! void
+! handle_drop(
+! int filec, /* the number of files dropped */
+! char_u **filev, /* the list of files dropped */
+! int split) /* force splitting the window */
+ {
+ exarg_T ea;
+ int save_msg_scroll = msg_scroll;
+
+! /* Postpone this while editing the command line. */
+! if (text_locked())
+! return;
+! if (curbuf_locked())
+! return;
+!
+! /* When the screen is being updated we should not change buffers and
+! * windows structures, it may cause freed memory to be used. */
+! if (updating_screen)
+! return;
+
+ /* Check whether the current buffer is changed. If so, we will need
+ * to split the current window or data could be lost.
+ * We don't need to check if the 'hidden' option is set, as in this
+ * case the buffer won't be lost.
+ */
+! if (!buf_hide(curbuf) && !split)
+ {
+ ++emsg_off;
+! split = check_changed(curbuf, CCGD_AW);
+ --emsg_off;
+ }
+! if (split)
+ {
+ if (win_split(0, 0) == FAIL)
+ return;
+--- 7859,7895 ----
+ do_shell(NULL, 0);
+ }
+
+! #if defined(HAVE_DROP_FILE) || defined(PROTO)
+
+! static int drop_busy = FALSE;
+! static int drop_filec;
+! static char_u **drop_filev = NULL;
+! static int drop_split;
+! static void (*drop_callback)(void *);
+! static void *drop_cookie;
+!
+! static void
+! handle_drop_internal(void)
+ {
+ exarg_T ea;
+ int save_msg_scroll = msg_scroll;
+
+! // Setting the argument list may cause screen updates and being called
+! // recursively. Avoid that by setting drop_busy.
+! drop_busy = TRUE;
+
+ /* Check whether the current buffer is changed. If so, we will need
+ * to split the current window or data could be lost.
+ * We don't need to check if the 'hidden' option is set, as in this
+ * case the buffer won't be lost.
+ */
+! if (!buf_hide(curbuf) && !drop_split)
+ {
+ ++emsg_off;
+! drop_split = check_changed(curbuf, CCGD_AW);
+ --emsg_off;
+ }
+! if (drop_split)
+ {
+ if (win_split(0, 0) == FAIL)
+ return;
+***************
+*** 7924,7930 ****
+ /*
+ * Set up the new argument list.
+ */
+! alist_set(ALIST(curwin), filec, filev, FALSE, NULL, 0);
+
+ /*
+ * Move to the first file.
+--- 7904,7910 ----
+ /*
+ * Set up the new argument list.
+ */
+! alist_set(ALIST(curwin), drop_filec, drop_filev, FALSE, NULL, 0);
+
+ /*
+ * Move to the first file.
+***************
+*** 7942,7947 ****
+--- 7922,7999 ----
+ * unexpectedly. The screen will be redrawn by the caller, thus
+ * msg_scroll being set by displaying a message is irrelevant. */
+ msg_scroll = save_msg_scroll;
++
++ if (drop_callback != NULL)
++ drop_callback(drop_cookie);
++
++ drop_filev = NULL;
++ drop_busy = FALSE;
++ }
++
++ /*
++ * Handle a file drop. The code is here because a drop is *nearly* like an
++ * :args command, but not quite (we have a list of exact filenames, so we
++ * don't want to (a) parse a command line, or (b) expand wildcards. So the
++ * code is very similar to :args and hence needs access to a lot of the static
++ * functions in this file.
++ *
++ * The "filev" list must have been allocated using alloc(), as should each item
++ * in the list. This function takes over responsibility for freeing the "filev"
++ * list.
++ */
++ void
++ handle_drop(
++ int filec, // the number of files dropped
++ char_u **filev, // the list of files dropped
++ int split, // force splitting the window
++ void (*callback)(void *), // to be called after setting the argument
++ // list
++ void *cookie) // argument for "callback" (allocated)
++ {
++ // Cannot handle recursive drops, finish the pending one.
++ if (drop_busy)
++ {
++ FreeWild(filec, filev);
++ vim_free(cookie);
++ return;
++ }
++
++ // When calling handle_drop() more than once in a row we only use the last
++ // one.
++ if (drop_filev != NULL)
++ {
++ FreeWild(drop_filec, drop_filev);
++ vim_free(drop_cookie);
++ }
++
++ drop_filec = filec;
++ drop_filev = filev;
++ drop_split = split;
++ drop_callback = callback;
++ drop_cookie = cookie;
++
++ // Postpone this when:
++ // - editing the command line
++ // - not possible to change the current buffer
++ // - updating the screen
++ // As it may change buffers and window structures that are in use and cause
++ // freed memory to be used.
++ if (text_locked() || curbuf_locked() || updating_screen)
++ return;
++
++ handle_drop_internal();
++ }
++
++ /*
++ * To be called when text is unlocked, curbuf is unlocked or updating_screen is
++ * reset: Handle a postponed drop.
++ */
++ void
++ handle_any_postponed_drop(void)
++ {
++ if (!drop_busy && drop_filev != NULL
++ && !text_locked() && !curbuf_locked() && !updating_screen)
++ handle_drop_internal();
+ }
+ #endif
+
+*** ../vim-8.1.0227/src/proto/ex_docmd.pro 2018-05-17 13:52:34.000000000 +0200
+--- src/proto/ex_docmd.pro 2018-07-29 16:58:19.612440949 +0200
+***************
+*** 31,37 ****
+ void tabpage_close(int forceit);
+ void tabpage_close_other(tabpage_T *tp, int forceit);
+ void ex_all(exarg_T *eap);
+! void handle_drop(int filec, char_u **filev, int split);
+ void alist_clear(alist_T *al);
+ void alist_init(alist_T *al);
+ void alist_unlink(alist_T *al);
+--- 31,38 ----
+ void tabpage_close(int forceit);
+ void tabpage_close_other(tabpage_T *tp, int forceit);
+ void ex_all(exarg_T *eap);
+! void handle_drop(int filec, char_u **filev, int split, void (*callback)(void *), void *cookie);
+! void handle_any_postponed_drop(void);
+ void alist_clear(alist_T *al);
+ void alist_init(alist_T *al);
+ void alist_unlink(alist_T *al);
+*** ../vim-8.1.0227/src/gui.c 2018-07-29 16:09:14.636945607 +0200
+--- src/gui.c 2018-07-29 16:52:45.218249227 +0200
+***************
+*** 5383,5392 ****
+
+ #endif
+
+! #if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
+! || defined(FEAT_GUI_MSWIN) \
+! || defined(FEAT_GUI_MAC) \
+! || defined(PROTO)
+
+ static void gui_wingoto_xy(int x, int y);
+
+--- 5383,5389 ----
+
+ #endif
+
+! #if defined(HAVE_DROP_FILE) || defined(PROTO)
+
+ static void gui_wingoto_xy(int x, int y);
+
+***************
+*** 5409,5414 ****
+--- 5406,5447 ----
+ }
+
+ /*
++ * Function passed to handle_drop() for the actions to be done after the
++ * argument list has been updated.
++ */
++ static void
++ drop_callback(void *cookie)
++ {
++ char_u *p = cookie;
++
++ /* If Shift held down, change to first file's directory. If the first
++ * item is a directory, change to that directory (and let the explorer
++ * plugin show the contents). */
++ if (p != NULL)
++ {
++ if (mch_isdir(p))
++ {
++ if (mch_chdir((char *)p) == 0)
++ shorten_fnames(TRUE);
++ }
++ else if (vim_chdirfile(p, "drop") == OK)
++ shorten_fnames(TRUE);
++ vim_free(p);
++ }
++
++ /* Update the screen display */
++ update_screen(NOT_VALID);
++ # ifdef FEAT_MENU
++ gui_update_menus(0);
++ # endif
++ #ifdef FEAT_TITLE
++ maketitle();
++ #endif
++ setcursor();
++ out_flush_cursor(FALSE, FALSE);
++ }
++
++ /*
+ * Process file drop. Mouse cursor position, key modifiers, name of files
+ * and count of files are given. Argument "fnames[count]" has full pathnames
+ * of dropped files, they will be freed in this function, and caller can't use
+***************
+*** 5488,5520 ****
+ vim_free(fnames);
+ }
+ else
+! handle_drop(count, fnames, (modifiers & MOUSE_CTRL) != 0);
+!
+! /* If Shift held down, change to first file's directory. If the first
+! * item is a directory, change to that directory (and let the explorer
+! * plugin show the contents). */
+! if (p != NULL)
+! {
+! if (mch_isdir(p))
+! {
+! if (mch_chdir((char *)p) == 0)
+! shorten_fnames(TRUE);
+! }
+! else if (vim_chdirfile(p, "drop") == OK)
+! shorten_fnames(TRUE);
+! vim_free(p);
+! }
+!
+! /* Update the screen display */
+! update_screen(NOT_VALID);
+! # ifdef FEAT_MENU
+! gui_update_menus(0);
+! # endif
+! #ifdef FEAT_TITLE
+! maketitle();
+! #endif
+! setcursor();
+! out_flush_cursor(FALSE, FALSE);
+ }
+
+ entered = FALSE;
+--- 5521,5528 ----
+ vim_free(fnames);
+ }
+ else
+! handle_drop(count, fnames, (modifiers & MOUSE_CTRL) != 0,
+! drop_callback, (void *)p);
+ }
+
+ entered = FALSE;
+*** ../vim-8.1.0227/src/gui.h 2018-05-05 18:42:37.000000000 +0200
+--- src/gui.h 2018-07-29 16:52:19.418385701 +0200
+***************
+*** 65,72 ****
+ /*
+ * GUIs that support dropping files on a running Vim.
+ */
+! #if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MAC) \
+! || defined(FEAT_GUI_GTK)
+ # define HAVE_DROP_FILE
+ #endif
+
+--- 65,73 ----
+ /*
+ * GUIs that support dropping files on a running Vim.
+ */
+! #if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
+! || defined(FEAT_GUI_MSWIN) \
+! || defined(FEAT_GUI_MAC)
+ # define HAVE_DROP_FILE
+ #endif
+
+*** ../vim-8.1.0227/src/screen.c 2018-07-29 16:09:14.644945560 +0200
+--- src/screen.c 2018-07-29 16:51:41.606584708 +0200
+***************
+*** 526,531 ****
+--- 526,537 ----
+ #ifdef FEAT_TERMINAL
+ term_check_channel_closed_recently();
+ #endif
++
++ #ifdef HAVE_DROP_FILE
++ // If handle_drop() was called while updating_screen was TRUE need to
++ // handle the drop now.
++ handle_any_postponed_drop();
++ #endif
+ }
+
+ /*
+*** ../vim-8.1.0227/src/main.c 2018-06-23 16:12:15.784258242 +0200
+--- src/main.c 2018-07-29 17:02:36.091020303 +0200
+***************
+*** 911,917 ****
+
+ /*
+ * Call the main command loop. This never returns.
+! */
+ main_loop(FALSE, FALSE);
+
+ #endif /* NO_VIM_MAIN */
+--- 911,917 ----
+
+ /*
+ * Call the main command loop. This never returns.
+! */
+ main_loop(FALSE, FALSE);
+
+ #endif /* NO_VIM_MAIN */
+***************
+*** 1155,1163 ****
+ else if (do_redraw || stuff_empty())
+ {
+ #ifdef FEAT_GUI
+! /* If ui_breakcheck() was used a resize may have been postponed. */
+ gui_may_resize_shell();
+ #endif
+ /* Trigger CursorMoved if the cursor moved. */
+ if (!finish_op && (
+ has_cursormoved()
+--- 1155,1169 ----
+ else if (do_redraw || stuff_empty())
+ {
+ #ifdef FEAT_GUI
+! // If ui_breakcheck() was used a resize may have been postponed.
+ gui_may_resize_shell();
+ #endif
++ #ifdef HAVE_DROP_FILE
++ // If files were dropped while text was locked or the curbuf was
++ // locked, this would be a good time to handle the drop.
++ handle_any_postponed_drop();
++ #endif
++
+ /* Trigger CursorMoved if the cursor moved. */
+ if (!finish_op && (
+ has_cursormoved()
+*** ../vim-8.1.0227/src/gui_mac.c 2018-03-06 18:53:06.000000000 +0100
+--- src/gui_mac.c 2018-07-29 17:33:07.670760672 +0200
+***************
+*** 1007,1012 ****
+--- 1007,1061 ----
+ long theDate; // modification date/time
+ };
+
++ static long drop_numFiles;
++ static short drop_gotPosition;
++ static SelectionRange drop_thePosition;
++
++ static void
++ drop_callback(void *cookie UNUSED)
++ {
++ /* TODO: Handle the goto/select line more cleanly */
++ if ((drop_numFiles == 1) & (drop_gotPosition))
++ {
++ if (drop_thePosition.lineNum >= 0)
++ {
++ lnum = drop_thePosition.lineNum + 1;
++ /* oap->motion_type = MLINE;
++ setpcmark();*/
++ if (lnum < 1L)
++ lnum = 1L;
++ else if (lnum > curbuf->b_ml.ml_line_count)
++ lnum = curbuf->b_ml.ml_line_count;
++ curwin->w_cursor.lnum = lnum;
++ curwin->w_cursor.col = 0;
++ /* beginline(BL_SOL | BL_FIX);*/
++ }
++ else
++ goto_byte(drop_thePosition.startRange + 1);
++ }
++
++ /* Update the screen display */
++ update_screen(NOT_VALID);
++
++ /* Select the text if possible */
++ if (drop_gotPosition)
++ {
++ VIsual_active = TRUE;
++ VIsual_select = FALSE;
++ VIsual = curwin->w_cursor;
++ if (drop_thePosition.lineNum < 0)
++ {
++ VIsual_mode = 'v';
++ goto_byte(drop_thePosition.endRange);
++ }
++ else
++ {
++ VIsual_mode = 'V';
++ VIsual.col = 0;
++ }
++ }
++ }
++
+ /* The IDE uses the optional keyAEPosition parameter to tell the ed-
+ itor the selection range. If lineNum is zero or greater, scroll the text
+ to the specified line. If lineNum is less than zero, use the values in
+***************
+*** 1113,1160 ****
+ }
+
+ /* Handle the drop, :edit to get to the file */
+! handle_drop(numFiles, fnames, FALSE);
+!
+! /* TODO: Handle the goto/select line more cleanly */
+! if ((numFiles == 1) & (gotPosition))
+! {
+! if (thePosition.lineNum >= 0)
+! {
+! lnum = thePosition.lineNum + 1;
+! /* oap->motion_type = MLINE;
+! setpcmark();*/
+! if (lnum < 1L)
+! lnum = 1L;
+! else if (lnum > curbuf->b_ml.ml_line_count)
+! lnum = curbuf->b_ml.ml_line_count;
+! curwin->w_cursor.lnum = lnum;
+! curwin->w_cursor.col = 0;
+! /* beginline(BL_SOL | BL_FIX);*/
+! }
+! else
+! goto_byte(thePosition.startRange + 1);
+! }
+!
+! /* Update the screen display */
+! update_screen(NOT_VALID);
+!
+! /* Select the text if possible */
+! if (gotPosition)
+! {
+! VIsual_active = TRUE;
+! VIsual_select = FALSE;
+! VIsual = curwin->w_cursor;
+! if (thePosition.lineNum < 0)
+! {
+! VIsual_mode = 'v';
+! goto_byte(thePosition.endRange);
+! }
+! else
+! {
+! VIsual_mode = 'V';
+! VIsual.col = 0;
+! }
+! }
+
+ setcursor();
+ out_flush();
+--- 1162,1171 ----
+ }
+
+ /* Handle the drop, :edit to get to the file */
+! drop_numFiles = numFiles;
+! drop_gotPosition = gotPosition;
+! drop_thePosition = thePosition;
+! handle_drop(numFiles, fnames, FALSE, drop_callback, NULL);
+
+ setcursor();
+ out_flush();
+*** ../vim-8.1.0227/src/version.c 2018-07-29 16:13:13.431551849 +0200
+--- src/version.c 2018-07-29 16:44:55.344870301 +0200
+***************
+*** 796,797 ****
+--- 796,799 ----
+ { /* Add new patch number below this line */
++ /**/
++ 228,
+ /**/
+
+
+--
+We do not stumble over mountains, but over molehills.
+ Confucius
+
+ /// 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 ///