]> granicus.if.org Git - vim/commitdiff
patch 8.1.1975: MS-Windows GUI responds slowly to timer v8.1.1975
authorBram Moolenaar <Bram@vim.org>
Wed, 4 Sep 2019 11:53:21 +0000 (13:53 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 4 Sep 2019 11:53:21 +0000 (13:53 +0200)
Problem:    MS-Windows GUI responds slowly to timer.
Solution:   Break out of wait loop when timer was added or input is available.
            (closes #4893)

src/gui_w32.c
src/version.c

index 5600ac0c28908bab255edaf41a05c92e00a2f50d..c2371f40523ed75733f1c67b900957c80b3424a5 100644 (file)
@@ -2074,7 +2074,7 @@ gui_mch_wait_for_chars(int wtime)
     focus = gui.in_focus;
     while (!s_timed_out)
     {
-       /* Stop or start blinking when focus changes */
+       // Stop or start blinking when focus changes
        if (gui.in_focus != focus)
        {
            if (gui.in_focus)
@@ -2094,29 +2094,31 @@ gui_mch_wait_for_chars(int wtime)
        did_add_timer = FALSE;
 #endif
 #ifdef MESSAGE_QUEUE
-       /* Check channel I/O while waiting for a message. */
+       // Check channel I/O while waiting for a message.
        for (;;)
        {
            MSG msg;
 
            parse_queued_messages();
-
+#ifdef FEAT_TIMERS
+           if (did_add_timer)
+               break;
+#endif
            if (pPeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
            {
                process_message();
                break;
            }
-           else if (MsgWaitForMultipleObjects(0, NULL, FALSE, 100, QS_ALLINPUT)
-                                                              != WAIT_TIMEOUT)
+           else if (input_available()
+                   || MsgWaitForMultipleObjects(0, NULL, FALSE, 100,
+                                                 QS_ALLINPUT) != WAIT_TIMEOUT)
                break;
        }
 #else
-       /*
-        * Don't use gui_mch_update() because then we will spin-lock until a
-        * char arrives, instead we use GetMessage() to hang until an
-        * event arrives.  No need to check for input_buf_full because we are
-        * returning as soon as it contains a single char -- webb
-        */
+       // Don't use gui_mch_update() because then we will spin-lock until a
+       // char arrives, instead we use GetMessage() to hang until an
+       // event arrives.  No need to check for input_buf_full because we are
+       // returning as soon as it contains a single char -- webb
        process_message();
 #endif
 
@@ -2125,9 +2127,9 @@ gui_mch_wait_for_chars(int wtime)
            remove_any_timer();
            allow_scrollbar = FALSE;
 
-           /* Clear pending mouse button, the release event may have been
-            * taken by the dialog window.  But don't do this when getting
-            * focus, we need the mouse-up event then. */
+           // Clear pending mouse button, the release event may have been
+           // taken by the dialog window.  But don't do this when getting
+           // focus, we need the mouse-up event then.
            if (!s_getting_focus)
                s_button_pending = -1;
 
@@ -2137,7 +2139,7 @@ gui_mch_wait_for_chars(int wtime)
 #ifdef FEAT_TIMERS
        if (did_add_timer)
        {
-           /* Need to recompute the waiting time. */
+           // Need to recompute the waiting time.
            remove_any_timer();
            break;
        }
index 3f92271dd303b8b134617a47152959bb670bee1a..191e10166c1a334457a026fc58ca4c58cfeb2e21 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1975,
 /**/
     1974,
 /**/