diff options
Diffstat (limited to 'cocoa/ScintillaCocoa.mm')
| -rw-r--r-- | cocoa/ScintillaCocoa.mm | 59 | 
1 files changed, 59 insertions, 0 deletions
| diff --git a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm index fe12690a4..8a31b40d3 100644 --- a/cocoa/ScintillaCocoa.mm +++ b/cocoa/ScintillaCocoa.mm @@ -383,6 +383,7 @@ ScintillaCocoa::ScintillaCocoa(NSView* view)  {    wMain = view; // Don't retain since we're owned by view, which would cause a cycle    timerTarget = [[TimerTarget alloc] init: this]; +  observer = NULL;    layerFindIndicator = NULL;    Initialise();  } @@ -428,12 +429,70 @@ void ScintillaCocoa::Initialise()   */  void ScintillaCocoa::Finalise()  { +  ObserverRemove();    SetTicking(false);    ScintillaBase::Finalise();  }  //-------------------------------------------------------------------------------------------------- +void ScintillaCocoa::UpdateObserver(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) { +  ScintillaCocoa* sci = reinterpret_cast<ScintillaCocoa*>(info); +  sci->IdleWork(); +} + +//-------------------------------------------------------------------------------------------------- + +/** + * Add an observer to the run loop to perform styling as high-priority idle task. + */ + +void ScintillaCocoa::ObserverAdd() { +  if (!observer) { +    CFRunLoopObserverContext context; +    context.version = 0; +    context.info = this; +    context.retain = NULL; +    context.release = NULL; +    context.copyDescription = NULL; + +    CFRunLoopRef mainRunLoop = CFRunLoopGetMain(); +    observer = CFRunLoopObserverCreate(NULL, kCFRunLoopEntry | kCFRunLoopBeforeWaiting, +      true, 0, UpdateObserver, &context); +    CFRunLoopAddObserver(mainRunLoop, observer, kCFRunLoopCommonModes); +  } +} + +//-------------------------------------------------------------------------------------------------- + +/** + * Remove the run loop observer. + */ +void ScintillaCocoa::ObserverRemove() { +  if (observer) { +    CFRunLoopRef mainRunLoop = CFRunLoopGetMain(); +    CFRunLoopRemoveObserver(mainRunLoop, observer, kCFRunLoopCommonModes); +    CFRelease(observer); +  } +  observer = NULL; +} + +//-------------------------------------------------------------------------------------------------- + +void ScintillaCocoa::IdleWork() { +  Editor::IdleWork(); +  ObserverRemove(); +} + +//-------------------------------------------------------------------------------------------------- + +void ScintillaCocoa::QueueIdleWork(WorkNeeded::workItems items, int upTo) { +  Editor::QueueIdleWork(items, upTo); +  ObserverAdd(); +} + +//-------------------------------------------------------------------------------------------------- +  /**   * Convert a core foundation string into an array of bytes in a particular encoding   */ | 
