patch 7.4.1873
Problem: When a callback adds a timer the GUI doesn't use it until later.
(Ramel Eshed)
Solution: Return early if a callback adds a timer.
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 5efe0ec..e0a392d 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -1101,6 +1101,7 @@
if (first_timer != NULL)
first_timer->tr_prev = timer;
first_timer = timer;
+ did_add_timer = TRUE;
}
/*
diff --git a/src/globals.h b/src/globals.h
index 369eb54..2e84e57 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1635,6 +1635,10 @@
EXTERN int in_free_unref_items INIT(= FALSE);
#endif
+#ifdef FEAT_TIMERS
+EXTERN int did_add_timer INIT(= FALSE);
+#endif
+
/*
* Optional Farsi support. Include it here, so EXTERN and INIT are defined.
*/
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index 77e84c1..d497c75 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -6535,15 +6535,15 @@
int
gui_mch_wait_for_chars(long wtime)
{
- int focus;
- guint timer;
- static int timed_out;
+ int focus;
+ guint timer;
+ static int timed_out;
+ int retval = FAIL;
timed_out = FALSE;
/* this timeout makes sure that we will return if no characters arrived in
* time */
-
if (wtime > 0)
#if GTK_CHECK_VERSION(3,0,0)
timer = g_timeout_add((guint)wtime, input_timer_cb, &timed_out);
@@ -6568,7 +6568,15 @@
}
#ifdef MESSAGE_QUEUE
+# ifdef FEAT_TIMERS
+ did_add_timer = FALSE;
+# endif
parse_queued_messages();
+# ifdef FEAT_TIMERS
+ if (did_add_timer)
+ /* Need to recompute the waiting time. */
+ goto theend;
+# endif
#endif
/*
@@ -6582,13 +6590,8 @@
/* Got char, return immediately */
if (input_available())
{
- if (timer != 0 && !timed_out)
-#if GTK_CHECK_VERSION(3,0,0)
- g_source_remove(timer);
-#else
- gtk_timeout_remove(timer);
-#endif
- return OK;
+ retval = OK;
+ goto theend;
}
} while (wtime < 0 || !timed_out);
@@ -6597,7 +6600,15 @@
*/
gui_mch_update();
- return FAIL;
+theend:
+ if (timer != 0 && !timed_out)
+#if GTK_CHECK_VERSION(3,0,0)
+ g_source_remove(timer);
+#else
+ gtk_timeout_remove(timer);
+#endif
+
+ return retval;
}
diff --git a/src/gui_w32.c b/src/gui_w32.c
index 10c14c9..82ca7de 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -2022,6 +2022,22 @@
process_message();
}
+ static void
+remove_any_timer(void)
+{
+ MSG msg;
+
+ if (s_wait_timer != 0 && !s_timed_out)
+ {
+ KillTimer(NULL, s_wait_timer);
+
+ /* Eat spurious WM_TIMER messages */
+ while (pPeekMessage(&msg, s_hwnd, WM_TIMER, WM_TIMER, PM_REMOVE))
+ ;
+ s_wait_timer = 0;
+ }
+}
+
/*
* GUI input routine called by gui_wait_for_chars(). Waits for a character
* from the keyboard.
@@ -2073,6 +2089,9 @@
s_need_activate = FALSE;
}
+#ifdef FEAT_TIMERS
+ did_add_timer = FALSE;
+#endif
#ifdef MESSAGE_QUEUE
/* Check channel while waiting message. */
for (;;)
@@ -2098,15 +2117,7 @@
if (input_available())
{
- if (s_wait_timer != 0 && !s_timed_out)
- {
- KillTimer(NULL, s_wait_timer);
-
- /* Eat spurious WM_TIMER messages */
- while (pPeekMessage(&msg, s_hwnd, WM_TIMER, WM_TIMER, PM_REMOVE))
- ;
- s_wait_timer = 0;
- }
+ remove_any_timer();
allow_scrollbar = FALSE;
/* Clear pending mouse button, the release event may have been
@@ -2117,6 +2128,15 @@
return OK;
}
+
+#ifdef FEAT_TIMERS
+ if (did_add_timer)
+ {
+ /* Need to recompute the waiting time. */
+ remove_any_timer();
+ break;
+ }
+#endif
}
allow_scrollbar = FALSE;
return FAIL;
diff --git a/src/gui_x11.c b/src/gui_x11.c
index b525cf7..7d01e79 100644
--- a/src/gui_x11.c
+++ b/src/gui_x11.c
@@ -2368,7 +2368,7 @@
for (i = 0; i < cmap_size; i++)
colortable[i].pixel = (unsigned long)i;
- XQueryColors (gui.dpy, colormap, colortable, cmap_size);
+ XQueryColors(gui.dpy, colormap, colortable, cmap_size);
/*
* Find the color that best approximates the desired one, then
@@ -2792,7 +2792,8 @@
int
gui_mch_wait_for_chars(long wtime)
{
- int focus;
+ int focus;
+ int retval = FAIL;
/*
* Make this static, in case gui_x11_timer_cb is called after leaving
@@ -2828,7 +2829,15 @@
}
#ifdef MESSAGE_QUEUE
+# ifdef FEAT_TIMERS
+ did_add_timer = FALSE;
+# endif
parse_queued_messages();
+# ifdef FEAT_TIMERS
+ if (did_add_timer)
+ /* Need to recompute the waiting time. */
+ break;
+# endif
#endif
/*
@@ -2843,12 +2852,15 @@
if (input_available())
{
- if (timer != (XtIntervalId)0 && !timed_out)
- XtRemoveTimeOut(timer);
- return OK;
+ retval = OK;
+ break;
}
}
- return FAIL;
+
+ if (timer != (XtIntervalId)0 && !timed_out)
+ XtRemoveTimeOut(timer);
+
+ return retval;
}
/*
diff --git a/src/version.c b/src/version.c
index b87300a..3c04195 100644
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1873,
+/**/
1872,
/**/
1871,