0
0
mirror of https://github.com/vim/vim.git synced 2025-09-28 04:24:06 -04:00

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.
This commit is contained in:
Bram Moolenaar
2016-06-02 14:30:04 +02:00
parent c4bc0e6542
commit 4231da403e
6 changed files with 77 additions and 27 deletions

View File

@@ -1101,6 +1101,7 @@ insert_timer(timer_T *timer)
if (first_timer != NULL)
first_timer->tr_prev = timer;
first_timer = timer;
did_add_timer = TRUE;
}
/*

View File

@@ -1635,6 +1635,10 @@ EXTERN int disable_char_avail_for_testing INIT(= 0);
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.
*/

View File

@@ -6538,12 +6538,12 @@ gui_mch_wait_for_chars(long wtime)
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 @@ gui_mch_wait_for_chars(long wtime)
}
#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 @@ gui_mch_wait_for_chars(long wtime)
/* 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_wait_for_chars(long wtime)
*/
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;
}

View File

@@ -2022,6 +2022,22 @@ gui_mch_update(void)
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 @@ gui_mch_wait_for_chars(int wtime)
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 @@ gui_mch_wait_for_chars(int wtime)
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 @@ gui_mch_wait_for_chars(int wtime)
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;

View File

@@ -2793,6 +2793,7 @@ gui_mch_update(void)
gui_mch_wait_for_chars(long wtime)
{
int focus;
int retval = FAIL;
/*
* Make this static, in case gui_x11_timer_cb is called after leaving
@@ -2828,7 +2829,15 @@ gui_mch_wait_for_chars(long wtime)
}
#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 @@ gui_mch_wait_for_chars(long wtime)
if (input_available())
{
retval = OK;
break;
}
}
if (timer != (XtIntervalId)0 && !timed_out)
XtRemoveTimeOut(timer);
return OK;
}
}
return FAIL;
return retval;
}
/*

View File

@@ -753,6 +753,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1873,
/**/
1872,
/**/