From ad397d2dfc06b832b7fd888f547c193f941f5adf Mon Sep 17 00:00:00 2001 From: ichizok Date: Mon, 23 Apr 2018 19:03:49 +0900 Subject: [PATCH] Fix a wait for input-event Should not return from waitForInput by channel-I/O event since it interrupts a wait for mapped-key sequence. --- src/MacVim/MMBackend.m | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index fa9ddfa774..e425765fbf 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -682,7 +682,7 @@ extern GuiFont gui_mch_retain_font(GuiFont font); // Only start the run loop if the input queue is empty, otherwise process // the input first so that the input on queue isn't delayed. - if ([inputQueue count] || input_available()) { + if ([inputQueue count] > 0 || input_available()) { inputReceived = YES; } else { // Wait for the specified amount of time, unless 'milliseconds' is @@ -703,16 +703,27 @@ extern GuiFont gui_mch_retain_font(GuiFont font); forMode:NSDefaultRunLoopMode]; } + CFAbsoluteTime lastTime = + milliseconds >= 0 ? CFAbsoluteTimeGetCurrent() : .0; + while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, dt, true) == kCFRunLoopRunHandledSource) { - // In order to ensure that all input on the run-loop has been - // processed we set the timeout to 0 and keep processing until the - // run-loop times out. - dt = 0.0; - inputReceived = YES; + // In order to ensure that all input (except for channel) on the + // run-loop has been processed we set the timeout to 0 and keep + // processing until the run-loop times out. + if ([inputQueue count] > 0 || input_available()) { + dt = 0.0; + inputReceived = YES; + } else if (milliseconds >= 0) { + CFAbsoluteTime nowTime = CFAbsoluteTimeGetCurrent(); + + if ((dt -= nowTime - lastTime) <= 0.0) + break; + lastTime = nowTime; + } } - if (input_available()) + if ([inputQueue count] > 0 || input_available()) inputReceived = YES; [timer invalidate];