From ecaafa9a18dda57dc99d88caad16ae14be40f043 Mon Sep 17 00:00:00 2001 From: Marco Antognini Date: Mon, 5 Sep 2011 00:43:06 +0200 Subject: [PATCH] Fixed sf::Window::Create on OS X (Closes #86) --- src/SFML/Window/OSX/AutoreleasePoolWrapper.h | 8 +++++ src/SFML/Window/OSX/AutoreleasePoolWrapper.mm | 34 +++++++++++++++++-- src/SFML/Window/OSX/SFContext.mm | 10 +++--- src/SFML/Window/OSX/WindowImplCocoa.mm | 6 +++- 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/src/SFML/Window/OSX/AutoreleasePoolWrapper.h b/src/SFML/Window/OSX/AutoreleasePoolWrapper.h index 47197877..cce8ea0d 100644 --- a/src/SFML/Window/OSX/AutoreleasePoolWrapper.h +++ b/src/SFML/Window/OSX/AutoreleasePoolWrapper.h @@ -41,3 +41,11 @@ void RetainPool(void); //////////////////////////////////////////////////////////// void ReleasePool(void); +//////////////////////////////////////////////////////////// +/// \brief Drain the pool. +/// +/// ReleasePool must be called at least once before DrainPool. +/// +//////////////////////////////////////////////////////////// +void DrainPool(); + diff --git a/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm b/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm index 4a2a6cff..3bf37541 100644 --- a/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm +++ b/src/SFML/Window/OSX/AutoreleasePoolWrapper.mm @@ -84,6 +84,12 @@ public : //////////////////////////////////////////////////////////// void Release(); + //////////////////////////////////////////////////////////// + /// \brief Drain the pool + /// + //////////////////////////////////////////////////////////// + void Drain(); + private: //////////////////////////////////////////////////////////// @@ -149,8 +155,7 @@ void PoolWrapper::Release() // Drain pool if required. if (count == 0) { - [pool drain]; - pool = 0; + Drain(); } #ifdef SFML_DEBUG @@ -160,6 +165,16 @@ void PoolWrapper::Release() #endif } +void PoolWrapper::Drain() +{ + [pool drain]; + pool = 0; + + if (count != 0) { + pool = [[NSAutoreleasePool alloc] init]; + } +} + } // namespace priv @@ -207,3 +222,18 @@ void ReleasePool(void) #endif } + +//////////////////////////////////////////////////////////// +void DrainPool() +{ + if (localPool != NULL) { + localPool->Drain(); + } +#ifdef SFML_DEBUG + else { + sf::Err() << "ReleasePool must be called at least one before DrainPool" + << std::endl; + } +#endif +} + diff --git a/src/SFML/Window/OSX/SFContext.mm b/src/SFML/Window/OSX/SFContext.mm index a9f50df2..8469208e 100644 --- a/src/SFML/Window/OSX/SFContext.mm +++ b/src/SFML/Window/OSX/SFContext.mm @@ -39,20 +39,22 @@ namespace priv //////////////////////////////////////////////////////////// SFContext::SFContext(SFContext* shared) - : myView(0), myWindow(0) +: myView(0), myWindow(0) { // Ask for a pool. RetainPool(); // Create the context - CreateContext(shared, VideoMode::GetDesktopMode().BitsPerPixel, ContextSettings(0, 0, 0)); + CreateContext(shared, + VideoMode::GetDesktopMode().BitsPerPixel, + ContextSettings(0, 0, 0)); } //////////////////////////////////////////////////////////// SFContext::SFContext(SFContext* shared, const ContextSettings& settings, const WindowImpl* owner, unsigned int bitsPerPixel) - : myView(0), myWindow(0) +: myView(0), myWindow(0) { // Ask for a pool. RetainPool(); @@ -68,7 +70,7 @@ SFContext::SFContext(SFContext* shared, const ContextSettings& settings, SFContext::SFContext(SFContext* shared, const ContextSettings& settings, unsigned int width, unsigned int height) - : myView(0), myWindow(0) +: myView(0), myWindow(0) { // Ensure the process is setup in order to create a valid window. WindowImplCocoa::SetUpProcess(); diff --git a/src/SFML/Window/OSX/WindowImplCocoa.mm b/src/SFML/Window/OSX/WindowImplCocoa.mm index 7697e2eb..3eacbd15 100644 --- a/src/SFML/Window/OSX/WindowImplCocoa.mm +++ b/src/SFML/Window/OSX/WindowImplCocoa.mm @@ -45,7 +45,7 @@ namespace priv //////////////////////////////////////////////////////////// WindowImplCocoa::WindowImplCocoa(WindowHandle handle) : myShowCursor(true) -{ +{ // Ask for a pool. RetainPool(); @@ -118,6 +118,10 @@ WindowImplCocoa::~WindowImplCocoa() [myDelegate release]; ReleasePool(); + + DrainPool(); // Make sure everything was freed + // This solve some issue when sf::Window::Create is called for the + // second time (nothing was render until the function was called again) }