changeset 8609:40bb2619f5e2 v7.4.1594

commit https://github.com/vim/vim/commit/943bb2b8eb80266a5de143feeab4c842c4b68c61 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 19 14:11:18 2016 +0100 patch 7.4.1594 Problem: Timers don't work on Unix. Solution: Add missing code.
author Christian Brabandt <cb@256bit.org>
date Sat, 19 Mar 2016 14:15:05 +0100
parents 74893ef07db0
children 00dc4a8866d2
files src/os_unix.c src/version.c
diffstat 2 files changed, 42 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -176,6 +176,7 @@ typedef int waitstatus;
 static pid_t wait4pid(pid_t, waitstatus *);
 
 static int  WaitForChar(long);
+static int  WaitForCharOrMouse(long);
 #if defined(__BEOS__) || defined(VMS)
 int  RealWaitForChar(int, long, int *);
 #else
@@ -5347,13 +5348,50 @@ mch_breakcheck(void)
 }
 
 /*
- * Wait "msec" msec until a character is available from the keyboard or from
- * inbuf[]. msec == -1 will block forever.
+ * Wait "msec" msec until a character is available from the mouse, keyboard,
+ * from inbuf[].
+ * "msec" == -1 will block forever.
+ * Invokes timer callbacks when needed.
  * When a GUI is being used, this will never get called -- webb
  */
     static int
 WaitForChar(long msec)
 {
+#ifdef FEAT_TIMERS
+    long    due_time;
+    long    remaining = msec;
+
+    /* When waiting very briefly don't trigger timers. */
+    if (msec >= 0 && msec < 10L)
+	return WaitForCharOrMouse(msec);
+
+    while (msec < 0 || remaining > 0)
+    {
+	/* Trigger timers and then get the time in msec until the next one is
+	 * due.  Wait up to that time. */
+	due_time = check_due_timer();
+	if (due_time <= 0 || (msec > 0 && due_time > remaining))
+	    due_time = remaining;
+	if (WaitForCharOrMouse(due_time))
+	    return TRUE;
+	if (msec > 0)
+	    remaining -= due_time;
+    }
+    return FALSE;
+#else
+    return WaitForCharOrMouse(msec);
+#endif
+}
+
+/*
+ * Wait "msec" msec until a character is available from the mouse or keyboard
+ * or from inbuf[].
+ * "msec" == -1 will block forever.
+ * When a GUI is being used, this will never get called -- webb
+ */
+    static int
+WaitForCharOrMouse(long msec)
+{
 #ifdef FEAT_MOUSE_GPM
     int		gpm_process_wanted;
 #endif
--- a/src/version.c
+++ b/src/version.c
@@ -749,6 +749,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1594,
+/**/
     1593,
 /**/
     1592,