diff src/misc1.c @ 11601:0a5d405e2520 v8.0.0683

patch 8.0.0683: visual bell flashes too quickly commit https://github.com/vim/vim/commit/2e147caa14f622dfd1c1def8e07c113b9b85d4b2 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jun 27 17:09:37 2017 +0200 patch 8.0.0683: visual bell flashes too quickly Problem: When using a visual bell there is no delay, causing the flash to be very short, possibly unnoticeable. Also, the flash and the beep can lockup the UI when repeated often. Solution: Do the delay in Vim or flush the output before the delay. Limit the bell to once per half a second. (Ozaki Kiichi, closes #1789)
author Christian Brabandt <cb@256bit.org>
date Tue, 27 Jun 2017 17:15:03 +0200
parents b200e14e7836
children 6bbc7bc0f3dd
line wrap: on
line diff
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -3685,16 +3685,30 @@ vim_beep(
     {
 	if (!((bo_flags & val) || (bo_flags & BO_ALL)))
 	{
-	    if (p_vb
+#ifdef ELAPSED_FUNC
+	    static int		did_init = FALSE;
+	    static ELAPSED_TYPE	start_tv;
+
+	    /* Only beep once per half a second, otherwise a sequence of beeps
+	     * would freeze Vim. */
+	    if (!did_init || ELAPSED_FUNC(start_tv) > 500)
+	    {
+		did_init = TRUE;
+		ELAPSED_INIT(start_tv);
+#endif
+		if (p_vb
 #ifdef FEAT_GUI
-		    /* While the GUI is starting up the termcap is set for the
-		     * GUI but the output still goes to a terminal. */
-		    && !(gui.in_use && gui.starting)
-#endif
-		    )
-		out_str(T_VB);
-	    else
-		out_char(BELL);
+			/* While the GUI is starting up the termcap is set for
+			 * the GUI but the output still goes to a terminal. */
+			&& !(gui.in_use && gui.starting)
+#endif
+			)
+		    out_str_cf(T_VB);
+		else
+		    out_char(BELL);
+#ifdef ELAPSED_FUNC
+	    }
+#endif
 	}
 
 	/* When 'verbose' is set and we are sourcing a script or executing a