]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.3.866 v7.3.866
authorBram Moolenaar <Bram@vim.org>
Tue, 19 Mar 2013 11:35:42 +0000 (12:35 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 19 Mar 2013 11:35:42 +0000 (12:35 +0100)
Problem:    Not serving the X selection during system() isn't nice.
Solution:   When using fork() do not loose the selection, keep serving it.
            Add a loop similar to handling I/O. (Yukihiro Nakadaira)

src/os_unix.c
src/version.c

index 9d9483261909294eb6bf2108dc4c230599dca438..97e35b9fd772d06c7736251ec1e66d88a2883549 100644 (file)
@@ -132,6 +132,7 @@ static RETSIGTYPE sig_sysmouse __ARGS(SIGPROTOARG);
 #  include <X11/Shell.h>
 #  include <X11/StringDefs.h>
 static Widget  xterm_Shell = (Widget)0;
+static void clip_update __ARGS((void));
 static void xterm_update __ARGS((void));
 # endif
 
@@ -1138,11 +1139,13 @@ sigcont_handler SIGDEFARG(sigarg)
 
 # if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
 static void loose_clipboard __ARGS((void));
+# ifdef USE_SYSTEM
 static void save_clipboard __ARGS((void));
 static void restore_clipboard __ARGS((void));
 
 static void *clip_star_save = NULL;
 static void *clip_plus_save = NULL;
+# endif
 
 /*
  * Called when Vim is going to sleep or execute a shell command.
@@ -1164,6 +1167,7 @@ loose_clipboard()
     }
 }
 
+# ifdef USE_SYSTEM
 /*
  * Save clipboard text to restore later.
  */
@@ -1199,6 +1203,7 @@ restore_clipboard()
        clip_plus_save = NULL;
     }
 }
+# endif
 #endif
 
 /*
@@ -4009,13 +4014,6 @@ mch_call_shell(cmd, options)
     if (options & SHELL_COOKED)
        settmode(TMODE_COOK);           /* set to normal mode */
 
-# if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
-    /* Disown the clipboard, because is the executed command tries to obtain a
-     * selection and we own it we get a deadlock. */
-    save_clipboard();
-    loose_clipboard();
-# endif
-
     /*
      * Do this loop twice:
      * 1: find number of arguments
@@ -4788,6 +4786,11 @@ mch_call_shell(cmd, options)
                    }
                    else
                        wait_pid = 0;
+
+# if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
+                   /* Handle any X events, e.g. serving the clipboard. */
+                   clip_update();
+# endif
                }
 finished:
                p_more = p_more_save;
@@ -4814,6 +4817,45 @@ finished:
                    close(toshell_fd);
                close(fromshell_fd);
            }
+# if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
+           else
+           {
+               /*
+                * Similar to the loop above, but only handle X events, no
+                * I/O.
+                */
+               for (;;)
+               {
+                   if (got_int)
+                   {
+                       /* CTRL-C sends a signal to the child, we ignore it
+                        * ourselves */
+#  ifdef HAVE_SETSID
+                       kill(-pid, SIGINT);
+#  else
+                       kill(0, SIGINT);
+#  endif
+                       got_int = FALSE;
+                   }
+# ifdef __NeXT__
+                   wait_pid = wait4(pid, &status, WNOHANG, (struct rusage *)0);
+# else
+                   wait_pid = waitpid(pid, &status, WNOHANG);
+# endif
+                   if ((wait_pid == (pid_t)-1 && errno == ECHILD)
+                           || (wait_pid == pid && WIFEXITED(status)))
+                   {
+                       wait_pid = pid;
+                       break;
+                   }
+
+                   /* Handle any X events, e.g. serving the clipboard. */
+                   clip_update();
+
+                   mch_delay(10L, TRUE);
+               }
+           }
+# endif
 
            /*
             * Wait until our child has exited.
@@ -4883,9 +4925,6 @@ error:
            settmode(TMODE_RAW);        /* set to raw mode */
 # ifdef FEAT_TITLE
     resettitle();
-# endif
-# if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
-    restore_clipboard();
 # endif
     vim_free(newcmd);
 
@@ -6867,6 +6906,21 @@ clear_xterm_clip()
 }
 # endif
 
+/*
+ * Catch up with GUI or X events.
+ */
+    static void
+clip_update()
+{
+# ifdef FEAT_GUI
+    if (gui.in_use)
+       gui_mch_update();
+    else
+# endif
+    if (xterm_Shell != (Widget)0)
+       xterm_update();
+}
+
 /*
  * Catch up with any queued X events.  This may put keyboard input into the
  * input buffer, call resize call-backs, trigger timers etc.  If there is
index 740e84159fd2f778a27686a3c8f5b88e6266979f..c3e8f3773def49ea3af261edb27711f0318a81a0 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    866,
 /**/
     865,
 /**/