]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 7.4.1873 v7.4.1873
authorBram Moolenaar <Bram@vim.org>
Thu, 2 Jun 2016 12:30:04 +0000 (14:30 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 2 Jun 2016 12:30:04 +0000 (14:30 +0200)
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.

src/ex_cmds2.c
src/globals.h
src/gui_gtk_x11.c
src/gui_w32.c
src/gui_x11.c
src/version.c

index 5efe0ec15a6301f1a1742248cabfc6dd041c725e..e0a392deeb5552e3b4898879a89eb27404f32cec 100644 (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;
 }
 
 /*
index 369eb546ec2046461e618cbb3330b18c629f81e0..2e84e579cb065ae303a2d76ebafa06f285ded444 100644 (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.
  */
index 77e84c1be21b87c3688b9ff5dee7a5d9bff56a63..d497c7530cecd83f9626b4a580f805632c35644d 100644 (file)
@@ -6535,15 +6535,15 @@ input_timer_cb(gpointer data)
     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 @@ 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;
 }
 
 
index 10c14c9d9c9cc1b93158e575b0facba664ad5ae8..82ca7de5d8198eb4a4d003a11d461884462b597b 100644 (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;
index b525cf7a68449d821897ac1c030def4556c8313c..7d01e79dcafd082fe8c36f5bbc87291db08717a1 100644 (file)
@@ -2368,7 +2368,7 @@ find_closest_color(Colormap colormap, XColor *colorPtr)
 
     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 @@ gui_mch_update(void)
     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 @@ 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())
        {
-           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;
 }
 
 /*
index b87300af374ff8d472eb6283712cd077b62bdb24..3c0419586dd97107bf5e976b8e1cd6fa3fc35bef 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1873,
 /**/
     1872,
 /**/