astepano / rpms / vim

Forked from rpms/vim 6 years ago
Clone
d172a1a
To: vim-dev@vim.org
d172a1a
Subject: Patch 7.2.121
d172a1a
Fcc: outbox
d172a1a
From: Bram Moolenaar <Bram@moolenaar.net>
d172a1a
Mime-Version: 1.0
d172a1a
Content-Type: text/plain; charset=ISO-8859-1
d172a1a
Content-Transfer-Encoding: 8bit
d172a1a
------------
d172a1a
d172a1a
Patch 7.2.121
d172a1a
Problem:    In gvim "!grep a *.c" spews out a lot of text that can't be
d172a1a
            stopped with CTRL-C.
d172a1a
Solution:   When looping to read and show text, do check for typed characters
d172a1a
            every two seconds.
d172a1a
Files:      src/os_unix.c
d172a1a
d172a1a
d172a1a
*** ../vim-7.2.120/src/os_unix.c	Wed Feb  4 14:18:44 2009
d172a1a
--- src/os_unix.c	Sun Feb 22 00:54:05 2009
d172a1a
***************
d172a1a
*** 4092,4097 ****
d172a1a
--- 4092,4100 ----
d172a1a
  		int	    fromshell_fd;
d172a1a
  		garray_T    ga;
d172a1a
  		int	    noread_cnt;
d172a1a
+ # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
d172a1a
+ 		struct timeval  start_tv;
d172a1a
+ # endif
d172a1a
  
d172a1a
  # ifdef FEAT_GUI
d172a1a
  		if (pty_master_fd >= 0)
d172a1a
***************
d172a1a
*** 4201,4207 ****
d172a1a
  		    ga_init2(&ga, 1, BUFLEN);
d172a1a
  
d172a1a
  		noread_cnt = 0;
d172a1a
! 
d172a1a
  		for (;;)
