diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 9f924be715..9446d3cd7f 100644 --- a/src/MacVim/MMBackend.m +++ b/src/MacVim/MMBackend.m @@ -198,6 +198,9 @@ extern GuiFont gui_mch_retain_font(GuiFont font); #ifdef FEAT_BEVAL - (void)bevalCallback:(id)sender; #endif +#ifdef MESSAGE_QUEUE +- (void)checkForProcessEvents:(NSTimer *)timer; +#endif @end @@ -679,13 +682,26 @@ 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]) { + if ([inputQueue count] || input_available()) { inputReceived = YES; } else { // Wait for the specified amount of time, unless 'milliseconds' is // negative in which case we wait "forever" (1e6 seconds translates to // approximately 11 days). CFTimeInterval dt = (milliseconds >= 0 ? .001*milliseconds : 1e6); + NSTimer *timer = nil; + + // Set interval timer which checks for the events of job and channel + // when there is any pending job or channel. + if (dt > 0.1 && (has_any_channel() || has_pending_job())) { + timer = [NSTimer scheduledTimerWithTimeInterval:0.1 + target:self + selector:@selector(checkForProcessEvents:) + userInfo:nil + repeats:YES]; + [[NSRunLoop currentRunLoop] addTimer:timer + forMode:NSDefaultRunLoopMode]; + } while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, dt, true) == kCFRunLoopRunHandledSource) { @@ -695,6 +711,11 @@ extern GuiFont gui_mch_retain_font(GuiFont font); dt = 0.0; inputReceived = YES; } + + if (input_available()) + inputReceived = YES; + + [timer invalidate]; } // The above calls may have placed messages on the input queue so process @@ -3004,6 +3025,24 @@ extern GuiFont gui_mch_retain_font(GuiFont font); } #endif +#ifdef MESSAGE_QUEUE +- (void)checkForProcessEvents:(NSTimer *)timer +{ +# ifdef FEAT_TIMERS + did_add_timer = FALSE; +# endif + + parse_queued_messages(); + + if (input_available() +# ifdef FEAT_TIMERS + || did_add_timer +# endif + ) + CFRunLoopStop(CFRunLoopGetCurrent()); +} +#endif + @end // MMBackend (Private) diff --git a/src/testdir/test_channel.vim b/src/testdir/test_channel.vim index 7fd0003db3..42e0e04b81 100644 --- a/src/testdir/test_channel.vim +++ b/src/testdir/test_channel.vim @@ -1396,7 +1396,7 @@ function MyExitTimeCb(job, status) endfunction func Test_exit_callback_interval() - if !has('job') || has('gui_macvim') + if !has('job') return endif