diff --git a/src/MacVim/MMBackend.m b/src/MacVim/MMBackend.m index 9f924be715..02f782ff71 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 @@ -682,6 +685,20 @@ extern GuiFont gui_mch_retain_font(GuiFont font); if ([inputQueue count]) { inputReceived = YES; } else { + NSTimer *timer = nil; + + // Set interval timer which checks for the events of job and channel + // when there is any pending job or channel. + if (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]; + } + // Wait for the specified amount of time, unless 'milliseconds' is // negative in which case we wait "forever" (1e6 seconds translates to // approximately 11 days). @@ -695,6 +712,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 +3026,22 @@ 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(); + +# ifdef FEAT_TIMERS + if (did_add_timer || input_available()) + CFRunLoopStop(CFRunLoopGetCurrent()); +# endif +} +#endif + @end // MMBackend (Private) diff --git a/src/MacVim/gui_macvim.m b/src/MacVim/gui_macvim.m index c6a8a16df2..77526db7bc 100644 --- a/src/MacVim/gui_macvim.m +++ b/src/MacVim/gui_macvim.m @@ -407,9 +407,21 @@ gui_mch_wait_for_chars(int wtime) [[MMBackend sharedInstance] flushQueue:YES]; #ifdef MESSAGE_QUEUE +# ifdef FEAT_TIMERS + did_add_timer = FALSE; +# endif + parse_queued_messages(); + +# ifdef FEAT_TIMERS + if (did_add_timer) + return FAIL; +# endif #endif + if (input_available()) + return OK; + return [[MMBackend sharedInstance] waitForInput:wtime]; } 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