195 lines
5.9 KiB
C
195 lines
5.9 KiB
C
//========================================================================
|
|
// GLFW - An OpenGL framework
|
|
// File: macosx_init.c
|
|
// Platform: Mac OS X
|
|
// API Version: 2.6
|
|
// WWW: http://glfw.sourceforge.net
|
|
//------------------------------------------------------------------------
|
|
// Copyright (c) 2002-2006 Camilla Berglund
|
|
//
|
|
// This software is provided 'as-is', without any express or implied
|
|
// warranty. In no event will the authors be held liable for any damages
|
|
// arising from the use of this software.
|
|
//
|
|
// Permission is granted to anyone to use this software for any purpose,
|
|
// including commercial applications, and to alter it and redistribute it
|
|
// freely, subject to the following restrictions:
|
|
//
|
|
// 1. The origin of this software must not be misrepresented; you must not
|
|
// claim that you wrote the original software. If you use this software
|
|
// in a product, an acknowledgment in the product documentation would
|
|
// be appreciated but is not required.
|
|
//
|
|
// 2. Altered source versions must be plainly marked as such, and must not
|
|
// be misrepresented as being the original software.
|
|
//
|
|
// 3. This notice may not be removed or altered from any source
|
|
// distribution.
|
|
//
|
|
//========================================================================
|
|
|
|
#include "internal.h"
|
|
|
|
#include <unistd.h>
|
|
|
|
//========================================================================
|
|
// Global variables
|
|
//========================================================================
|
|
|
|
// KCHR resource pointer for keycode translation
|
|
void *KCHRPtr;
|
|
|
|
|
|
//========================================================================
|
|
// _glfwInitThreads() - Initialize GLFW thread package
|
|
//========================================================================
|
|
|
|
static void _glfwInitThreads( void )
|
|
{
|
|
// Initialize critical section handle
|
|
(void) pthread_mutex_init( &_glfwThrd.CriticalSection, NULL );
|
|
|
|
// The first thread (the main thread) has ID 0
|
|
_glfwThrd.NextID = 0;
|
|
|
|
// Fill out information about the main thread (this thread)
|
|
_glfwThrd.First.ID = _glfwThrd.NextID ++;
|
|
_glfwThrd.First.Function = NULL;
|
|
_glfwThrd.First.PosixID = pthread_self();
|
|
_glfwThrd.First.Previous = NULL;
|
|
_glfwThrd.First.Next = NULL;
|
|
}
|
|
|
|
#define NO_BUNDLE_MESSAGE \
|
|
"Working in unbundled mode. " \
|
|
"You should build a .app wrapper for your Mac OS X applications.\n"
|
|
|
|
#define UNBUNDLED \
|
|
fprintf(stderr, NO_BUNDLE_MESSAGE); \
|
|
_glfwLibrary.Unbundled = 1; \
|
|
return
|
|
|
|
void _glfwChangeToResourcesDirectory( void )
|
|
{
|
|
CFBundleRef mainBundle = CFBundleGetMainBundle();
|
|
CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL( mainBundle );
|
|
char resourcesPath[ _GLFW_MAX_PATH_LENGTH ];
|
|
|
|
CFStringRef lastComponent = CFURLCopyLastPathComponent( resourcesURL );
|
|
if ( kCFCompareEqualTo != CFStringCompare(
|
|
CFSTR( "Resources" ),
|
|
lastComponent,
|
|
0 ) )
|
|
{
|
|
UNBUNDLED;
|
|
}
|
|
|
|
CFRelease( lastComponent );
|
|
|
|
if( !CFURLGetFileSystemRepresentation( resourcesURL,
|
|
TRUE,
|
|
(UInt8*)resourcesPath,
|
|
_GLFW_MAX_PATH_LENGTH ) )
|
|
{
|
|
CFRelease( resourcesURL );
|
|
UNBUNDLED;
|
|
}
|
|
|
|
CFRelease( resourcesURL );
|
|
|
|
if( chdir( resourcesPath ) != 0 )
|
|
{
|
|
UNBUNDLED;
|
|
}
|
|
}
|
|
|
|
int _glfwPlatformInit( void )
|
|
{
|
|
struct timeval tv;
|
|
UInt32 nullDummy = 0;
|
|
|
|
_glfwWin.MacWindow = NULL;
|
|
_glfwWin.AGLContext = NULL;
|
|
_glfwWin.CGLContext = NULL;
|
|
_glfwWin.WindowFunctions = NULL;
|
|
_glfwWin.MouseUPP = NULL;
|
|
_glfwWin.CommandUPP = NULL;
|
|
_glfwWin.KeyboardUPP = NULL;
|
|
_glfwWin.WindowUPP = NULL;
|
|
|
|
_glfwInput.Modifiers = 0;
|
|
|
|
_glfwLibrary.Unbundled = 0;
|
|
|
|
_glfwLibrary.Libs.OpenGLFramework
|
|
= CFBundleGetBundleWithIdentifier( CFSTR( "com.apple.opengl" ) );
|
|
if( _glfwLibrary.Libs.OpenGLFramework == NULL )
|
|
{
|
|
fprintf(
|
|
stderr,
|
|
"glfwInit failing because you aren't linked to OpenGL\n" );
|
|
return GL_FALSE;
|
|
}
|
|
|
|
_glfwDesktopVideoMode = CGDisplayCurrentMode( kCGDirectMainDisplay );
|
|
if( _glfwDesktopVideoMode == NULL )
|
|
{
|
|
fprintf(
|
|
stderr,
|
|
"glfwInit failing because it kind find the desktop display mode\n" );
|
|
return GL_FALSE;
|
|
}
|
|
|
|
_glfwInitThreads();
|
|
|
|
_glfwChangeToResourcesDirectory();
|
|
|
|
if( !_glfwInstallEventHandlers() )
|
|
{
|
|
fprintf(
|
|
stderr,
|
|
"glfwInit failing because it can't install event handlers\n" );
|
|
_glfwPlatformTerminate();
|
|
return GL_FALSE;
|
|
}
|
|
|
|
// Ugly hack to reduce the nasty jump that occurs at the first non-
|
|
// sys keypress, caused by OS X loading certain meta scripts used
|
|
// for lexical- and raw keycode translation - instead of letting
|
|
// this happen while our application is running, we do some blunt
|
|
// function calls in advance just to get the script caching out of
|
|
// the way BEFORE our window/screen is opened. These calls might
|
|
// generate err return codes, but we don't care in this case.
|
|
// NOTE: KCHRPtr is declared globally, because we need it later on.
|
|
KCHRPtr = (void *)GetScriptVariable( smCurrentScript, smKCHRCache );
|
|
KeyTranslate( KCHRPtr, 0, &nullDummy );
|
|
UppercaseText( (char *)&nullDummy, 0, smSystemScript );
|
|
|
|
gettimeofday( &tv, NULL );
|
|
_glfwLibrary.Timer.t0 = tv.tv_sec + (double) tv.tv_usec / 1000000.0;
|
|
|
|
return GL_TRUE;
|
|
}
|
|
|
|
int _glfwPlatformTerminate( void )
|
|
{
|
|
if( _glfwWin.MouseUPP != NULL )
|
|
{
|
|
DisposeEventHandlerUPP( _glfwWin.MouseUPP );
|
|
_glfwWin.MouseUPP = NULL;
|
|
}
|
|
if( _glfwWin.CommandUPP != NULL )
|
|
{
|
|
DisposeEventHandlerUPP( _glfwWin.CommandUPP );
|
|
_glfwWin.CommandUPP = NULL;
|
|
}
|
|
if( _glfwWin.KeyboardUPP != NULL )
|
|
{
|
|
DisposeEventHandlerUPP( _glfwWin.KeyboardUPP );
|
|
_glfwWin.KeyboardUPP = NULL;
|
|
}
|
|
|
|
return GL_TRUE;
|
|
}
|
|
|