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