diff options
Diffstat (limited to 'cocoa')
-rw-r--r-- | cocoa/ScintillaCocoa.h | 6 | ||||
-rw-r--r-- | cocoa/ScintillaCocoa.mm | 59 |
2 files changed, 65 insertions, 0 deletions
diff --git a/cocoa/ScintillaCocoa.h b/cocoa/ScintillaCocoa.h index 1a7852bce..87702f51e 100644 --- a/cocoa/ScintillaCocoa.h +++ b/cocoa/ScintillaCocoa.h @@ -120,6 +120,7 @@ private: int scrollTicks; NSTimer* tickTimer; NSTimer* idleTimer; + CFRunLoopObserverRef observer; FindHighlightLayer *layerFindIndicator; @@ -184,6 +185,11 @@ public: void TimerFired(NSTimer* timer); void IdleTimerFired(); + static void UpdateObserver(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *sci); + void ObserverAdd(); + void ObserverRemove(); + virtual void IdleWork(); + virtual void QueueIdleWork(WorkNeeded::workItems items, int upTo); int InsertText(NSString* input); bool KeyboardInput(NSEvent* event); 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 */ |