d172a1a
  		{
d172a1a
  		    /*
d172a1a
--- 4204,4212 ----
d172a1a
  		    ga_init2(&ga, 1, BUFLEN);
d172a1a
  
d172a1a
  		noread_cnt = 0;
d172a1a
! # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
d172a1a
! 		gettimeofday(&start_tv, NULL);
d172a1a
! # endif
d172a1a
  		for (;;)
d172a1a
  		{
d172a1a
  		    /*
d172a1a
***************
d172a1a
*** 4214,4238 ****
d172a1a
  		     * that a typed password is echoed for ssh or gpg command.
d172a1a
  		     * Don't get characters when the child has already
d172a1a
  		     * finished (wait_pid == 0).
d172a1a
- 		     * Don't get extra characters when we already have one.
d172a1a
  		     * Don't read characters unless we didn't get output for a
d172a1a
! 		     * while, avoids that ":r !ls" eats typeahead.
d172a1a
  		     */
d172a1a
  		    len = 0;
d172a1a
  		    if (!(options & SHELL_EXPAND)
d172a1a
  			    && ((options &
d172a1a
  					 (SHELL_READ|SHELL_WRITE|SHELL_COOKED))
d172a1a
  				      != (SHELL_READ|SHELL_WRITE|SHELL_COOKED)
d172a1a
! #ifdef FEAT_GUI
d172a1a
  						    || gui.in_use
d172a1a
! #endif
d172a1a
  						    )
d172a1a
  			    && wait_pid == 0
d172a1a
! 			    && (ta_len > 0
d172a1a
! 				|| (noread_cnt > 4
d172a1a
! 				    && (len = ui_inchar(ta_buf,
d172a1a
! 						       BUFLEN, 10L, 0)) > 0)))
d172a1a
  		    {
d172a1a
  			/*
d172a1a
  			 * For pipes:
d172a1a
  			 * Check for CTRL-C: send interrupt signal to child.
d172a1a
--- 4219,4252 ----
d172a1a
  		     * that a typed password is echoed for ssh or gpg command.
d172a1a
  		     * Don't get characters when the child has already
d172a1a
  		     * finished (wait_pid == 0).
d172a1a
  		     * Don't read characters unless we didn't get output for a
d172a1a
! 		     * while (noread_cnt > 4), avoids that ":r !ls" eats
d172a1a
! 		     * typeahead.
d172a1a
  		     */
d172a1a
  		    len = 0;
d172a1a
  		    if (!(options & SHELL_EXPAND)
d172a1a
  			    && ((options &
d172a1a
  					 (SHELL_READ|SHELL_WRITE|SHELL_COOKED))
d172a1a
  				      != (SHELL_READ|SHELL_WRITE|SHELL_COOKED)
d172a1a
! # ifdef FEAT_GUI
d172a1a
  						    || gui.in_use
d172a1a
! # endif
d172a1a
  						    )
d172a1a
  			    && wait_pid == 0
d172a1a
! 			    && (ta_len > 0 || noread_cnt > 4))
d172a1a
  		    {
d172a1a
+ 		      if (ta_len == 0)
d172a1a
+ 		      {
d172a1a
+ 			  /* Get extra characters when we don't have any.
d172a1a
+ 			   * Reset the counter and timer. */
d172a1a
+ 			  noread_cnt = 0;
d172a1a
+ # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
d172a1a
+ 			  gettimeofday(&start_tv, NULL);
d172a1a
+ # endif
d172a1a
+ 			  len = ui_inchar(ta_buf, BUFLEN, 10L, 0);
d172a1a
+ 		      }
d172a1a
+ 		      if (ta_len > 0 || len > 0)
d172a1a
+ 		      {
d172a1a
  			/*
d172a1a
  			 * For pipes:
d172a1a
  			 * Check for CTRL-C: send interrupt signal to child.
d172a1a
***************
d172a1a
*** 4334,4342 ****
d172a1a
  			    {
d172a1a
  				ta_len -= len;
d172a1a
  				mch_memmove(ta_buf, ta_buf + len, ta_len);
d172a1a
- 				noread_cnt = 0;
d172a1a
  			    }
d172a1a
  			}
d172a1a
  		    }
d172a1a
  
d172a1a
  		    if (got_int)
d172a1a
--- 4348,4356 ----
d172a1a
  			    {
d172a1a
  				ta_len -= len;
d172a1a
  				mch_memmove(ta_buf, ta_buf + len, ta_len);
d172a1a
  			    }
d172a1a
  			}
d172a1a
+ 		      }
d172a1a
  		    }
d172a1a
  
d172a1a
  		    if (got_int)
d172a1a
***************
d172a1a
*** 4444,4449 ****
d172a1a
--- 4458,4482 ----
d172a1a
  			out_flush();
d172a1a
  			if (got_int)
d172a1a
  			    break;
d172a1a
+ 
d172a1a
+ # if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
d172a1a
+ 			{
d172a1a
+ 			    struct timeval  now_tv;
d172a1a
+ 			    long	    msec;
d172a1a
+ 
d172a1a
+ 			    /* Avoid that we keep looping here without
d172a1a
+ 			     * checking for a CTRL-C for a long time.  Don't
d172a1a
+ 			     * break out too often to avoid losing typeahead. */
d172a1a
+ 			    gettimeofday(&now_tv, NULL);
d172a1a
+ 			    msec = (now_tv.tv_sec - start_tv.tv_sec) * 1000L
d172a1a
+ 				+ (now_tv.tv_usec - start_tv.tv_usec) / 1000L;
d172a1a
+ 			    if (msec > 2000)
d172a1a
+ 			    {
d172a1a
+ 				noread_cnt = 5;
d172a1a
+ 				break;
d172a1a
+ 			    }
d172a1a
+ 			}
d172a1a
+ # endif
d172a1a
  		    }
d172a1a
  
d172a1a
  		    /* If we already detected the child has finished break the
d172a1a
*** ../vim-7.2.120/src/version.c	Sun Feb 22 02:36:36 2009
d172a1a
--- src/version.c	Sun Feb 22 02:48:03 2009
d172a1a
***************
d172a1a
*** 678,679 ****
d172a1a
--- 678,681 ----
d172a1a
  {   /* Add new patch number below this line */
d172a1a
+ /**/
d172a1a
+     121,
d172a1a
  /**/
d172a1a
d172a1a
-- 
d172a1a
hundred-and-one symptoms of being an internet addict:
d172a1a
111. You and your friends get together regularly on IRC, even though
d172a1a
     all of you live in the same city.
d172a1a
d172a1a
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
d172a1a
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
d172a1a
\\\        download, build and distribute -- http://www.A-A-P.org        ///
d172a1a
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///