aboutsummaryrefslogtreecommitdiffhomepage
path: root/cocoa
diff options
context:
space:
mode:
Diffstat (limited to 'cocoa')
-rw-r--r--cocoa/ScintillaCocoa.h6
-rw-r--r--cocoa/ScintillaCocoa.mm59
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
*/