diff --git a/uppsrc/Core/Core.h b/uppsrc/Core/Core.h index 10c5358c2..4a437dc15 100644 --- a/uppsrc/Core/Core.h +++ b/uppsrc/Core/Core.h @@ -91,6 +91,9 @@ #else #include #endif + #ifdef PLATFORM_OSX + #include + #endif #endif //PLATFORM_POSIX #ifdef PLATFORM_POSIX diff --git a/uppsrc/Core/Mt.cpp b/uppsrc/Core/Mt.cpp index 1f8bbaa91..5342b148b 100644 --- a/uppsrc/Core/Mt.cpp +++ b/uppsrc/Core/Mt.cpp @@ -611,6 +611,30 @@ RWMutex::~RWMutex() pthread_rwlock_destroy(rwlock); } +#ifdef PLATFORM_OSX + +void Semaphore::Release() +{ + dispatch_semaphore_signal(sem); +} + +void Semaphore::Wait() +{ + dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); +} + +Semaphore::Semaphore() +{ + sem = dispatch_semaphore_create(0); +} + +Semaphore::~Semaphore() +{ + dispatch_release(sem); +} + +#else + void Semaphore::Release() { sem_post(&sem); @@ -633,6 +657,8 @@ Semaphore::~Semaphore() #endif +#endif + void LazyUpdate::Invalidate() { dirty.store(true, std::memory_order_release); diff --git a/uppsrc/Core/Mt.h b/uppsrc/Core/Mt.h index b3935d1bd..f84c32123 100644 --- a/uppsrc/Core/Mt.h +++ b/uppsrc/Core/Mt.h @@ -119,6 +119,8 @@ inline void AssertST() { ASSERT(Thread::IsST()); } class Semaphore : NoCopy { #ifdef PLATFORM_WIN32 HANDLE handle; +#elif PLATFORM_OSX + dispatch_semaphore_t sem; #else sem_t sem; #endif diff --git a/uppsrc/CtrlCore/CocoApp.mm b/uppsrc/CtrlCore/CocoApp.mm index ac1f9d015..f081ed13d 100644 --- a/uppsrc/CtrlCore/CocoApp.mm +++ b/uppsrc/CtrlCore/CocoApp.mm @@ -84,12 +84,15 @@ bool Upp::Ctrl::ProcessEvent(bool *) ASSERT(IsMainThread()); Upp::AutoreleasePool __; - + ONCELOCK { [NSApp finishLaunching]; } NSEvent *event = GetNextEvent(nil); + + // DLOG("ProcessEvent " << ToString(event.description)); + if(!event) return false; @@ -152,12 +155,29 @@ void Upp::Ctrl::EventLoop(Ctrl *ctrl) LLOG("Leaving event loop "); } +static std::atomic sGuiSleep; + void Upp::Ctrl::GuiSleep(int ms) { ASSERT(IsMainThread()); + sGuiSleep = true; GetNextEvent([NSDate dateWithTimeIntervalSinceNow:ms / 1000.0]); + sGuiSleep = false; } +namespace Upp { +void WakeUpGuiThread(void) +{ + if(sGuiSleep) { + sGuiSleep = false; + [NSApp postEvent:[NSEvent otherEventWithType:NSEventTypeApplicationDefined + location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0.0 + windowNumber:0 context:nil subtype: 0 data1:0 data2:0] + atStart:YES]; + } +} +}; + void Upp::Ctrl::AnimateCaret() { GuiLock __; diff --git a/uppsrc/CtrlCore/CocoCtrl.cpp b/uppsrc/CtrlCore/CocoCtrl.cpp index eff2d53dc..92d924bea 100644 --- a/uppsrc/CtrlCore/CocoCtrl.cpp +++ b/uppsrc/CtrlCore/CocoCtrl.cpp @@ -10,11 +10,6 @@ void ChHostSkin(void) { } -void WakeUpGuiThread(void) -{ - -} - void Ctrl::GuiPlatformConstruct() { } diff --git a/uppsrc/CtrlCore/CtrlMt.cpp b/uppsrc/CtrlCore/CtrlMt.cpp index fcd18675e..ff2c799c3 100644 --- a/uppsrc/CtrlCore/CtrlMt.cpp +++ b/uppsrc/CtrlCore/CtrlMt.cpp @@ -74,7 +74,6 @@ struct Ctrl::CallBox { void Ctrl::PerformCall(Ctrl::CallBox *cbox) { cbox->cb(); - LLOG("Sem release"); cbox->sem.Release(); }