Forbid window creating and event fetching from worker thread as it's an OS X limitation.

Fix context not activated when created (now shader and renderimage works without having to creat a window or a context explicitly).



git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/branches/sfml2@1800 4e206d99-4929-0410-ac5d-dfc041789085
This commit is contained in:
mantognini 2011-02-19 14:22:39 +00:00
parent 4813ca8d8e
commit 73370dc178
3 changed files with 40 additions and 9 deletions

View File

@ -49,10 +49,10 @@
} }
// If there are some other event read them. // If there are some other event read them.
while (event = [NSApp nextEventMatchingMask:NSAnyEventMask while ((event = [NSApp nextEventMatchingMask:NSAnyEventMask
untilDate:[NSDate distantPast] untilDate:[NSDate distantPast]
inMode:NSDefaultRunLoopMode inMode:NSDefaultRunLoopMode
dequeue:YES]) // Remove the event from the dequeue dequeue:YES])) // Remove the event from the dequeue
{ {
[NSApp sendEvent:event]; [NSApp sendEvent:event];
} }

View File

@ -30,7 +30,6 @@
#include <SFML/Window/OSX/WindowImplCocoa.hpp> #include <SFML/Window/OSX/WindowImplCocoa.hpp>
#include <SFML/System/Err.hpp> #include <SFML/System/Err.hpp>
/* /*
* DISCUSSION : * DISCUSSION :
* ============ * ============
@ -57,6 +56,9 @@ SFContext::SFContext(SFContext* shared)
// Create the context // Create the context
CreateContext(shared, 0, ContextSettings(0, 0, 0)); CreateContext(shared, 0, ContextSettings(0, 0, 0));
// Activate the context
SetActive(true);
} }
@ -72,6 +74,9 @@ SFContext::SFContext(SFContext* shared, const WindowImpl* owner,
// Apply context. // Apply context.
WindowImplCocoa const * ownerCocoa = static_cast<WindowImplCocoa const *>(owner); WindowImplCocoa const * ownerCocoa = static_cast<WindowImplCocoa const *>(owner);
ownerCocoa->ApplyContext(myContext); ownerCocoa->ApplyContext(myContext);
// Activate the context
SetActive(true);
} }
@ -106,12 +111,12 @@ void SFContext::Display()
void SFContext::EnableVerticalSync(bool enabled) void SFContext::EnableVerticalSync(bool enabled)
{ {
// Make compiler happy // Make compiler happy
#ifdef USE_OS_X_VERSION_10_4 #if MAC_OS_X_VERSION_MAX_ALLOWED < 1060
long int swapInterval = enabled ? 1 : 0; typedef int GLint;
#else /* USE_OS_X_VERSION_10_6 */
GLint swapInterval = enabled ? 1 : 0;
#endif #endif
GLint swapInterval = enabled ? 1 : 0;
[myContext setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval]; [myContext setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval];
} }

View File

@ -105,6 +105,19 @@
//////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
-(id)initWithMode:(sf::VideoMode const &)mode andStyle:(unsigned long)style -(id)initWithMode:(sf::VideoMode const &)mode andStyle:(unsigned long)style
{ {
// If we are not on the main thread we stop here and advice the user.
if ([NSThread currentThread] != [NSThread mainThread]) {
/*
* See http://lists.apple.com/archives/cocoa-dev/2011/Feb/msg00460.html
* for more information.
*/
sf::Err()
<< "Cannot create a window from a worker thread. (OS X limitation)"
<< std::endl;
return nil;
}
if ((self = [super init])) { if ((self = [super init])) {
myRequester = 0; myRequester = 0;
@ -414,6 +427,19 @@
//////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
-(void)processEventWithBlockingMode:(BOOL)block -(void)processEventWithBlockingMode:(BOOL)block
{ {
// If we are not on the main thread we stop here and advice the user.
if ([NSThread currentThread] != [NSThread mainThread]) {
/*
* See http://lists.apple.com/archives/cocoa-dev/2011/Feb/msg00460.html
* for more information.
*/
sf::Err()
<< "Cannot fetch event from a worker thread. (OS X limitation)"
<< std::endl;
return;
}
// If we don't have a requester we don't fetch event. // If we don't have a requester we don't fetch event.
if (myRequester != 0) { if (myRequester != 0) {
[SFApplication processEventWithBlockingMode:block]; [SFApplication processEventWithBlockingMode:block];