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.
Files:      src/ex_cmds2.c, src/gui_gtk_x11.c, src/gui_w32.c, src/gui_x11.c,
            src/globals.h


*** ../vim-7.4.1872/src/ex_cmds2.c      2016-05-31 21:37:32.962685143 +0200
--- src/ex_cmds2.c      2016-06-02 14:08:06.816679082 +0200
***************
*** 1101,1106 ****
--- 1101,1107 ----
      if (first_timer != NULL)
        first_timer->tr_prev = timer;
      first_timer = timer;
+     did_add_timer = TRUE;
  }
  
  /*
*** ../vim-7.4.1872/src/gui_gtk_x11.c   2016-04-17 20:49:46.133819400 +0200
--- src/gui_gtk_x11.c   2016-06-02 14:11:35.104676217 +0200
***************
*** 6535,6549 ****
      int
  gui_mch_wait_for_chars(long wtime)
  {
!     int focus;
!     guint timer;
!     static int timed_out;
  
      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);
--- 6535,6549 ----
      int
  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,6574 ****
--- 6568,6582 ----
        }
  
  #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,6594 ****
        /* 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;
        }
      } while (wtime < 0 || !timed_out);
  
--- 6590,6597 ----
        /* Got char, return immediately */
        if (input_available())
        {
!           retval = OK;
!           goto theend;
        }
      } while (wtime < 0 || !timed_out);
  
***************
*** 6597,6603 ****
       */
      gui_mch_update();
  
!     return FAIL;
  }
  
  
--- 6600,6614 ----
       */
      gui_mch_update();
  
! 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;
  }
  
  
*** ../vim-7.4.1872/src/gui_w32.c       2016-04-26 21:51:45.014007644 +0200
--- src/gui_w32.c       2016-06-02 14:21:55.296667686 +0200
***************
*** 2022,2027 ****
--- 2022,2043 ----
            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,2078 ****
--- 2089,2097 ----
            s_need_activate = FALSE;
        }
  
+ #ifdef FEAT_TIMERS
+       did_add_timer = FALSE;
+ #endif
  #ifdef MESSAGE_QUEUE
        /* Check channel while waiting message. */
        for (;;)
***************
*** 2098,2112 ****
  
        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;
!           }
            allow_scrollbar = FALSE;
  
            /* Clear pending mouse button, the release event may have been
--- 2117,2123 ----
  
        if (input_available())
        {
!           remove_any_timer();
            allow_scrollbar = FALSE;
  
            /* Clear pending mouse button, the release event may have been
***************
*** 2117,2122 ****
--- 2128,2142 ----
  
            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;
*** ../vim-7.4.1872/src/gui_x11.c       2016-02-27 18:13:05.236593109 +0100
--- src/gui_x11.c       2016-06-02 14:24:32.900665518 +0200
***************
*** 2368,2374 ****
  
      for (i = 0; i  < cmap_size; i++)
        colortable[i].pixel = (unsigned long)i;
!     XQueryColors (gui.dpy, colormap, colortable, cmap_size);
  
      /*
       * Find the color that best approximates the desired one, then
--- 2368,2374 ----
  
      for (i = 0; i  < cmap_size; i++)
        colortable[i].pixel = (unsigned long)i;
!     XQueryColors(gui.dpy, colormap, colortable, cmap_size);
  
      /*
       * Find the color that best approximates the desired one, then
***************
*** 2792,2798 ****
      int
  gui_mch_wait_for_chars(long wtime)
  {
!     int                   focus;
  
      /*
       * Make this static, in case gui_x11_timer_cb is called after leaving
--- 2792,2799 ----
      int
  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,2834 ****
--- 2829,2843 ----
        }
  
  #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,2854 ****
  
        if (input_available())
        {
!           if (timer != (XtIntervalId)0 && !timed_out)
!               XtRemoveTimeOut(timer);
!           return OK;
        }
      }
!     return FAIL;
  }
  
  /*
--- 2852,2866 ----
  
        if (input_available())
        {
!           retval = OK;
!           break;
        }
      }
! 
!     if (timer != (XtIntervalId)0 && !timed_out)
!       XtRemoveTimeOut(timer);
! 
!     return retval;
  }
  
  /*
*** ../vim-7.4.1872/src/globals.h       2016-06-01 23:08:35.241421504 +0200
--- src/globals.h       2016-06-02 14:07:55.776679234 +0200
***************
*** 1635,1640 ****
--- 1635,1644 ----
  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.
   */
*** ../vim-7.4.1872/src/version.c       2016-06-02 13:54:45.144690110 +0200
--- src/version.c       2016-06-02 14:11:52.968675971 +0200
***************
*** 755,756 ****
--- 755,758 ----
  {   /* Add new patch number below this line */
+ /**/
+     1873,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
35. Your husband tells you he's had the beard for 2 months.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui