mirror of
https://github.com/glfw/glfw.git
synced 2026-09-21 16:44:11 +00:00
Initial import of 2.7 Lite.
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/libglfw.pc.cmake
|
||||
${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc @ONLY)
|
||||
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${CMAKE_SOURCE_DIR}/lib
|
||||
${GLFW_INCLUDE_DIR})
|
||||
|
||||
set(libglfw_SOURCES
|
||||
${common_SOURCES}
|
||||
carbon_enable.c
|
||||
carbon_fullscreen.c
|
||||
carbon_glext.c
|
||||
carbon_init.c
|
||||
carbon_joystick.c
|
||||
carbon_time.c
|
||||
carbon_window.c)
|
||||
|
||||
add_library(libglfwStatic STATIC ${libglfw_SOURCES})
|
||||
add_library(libglfwShared SHARED ${libglfw_SOURCES})
|
||||
target_link_libraries(libglfwShared ${GLFW_LIBRARIES})
|
||||
set_target_properties(libglfwStatic libglfwShared PROPERTIES
|
||||
CLEAN_DIRECT_OUTPUT 1
|
||||
OUTPUT_NAME glfw
|
||||
)
|
||||
|
||||
# Append -fno-common to the compile flags to work around a bug in the Apple GCC
|
||||
get_target_property(CFLAGS libglfwShared COMPILE_FLAGS)
|
||||
if(NOT CFLAGS)
|
||||
set(CFLAGS "")
|
||||
endif(NOT CFLAGS)
|
||||
set_target_properties(libglfwShared PROPERTIES COMPILE_FLAGS "${CFLAGS} -fno-common")
|
||||
|
||||
install(TARGETS libglfwStatic libglfwShared DESTINATION lib)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc DESTINATION lib/pkgconfig)
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Carbon/AGL/CGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2003 Keith Bauer
|
||||
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformEnableSystemKeys( void )
|
||||
{
|
||||
// Nothing to do; event handling code checks the status of
|
||||
// _glfwWin.sysKeysDisabled to ensure this behavior.
|
||||
}
|
||||
|
||||
void _glfwPlatformDisableSystemKeys( void )
|
||||
{
|
||||
// Nothing to do; event handling code checks the status of
|
||||
// _glfwWin.sysKeysDisabled to ensure this behavior.
|
||||
}
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Carbon/AGL/CGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2003 Keith Bauer
|
||||
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
//========================================================================
|
||||
// _glfwVideoModesEqual() - Compares two video modes
|
||||
//========================================================================
|
||||
|
||||
static int _glfwVideoModesEqual( GLFWvidmode* first,
|
||||
GLFWvidmode* second )
|
||||
{
|
||||
if( first->Width != second->Width )
|
||||
return 0;
|
||||
|
||||
if( first->Height != second->Height )
|
||||
return 0;
|
||||
|
||||
if( first->RedBits + first->GreenBits + first->BlueBits !=
|
||||
second->RedBits + second->GreenBits + second->BlueBits )
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// _glfwCGToGLFWVideoMode() - Converts a CG mode to a GLFW mode
|
||||
//========================================================================
|
||||
|
||||
static void _glfwCGToGLFWVideoMode( CFDictionaryRef cgMode,
|
||||
GLFWvidmode* glfwMode )
|
||||
{
|
||||
int bitsPerSample;
|
||||
|
||||
CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayWidth ),
|
||||
kCFNumberIntType,
|
||||
&(glfwMode->Width) );
|
||||
CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayHeight ),
|
||||
kCFNumberIntType,
|
||||
&(glfwMode->Height) );
|
||||
|
||||
CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayBitsPerSample ),
|
||||
kCFNumberIntType,
|
||||
&bitsPerSample );
|
||||
|
||||
glfwMode->RedBits = bitsPerSample;
|
||||
glfwMode->GreenBits = bitsPerSample;
|
||||
glfwMode->BlueBits = bitsPerSample;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// _glfwPlatformGetVideoModes() - Get a list of available video modes
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )
|
||||
{
|
||||
int i, j, maxModes, numModes;
|
||||
GLFWvidmode mode;
|
||||
CFArrayRef availableModes = CGDisplayAvailableModes( kCGDirectMainDisplay );
|
||||
CFIndex numberOfAvailableModes = CFArrayGetCount( availableModes );
|
||||
|
||||
numModes = 0;
|
||||
maxModes = ( numberOfAvailableModes < maxcount ?
|
||||
numberOfAvailableModes :
|
||||
maxcount );
|
||||
|
||||
for( i = 0; i < maxModes; ++i )
|
||||
{
|
||||
_glfwCGToGLFWVideoMode( CFArrayGetValueAtIndex( availableModes, i ),
|
||||
&mode );
|
||||
|
||||
// Is it a valid mode? (only list depths >= 15 bpp)
|
||||
if( mode.RedBits + mode.GreenBits + mode.BlueBits < 15 )
|
||||
continue;
|
||||
|
||||
// Check for duplicate of current mode in target list
|
||||
for( j = 0; j < numModes; ++j )
|
||||
{
|
||||
if( _glfwVideoModesEqual( &mode, &(list[j]) ) )
|
||||
break;
|
||||
}
|
||||
|
||||
// If empty list or no match found
|
||||
if( numModes == 0 || j == numModes )
|
||||
list[numModes++] = mode;
|
||||
}
|
||||
|
||||
return numModes;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// glfwGetDesktopMode() - Get the desktop video mode
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )
|
||||
{
|
||||
_glfwCGToGLFWVideoMode( _glfwDesktopVideoMode, mode );
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Carbon/AGL/CGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2003 Keith Bauer
|
||||
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
int _glfwPlatformExtensionSupported( const char *extension )
|
||||
{
|
||||
// There are no AGL, CGL or NSGL extensions.
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
void * _glfwPlatformGetProcAddress( const char *procname )
|
||||
{
|
||||
CFStringRef symbolName = CFStringCreateWithCString( kCFAllocatorDefault,
|
||||
procname,
|
||||
kCFStringEncodingASCII );
|
||||
|
||||
void *symbol = CFBundleGetFunctionPointerForName( _glfwLibrary.Libs.OpenGLFramework,
|
||||
symbolName );
|
||||
|
||||
CFRelease( symbolName );
|
||||
|
||||
return symbol;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,159 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Carbon/AGL/CGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2003 Keith Bauer
|
||||
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
// Copyright (c) 2006-2007 Robin Leffmann
|
||||
//
|
||||
// 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;
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Terminate GLFW when exiting application
|
||||
//========================================================================
|
||||
|
||||
static void glfw_atexit( void )
|
||||
{
|
||||
glfwTerminate();
|
||||
}
|
||||
|
||||
|
||||
#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();
|
||||
if( mainBundle == NULL )
|
||||
{
|
||||
UNBUNDLED;
|
||||
}
|
||||
|
||||
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.window = NULL;
|
||||
_glfwWin.aglContext = NULL;
|
||||
_glfwWin.cglContext = 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;
|
||||
}
|
||||
|
||||
// Install atexit routine
|
||||
atexit( glfw_atexit );
|
||||
|
||||
_glfwChangeToResourcesDirectory();
|
||||
|
||||
// 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 )
|
||||
{
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Carbon/AGL/CGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2003 Keith Bauer
|
||||
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
// TO DO: use HID manager to implement joystick support.
|
||||
|
||||
int _glfwPlatformGetJoystickParam( int joy, int param )
|
||||
{
|
||||
// GL_FALSE == 0
|
||||
return 0;
|
||||
}
|
||||
|
||||
int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Carbon/AGL/CGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2003 Keith Bauer
|
||||
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Return timer value in seconds
|
||||
//========================================================================
|
||||
|
||||
double _glfwPlatformGetTime( void )
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday( &tv, NULL );
|
||||
return tv.tv_sec + (double) tv.tv_usec / 1000000.0 - _glfwLibrary.Timer.t0;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Set timer value in seconds
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformSetTime( double time )
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday( &tv, NULL );
|
||||
_glfwLibrary.Timer.t0 = tv.tv_sec + (double) tv.tv_usec / 1000000.0 - time;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
||||
prefix=@PREFIX@
|
||||
exec_prefix=@PREFIX@
|
||||
libdir=@PREFIX@/lib
|
||||
includedir=@PREFIX@/include
|
||||
|
||||
Name: GLFW
|
||||
Description: A portable framework for OpenGL development
|
||||
Version: 2.7
|
||||
URL: http://glfw.sourceforge.net/
|
||||
Libs: -L${libdir} -lglfw -framework AGL -framework OpenGL -framework Carbon
|
||||
Cflags: -I${includedir}
|
||||
@@ -0,0 +1,268 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Carbon/AGL/CGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2003 Keith Bauer
|
||||
// Copyright (c) 2003-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
// Copyright (c) 2006-2007 Robin Leffmann
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//========================================================================
|
||||
|
||||
#ifndef _platform_h_
|
||||
#define _platform_h_
|
||||
|
||||
|
||||
// This is the Mac OS X version of GLFW
|
||||
#define _GLFW_MAC_OS_X
|
||||
|
||||
#include <Carbon/Carbon.h>
|
||||
#include <OpenGL/OpenGL.h>
|
||||
#include <AGL/agl.h>
|
||||
|
||||
#include "../../include/GL/glfw.h"
|
||||
|
||||
#if MACOSX_DEPLOYMENT_TARGET < MAC_OS_X_VERSION_10_3
|
||||
|
||||
#ifndef kCGLNoError
|
||||
#define kCGLNoError 0
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef GL_VERSION_3_0
|
||||
|
||||
typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint);
|
||||
|
||||
#endif /*GL_VERSION_3_0*/
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Defines
|
||||
//========================================================================
|
||||
|
||||
#define _GLFW_MAX_PATH_LENGTH (8192)
|
||||
|
||||
#define MAC_KEY_ENTER 0x24
|
||||
#define MAC_KEY_RETURN 0x34
|
||||
#define MAC_KEY_ESC 0x35
|
||||
#define MAC_KEY_F1 0x7A
|
||||
#define MAC_KEY_F2 0x78
|
||||
#define MAC_KEY_F3 0x63
|
||||
#define MAC_KEY_F4 0x76
|
||||
#define MAC_KEY_F5 0x60
|
||||
#define MAC_KEY_F6 0x61
|
||||
#define MAC_KEY_F7 0x62
|
||||
#define MAC_KEY_F8 0x64
|
||||
#define MAC_KEY_F9 0x65
|
||||
#define MAC_KEY_F10 0x6D
|
||||
#define MAC_KEY_F11 0x67
|
||||
#define MAC_KEY_F12 0x6F
|
||||
#define MAC_KEY_F13 0x69
|
||||
#define MAC_KEY_F14 0x6B
|
||||
#define MAC_KEY_F15 0x71
|
||||
#define MAC_KEY_UP 0x7E
|
||||
#define MAC_KEY_DOWN 0x7D
|
||||
#define MAC_KEY_LEFT 0x7B
|
||||
#define MAC_KEY_RIGHT 0x7C
|
||||
#define MAC_KEY_TAB 0x30
|
||||
#define MAC_KEY_BACKSPACE 0x33
|
||||
#define MAC_KEY_HELP 0x72
|
||||
#define MAC_KEY_DEL 0x75
|
||||
#define MAC_KEY_PAGEUP 0x74
|
||||
#define MAC_KEY_PAGEDOWN 0x79
|
||||
#define MAC_KEY_HOME 0x73
|
||||
#define MAC_KEY_END 0x77
|
||||
#define MAC_KEY_KP_0 0x52
|
||||
#define MAC_KEY_KP_1 0x53
|
||||
#define MAC_KEY_KP_2 0x54
|
||||
#define MAC_KEY_KP_3 0x55
|
||||
#define MAC_KEY_KP_4 0x56
|
||||
#define MAC_KEY_KP_5 0x57
|
||||
#define MAC_KEY_KP_6 0x58
|
||||
#define MAC_KEY_KP_7 0x59
|
||||
#define MAC_KEY_KP_8 0x5B
|
||||
#define MAC_KEY_KP_9 0x5C
|
||||
#define MAC_KEY_KP_DIVIDE 0x4B
|
||||
#define MAC_KEY_KP_MULTIPLY 0x43
|
||||
#define MAC_KEY_KP_SUBTRACT 0x4E
|
||||
#define MAC_KEY_KP_ADD 0x45
|
||||
#define MAC_KEY_KP_DECIMAL 0x41
|
||||
#define MAC_KEY_KP_EQUAL 0x51
|
||||
#define MAC_KEY_KP_ENTER 0x4C
|
||||
#define MAC_KEY_NUMLOCK 0x47
|
||||
|
||||
|
||||
//========================================================================
|
||||
// GLFW platform specific types
|
||||
//========================================================================
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Pointer length integer
|
||||
//------------------------------------------------------------------------
|
||||
typedef intptr_t GLFWintptr;
|
||||
|
||||
|
||||
GLFWGLOBAL CFDictionaryRef _glfwDesktopVideoMode;
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Window structure
|
||||
//------------------------------------------------------------------------
|
||||
typedef struct _GLFWwin_struct _GLFWwin;
|
||||
|
||||
struct _GLFWwin_struct {
|
||||
|
||||
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||
|
||||
// User callback functions
|
||||
GLFWwindowsizefun windowSizeCallback;
|
||||
GLFWwindowclosefun windowCloseCallback;
|
||||
GLFWwindowrefreshfun windowRefreshCallback;
|
||||
GLFWmousebuttonfun mouseButtonCallback;
|
||||
GLFWmouseposfun mousePosCallback;
|
||||
GLFWmousewheelfun mouseWheelCallback;
|
||||
GLFWkeyfun keyCallback;
|
||||
GLFWcharfun charCallback;
|
||||
|
||||
// User selected window settings
|
||||
int fullscreen; // Fullscreen flag
|
||||
int mouseLock; // Mouse-lock flag
|
||||
int autoPollEvents; // Auto polling flag
|
||||
int sysKeysDisabled; // System keys disabled flag
|
||||
int windowNoResize; // Resize- and maximize gadgets disabled flag
|
||||
int refreshRate; // Vertical monitor refresh rate
|
||||
|
||||
// Window status & parameters
|
||||
int opened; // Flag telling if window is opened or not
|
||||
int active; // Application active flag
|
||||
int iconified; // Window iconified flag
|
||||
int width, height; // Window width and heigth
|
||||
int accelerated; // GL_TRUE if window is HW accelerated
|
||||
|
||||
// Framebuffer attributes
|
||||
int redBits;
|
||||
int greenBits;
|
||||
int blueBits;
|
||||
int alphaBits;
|
||||
int depthBits;
|
||||
int stencilBits;
|
||||
int accumRedBits;
|
||||
int accumGreenBits;
|
||||
int accumBlueBits;
|
||||
int accumAlphaBits;
|
||||
int auxBuffers;
|
||||
int stereo;
|
||||
int samples;
|
||||
|
||||
// OpenGL extensions and context attributes
|
||||
int has_GL_SGIS_generate_mipmap;
|
||||
int has_GL_ARB_texture_non_power_of_two;
|
||||
int glMajor, glMinor, glRevision;
|
||||
int glForward, glDebug, glProfile;
|
||||
|
||||
PFNGLGETSTRINGIPROC GetStringi;
|
||||
|
||||
// ========= PLATFORM SPECIFIC PART ======================================
|
||||
|
||||
WindowRef window;
|
||||
|
||||
AGLContext aglContext;
|
||||
AGLPixelFormat aglPixelFormat;
|
||||
|
||||
CGLContextObj cglContext;
|
||||
CGLPixelFormatObj cglPixelFormat;
|
||||
|
||||
EventHandlerUPP windowUPP;
|
||||
EventHandlerUPP mouseUPP;
|
||||
EventHandlerUPP commandUPP;
|
||||
EventHandlerUPP keyboardUPP;
|
||||
};
|
||||
|
||||
GLFWGLOBAL _GLFWwin _glfwWin;
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// User input status (some of this should go in _GLFWwin)
|
||||
//------------------------------------------------------------------------
|
||||
GLFWGLOBAL struct {
|
||||
|
||||
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||
|
||||
// Mouse status
|
||||
int MousePosX, MousePosY;
|
||||
int WheelPos;
|
||||
char MouseButton[ GLFW_MOUSE_BUTTON_LAST + 1 ];
|
||||
|
||||
// Keyboard status
|
||||
char Key[ GLFW_KEY_LAST + 1 ];
|
||||
int LastChar;
|
||||
|
||||
// User selected settings
|
||||
int StickyKeys;
|
||||
int StickyMouseButtons;
|
||||
int KeyRepeat;
|
||||
|
||||
// ========= PLATFORM SPECIFIC PART ======================================
|
||||
|
||||
UInt32 Modifiers;
|
||||
|
||||
} _glfwInput;
|
||||
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Library global data
|
||||
//------------------------------------------------------------------------
|
||||
GLFWGLOBAL struct {
|
||||
|
||||
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||
|
||||
// Window opening hints
|
||||
_GLFWhints hints;
|
||||
|
||||
// ========= PLATFORM SPECIFIC PART ======================================
|
||||
|
||||
// Timer data
|
||||
struct {
|
||||
double t0;
|
||||
} Timer;
|
||||
|
||||
struct {
|
||||
// Bundle for dynamically-loading extension function pointers
|
||||
CFBundleRef OpenGLFramework;
|
||||
} Libs;
|
||||
|
||||
int Unbundled;
|
||||
|
||||
} _glfwLibrary;
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Prototypes for platform specific internal functions
|
||||
//========================================================================
|
||||
|
||||
void _glfwChangeToResourcesDirectory( void );
|
||||
|
||||
#endif // _platform_h_
|
||||
@@ -0,0 +1,44 @@
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/libglfw.pc.cmake
|
||||
${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc @ONLY)
|
||||
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${CMAKE_SOURCE_DIR}/lib
|
||||
${GLFW_INCLUDE_DIR})
|
||||
|
||||
set(cocoa_SOURCES
|
||||
cocoa_enable.m
|
||||
cocoa_fullscreen.m
|
||||
cocoa_glext.m
|
||||
cocoa_init.m
|
||||
cocoa_joystick.m
|
||||
cocoa_time.m
|
||||
cocoa_window.m)
|
||||
|
||||
# For some reason, CMake doesn't know about .m
|
||||
set_source_files_properties(${cocoa_SOURCES} PROPERTIES LANGUAGE C)
|
||||
|
||||
set(libglfw_SOURCES
|
||||
${common_SOURCES}
|
||||
${cocoa_SOURCES})
|
||||
|
||||
add_library(libglfwStatic STATIC ${libglfw_SOURCES})
|
||||
add_library(libglfwShared SHARED ${libglfw_SOURCES})
|
||||
target_link_libraries(libglfwShared ${GLFW_LIBRARIES})
|
||||
set_target_properties(libglfwStatic libglfwShared PROPERTIES
|
||||
CLEAN_DIRECT_OUTPUT 1
|
||||
OUTPUT_NAME glfw
|
||||
)
|
||||
|
||||
# Append -fno-common to the compile flags to work around a bug in the Apple GCC
|
||||
get_target_property(CFLAGS libglfwShared COMPILE_FLAGS)
|
||||
if(NOT CFLAGS)
|
||||
set(CFLAGS "")
|
||||
endif(NOT CFLAGS)
|
||||
set_target_properties(libglfwShared PROPERTIES COMPILE_FLAGS "${CFLAGS} -fno-common")
|
||||
|
||||
install(TARGETS libglfwStatic libglfwShared DESTINATION lib)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc DESTINATION lib/pkgconfig)
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Cocoa/NSOpenGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Enable and disable system keys
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformEnableSystemKeys( void )
|
||||
{
|
||||
// This is checked in macosx_window.m; we take no action here
|
||||
}
|
||||
|
||||
void _glfwPlatformDisableSystemKeys( void )
|
||||
{
|
||||
// This is checked in macosx_window.m; we take no action here
|
||||
// I don't think it's really possible to disable stuff like Exposé
|
||||
// except in full-screen mode.
|
||||
}
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Cocoa/NSOpenGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
//========================================================================
|
||||
// Check whether the display mode should be included in enumeration
|
||||
//========================================================================
|
||||
|
||||
static BOOL modeIsGood( NSDictionary *mode )
|
||||
{
|
||||
// This is a bit controversial, if you've got something other than an
|
||||
// LCD computer monitor as an output device you might not want these
|
||||
// checks. You might also want to reject modes which are interlaced,
|
||||
// or TV out. There is no one-size-fits-all policy that can work here.
|
||||
// This seems like a decent compromise, but certain applications may
|
||||
// wish to patch this...
|
||||
return [[mode objectForKey:(id)kCGDisplayBitsPerPixel] intValue] >= 15 &&
|
||||
[mode objectForKey:(id)kCGDisplayModeIsSafeForHardware] != nil &&
|
||||
[mode objectForKey:(id)kCGDisplayModeIsStretched] == nil;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Convert Core Graphics display mode to GLFW video mode
|
||||
//========================================================================
|
||||
|
||||
static GLFWvidmode vidmodeFromCGDisplayMode( NSDictionary *mode )
|
||||
{
|
||||
unsigned int width = [[mode objectForKey:(id)kCGDisplayWidth] unsignedIntValue];
|
||||
unsigned int height = [[mode objectForKey:(id)kCGDisplayHeight] unsignedIntValue];
|
||||
unsigned int bps = [[mode objectForKey:(id)kCGDisplayBitsPerSample] unsignedIntValue];
|
||||
|
||||
GLFWvidmode result;
|
||||
result.Width = width;
|
||||
result.Height = height;
|
||||
result.RedBits = bps;
|
||||
result.GreenBits = bps;
|
||||
result.BlueBits = bps;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Get a list of available video modes
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )
|
||||
{
|
||||
NSArray *modes = (NSArray *)CGDisplayAvailableModes( CGMainDisplayID() );
|
||||
|
||||
unsigned int i, j = 0, n = [modes count];
|
||||
for( i = 0; i < n && i < (unsigned)maxcount; i++ )
|
||||
{
|
||||
NSDictionary *mode = [modes objectAtIndex:i];
|
||||
if( modeIsGood( mode ) )
|
||||
{
|
||||
list[j++] = vidmodeFromCGDisplayMode( mode );
|
||||
}
|
||||
}
|
||||
|
||||
return j;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Get the desktop video mode
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )
|
||||
{
|
||||
*mode = vidmodeFromCGDisplayMode( _glfwLibrary.DesktopMode );
|
||||
}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Cocoa/NSOpenGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Check if an OpenGL extension is available at runtime
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformExtensionSupported( const char *extension )
|
||||
{
|
||||
// There are no AGL, CGL or NSGL extensions.
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Get the function pointer to an OpenGL function
|
||||
//========================================================================
|
||||
|
||||
void * _glfwPlatformGetProcAddress( const char *procname )
|
||||
{
|
||||
CFStringRef symbolName = CFStringCreateWithCString( kCFAllocatorDefault,
|
||||
procname,
|
||||
kCFStringEncodingASCII );
|
||||
|
||||
void *symbol = CFBundleGetFunctionPointerForName( _glfwLibrary.OpenGLFramework,
|
||||
symbolName );
|
||||
|
||||
CFRelease( symbolName );
|
||||
|
||||
return symbol;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,250 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Cocoa/NSOpenGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//========================================================================
|
||||
|
||||
// Needed for _NSGetProgname
|
||||
#include <crt_externs.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
@interface GLFWApplication : NSApplication
|
||||
@end
|
||||
|
||||
@implementation GLFWApplication
|
||||
|
||||
// From http://cocoadev.com/index.pl?GameKeyboardHandlingAlmost
|
||||
// This works around an AppKit bug, where key up events while holding
|
||||
// down the command key don't get sent to the key window.
|
||||
- (void)sendEvent:(NSEvent *)event
|
||||
{
|
||||
if( [event type] == NSKeyUp && ( [event modifierFlags] & NSCommandKeyMask ) )
|
||||
{
|
||||
[[self keyWindow] sendEvent:event];
|
||||
}
|
||||
else
|
||||
{
|
||||
[super sendEvent:event];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// Prior to Snow Leopard, we need to use this oddly-named semi-private API
|
||||
// to get the application menu working properly. Need to be careful in
|
||||
// case it goes away in a future OS update.
|
||||
@interface NSApplication (NSAppleMenu)
|
||||
- (void)setAppleMenu:(NSMenu *)m;
|
||||
@end
|
||||
|
||||
// Keys to search for as potential application names
|
||||
NSString *GLFWNameKeys[] =
|
||||
{
|
||||
@"CFBundleDisplayName",
|
||||
@"CFBundleName",
|
||||
@"CFBundleExecutable",
|
||||
};
|
||||
|
||||
//========================================================================
|
||||
// Try to figure out what the calling application is called
|
||||
//========================================================================
|
||||
static NSString *findAppName( void )
|
||||
{
|
||||
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
|
||||
|
||||
unsigned int i;
|
||||
for( i = 0; i < sizeof(GLFWNameKeys) / sizeof(GLFWNameKeys[0]); i++ )
|
||||
{
|
||||
id name = [infoDictionary objectForKey:GLFWNameKeys[i]];
|
||||
if (name &&
|
||||
[name isKindOfClass:[NSString class]] &&
|
||||
![@"" isEqualToString:name])
|
||||
{
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
// If we get here, we're unbundled
|
||||
if( !_glfwLibrary.Unbundled )
|
||||
{
|
||||
// Could do this only if we discover we're unbundled, but it should
|
||||
// do no harm...
|
||||
ProcessSerialNumber psn = { 0, kCurrentProcess };
|
||||
TransformProcessType( &psn, kProcessTransformToForegroundApplication );
|
||||
|
||||
// Having the app in front of the terminal window is also generally
|
||||
// handy. There is an NSApplication API to do this, but...
|
||||
SetFrontProcess( &psn );
|
||||
|
||||
_glfwLibrary.Unbundled = GL_TRUE;
|
||||
}
|
||||
|
||||
char **progname = _NSGetProgname();
|
||||
if( progname && *progname )
|
||||
{
|
||||
// TODO: UTF8?
|
||||
return [NSString stringWithUTF8String:*progname];
|
||||
}
|
||||
|
||||
// Really shouldn't get here
|
||||
return @"GLFW Application";
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Set up the menu bar (manually)
|
||||
// This is nasty, nasty stuff -- calls to undocumented semi-private APIs that
|
||||
// could go away at any moment, lots of stuff that really should be
|
||||
// localize(d|able), etc. Loading a nib would save us this horror, but that
|
||||
// doesn't seem like a good thing to require of GLFW's clients.
|
||||
//========================================================================
|
||||
static void setUpMenuBar( void )
|
||||
{
|
||||
NSString *appName = findAppName();
|
||||
|
||||
NSMenu *bar = [[NSMenu alloc] init];
|
||||
[NSApp setMainMenu:bar];
|
||||
|
||||
NSMenuItem *appMenuItem =
|
||||
[bar addItemWithTitle:@"" action:NULL keyEquivalent:@""];
|
||||
NSMenu *appMenu = [[NSMenu alloc] init];
|
||||
[appMenuItem setSubmenu:appMenu];
|
||||
|
||||
[appMenu addItemWithTitle:[NSString stringWithFormat:@"About %@", appName]
|
||||
action:@selector(orderFrontStandardAboutPanel:)
|
||||
keyEquivalent:@""];
|
||||
[appMenu addItem:[NSMenuItem separatorItem]];
|
||||
NSMenu *servicesMenu = [[NSMenu alloc] init];
|
||||
[NSApp setServicesMenu:servicesMenu];
|
||||
[[appMenu addItemWithTitle:@"Services"
|
||||
action:NULL
|
||||
keyEquivalent:@""] setSubmenu:servicesMenu];
|
||||
[appMenu addItem:[NSMenuItem separatorItem]];
|
||||
[appMenu addItemWithTitle:[NSString stringWithFormat:@"Hide %@", appName]
|
||||
action:@selector(hide:)
|
||||
keyEquivalent:@"h"];
|
||||
[[appMenu addItemWithTitle:@"Hide Others"
|
||||
action:@selector(hideOtherApplications:)
|
||||
keyEquivalent:@"h"]
|
||||
setKeyEquivalentModifierMask:NSAlternateKeyMask | NSCommandKeyMask];
|
||||
[appMenu addItemWithTitle:@"Show All"
|
||||
action:@selector(unhideAllApplications:)
|
||||
keyEquivalent:@""];
|
||||
[appMenu addItem:[NSMenuItem separatorItem]];
|
||||
[appMenu addItemWithTitle:[NSString stringWithFormat:@"Quit %@", appName]
|
||||
action:@selector(terminate:)
|
||||
keyEquivalent:@"q"];
|
||||
|
||||
NSMenuItem *windowMenuItem =
|
||||
[bar addItemWithTitle:@"" action:NULL keyEquivalent:@""];
|
||||
NSMenu *windowMenu = [[NSMenu alloc] initWithTitle:@"Window"];
|
||||
[NSApp setWindowsMenu:windowMenu];
|
||||
[windowMenuItem setSubmenu:windowMenu];
|
||||
|
||||
[windowMenu addItemWithTitle:@"Miniaturize"
|
||||
action:@selector(performMiniaturize:)
|
||||
keyEquivalent:@"m"];
|
||||
[windowMenu addItemWithTitle:@"Zoom"
|
||||
action:@selector(performZoom:)
|
||||
keyEquivalent:@""];
|
||||
[windowMenu addItem:[NSMenuItem separatorItem]];
|
||||
[windowMenu addItemWithTitle:@"Bring All to Front"
|
||||
action:@selector(arrangeInFront:)
|
||||
keyEquivalent:@""];
|
||||
|
||||
// At least guard the call to private API to avoid an exception if it
|
||||
// goes away. Hopefully that means the worst we'll break in future is to
|
||||
// look ugly...
|
||||
if( [NSApp respondsToSelector:@selector(setAppleMenu:)] )
|
||||
{
|
||||
[NSApp setAppleMenu:appMenu];
|
||||
}
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Terminate GLFW when exiting application
|
||||
//========================================================================
|
||||
|
||||
static void glfw_atexit( void )
|
||||
{
|
||||
glfwTerminate();
|
||||
}
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Initialize the GLFW library
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformInit( void )
|
||||
{
|
||||
_glfwLibrary.AutoreleasePool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
// Implicitly create shared NSApplication instance
|
||||
[GLFWApplication sharedApplication];
|
||||
|
||||
NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
|
||||
|
||||
if( access( [resourcePath cStringUsingEncoding:NSUTF8StringEncoding], R_OK ) == 0 )
|
||||
{
|
||||
chdir( [resourcePath cStringUsingEncoding:NSUTF8StringEncoding] );
|
||||
}
|
||||
|
||||
// Setting up menu bar must go exactly here else weirdness ensues
|
||||
setUpMenuBar();
|
||||
|
||||
[NSApp finishLaunching];
|
||||
|
||||
// Install atexit routine
|
||||
atexit( glfw_atexit );
|
||||
|
||||
_glfwPlatformSetTime( 0.0 );
|
||||
|
||||
_glfwLibrary.DesktopMode =
|
||||
(NSDictionary *)CGDisplayCurrentMode( CGMainDisplayID() );
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Close window, if open, and shut down GLFW
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformTerminate( void )
|
||||
{
|
||||
glfwCloseWindow();
|
||||
|
||||
// TODO: Probably other cleanup
|
||||
|
||||
[_glfwLibrary.AutoreleasePool release];
|
||||
_glfwLibrary.AutoreleasePool = nil;
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Cocoa/NSOpenGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Determine joystick capabilities
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetJoystickParam( int joy, int param )
|
||||
{
|
||||
// TODO: Implement this.
|
||||
return 0;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Get joystick axis positions
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )
|
||||
{
|
||||
// TODO: Implement this.
|
||||
return 0;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Get joystick button states
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons )
|
||||
{
|
||||
// TODO: Implement this.
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Cocoa/NSOpenGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Return timer value in seconds
|
||||
//========================================================================
|
||||
|
||||
double _glfwPlatformGetTime( void )
|
||||
{
|
||||
return [NSDate timeIntervalSinceReferenceDate] - _glfwLibrary.Timer.t0;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Set timer value in seconds
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformSetTime( double time )
|
||||
{
|
||||
_glfwLibrary.Timer.t0 = [NSDate timeIntervalSinceReferenceDate] - time;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,886 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Cocoa/NSOpenGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
//========================================================================
|
||||
// Delegate for window related notifications
|
||||
// (but also used as an application delegate)
|
||||
//========================================================================
|
||||
|
||||
@interface GLFWWindowDelegate : NSObject
|
||||
@end
|
||||
|
||||
@implementation GLFWWindowDelegate
|
||||
|
||||
- (BOOL)windowShouldClose:(id)window
|
||||
{
|
||||
if( _glfwWin.windowCloseCallback )
|
||||
{
|
||||
if( !_glfwWin.windowCloseCallback() )
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
// This is horribly ugly, but it works
|
||||
glfwCloseWindow();
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)windowDidResize:(NSNotification *)notification
|
||||
{
|
||||
[_glfwWin.context update];
|
||||
|
||||
NSRect contentRect =
|
||||
[_glfwWin.window contentRectForFrameRect:[_glfwWin.window frame]];
|
||||
_glfwWin.width = contentRect.size.width;
|
||||
_glfwWin.height = contentRect.size.height;
|
||||
|
||||
if( _glfwWin.windowSizeCallback )
|
||||
{
|
||||
_glfwWin.windowSizeCallback( _glfwWin.width, _glfwWin.height );
|
||||
}
|
||||
}
|
||||
|
||||
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
|
||||
{
|
||||
if( _glfwWin.windowCloseCallback )
|
||||
{
|
||||
if( !_glfwWin.windowCloseCallback() )
|
||||
{
|
||||
return NSTerminateCancel;
|
||||
}
|
||||
}
|
||||
|
||||
// This is horribly ugly, but it works
|
||||
glfwCloseWindow();
|
||||
return NSTerminateCancel;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// TODO: Need to find mappings for F13-F15, volume down/up/mute, and eject.
|
||||
static const unsigned int MAC_TO_GLFW_KEYCODE_MAPPING[128] =
|
||||
{
|
||||
/* 00 */ 'A',
|
||||
/* 01 */ 'S',
|
||||
/* 02 */ 'D',
|
||||
/* 03 */ 'F',
|
||||
/* 04 */ 'H',
|
||||
/* 05 */ 'G',
|
||||
/* 06 */ 'Z',
|
||||
/* 07 */ 'X',
|
||||
/* 08 */ 'C',
|
||||
/* 09 */ 'V',
|
||||
/* 0a */ -1,
|
||||
/* 0b */ 'B',
|
||||
/* 0c */ 'Q',
|
||||
/* 0d */ 'W',
|
||||
/* 0e */ 'E',
|
||||
/* 0f */ 'R',
|
||||
/* 10 */ 'Y',
|
||||
/* 11 */ 'T',
|
||||
/* 12 */ '1',
|
||||
/* 13 */ '2',
|
||||
/* 14 */ '3',
|
||||
/* 15 */ '4',
|
||||
/* 16 */ '6',
|
||||
/* 17 */ '5',
|
||||
/* 18 */ '=',
|
||||
/* 19 */ '9',
|
||||
/* 1a */ '7',
|
||||
/* 1b */ '-',
|
||||
/* 1c */ '8',
|
||||
/* 1d */ '0',
|
||||
/* 1e */ ']',
|
||||
/* 1f */ 'O',
|
||||
/* 20 */ 'U',
|
||||
/* 21 */ '[',
|
||||
/* 22 */ 'I',
|
||||
/* 23 */ 'P',
|
||||
/* 24 */ GLFW_KEY_ENTER,
|
||||
/* 25 */ 'L',
|
||||
/* 26 */ 'J',
|
||||
/* 27 */ '\'',
|
||||
/* 28 */ 'K',
|
||||
/* 29 */ ';',
|
||||
/* 2a */ '\\',
|
||||
/* 2b */ ',',
|
||||
/* 2c */ '/',
|
||||
/* 2d */ 'N',
|
||||
/* 2e */ 'M',
|
||||
/* 2f */ '.',
|
||||
/* 30 */ GLFW_KEY_TAB,
|
||||
/* 31 */ GLFW_KEY_SPACE,
|
||||
/* 32 */ '`',
|
||||
/* 33 */ GLFW_KEY_BACKSPACE,
|
||||
/* 34 */ -1,
|
||||
/* 35 */ GLFW_KEY_ESC,
|
||||
/* 36 */ GLFW_KEY_RSUPER,
|
||||
/* 37 */ GLFW_KEY_LSUPER,
|
||||
/* 38 */ GLFW_KEY_LSHIFT,
|
||||
/* 39 */ GLFW_KEY_CAPS_LOCK,
|
||||
/* 3a */ GLFW_KEY_LALT,
|
||||
/* 3b */ GLFW_KEY_LCTRL,
|
||||
/* 3c */ GLFW_KEY_RSHIFT,
|
||||
/* 3d */ GLFW_KEY_RALT,
|
||||
/* 3e */ GLFW_KEY_RCTRL,
|
||||
/* 3f */ -1, /*Function*/
|
||||
/* 40 */ GLFW_KEY_F17,
|
||||
/* 41 */ GLFW_KEY_KP_DECIMAL,
|
||||
/* 42 */ -1,
|
||||
/* 43 */ GLFW_KEY_KP_MULTIPLY,
|
||||
/* 44 */ -1,
|
||||
/* 45 */ GLFW_KEY_KP_ADD,
|
||||
/* 46 */ -1,
|
||||
/* 47 */ -1, /*KeypadClear*/
|
||||
/* 48 */ -1, /*VolumeUp*/
|
||||
/* 49 */ -1, /*VolumeDown*/
|
||||
/* 4a */ -1, /*Mute*/
|
||||
/* 4b */ GLFW_KEY_KP_DIVIDE,
|
||||
/* 4c */ GLFW_KEY_KP_ENTER,
|
||||
/* 4d */ -1,
|
||||
/* 4e */ GLFW_KEY_KP_SUBTRACT,
|
||||
/* 4f */ GLFW_KEY_F18,
|
||||
/* 50 */ GLFW_KEY_F19,
|
||||
/* 51 */ GLFW_KEY_KP_EQUAL,
|
||||
/* 52 */ GLFW_KEY_KP_0,
|
||||
/* 53 */ GLFW_KEY_KP_1,
|
||||
/* 54 */ GLFW_KEY_KP_2,
|
||||
/* 55 */ GLFW_KEY_KP_3,
|
||||
/* 56 */ GLFW_KEY_KP_4,
|
||||
/* 57 */ GLFW_KEY_KP_5,
|
||||
/* 58 */ GLFW_KEY_KP_6,
|
||||
/* 59 */ GLFW_KEY_KP_7,
|
||||
/* 5a */ GLFW_KEY_F20,
|
||||
/* 5b */ GLFW_KEY_KP_8,
|
||||
/* 5c */ GLFW_KEY_KP_9,
|
||||
/* 5d */ -1,
|
||||
/* 5e */ -1,
|
||||
/* 5f */ -1,
|
||||
/* 60 */ GLFW_KEY_F5,
|
||||
/* 61 */ GLFW_KEY_F6,
|
||||
/* 62 */ GLFW_KEY_F7,
|
||||
/* 63 */ GLFW_KEY_F3,
|
||||
/* 64 */ GLFW_KEY_F8,
|
||||
/* 65 */ GLFW_KEY_F9,
|
||||
/* 66 */ -1,
|
||||
/* 67 */ GLFW_KEY_F11,
|
||||
/* 68 */ -1,
|
||||
/* 69 */ GLFW_KEY_F13,
|
||||
/* 6a */ GLFW_KEY_F16,
|
||||
/* 6b */ GLFW_KEY_F14,
|
||||
/* 6c */ -1,
|
||||
/* 6d */ GLFW_KEY_F10,
|
||||
/* 6e */ -1,
|
||||
/* 6f */ GLFW_KEY_F12,
|
||||
/* 70 */ -1,
|
||||
/* 71 */ GLFW_KEY_F15,
|
||||
/* 72 */ GLFW_KEY_INSERT, /*Help*/
|
||||
/* 73 */ GLFW_KEY_HOME,
|
||||
/* 74 */ GLFW_KEY_PAGEUP,
|
||||
/* 75 */ GLFW_KEY_DEL,
|
||||
/* 76 */ GLFW_KEY_F4,
|
||||
/* 77 */ GLFW_KEY_END,
|
||||
/* 78 */ GLFW_KEY_F2,
|
||||
/* 79 */ GLFW_KEY_PAGEDOWN,
|
||||
/* 7a */ GLFW_KEY_F1,
|
||||
/* 7b */ GLFW_KEY_LEFT,
|
||||
/* 7c */ GLFW_KEY_RIGHT,
|
||||
/* 7d */ GLFW_KEY_DOWN,
|
||||
/* 7e */ GLFW_KEY_UP,
|
||||
/* 7f */ -1,
|
||||
};
|
||||
|
||||
//========================================================================
|
||||
// Converts a Mac OS X keycode to a GLFW keycode
|
||||
//========================================================================
|
||||
|
||||
static int convertMacKeyCode( unsigned int macKeyCode )
|
||||
{
|
||||
if( macKeyCode >= 128 )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
// This treats keycodes as *positional*; that is, we'll return 'a'
|
||||
// for the key left of 's', even on an AZERTY keyboard. The charInput
|
||||
// function should still get 'q' though.
|
||||
return MAC_TO_GLFW_KEYCODE_MAPPING[macKeyCode];
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Content view class for the GLFW window
|
||||
//========================================================================
|
||||
|
||||
@interface GLFWContentView : NSView
|
||||
@end
|
||||
|
||||
@implementation GLFWContentView
|
||||
|
||||
- (BOOL)isOpaque
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL)canBecomeKeyView
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL)acceptsFirstResponder
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)mouseDown:(NSEvent *)event
|
||||
{
|
||||
_glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS );
|
||||
}
|
||||
|
||||
- (void)mouseDragged:(NSEvent *)event
|
||||
{
|
||||
[self mouseMoved:event];
|
||||
}
|
||||
|
||||
- (void)mouseUp:(NSEvent *)event
|
||||
{
|
||||
_glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE );
|
||||
}
|
||||
|
||||
- (void)mouseMoved:(NSEvent *)event
|
||||
{
|
||||
if( _glfwWin.mouseLock )
|
||||
{
|
||||
_glfwInput.MousePosX += [event deltaX];
|
||||
_glfwInput.MousePosY += [event deltaY];
|
||||
}
|
||||
else
|
||||
{
|
||||
NSPoint p = [event locationInWindow];
|
||||
|
||||
// Cocoa coordinate system has origin at lower left
|
||||
_glfwInput.MousePosX = p.x;
|
||||
_glfwInput.MousePosY = [[_glfwWin.window contentView] bounds].size.height - p.y;
|
||||
}
|
||||
|
||||
if( _glfwWin.mousePosCallback )
|
||||
{
|
||||
_glfwWin.mousePosCallback( _glfwInput.MousePosX, _glfwInput.MousePosY );
|
||||
}
|
||||
}
|
||||
|
||||
- (void)rightMouseDown:(NSEvent *)event
|
||||
{
|
||||
_glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS );
|
||||
}
|
||||
|
||||
- (void)rightMouseDragged:(NSEvent *)event
|
||||
{
|
||||
[self mouseMoved:event];
|
||||
}
|
||||
|
||||
- (void)rightMouseUp:(NSEvent *)event
|
||||
{
|
||||
_glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE );
|
||||
}
|
||||
|
||||
- (void)otherMouseDown:(NSEvent *)event
|
||||
{
|
||||
_glfwInputMouseClick( [event buttonNumber], GLFW_PRESS );
|
||||
}
|
||||
|
||||
- (void)otherMouseDragged:(NSEvent *)event
|
||||
{
|
||||
[self mouseMoved:event];
|
||||
}
|
||||
|
||||
- (void)otherMouseUp:(NSEvent *)event
|
||||
{
|
||||
_glfwInputMouseClick( [event buttonNumber], GLFW_RELEASE );
|
||||
}
|
||||
|
||||
- (void)keyDown:(NSEvent *)event
|
||||
{
|
||||
NSUInteger length;
|
||||
NSString* characters;
|
||||
int i, code = convertMacKeyCode( [event keyCode] );
|
||||
|
||||
if( code != -1 )
|
||||
{
|
||||
_glfwInputKey( code, GLFW_PRESS );
|
||||
|
||||
if( [event modifierFlags] & NSCommandKeyMask )
|
||||
{
|
||||
if( !_glfwWin.sysKeysDisabled )
|
||||
{
|
||||
[super keyDown:event];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
characters = [event characters];
|
||||
length = [characters length];
|
||||
|
||||
for( i = 0; i < length; i++ )
|
||||
{
|
||||
_glfwInputChar( [characters characterAtIndex:i], GLFW_PRESS );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)flagsChanged:(NSEvent *)event
|
||||
{
|
||||
unsigned int newModifierFlags = [event modifierFlags] | NSDeviceIndependentModifierFlagsMask;
|
||||
int mode;
|
||||
|
||||
if( newModifierFlags > _glfwWin.modifierFlags )
|
||||
{
|
||||
mode = GLFW_PRESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
mode = GLFW_RELEASE;
|
||||
}
|
||||
|
||||
_glfwWin.modifierFlags = newModifierFlags;
|
||||
_glfwInputKey( MAC_TO_GLFW_KEYCODE_MAPPING[[event keyCode]], mode );
|
||||
}
|
||||
|
||||
- (void)keyUp:(NSEvent *)event
|
||||
{
|
||||
NSUInteger length;
|
||||
NSString* characters;
|
||||
int i, code = convertMacKeyCode( [event keyCode] );
|
||||
|
||||
if( code != -1 )
|
||||
{
|
||||
_glfwInputKey( code, GLFW_RELEASE );
|
||||
|
||||
characters = [event characters];
|
||||
length = [characters length];
|
||||
|
||||
for( i = 0; i < length; i++ )
|
||||
{
|
||||
_glfwInputChar( [characters characterAtIndex:i], GLFW_RELEASE );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)scrollWheel:(NSEvent *)event
|
||||
{
|
||||
_glfwInput.WheelPosFloating += [event deltaY];
|
||||
_glfwInput.WheelPos = lrint(_glfwInput.WheelPosFloating);
|
||||
|
||||
if( _glfwWin.mouseWheelCallback )
|
||||
{
|
||||
_glfwWin.mouseWheelCallback( _glfwInput.WheelPos );
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Here is where the window is created, and the OpenGL rendering context is
|
||||
// created
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformOpenWindow( int width, int height,
|
||||
const _GLFWwndconfig *wndconfig,
|
||||
const _GLFWfbconfig *fbconfig )
|
||||
{
|
||||
int colorBits;
|
||||
|
||||
_glfwWin.pixelFormat = nil;
|
||||
_glfwWin.window = nil;
|
||||
_glfwWin.context = nil;
|
||||
_glfwWin.delegate = nil;
|
||||
|
||||
// Fail if OpenGL 3.0 or above was requested
|
||||
if( wndconfig->glMajor > 2 )
|
||||
{
|
||||
_glfwPlatformCloseWindow();
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
_glfwWin.delegate = [[GLFWWindowDelegate alloc] init];
|
||||
if( _glfwWin.delegate == nil )
|
||||
{
|
||||
_glfwPlatformCloseWindow();
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
[NSApp setDelegate:_glfwWin.delegate];
|
||||
|
||||
// Mac OS X needs non-zero color size, so set resonable values
|
||||
colorBits = fbconfig->redBits + fbconfig->greenBits + fbconfig->blueBits;
|
||||
if( colorBits == 0 )
|
||||
{
|
||||
colorBits = 24;
|
||||
}
|
||||
else if( colorBits < 15 )
|
||||
{
|
||||
colorBits = 15;
|
||||
}
|
||||
|
||||
// Ignored hints:
|
||||
// OpenGLMajor, OpenGLMinor, OpenGLForward:
|
||||
// pending Mac OS X support for OpenGL 3.x
|
||||
// OpenGLDebug
|
||||
// pending it meaning anything on Mac OS X
|
||||
|
||||
// Don't use accumulation buffer support; it's not accelerated
|
||||
// Aux buffers probably aren't accelerated either
|
||||
|
||||
CFDictionaryRef fullscreenMode = NULL;
|
||||
if( wndconfig->mode == GLFW_FULLSCREEN )
|
||||
{
|
||||
fullscreenMode =
|
||||
// I think it's safe to pass 0 to the refresh rate for this function
|
||||
// rather than conditionalizing the code to call the version which
|
||||
// doesn't specify refresh...
|
||||
CGDisplayBestModeForParametersAndRefreshRateWithProperty(
|
||||
CGMainDisplayID(),
|
||||
colorBits + fbconfig->alphaBits,
|
||||
width,
|
||||
height,
|
||||
wndconfig->refreshRate,
|
||||
// Controversial, see macosx_fullscreen.m for discussion
|
||||
kCGDisplayModeIsSafeForHardware,
|
||||
NULL);
|
||||
|
||||
width = [[(id)fullscreenMode objectForKey:(id)kCGDisplayWidth] intValue];
|
||||
height = [[(id)fullscreenMode objectForKey:(id)kCGDisplayHeight] intValue];
|
||||
}
|
||||
|
||||
unsigned int styleMask = 0;
|
||||
if( wndconfig->mode == GLFW_WINDOW )
|
||||
{
|
||||
styleMask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask;
|
||||
|
||||
if( !wndconfig->windowNoResize )
|
||||
{
|
||||
styleMask |= NSResizableWindowMask;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
styleMask = NSBorderlessWindowMask;
|
||||
}
|
||||
|
||||
_glfwWin.window = [[NSWindow alloc]
|
||||
initWithContentRect:NSMakeRect(0, 0, width, height)
|
||||
styleMask:styleMask
|
||||
backing:NSBackingStoreBuffered
|
||||
defer:NO];
|
||||
[_glfwWin.window setContentView:[[GLFWContentView alloc] init]];
|
||||
[_glfwWin.window setDelegate:_glfwWin.delegate];
|
||||
[_glfwWin.window setAcceptsMouseMovedEvents:YES];
|
||||
[_glfwWin.window center];
|
||||
|
||||
if( wndconfig->mode == GLFW_FULLSCREEN )
|
||||
{
|
||||
CGCaptureAllDisplays();
|
||||
CGDisplaySwitchToMode( CGMainDisplayID(), fullscreenMode );
|
||||
}
|
||||
|
||||
unsigned int attribute_count = 0;
|
||||
#define ADD_ATTR(x) attributes[attribute_count++] = x
|
||||
#define ADD_ATTR2(x, y) (void)({ ADD_ATTR(x); ADD_ATTR(y); })
|
||||
#define MAX_ATTRS 24 // urgh
|
||||
NSOpenGLPixelFormatAttribute attributes[MAX_ATTRS];
|
||||
|
||||
ADD_ATTR( NSOpenGLPFADoubleBuffer );
|
||||
|
||||
if( wndconfig->mode == GLFW_FULLSCREEN )
|
||||
{
|
||||
ADD_ATTR( NSOpenGLPFAFullScreen );
|
||||
ADD_ATTR( NSOpenGLPFANoRecovery );
|
||||
ADD_ATTR2( NSOpenGLPFAScreenMask,
|
||||
CGDisplayIDToOpenGLDisplayMask( CGMainDisplayID() ) );
|
||||
}
|
||||
|
||||
ADD_ATTR2( NSOpenGLPFAColorSize, colorBits );
|
||||
|
||||
if( fbconfig->alphaBits > 0)
|
||||
{
|
||||
ADD_ATTR2( NSOpenGLPFAAlphaSize, fbconfig->alphaBits );
|
||||
}
|
||||
|
||||
if( fbconfig->depthBits > 0)
|
||||
{
|
||||
ADD_ATTR2( NSOpenGLPFADepthSize, fbconfig->depthBits );
|
||||
}
|
||||
|
||||
if( fbconfig->stencilBits > 0)
|
||||
{
|
||||
ADD_ATTR2( NSOpenGLPFAStencilSize, fbconfig->stencilBits );
|
||||
}
|
||||
|
||||
int accumBits = fbconfig->accumRedBits + fbconfig->accumGreenBits +
|
||||
fbconfig->accumBlueBits + fbconfig->accumAlphaBits;
|
||||
|
||||
if( accumBits > 0)
|
||||
{
|
||||
ADD_ATTR2( NSOpenGLPFAAccumSize, accumBits );
|
||||
}
|
||||
|
||||
if( fbconfig->auxBuffers > 0)
|
||||
{
|
||||
ADD_ATTR2( NSOpenGLPFAAuxBuffers, fbconfig->auxBuffers );
|
||||
}
|
||||
|
||||
if( fbconfig->stereo)
|
||||
{
|
||||
ADD_ATTR( NSOpenGLPFAStereo );
|
||||
}
|
||||
|
||||
if( fbconfig->samples > 0)
|
||||
{
|
||||
ADD_ATTR2( NSOpenGLPFASampleBuffers, 1 );
|
||||
ADD_ATTR2( NSOpenGLPFASamples, fbconfig->samples );
|
||||
}
|
||||
|
||||
ADD_ATTR(0);
|
||||
|
||||
_glfwWin.pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];
|
||||
if( _glfwWin.pixelFormat == nil )
|
||||
{
|
||||
_glfwPlatformCloseWindow();
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
_glfwWin.context = [[NSOpenGLContext alloc] initWithFormat:_glfwWin.pixelFormat
|
||||
shareContext:nil];
|
||||
if( _glfwWin.context == nil )
|
||||
{
|
||||
_glfwPlatformCloseWindow();
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
[_glfwWin.window makeKeyAndOrderFront:nil];
|
||||
[_glfwWin.context setView:[_glfwWin.window contentView]];
|
||||
|
||||
if( wndconfig->mode == GLFW_FULLSCREEN )
|
||||
{
|
||||
// TODO: Make this work on pre-Leopard systems
|
||||
[[_glfwWin.window contentView] enterFullScreenMode:[NSScreen mainScreen]
|
||||
withOptions:nil];
|
||||
}
|
||||
|
||||
[_glfwWin.context makeCurrentContext];
|
||||
|
||||
NSPoint point = [[NSCursor currentCursor] hotSpot];
|
||||
_glfwInput.MousePosX = point.x;
|
||||
_glfwInput.MousePosY = point.y;
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Properly kill the window / video display
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformCloseWindow( void )
|
||||
{
|
||||
[_glfwWin.window orderOut:nil];
|
||||
|
||||
if( _glfwWin.fullscreen )
|
||||
{
|
||||
[[_glfwWin.window contentView] exitFullScreenModeWithOptions:nil];
|
||||
CGDisplaySwitchToMode( CGMainDisplayID(),
|
||||
(CFDictionaryRef)_glfwLibrary.DesktopMode );
|
||||
CGReleaseAllDisplays();
|
||||
}
|
||||
|
||||
[_glfwWin.pixelFormat release];
|
||||
_glfwWin.pixelFormat = nil;
|
||||
|
||||
[NSOpenGLContext clearCurrentContext];
|
||||
[_glfwWin.context release];
|
||||
_glfwWin.context = nil;
|
||||
|
||||
[_glfwWin.window setDelegate:nil];
|
||||
[NSApp setDelegate:nil];
|
||||
[_glfwWin.delegate release];
|
||||
_glfwWin.delegate = nil;
|
||||
|
||||
[_glfwWin.window close];
|
||||
_glfwWin.window = nil;
|
||||
|
||||
// TODO: Probably more cleanup
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Set the window title
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformSetWindowTitle( const char *title )
|
||||
{
|
||||
[_glfwWin.window setTitle:[NSString stringWithCString:title
|
||||
encoding:NSISOLatin1StringEncoding]];
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Set the window size
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformSetWindowSize( int width, int height )
|
||||
{
|
||||
[_glfwWin.window setContentSize:NSMakeSize(width, height)];
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Set the window position
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformSetWindowPos( int x, int y )
|
||||
{
|
||||
NSRect contentRect = [_glfwWin.window contentRectForFrameRect:[_glfwWin.window frame]];
|
||||
|
||||
// We assume here that the client code wants to position the window within the
|
||||
// screen the window currently occupies
|
||||
NSRect screenRect = [[_glfwWin.window screen] visibleFrame];
|
||||
contentRect.origin = NSMakePoint(screenRect.origin.x + x,
|
||||
screenRect.origin.y + screenRect.size.height -
|
||||
y - contentRect.size.height);
|
||||
|
||||
[_glfwWin.window setFrame:[_glfwWin.window frameRectForContentRect:contentRect]
|
||||
display:YES];
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Iconify the window
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformIconifyWindow( void )
|
||||
{
|
||||
[_glfwWin.window miniaturize:nil];
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Restore (un-iconify) the window
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformRestoreWindow( void )
|
||||
{
|
||||
[_glfwWin.window deminiaturize:nil];
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Swap buffers
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformSwapBuffers( void )
|
||||
{
|
||||
// ARP appears to be unnecessary, but this is future-proof
|
||||
[_glfwWin.context flushBuffer];
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Set double buffering swap interval
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformSwapInterval( int interval )
|
||||
{
|
||||
GLint sync = interval;
|
||||
[_glfwWin.context setValues:&sync forParameter:NSOpenGLCPSwapInterval];
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Write back window parameters into GLFW window structure
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformRefreshWindowParams( void )
|
||||
{
|
||||
GLint value;
|
||||
|
||||
// Since GLFW 2.x doesn't understand screens, we use virtual screen zero
|
||||
|
||||
[_glfwWin.pixelFormat getValues:&value
|
||||
forAttribute:NSOpenGLPFAAccelerated
|
||||
forVirtualScreen:0];
|
||||
_glfwWin.accelerated = value;
|
||||
|
||||
[_glfwWin.pixelFormat getValues:&value
|
||||
forAttribute:NSOpenGLPFAAlphaSize
|
||||
forVirtualScreen:0];
|
||||
_glfwWin.alphaBits = value;
|
||||
|
||||
// It seems that the color size includes the size of the alpha channel
|
||||
[_glfwWin.pixelFormat getValues:&value
|
||||
forAttribute:NSOpenGLPFAColorSize
|
||||
forVirtualScreen:0];
|
||||
value -= _glfwWin.alphaBits;
|
||||
_glfwWin.redBits = value / 3;
|
||||
_glfwWin.greenBits = value / 3;
|
||||
_glfwWin.blueBits = value / 3;
|
||||
|
||||
[_glfwWin.pixelFormat getValues:&value
|
||||
forAttribute:NSOpenGLPFADepthSize
|
||||
forVirtualScreen:0];
|
||||
_glfwWin.depthBits = value;
|
||||
|
||||
[_glfwWin.pixelFormat getValues:&value
|
||||
forAttribute:NSOpenGLPFAStencilSize
|
||||
forVirtualScreen:0];
|
||||
_glfwWin.stencilBits = value;
|
||||
|
||||
[_glfwWin.pixelFormat getValues:&value
|
||||
forAttribute:NSOpenGLPFAAccumSize
|
||||
forVirtualScreen:0];
|
||||
_glfwWin.accumRedBits = value / 3;
|
||||
_glfwWin.accumGreenBits = value / 3;
|
||||
_glfwWin.accumBlueBits = value / 3;
|
||||
|
||||
// TODO: Figure out what to set this value to
|
||||
_glfwWin.accumAlphaBits = 0;
|
||||
|
||||
[_glfwWin.pixelFormat getValues:&value
|
||||
forAttribute:NSOpenGLPFAAuxBuffers
|
||||
forVirtualScreen:0];
|
||||
_glfwWin.auxBuffers = value;
|
||||
|
||||
[_glfwWin.pixelFormat getValues:&value
|
||||
forAttribute:NSOpenGLPFAStereo
|
||||
forVirtualScreen:0];
|
||||
_glfwWin.stereo = value;
|
||||
|
||||
[_glfwWin.pixelFormat getValues:&value
|
||||
forAttribute:NSOpenGLPFASamples
|
||||
forVirtualScreen:0];
|
||||
_glfwWin.samples = value;
|
||||
|
||||
// These are forced to false as long as Mac OS X lacks support for OpenGL 3.0+
|
||||
_glfwWin.glForward = GL_FALSE;
|
||||
_glfwWin.glDebug = GL_FALSE;
|
||||
_glfwWin.glProfile = 0;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Poll for new window and input events
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformPollEvents( void )
|
||||
{
|
||||
NSEvent *event;
|
||||
|
||||
do
|
||||
{
|
||||
event = [NSApp nextEventMatchingMask:NSAnyEventMask
|
||||
untilDate:[NSDate distantPast]
|
||||
inMode:NSDefaultRunLoopMode
|
||||
dequeue:YES];
|
||||
|
||||
if (event)
|
||||
{
|
||||
[NSApp sendEvent:event];
|
||||
}
|
||||
}
|
||||
while (event);
|
||||
|
||||
[_glfwLibrary.AutoreleasePool drain];
|
||||
_glfwLibrary.AutoreleasePool = [[NSAutoreleasePool alloc] init];
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Wait for new window and input events
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformWaitEvents( void )
|
||||
{
|
||||
// I wanted to pass NO to dequeue:, and rely on PollEvents to
|
||||
// dequeue and send. For reasons not at all clear to me, passing
|
||||
// NO to dequeue: causes this method never to return.
|
||||
NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask
|
||||
untilDate:[NSDate distantFuture]
|
||||
inMode:NSDefaultRunLoopMode
|
||||
dequeue:YES];
|
||||
[NSApp sendEvent:event];
|
||||
|
||||
_glfwPlatformPollEvents();
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Hide mouse cursor (lock it)
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformHideMouseCursor( void )
|
||||
{
|
||||
[NSCursor hide];
|
||||
CGAssociateMouseAndMouseCursorPosition( false );
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Show mouse cursor (unlock it)
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformShowMouseCursor( void )
|
||||
{
|
||||
[NSCursor unhide];
|
||||
CGAssociateMouseAndMouseCursorPosition( true );
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Set physical mouse cursor position
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformSetMouseCursorPos( int x, int y )
|
||||
{
|
||||
// The library seems to assume that after calling this the mouse won't move,
|
||||
// but obviously it will, and escape the app's window, and activate other apps,
|
||||
// and other badness in pain. I think the API's just silly, but maybe I'm
|
||||
// misunderstanding it...
|
||||
|
||||
// Also, (x, y) are window coords...
|
||||
|
||||
// Also, it doesn't seem possible to write this robustly without
|
||||
// calculating the maximum y coordinate of all screens, since Cocoa's
|
||||
// "global coordinates" are upside down from CG's...
|
||||
|
||||
// Without this (once per app run, but it's convenient to do it here)
|
||||
// events will be suppressed for a default of 0.25 seconds after we
|
||||
// move the cursor.
|
||||
CGSetLocalEventsSuppressionInterval( 0.0 );
|
||||
|
||||
NSPoint localPoint = NSMakePoint( x, y );
|
||||
NSPoint globalPoint = [_glfwWin.window convertBaseToScreen:localPoint];
|
||||
CGPoint mainScreenOrigin = CGDisplayBounds( CGMainDisplayID() ).origin;
|
||||
double mainScreenHeight = CGDisplayBounds( CGMainDisplayID() ).size.height;
|
||||
CGPoint targetPoint = CGPointMake( globalPoint.x - mainScreenOrigin.x,
|
||||
mainScreenHeight - globalPoint.y - mainScreenOrigin.y );
|
||||
CGDisplayMoveCursorToPoint( CGMainDisplayID(), targetPoint );
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
prefix=@PREFIX@
|
||||
exec_prefix=@PREFIX@
|
||||
libdir=@PREFIX@/lib
|
||||
includedir=@PREFIX@/include
|
||||
|
||||
Name: GLFW
|
||||
Description: A portable framework for OpenGL development
|
||||
Version: 2.7
|
||||
URL: http://glfw.sourceforge.net/
|
||||
Libs: -L${libdir} -lglfw -framework AGL -framework OpenGL -framework Carbon
|
||||
Cflags: -I${includedir}
|
||||
@@ -0,0 +1,189 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Cocoa/NSOpenGL
|
||||
// API Version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2009-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//========================================================================
|
||||
|
||||
#ifndef _platform_h_
|
||||
#define _platform_h_
|
||||
|
||||
|
||||
// This is the Mac OS X version of GLFW
|
||||
#define _GLFW_MAC_OS_X
|
||||
|
||||
#if defined(__OBJC__)
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#else
|
||||
typedef void *id;
|
||||
#endif
|
||||
|
||||
#include "../../include/GL/glfw.h"
|
||||
|
||||
|
||||
#ifndef GL_VERSION_3_0
|
||||
|
||||
typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint);
|
||||
|
||||
#endif /*GL_VERSION_3_0*/
|
||||
|
||||
|
||||
//========================================================================
|
||||
// GLFW platform specific types
|
||||
//========================================================================
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Pointer length integer
|
||||
//------------------------------------------------------------------------
|
||||
typedef intptr_t GLFWintptr;
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Window structure
|
||||
//------------------------------------------------------------------------
|
||||
typedef struct _GLFWwin_struct _GLFWwin;
|
||||
|
||||
struct _GLFWwin_struct {
|
||||
|
||||
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||
|
||||
// User callback functions
|
||||
GLFWwindowsizefun windowSizeCallback;
|
||||
GLFWwindowclosefun windowCloseCallback;
|
||||
GLFWwindowrefreshfun windowRefreshCallback;
|
||||
GLFWmousebuttonfun mouseButtonCallback;
|
||||
GLFWmouseposfun mousePosCallback;
|
||||
GLFWmousewheelfun mouseWheelCallback;
|
||||
GLFWkeyfun keyCallback;
|
||||
GLFWcharfun charCallback;
|
||||
|
||||
// User selected window settings
|
||||
int fullscreen; // Fullscreen flag
|
||||
int mouseLock; // Mouse-lock flag
|
||||
int autoPollEvents; // Auto polling flag
|
||||
int sysKeysDisabled; // System keys disabled flag
|
||||
int windowNoResize; // Resize- and maximize gadgets disabled flag
|
||||
int refreshRate; // Vertical monitor refresh rate
|
||||
|
||||
// Window status & parameters
|
||||
int opened; // Flag telling if window is opened or not
|
||||
int active; // Application active flag
|
||||
int iconified; // Window iconified flag
|
||||
int width, height; // Window width and heigth
|
||||
int accelerated; // GL_TRUE if window is HW accelerated
|
||||
|
||||
// Framebuffer attributes
|
||||
int redBits;
|
||||
int greenBits;
|
||||
int blueBits;
|
||||
int alphaBits;
|
||||
int depthBits;
|
||||
int stencilBits;
|
||||
int accumRedBits;
|
||||
int accumGreenBits;
|
||||
int accumBlueBits;
|
||||
int accumAlphaBits;
|
||||
int auxBuffers;
|
||||
int stereo;
|
||||
int samples;
|
||||
|
||||
// OpenGL extensions and context attributes
|
||||
int has_GL_SGIS_generate_mipmap;
|
||||
int has_GL_ARB_texture_non_power_of_two;
|
||||
int glMajor, glMinor, glRevision;
|
||||
int glForward, glDebug, glProfile;
|
||||
|
||||
PFNGLGETSTRINGIPROC GetStringi;
|
||||
|
||||
// ========= PLATFORM SPECIFIC PART ======================================
|
||||
|
||||
id window;
|
||||
id pixelFormat;
|
||||
id context;
|
||||
id delegate;
|
||||
unsigned int modifierFlags;
|
||||
};
|
||||
|
||||
GLFWGLOBAL _GLFWwin _glfwWin;
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Library global data
|
||||
//------------------------------------------------------------------------
|
||||
GLFWGLOBAL struct {
|
||||
|
||||
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||
|
||||
// Window opening hints
|
||||
_GLFWhints hints;
|
||||
|
||||
// ========= PLATFORM SPECIFIC PART ======================================
|
||||
|
||||
// Timer data
|
||||
struct {
|
||||
double t0;
|
||||
} Timer;
|
||||
|
||||
// dlopen handle for dynamically-loading extension function pointers
|
||||
void *OpenGLFramework;
|
||||
|
||||
int Unbundled;
|
||||
|
||||
id DesktopMode;
|
||||
|
||||
id AutoreleasePool;
|
||||
|
||||
} _glfwLibrary;
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// User input status (some of this should go in _GLFWwin)
|
||||
//------------------------------------------------------------------------
|
||||
GLFWGLOBAL struct {
|
||||
|
||||
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||
|
||||
// Mouse status
|
||||
int MousePosX, MousePosY;
|
||||
int WheelPos;
|
||||
char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];
|
||||
|
||||
// Keyboard status
|
||||
char Key[ GLFW_KEY_LAST+1 ];
|
||||
int LastChar;
|
||||
|
||||
// User selected settings
|
||||
int StickyKeys;
|
||||
int StickyMouseButtons;
|
||||
int KeyRepeat;
|
||||
|
||||
|
||||
// ========= PLATFORM SPECIFIC PART ======================================
|
||||
|
||||
double WheelPosFloating;
|
||||
|
||||
} _glfwInput;
|
||||
|
||||
|
||||
#endif // _platform_h_
|
||||
+310
@@ -0,0 +1,310 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Any
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW internal functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Enable (show) mouse cursor
|
||||
//========================================================================
|
||||
|
||||
static void enableMouseCursor( void )
|
||||
{
|
||||
int centerPosX, centerPosY;
|
||||
|
||||
if( !_glfwWin.opened || !_glfwWin.mouseLock )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Show mouse cursor
|
||||
_glfwPlatformShowMouseCursor();
|
||||
|
||||
centerPosX = _glfwWin.width / 2;
|
||||
centerPosY = _glfwWin.height / 2;
|
||||
|
||||
if( centerPosX != _glfwInput.MousePosX || centerPosY != _glfwInput.MousePosY )
|
||||
{
|
||||
_glfwPlatformSetMouseCursorPos( centerPosX, centerPosY );
|
||||
|
||||
_glfwInput.MousePosX = centerPosX;
|
||||
_glfwInput.MousePosY = centerPosY;
|
||||
|
||||
if( _glfwWin.mousePosCallback )
|
||||
{
|
||||
_glfwWin.mousePosCallback( _glfwInput.MousePosX,
|
||||
_glfwInput.MousePosY );
|
||||
}
|
||||
}
|
||||
|
||||
// From now on the mouse is unlocked
|
||||
_glfwWin.mouseLock = GL_FALSE;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Disable (hide) mouse cursor
|
||||
//========================================================================
|
||||
|
||||
static void disableMouseCursor( void )
|
||||
{
|
||||
if( !_glfwWin.opened || _glfwWin.mouseLock )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Hide mouse cursor
|
||||
_glfwPlatformHideMouseCursor();
|
||||
|
||||
// Move cursor to the middle of the window
|
||||
_glfwPlatformSetMouseCursorPos( _glfwWin.width >> 1,
|
||||
_glfwWin.height >> 1 );
|
||||
|
||||
// From now on the mouse is locked
|
||||
_glfwWin.mouseLock = GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Enable sticky keys
|
||||
//========================================================================
|
||||
|
||||
static void enableStickyKeys( void )
|
||||
{
|
||||
_glfwInput.StickyKeys = 1;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Disable sticky keys
|
||||
//========================================================================
|
||||
|
||||
static void disableStickyKeys( void )
|
||||
{
|
||||
int i;
|
||||
|
||||
_glfwInput.StickyKeys = 0;
|
||||
|
||||
// Release all sticky keys
|
||||
for( i = 0; i <= GLFW_KEY_LAST; i++ )
|
||||
{
|
||||
if( _glfwInput.Key[ i ] == 2 )
|
||||
{
|
||||
_glfwInput.Key[ i ] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Enable sticky mouse buttons
|
||||
//========================================================================
|
||||
|
||||
static void enableStickyMouseButtons( void )
|
||||
{
|
||||
_glfwInput.StickyMouseButtons = 1;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Disable sticky mouse buttons
|
||||
//========================================================================
|
||||
|
||||
static void disableStickyMouseButtons( void )
|
||||
{
|
||||
int i;
|
||||
|
||||
_glfwInput.StickyMouseButtons = 0;
|
||||
|
||||
// Release all sticky mouse buttons
|
||||
for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i++ )
|
||||
{
|
||||
if( _glfwInput.MouseButton[ i ] == 2 )
|
||||
{
|
||||
_glfwInput.MouseButton[ i ] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Enable system keys
|
||||
//========================================================================
|
||||
|
||||
static void enableSystemKeys( void )
|
||||
{
|
||||
if( !_glfwWin.sysKeysDisabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_glfwPlatformEnableSystemKeys();
|
||||
|
||||
// Indicate that system keys are no longer disabled
|
||||
_glfwWin.sysKeysDisabled = GL_FALSE;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Disable system keys
|
||||
//========================================================================
|
||||
|
||||
static void disableSystemKeys( void )
|
||||
{
|
||||
if( _glfwWin.sysKeysDisabled )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_glfwPlatformDisableSystemKeys();
|
||||
|
||||
// Indicate that system keys are now disabled
|
||||
_glfwWin.sysKeysDisabled = GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Enable key repeat
|
||||
//========================================================================
|
||||
|
||||
static void enableKeyRepeat( void )
|
||||
{
|
||||
_glfwInput.KeyRepeat = 1;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Disable key repeat
|
||||
//========================================================================
|
||||
|
||||
static void disableKeyRepeat( void )
|
||||
{
|
||||
_glfwInput.KeyRepeat = 0;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Enable automatic event polling
|
||||
//========================================================================
|
||||
|
||||
static void enableAutoPollEvents( void )
|
||||
{
|
||||
_glfwWin.autoPollEvents = 1;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Disable automatic event polling
|
||||
//========================================================================
|
||||
|
||||
static void disableAutoPollEvents( void )
|
||||
{
|
||||
_glfwWin.autoPollEvents = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW user functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Enable certain GLFW/window/system functions.
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwEnable( int token )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch( token )
|
||||
{
|
||||
case GLFW_MOUSE_CURSOR:
|
||||
enableMouseCursor();
|
||||
break;
|
||||
case GLFW_STICKY_KEYS:
|
||||
enableStickyKeys();
|
||||
break;
|
||||
case GLFW_STICKY_MOUSE_BUTTONS:
|
||||
enableStickyMouseButtons();
|
||||
break;
|
||||
case GLFW_SYSTEM_KEYS:
|
||||
enableSystemKeys();
|
||||
break;
|
||||
case GLFW_KEY_REPEAT:
|
||||
enableKeyRepeat();
|
||||
break;
|
||||
case GLFW_AUTO_POLL_EVENTS:
|
||||
enableAutoPollEvents();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Disable certain GLFW/window/system functions.
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwDisable( int token )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch( token )
|
||||
{
|
||||
case GLFW_MOUSE_CURSOR:
|
||||
disableMouseCursor();
|
||||
break;
|
||||
case GLFW_STICKY_KEYS:
|
||||
disableStickyKeys();
|
||||
break;
|
||||
case GLFW_STICKY_MOUSE_BUTTONS:
|
||||
disableStickyMouseButtons();
|
||||
break;
|
||||
case GLFW_SYSTEM_KEYS:
|
||||
disableSystemKeys();
|
||||
break;
|
||||
case GLFW_KEY_REPEAT:
|
||||
disableKeyRepeat();
|
||||
break;
|
||||
case GLFW_AUTO_POLL_EVENTS:
|
||||
disableAutoPollEvents();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Any
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW user functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// glfwGetVideoModes() - Get a list of available video modes
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI int glfwGetVideoModes( GLFWvidmode *list, int maxcount )
|
||||
{
|
||||
int count, i, swap, res1, res2, depth1, depth2;
|
||||
GLFWvidmode vm;
|
||||
|
||||
if( !_glfwInitialized || maxcount <= 0 || list == (GLFWvidmode*) 0 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Get list of video modes
|
||||
count = _glfwPlatformGetVideoModes( list, maxcount );
|
||||
|
||||
// Sort list (bubble sort)
|
||||
do
|
||||
{
|
||||
swap = 0;
|
||||
for( i = 0; i < count-1; ++ i )
|
||||
{
|
||||
res1 = list[i].Width*list[i].Height;
|
||||
depth1 = list[i].RedBits+list[i].GreenBits+list[i].BlueBits;
|
||||
res2 = list[i+1].Width*list[i+1].Height;
|
||||
depth2 = list[i+1].RedBits+list[i+1].GreenBits+
|
||||
list[i+1].BlueBits;
|
||||
if( (depth2<depth1) || ((depth2==depth1) && (res2<res1)) )
|
||||
{
|
||||
vm = list[i];
|
||||
list[i] = list[i+1];
|
||||
list[i+1] = vm;
|
||||
swap = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
while( swap );
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwGetDesktopMode() - Get the desktop video mode
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwGetDesktopMode( GLFWvidmode *mode )
|
||||
{
|
||||
if( !_glfwInitialized || mode == (GLFWvidmode*) 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_glfwPlatformGetDesktopMode( mode );
|
||||
}
|
||||
|
||||
+235
@@ -0,0 +1,235 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Any
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW internal functions ****
|
||||
//************************************************************************
|
||||
|
||||
#ifndef GL_VERSION_3_0
|
||||
#define GL_NUM_EXTENSIONS 0x821D
|
||||
#endif
|
||||
|
||||
//========================================================================
|
||||
// Parses the OpenGL version string and extracts the version number
|
||||
//========================================================================
|
||||
|
||||
void _glfwParseGLVersion( int *major, int *minor, int *rev )
|
||||
{
|
||||
GLuint _major, _minor = 0, _rev = 0;
|
||||
const GLubyte *version;
|
||||
const GLubyte *ptr;
|
||||
|
||||
// Get OpenGL version string
|
||||
version = glGetString( GL_VERSION );
|
||||
if( !version )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Parse string
|
||||
ptr = version;
|
||||
for( _major = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )
|
||||
{
|
||||
_major = 10*_major + (*ptr - '0');
|
||||
}
|
||||
if( *ptr == '.' )
|
||||
{
|
||||
ptr ++;
|
||||
for( _minor = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )
|
||||
{
|
||||
_minor = 10*_minor + (*ptr - '0');
|
||||
}
|
||||
if( *ptr == '.' )
|
||||
{
|
||||
ptr ++;
|
||||
for( _rev = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ )
|
||||
{
|
||||
_rev = 10*_rev + (*ptr - '0');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Return parsed values
|
||||
*major = _major;
|
||||
*minor = _minor;
|
||||
*rev = _rev;
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// _glfwStringInExtensionString() - Check if a string can be found in an
|
||||
// OpenGL extension string
|
||||
//========================================================================
|
||||
|
||||
int _glfwStringInExtensionString( const char *string,
|
||||
const GLubyte *extensions )
|
||||
{
|
||||
const GLubyte *start;
|
||||
GLubyte *where, *terminator;
|
||||
|
||||
// It takes a bit of care to be fool-proof about parsing the
|
||||
// OpenGL extensions string. Don't be fooled by sub-strings,
|
||||
// etc.
|
||||
start = extensions;
|
||||
while( 1 )
|
||||
{
|
||||
where = (GLubyte *) strstr( (const char *) start, string );
|
||||
if( !where )
|
||||
{
|
||||
return GL_FALSE;
|
||||
}
|
||||
terminator = where + strlen( string );
|
||||
if( where == start || *(where - 1) == ' ' )
|
||||
{
|
||||
if( *terminator == ' ' || *terminator == '\0' )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
start = terminator;
|
||||
}
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW user functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Check if an OpenGL extension is available at runtime
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI int glfwExtensionSupported( const char *extension )
|
||||
{
|
||||
const GLubyte *extensions;
|
||||
GLubyte *where;
|
||||
GLint count;
|
||||
int i;
|
||||
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
// Extension names should not have spaces
|
||||
where = (GLubyte *) strchr( extension, ' ' );
|
||||
if( where || *extension == '\0' )
|
||||
{
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
if( _glfwWin.glMajor < 3 )
|
||||
{
|
||||
// Check if extension is in the old style OpenGL extensions string
|
||||
|
||||
extensions = glGetString( GL_EXTENSIONS );
|
||||
if( extensions != NULL )
|
||||
{
|
||||
if( _glfwStringInExtensionString( extension, extensions ) )
|
||||
{
|
||||
return GL_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Check if extension is in the modern OpenGL extensions string list
|
||||
|
||||
glGetIntegerv( GL_NUM_EXTENSIONS, &count );
|
||||
|
||||
for( i = 0; i < count; i++ )
|
||||
{
|
||||
if( strcmp( (const char*) _glfwWin.GetStringi( GL_EXTENSIONS, i ),
|
||||
extension ) == 0 )
|
||||
{
|
||||
return GL_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Additional platform specific extension checking (e.g. WGL)
|
||||
if( _glfwPlatformExtensionSupported( extension ) )
|
||||
{
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwGetProcAddress() - Get the function pointer to an OpenGL function.
|
||||
// This function can be used to get access to extended OpenGL functions.
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void * glfwGetProcAddress( const char *procname )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return _glfwPlatformGetProcAddress( procname );
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Returns the OpenGL version
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwGetGLVersion( int *major, int *minor, int *rev )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if( major != NULL )
|
||||
{
|
||||
*major = _glfwWin.glMajor;
|
||||
}
|
||||
if( minor != NULL )
|
||||
{
|
||||
*minor = _glfwWin.glMinor;
|
||||
}
|
||||
if( rev != NULL )
|
||||
{
|
||||
*rev = _glfwWin.glRevision;
|
||||
}
|
||||
}
|
||||
|
||||
+110
@@ -0,0 +1,110 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Any
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//========================================================================
|
||||
|
||||
#define _init_c_
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW user functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// glfwInit() - Initialize various GLFW state
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI int glfwInit( void )
|
||||
{
|
||||
// Is GLFW already initialized?
|
||||
if( _glfwInitialized )
|
||||
{
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
memset( &_glfwLibrary, 0, sizeof( _glfwLibrary ) );
|
||||
memset( &_glfwWin, 0, sizeof( _glfwWin ) );
|
||||
|
||||
// Window is not yet opened
|
||||
_glfwWin.opened = GL_FALSE;
|
||||
|
||||
// Default enable/disable settings
|
||||
_glfwWin.sysKeysDisabled = GL_FALSE;
|
||||
|
||||
// Clear window hints
|
||||
_glfwClearWindowHints();
|
||||
|
||||
// Platform specific initialization
|
||||
if( !_glfwPlatformInit() )
|
||||
{
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
// Form now on, GLFW state is valid
|
||||
_glfwInitialized = GL_TRUE;
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Close window and shut down library
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwTerminate( void )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Platform specific termination
|
||||
if( !_glfwPlatformTerminate() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// GLFW is no longer initialized
|
||||
_glfwInitialized = GL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwGetVersion() - Get GLFW version
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwGetVersion( int *major, int *minor, int *rev )
|
||||
{
|
||||
if( major != NULL ) *major = GLFW_VERSION_MAJOR;
|
||||
if( minor != NULL ) *minor = GLFW_VERSION_MINOR;
|
||||
if( rev != NULL ) *rev = GLFW_VERSION_REVISION;
|
||||
}
|
||||
|
||||
+280
@@ -0,0 +1,280 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Any
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwGetKey()
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI int glfwGetKey( int key )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return GLFW_RELEASE;
|
||||
}
|
||||
|
||||
// Is it a valid key?
|
||||
if( key < 0 || key > GLFW_KEY_LAST )
|
||||
{
|
||||
return GLFW_RELEASE;
|
||||
}
|
||||
|
||||
if( _glfwInput.Key[ key ] == GLFW_STICK )
|
||||
{
|
||||
// Sticky mode: release key now
|
||||
_glfwInput.Key[ key ] = GLFW_RELEASE;
|
||||
return GLFW_PRESS;
|
||||
}
|
||||
|
||||
return (int) _glfwInput.Key[ key ];
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwGetMouseButton()
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI int glfwGetMouseButton( int button )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return GLFW_RELEASE;
|
||||
}
|
||||
|
||||
// Is it a valid mouse button?
|
||||
if( button < 0 || button > GLFW_MOUSE_BUTTON_LAST )
|
||||
{
|
||||
return GLFW_RELEASE;
|
||||
}
|
||||
|
||||
if( _glfwInput.MouseButton[ button ] == GLFW_STICK )
|
||||
{
|
||||
// Sticky mode: release mouse button now
|
||||
_glfwInput.MouseButton[ button ] = GLFW_RELEASE;
|
||||
return GLFW_PRESS;
|
||||
}
|
||||
|
||||
return (int) _glfwInput.MouseButton[ button ];
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwGetMousePos()
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwGetMousePos( int *xpos, int *ypos )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Return mouse position
|
||||
if( xpos != NULL )
|
||||
{
|
||||
*xpos = _glfwInput.MousePosX;
|
||||
}
|
||||
if( ypos != NULL )
|
||||
{
|
||||
*ypos = _glfwInput.MousePosY;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwSetMousePos()
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwSetMousePos( int xpos, int ypos )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't do anything if the mouse position did not change
|
||||
if( xpos == _glfwInput.MousePosX && ypos == _glfwInput.MousePosY )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Set GLFW mouse position
|
||||
_glfwInput.MousePosX = xpos;
|
||||
_glfwInput.MousePosY = ypos;
|
||||
|
||||
// If we have a locked mouse, do not change cursor position
|
||||
if( _glfwWin.mouseLock )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Update physical cursor position
|
||||
_glfwPlatformSetMouseCursorPos( xpos, ypos );
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwGetMouseWheel()
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI int glfwGetMouseWheel( void )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Return mouse wheel position
|
||||
return _glfwInput.WheelPos;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwSetMouseWheel()
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwSetMouseWheel( int pos )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Set mouse wheel position
|
||||
_glfwInput.WheelPos = pos;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwSetKeyCallback() - Set callback function for keyboard input
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwSetKeyCallback( GLFWkeyfun cbfun )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Set callback function
|
||||
_glfwWin.keyCallback = cbfun;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwSetCharCallback() - Set callback function for character input
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwSetCharCallback( GLFWcharfun cbfun )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Set callback function
|
||||
_glfwWin.charCallback = cbfun;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwSetMouseButtonCallback() - Set callback function for mouse clicks
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Set callback function
|
||||
_glfwWin.mouseButtonCallback = cbfun;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwSetMousePosCallback() - Set callback function for mouse moves
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwSetMousePosCallback( GLFWmouseposfun cbfun )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Set callback function
|
||||
_glfwWin.mousePosCallback = cbfun;
|
||||
|
||||
// Call the callback function to let the application know the current
|
||||
// mouse position
|
||||
if( cbfun )
|
||||
{
|
||||
cbfun( _glfwInput.MousePosX, _glfwInput.MousePosY );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwSetMouseWheelCallback() - Set callback function for mouse wheel
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized || !_glfwWin.opened )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Set callback function
|
||||
_glfwWin.mouseWheelCallback = cbfun;
|
||||
|
||||
// Call the callback function to let the application know the current
|
||||
// mouse wheel position
|
||||
if( cbfun )
|
||||
{
|
||||
cbfun( _glfwInput.WheelPos );
|
||||
}
|
||||
}
|
||||
|
||||
+221
@@ -0,0 +1,221 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Any
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//========================================================================
|
||||
|
||||
#ifndef _internal_h_
|
||||
#define _internal_h_
|
||||
|
||||
//========================================================================
|
||||
// GLFWGLOBAL is a macro that places all global variables in the init.c
|
||||
// module (all other modules reference global variables as 'extern')
|
||||
//========================================================================
|
||||
|
||||
#if defined( _init_c_ )
|
||||
#define GLFWGLOBAL
|
||||
#else
|
||||
#define GLFWGLOBAL extern
|
||||
#endif
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Input handling definitions
|
||||
//========================================================================
|
||||
|
||||
// Internal key and button state/action definitions
|
||||
#define GLFW_STICK 2
|
||||
|
||||
|
||||
//========================================================================
|
||||
// System independent include files
|
||||
//========================================================================
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Window opening hints (set by glfwOpenWindowHint)
|
||||
// A bucket of semi-random stuff bunched together for historical reasons
|
||||
// This is used only by the platform independent code and only to store
|
||||
// parameters passed to us by glfwOpenWindowHint
|
||||
//------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
int refreshRate;
|
||||
int accumRedBits;
|
||||
int accumGreenBits;
|
||||
int accumBlueBits;
|
||||
int accumAlphaBits;
|
||||
int auxBuffers;
|
||||
int stereo;
|
||||
int windowNoResize;
|
||||
int samples;
|
||||
int glMajor;
|
||||
int glMinor;
|
||||
int glForward;
|
||||
int glDebug;
|
||||
int glProfile;
|
||||
} _GLFWhints;
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Platform specific definitions goes in platform.h (which also includes
|
||||
// glfw.h)
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
#include "platform.h"
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Parameters relating to the creation of the context and window but not
|
||||
// directly related to the properties of the framebuffer
|
||||
// This is used to pass window and context creation parameters from the
|
||||
// platform independent code to the platform specific code
|
||||
//------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
int mode;
|
||||
int refreshRate;
|
||||
int windowNoResize;
|
||||
int glMajor;
|
||||
int glMinor;
|
||||
int glForward;
|
||||
int glDebug;
|
||||
int glProfile;
|
||||
} _GLFWwndconfig;
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Framebuffer configuration descriptor, i.e. buffers and their sizes
|
||||
// Also a platform specific ID used to map back to the actual backend APIs
|
||||
// This is used to pass framebuffer parameters from the platform independent
|
||||
// code to the platform specific code, and also to enumerate and select
|
||||
// available framebuffer configurations
|
||||
//------------------------------------------------------------------------
|
||||
typedef struct {
|
||||
int redBits;
|
||||
int greenBits;
|
||||
int blueBits;
|
||||
int alphaBits;
|
||||
int depthBits;
|
||||
int stencilBits;
|
||||
int accumRedBits;
|
||||
int accumGreenBits;
|
||||
int accumBlueBits;
|
||||
int accumAlphaBits;
|
||||
int auxBuffers;
|
||||
int stereo;
|
||||
int samples;
|
||||
GLFWintptr platformID;
|
||||
} _GLFWfbconfig;
|
||||
|
||||
|
||||
//========================================================================
|
||||
// System independent global variables (GLFW internals)
|
||||
//========================================================================
|
||||
|
||||
// Flag indicating if GLFW has been initialized
|
||||
#if defined( _init_c_ )
|
||||
int _glfwInitialized = 0;
|
||||
#else
|
||||
GLFWGLOBAL int _glfwInitialized;
|
||||
#endif
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Prototypes for platform specific implementation functions
|
||||
//========================================================================
|
||||
|
||||
// Init/terminate
|
||||
int _glfwPlatformInit( void );
|
||||
int _glfwPlatformTerminate( void );
|
||||
|
||||
// Enable/Disable
|
||||
void _glfwPlatformEnableSystemKeys( void );
|
||||
void _glfwPlatformDisableSystemKeys( void );
|
||||
|
||||
// Fullscreen
|
||||
int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount );
|
||||
void _glfwPlatformGetDesktopMode( GLFWvidmode *mode );
|
||||
|
||||
// OpenGL extensions
|
||||
int _glfwPlatformExtensionSupported( const char *extension );
|
||||
void * _glfwPlatformGetProcAddress( const char *procname );
|
||||
|
||||
// Joystick
|
||||
int _glfwPlatformGetJoystickParam( int joy, int param );
|
||||
int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes );
|
||||
int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons );
|
||||
|
||||
// Time
|
||||
double _glfwPlatformGetTime( void );
|
||||
void _glfwPlatformSetTime( double time );
|
||||
|
||||
// Window management
|
||||
int _glfwPlatformOpenWindow( int width, int height, const _GLFWwndconfig *wndconfig, const _GLFWfbconfig *fbconfig );
|
||||
void _glfwPlatformCloseWindow( void );
|
||||
void _glfwPlatformSetWindowTitle( const char *title );
|
||||
void _glfwPlatformSetWindowSize( int width, int height );
|
||||
void _glfwPlatformSetWindowPos( int x, int y );
|
||||
void _glfwPlatformIconifyWindow( void );
|
||||
void _glfwPlatformRestoreWindow( void );
|
||||
void _glfwPlatformSwapBuffers( void );
|
||||
void _glfwPlatformSwapInterval( int interval );
|
||||
void _glfwPlatformRefreshWindowParams( void );
|
||||
void _glfwPlatformPollEvents( void );
|
||||
void _glfwPlatformWaitEvents( void );
|
||||
void _glfwPlatformHideMouseCursor( void );
|
||||
void _glfwPlatformShowMouseCursor( void );
|
||||
void _glfwPlatformSetMouseCursorPos( int x, int y );
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Prototypes for platform independent internal functions
|
||||
//========================================================================
|
||||
|
||||
// Window management (window.c)
|
||||
void _glfwClearWindowHints( void );
|
||||
|
||||
// Input handling (window.c)
|
||||
void _glfwClearInput( void );
|
||||
void _glfwInputDeactivation( void );
|
||||
void _glfwInputKey( int key, int action );
|
||||
void _glfwInputChar( int character, int action );
|
||||
void _glfwInputMouseClick( int button, int action );
|
||||
|
||||
// OpenGL extensions (glext.c)
|
||||
void _glfwParseGLVersion( int *major, int *minor, int *rev );
|
||||
int _glfwStringInExtensionString( const char *string, const GLubyte *extensions );
|
||||
|
||||
// Framebuffer configs
|
||||
const _GLFWfbconfig *_glfwChooseFBConfig( const _GLFWfbconfig *desired,
|
||||
const _GLFWfbconfig *alternatives,
|
||||
unsigned int count );
|
||||
|
||||
|
||||
#endif // _internal_h_
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Any
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW user functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// glfwGetJoystickParam() - Determine joystick capabilities
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI int glfwGetJoystickParam( int joy, int param )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return _glfwPlatformGetJoystickParam( joy, param );
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwGetJoystickPos() - Get joystick axis positions
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI int glfwGetJoystickPos( int joy, float *pos, int numaxes )
|
||||
{
|
||||
int i;
|
||||
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Clear positions
|
||||
for( i = 0; i < numaxes; i++ )
|
||||
{
|
||||
pos[ i ] = 0.0f;
|
||||
}
|
||||
|
||||
return _glfwPlatformGetJoystickPos( joy, pos, numaxes );
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwGetJoystickButtons() - Get joystick button states
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI int glfwGetJoystickButtons( int joy,
|
||||
unsigned char *buttons,
|
||||
int numbuttons )
|
||||
{
|
||||
int i;
|
||||
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Clear button states
|
||||
for( i = 0; i < numbuttons; i++ )
|
||||
{
|
||||
buttons[ i ] = GLFW_RELEASE;
|
||||
}
|
||||
|
||||
return _glfwPlatformGetJoystickButtons( joy, buttons, numbuttons );
|
||||
}
|
||||
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Any
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW user functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// glfwGetTime() - Return timer value in seconds
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI double glfwGetTime( void )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized )
|
||||
{
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
return _glfwPlatformGetTime();
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// glfwSetTime() - Set timer value in seconds
|
||||
//========================================================================
|
||||
|
||||
GLFWAPI void glfwSetTime( double time )
|
||||
{
|
||||
// Is GLFW initialized?
|
||||
if( !_glfwInitialized )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_glfwPlatformSetTime( time );
|
||||
}
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
|
||||
if(CYGWIN)
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/libglfw.pc.cmake
|
||||
${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc @ONLY)
|
||||
|
||||
# These lines are intended to remove the --export-all-symbols
|
||||
# flag added in the Modules/Platform/CYGWIN.cmake file of the
|
||||
# CMake distribution.
|
||||
# This is a HACK. If you have trouble _linking_ the GLFW
|
||||
# _shared_ library on Cygwin, try disabling this.
|
||||
set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-shared")
|
||||
set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS ${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS})
|
||||
|
||||
endif(CYGWIN)
|
||||
|
||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/lib)
|
||||
|
||||
set(libglfw_SOURCES
|
||||
${common_SOURCES}
|
||||
win32_enable.c
|
||||
win32_fullscreen.c
|
||||
win32_glext.c
|
||||
win32_init.c
|
||||
win32_joystick.c
|
||||
win32_time.c
|
||||
win32_window.c
|
||||
win32_dllmain.c)
|
||||
|
||||
add_library(libglfwStatic STATIC ${libglfw_SOURCES})
|
||||
add_library(libglfwShared SHARED glfwdll.def ${libglfw_SOURCES})
|
||||
|
||||
target_link_libraries(libglfwShared ${OPENGL_gl_LIBRARY})
|
||||
set_target_properties(libglfwShared PROPERTIES
|
||||
DEFINE_SYMBOL GLFW_BUILD_DLL
|
||||
PREFIX ""
|
||||
IMPORT_PREFIX ""
|
||||
IMPORT_SUFFIX "dll.lib")
|
||||
|
||||
set_target_properties(libglfwStatic libglfwShared PROPERTIES
|
||||
CLEAN_DIRECT_OUTPUT 1
|
||||
OUTPUT_NAME glfw)
|
||||
|
||||
if(CYGWIN)
|
||||
# Build for the regular Win32 environment (not Cygwin)
|
||||
set_target_properties(libglfwStatic libglfwShared PROPERTIES COMPILE_FLAGS "-mwin32 -mno-cygwin")
|
||||
set_target_properties(libglfwStatic libglfwShared PROPERTIES LINK_FLAGS "-mwin32 -mno-cygwin")
|
||||
endif(CYGWIN)
|
||||
|
||||
install(TARGETS libglfwStatic libglfwShared DESTINATION lib)
|
||||
|
||||
if(CYGWIN)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc DESTINATION lib/pkgconfig)
|
||||
endif(CYGWIN)
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
LIBRARY GLFW.DLL
|
||||
|
||||
EXPORTS
|
||||
glfwCloseWindow
|
||||
glfwDisable
|
||||
glfwEnable
|
||||
glfwExtensionSupported
|
||||
glfwGetDesktopMode
|
||||
glfwGetGLVersion
|
||||
glfwGetJoystickButtons
|
||||
glfwGetJoystickParam
|
||||
glfwGetJoystickPos
|
||||
glfwGetKey
|
||||
glfwGetMouseButton
|
||||
glfwGetMousePos
|
||||
glfwGetMouseWheel
|
||||
glfwGetProcAddress
|
||||
glfwGetTime
|
||||
glfwGetVersion
|
||||
glfwGetVideoModes
|
||||
glfwGetWindowParam
|
||||
glfwGetWindowSize
|
||||
glfwIconifyWindow
|
||||
glfwInit
|
||||
glfwOpenWindow
|
||||
glfwOpenWindowHint
|
||||
glfwPollEvents
|
||||
glfwRestoreWindow
|
||||
glfwSetCharCallback
|
||||
glfwSetKeyCallback
|
||||
glfwSetMouseButtonCallback
|
||||
glfwSetMousePos
|
||||
glfwSetMousePosCallback
|
||||
glfwSetMouseWheel
|
||||
glfwSetMouseWheelCallback
|
||||
glfwSetTime
|
||||
glfwSetWindowCloseCallback
|
||||
glfwSetWindowRefreshCallback
|
||||
glfwSetWindowPos
|
||||
glfwSetWindowSize
|
||||
glfwSetWindowSizeCallback
|
||||
glfwSetWindowTitle
|
||||
glfwSwapBuffers
|
||||
glfwSwapInterval
|
||||
glfwTerminate
|
||||
glfwWaitEvents
|
||||
@@ -0,0 +1,46 @@
|
||||
LIBRARY GLFW.DLL
|
||||
|
||||
EXPORTS
|
||||
glfwCloseWindow = glfwCloseWindow@0
|
||||
glfwDisable = glfwDisable@4
|
||||
glfwEnable = glfwEnable@4
|
||||
glfwExtensionSupported = glfwExtensionSupported@4
|
||||
glfwGetDesktopMode = glfwGetDesktopMode@4
|
||||
glfwGetGLVersion = glfwGetGLVersion@12
|
||||
glfwGetJoystickButtons = glfwGetJoystickButtons@12
|
||||
glfwGetJoystickParam = glfwGetJoystickParam@8
|
||||
glfwGetJoystickPos = glfwGetJoystickPos@12
|
||||
glfwGetKey = glfwGetKey@4
|
||||
glfwGetMouseButton = glfwGetMouseButton@4
|
||||
glfwGetMousePos = glfwGetMousePos@8
|
||||
glfwGetMouseWheel = glfwGetMouseWheel@0
|
||||
glfwGetProcAddress = glfwGetProcAddress@4
|
||||
glfwGetTime = glfwGetTime@0
|
||||
glfwGetVersion = glfwGetVersion@12
|
||||
glfwGetVideoModes = glfwGetVideoModes@8
|
||||
glfwGetWindowParam = glfwGetWindowParam@4
|
||||
glfwGetWindowSize = glfwGetWindowSize@8
|
||||
glfwIconifyWindow = glfwIconifyWindow@0
|
||||
glfwInit = glfwInit@0
|
||||
glfwOpenWindow = glfwOpenWindow@36
|
||||
glfwOpenWindowHint = glfwOpenWindowHint@8
|
||||
glfwPollEvents = glfwPollEvents@0
|
||||
glfwRestoreWindow = glfwRestoreWindow@0
|
||||
glfwSetCharCallback = glfwSetCharCallback@4
|
||||
glfwSetKeyCallback = glfwSetKeyCallback@4
|
||||
glfwSetMouseButtonCallback = glfwSetMouseButtonCallback@4
|
||||
glfwSetMousePos = glfwSetMousePos@8
|
||||
glfwSetMousePosCallback = glfwSetMousePosCallback@4
|
||||
glfwSetMouseWheel = glfwSetMouseWheel@4
|
||||
glfwSetMouseWheelCallback = glfwSetMouseWheelCallback@4
|
||||
glfwSetTime = glfwSetTime@8
|
||||
glfwSetWindowCloseCallback = glfwSetWindowCloseCallback@4
|
||||
glfwSetWindowRefreshCallback = glfwSetWindowRefreshCallback@4
|
||||
glfwSetWindowPos = glfwSetWindowPos@8
|
||||
glfwSetWindowSize = glfwSetWindowSize@8
|
||||
glfwSetWindowSizeCallback = glfwSetWindowSizeCallback@4
|
||||
glfwSetWindowTitle = glfwSetWindowTitle@4
|
||||
glfwSwapBuffers = glfwSwapBuffers@0
|
||||
glfwSwapInterval = glfwSwapInterval@4
|
||||
glfwTerminate = glfwTerminate@0
|
||||
glfwWaitEvents = glfwWaitEvents@0
|
||||
@@ -0,0 +1,46 @@
|
||||
LIBRARY GLFW.DLL
|
||||
|
||||
EXPORTS
|
||||
glfwCloseWindow@0
|
||||
glfwDisable@4
|
||||
glfwEnable@4
|
||||
glfwExtensionSupported@4
|
||||
glfwGetDesktopMode@4
|
||||
glfwGetGLVersion@12
|
||||
glfwGetJoystickButtons@12
|
||||
glfwGetJoystickParam@8
|
||||
glfwGetJoystickPos@12
|
||||
glfwGetKey@4
|
||||
glfwGetMouseButton@4
|
||||
glfwGetMousePos@8
|
||||
glfwGetMouseWheel@0
|
||||
glfwGetProcAddress@4
|
||||
glfwGetTime@0
|
||||
glfwGetVersion@12
|
||||
glfwGetVideoModes@8
|
||||
glfwGetWindowParam@4
|
||||
glfwGetWindowSize@8
|
||||
glfwIconifyWindow@0
|
||||
glfwInit@0
|
||||
glfwOpenWindow@36
|
||||
glfwOpenWindowHint@8
|
||||
glfwPollEvents@0
|
||||
glfwRestoreWindow@0
|
||||
glfwSetCharCallback@4
|
||||
glfwSetKeyCallback@4
|
||||
glfwSetMouseButtonCallback@4
|
||||
glfwSetMousePos@8
|
||||
glfwSetMousePosCallback@4
|
||||
glfwSetMouseWheel@4
|
||||
glfwSetMouseWheelCallback@4
|
||||
glfwSetTime@8
|
||||
glfwSetWindowCloseCallback@4
|
||||
glfwSetWindowRefreshCallback@4
|
||||
glfwSetWindowPos@8
|
||||
glfwSetWindowSize@8
|
||||
glfwSetWindowSizeCallback@4
|
||||
glfwSetWindowTitle@4
|
||||
glfwSwapBuffers@0
|
||||
glfwSwapInterval@4
|
||||
glfwTerminate@0
|
||||
glfwWaitEvents@0
|
||||
@@ -0,0 +1,11 @@
|
||||
prefix=@CMAKE_INSTALL_PREFIX@
|
||||
exec_prefix=${prefix}
|
||||
libdir=${exec_prefix}/lib
|
||||
includedir=${prefix}/include
|
||||
|
||||
Name: GLFW
|
||||
Description: A portable framework for OpenGL development
|
||||
Version: 2.7
|
||||
URL: http://glfw.sourceforge.net/
|
||||
Libs: -L${libdir} -lglfw @GLFW_LIBRARIES@
|
||||
Cflags: -I${includedir} -mwin32
|
||||
@@ -0,0 +1,480 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Win32/WGL
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//========================================================================
|
||||
|
||||
#ifndef _platform_h_
|
||||
#define _platform_h_
|
||||
|
||||
|
||||
// This is the Windows version of GLFW
|
||||
#define _GLFW_WIN32
|
||||
|
||||
// We don't need all the fancy stuff
|
||||
#define NOMINMAX
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define VC_EXTRALEAN
|
||||
|
||||
// Include files
|
||||
#include <windows.h>
|
||||
#include <mmsystem.h>
|
||||
#include "../../include/GL/glfw.h"
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Hack: Define things that some <windows.h>'s do not define
|
||||
//========================================================================
|
||||
|
||||
// Some old versions of w32api (used by MinGW and Cygwin) define
|
||||
// WH_KEYBOARD_LL without typedef:ing KBDLLHOOKSTRUCT (!)
|
||||
#if defined(__MINGW32__) || defined(__CYGWIN__)
|
||||
#include <w32api.h>
|
||||
#if defined(WH_KEYBOARD_LL) && (__W32API_MAJOR_VERSION == 1) && (__W32API_MINOR_VERSION <= 2)
|
||||
#undef WH_KEYBOARD_LL
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// ** NOTE ** If this gives you compiler errors and you are using MinGW
|
||||
// (or Dev-C++), update to w32api version 1.3 or later:
|
||||
// http://sourceforge.net/project/showfiles.php?group_id=2435
|
||||
//------------------------------------------------------------------------
|
||||
#ifndef WH_KEYBOARD_LL
|
||||
#define WH_KEYBOARD_LL 13
|
||||
typedef struct tagKBDLLHOOKSTRUCT {
|
||||
DWORD vkCode;
|
||||
DWORD scanCode;
|
||||
DWORD flags;
|
||||
DWORD time;
|
||||
DWORD dwExtraInfo;
|
||||
} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
|
||||
#endif // WH_KEYBOARD_LL
|
||||
|
||||
#ifndef LLKHF_ALTDOWN
|
||||
#define LLKHF_ALTDOWN 0x00000020
|
||||
#endif
|
||||
|
||||
#ifndef SPI_SETSCREENSAVERRUNNING
|
||||
#define SPI_SETSCREENSAVERRUNNING 97
|
||||
#endif
|
||||
#ifndef SPI_GETANIMATION
|
||||
#define SPI_GETANIMATION 72
|
||||
#endif
|
||||
#ifndef SPI_SETANIMATION
|
||||
#define SPI_SETANIMATION 73
|
||||
#endif
|
||||
#ifndef SPI_GETFOREGROUNDLOCKTIMEOUT
|
||||
#define SPI_GETFOREGROUNDLOCKTIMEOUT 0x2000
|
||||
#endif
|
||||
#ifndef SPI_SETFOREGROUNDLOCKTIMEOUT
|
||||
#define SPI_SETFOREGROUNDLOCKTIMEOUT 0x2001
|
||||
#endif
|
||||
|
||||
#ifndef CDS_FULLSCREEN
|
||||
#define CDS_FULLSCREEN 4
|
||||
#endif
|
||||
|
||||
#ifndef PFD_GENERIC_ACCELERATED
|
||||
#define PFD_GENERIC_ACCELERATED 0x00001000
|
||||
#endif
|
||||
#ifndef PFD_DEPTH_DONTCARE
|
||||
#define PFD_DEPTH_DONTCARE 0x20000000
|
||||
#endif
|
||||
|
||||
#ifndef ENUM_CURRENT_SETTINGS
|
||||
#define ENUM_CURRENT_SETTINGS -1
|
||||
#endif
|
||||
#ifndef ENUM_REGISTRY_SETTINGS
|
||||
#define ENUM_REGISTRY_SETTINGS -2
|
||||
#endif
|
||||
|
||||
#ifndef WM_MOUSEWHEEL
|
||||
#define WM_MOUSEWHEEL 0x020A
|
||||
#endif
|
||||
#ifndef WHEEL_DELTA
|
||||
#define WHEEL_DELTA 120
|
||||
#endif
|
||||
|
||||
#ifndef WM_XBUTTONDOWN
|
||||
#define WM_XBUTTONDOWN 0x020B
|
||||
#endif
|
||||
#ifndef WM_XBUTTONUP
|
||||
#define WM_XBUTTONUP 0x020C
|
||||
#endif
|
||||
#ifndef XBUTTON1
|
||||
#define XBUTTON1 1
|
||||
#endif
|
||||
#ifndef XBUTTON2
|
||||
#define XBUTTON2 2
|
||||
#endif
|
||||
|
||||
#ifndef WGL_ARB_pixel_format
|
||||
|
||||
// wglSwapIntervalEXT typedef (Win32 buffer-swap interval control)
|
||||
typedef int (APIENTRY * WGLSWAPINTERVALEXT_T) (int);
|
||||
// wglGetPixelFormatAttribivARB typedef
|
||||
typedef BOOL (WINAPI * WGLGETPIXELFORMATATTRIBIVARB_T) (HDC, int, int, UINT, const int *, int *);
|
||||
// wglGetExtensionStringEXT typedef
|
||||
typedef const char *(APIENTRY * WGLGETEXTENSIONSSTRINGEXT_T)( void );
|
||||
// wglGetExtensionStringARB typedef
|
||||
typedef const char *(APIENTRY * WGLGETEXTENSIONSSTRINGARB_T)( HDC );
|
||||
|
||||
/* Constants for wglGetPixelFormatAttribivARB */
|
||||
#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
|
||||
#define WGL_DRAW_TO_WINDOW_ARB 0x2001
|
||||
#define WGL_SUPPORT_OPENGL_ARB 0x2010
|
||||
#define WGL_ACCELERATION_ARB 0x2003
|
||||
#define WGL_DOUBLE_BUFFER_ARB 0x2011
|
||||
#define WGL_STEREO_ARB 0x2012
|
||||
#define WGL_PIXEL_TYPE_ARB 0x2013
|
||||
#define WGL_COLOR_BITS_ARB 0x2014
|
||||
#define WGL_RED_BITS_ARB 0x2015
|
||||
#define WGL_GREEN_BITS_ARB 0x2017
|
||||
#define WGL_BLUE_BITS_ARB 0x2019
|
||||
#define WGL_ALPHA_BITS_ARB 0x201B
|
||||
#define WGL_ACCUM_BITS_ARB 0x201D
|
||||
#define WGL_ACCUM_RED_BITS_ARB 0x201E
|
||||
#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
|
||||
#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
|
||||
#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
|
||||
#define WGL_DEPTH_BITS_ARB 0x2022
|
||||
#define WGL_STENCIL_BITS_ARB 0x2023
|
||||
#define WGL_AUX_BUFFERS_ARB 0x2024
|
||||
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
||||
#define WGL_SAMPLES_ARB 0x2042
|
||||
|
||||
/* Constants for WGL_ACCELERATION_ARB */
|
||||
#define WGL_NO_ACCELERATION_ARB 0x2025
|
||||
#define WGL_GENERIC_ACCELERATION_ARB 0x2026
|
||||
#define WGL_FULL_ACCELERATION_ARB 0x2027
|
||||
|
||||
/* Constants for WGL_PIXEL_TYPE_ARB */
|
||||
#define WGL_TYPE_RGBA_ARB 0x202B
|
||||
#define WGL_TYPE_COLORINDEX_ARB 0x202C
|
||||
|
||||
#endif /*WGL_ARB_pixel_format*/
|
||||
|
||||
|
||||
#ifndef WGL_ARB_create_context
|
||||
|
||||
/* wglCreateContextAttribsARB */
|
||||
typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC, HGLRC, const int *);
|
||||
|
||||
/* Tokens for wglCreateContextAttribsARB attributes */
|
||||
#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
|
||||
#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
|
||||
#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
|
||||
#define WGL_CONTEXT_FLAGS_ARB 0x2094
|
||||
#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
|
||||
|
||||
/* Bits for WGL_CONTEXT_FLAGS_ARB */
|
||||
#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001
|
||||
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
|
||||
|
||||
/* Bits for WGL_CONTEXT_PROFILE_MASK_ARB */
|
||||
#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
|
||||
#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
|
||||
|
||||
#endif /*WGL_ARB_create_context*/
|
||||
|
||||
|
||||
#ifndef GL_VERSION_3_0
|
||||
|
||||
typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint);
|
||||
|
||||
#endif /*GL_VERSION_3_0*/
|
||||
|
||||
|
||||
//========================================================================
|
||||
// DLLs that are loaded at glfwInit()
|
||||
//========================================================================
|
||||
|
||||
// gdi32.dll function pointer typedefs
|
||||
#ifndef _GLFW_NO_DLOAD_GDI32
|
||||
typedef int (WINAPI * CHOOSEPIXELFORMAT_T) (HDC,CONST PIXELFORMATDESCRIPTOR*);
|
||||
typedef int (WINAPI * DESCRIBEPIXELFORMAT_T) (HDC,int,UINT,LPPIXELFORMATDESCRIPTOR);
|
||||
typedef int (WINAPI * GETPIXELFORMAT_T) (HDC);
|
||||
typedef BOOL (WINAPI * SETPIXELFORMAT_T) (HDC,int,const PIXELFORMATDESCRIPTOR*);
|
||||
typedef BOOL (WINAPI * SWAPBUFFERS_T) (HDC);
|
||||
#endif // _GLFW_NO_DLOAD_GDI32
|
||||
|
||||
// winmm.dll function pointer typedefs
|
||||
#ifndef _GLFW_NO_DLOAD_WINMM
|
||||
typedef MMRESULT (WINAPI * JOYGETDEVCAPSA_T) (UINT,LPJOYCAPSA,UINT);
|
||||
typedef MMRESULT (WINAPI * JOYGETPOS_T) (UINT,LPJOYINFO);
|
||||
typedef MMRESULT (WINAPI * JOYGETPOSEX_T) (UINT,LPJOYINFOEX);
|
||||
typedef DWORD (WINAPI * TIMEGETTIME_T) (void);
|
||||
#endif // _GLFW_NO_DLOAD_WINMM
|
||||
|
||||
|
||||
// gdi32.dll shortcuts
|
||||
#ifndef _GLFW_NO_DLOAD_GDI32
|
||||
#define _glfw_ChoosePixelFormat _glfwLibrary.Libs.ChoosePixelFormat
|
||||
#define _glfw_DescribePixelFormat _glfwLibrary.Libs.DescribePixelFormat
|
||||
#define _glfw_GetPixelFormat _glfwLibrary.Libs.GetPixelFormat
|
||||
#define _glfw_SetPixelFormat _glfwLibrary.Libs.SetPixelFormat
|
||||
#define _glfw_SwapBuffers _glfwLibrary.Libs.SwapBuffers
|
||||
#else
|
||||
#define _glfw_ChoosePixelFormat ChoosePixelFormat
|
||||
#define _glfw_DescribePixelFormat DescribePixelFormat
|
||||
#define _glfw_GetPixelFormat GetPixelFormat
|
||||
#define _glfw_SetPixelFormat SetPixelFormat
|
||||
#define _glfw_SwapBuffers SwapBuffers
|
||||
#endif // _GLFW_NO_DLOAD_GDI32
|
||||
|
||||
// winmm.dll shortcuts
|
||||
#ifndef _GLFW_NO_DLOAD_WINMM
|
||||
#define _glfw_joyGetDevCaps _glfwLibrary.Libs.joyGetDevCapsA
|
||||
#define _glfw_joyGetPos _glfwLibrary.Libs.joyGetPos
|
||||
#define _glfw_joyGetPosEx _glfwLibrary.Libs.joyGetPosEx
|
||||
#define _glfw_timeGetTime _glfwLibrary.Libs.timeGetTime
|
||||
#else
|
||||
#define _glfw_joyGetDevCaps joyGetDevCapsA
|
||||
#define _glfw_joyGetPos joyGetPos
|
||||
#define _glfw_joyGetPosEx joyGetPosEx
|
||||
#define _glfw_timeGetTime timeGetTime
|
||||
#endif // _GLFW_NO_DLOAD_WINMM
|
||||
|
||||
|
||||
//========================================================================
|
||||
// GLFW platform specific types
|
||||
//========================================================================
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Pointer length integer
|
||||
//------------------------------------------------------------------------
|
||||
typedef INT_PTR GLFWintptr;
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Window structure
|
||||
//------------------------------------------------------------------------
|
||||
typedef struct _GLFWwin_struct _GLFWwin;
|
||||
|
||||
struct _GLFWwin_struct {
|
||||
|
||||
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||
|
||||
// User callback functions
|
||||
GLFWwindowsizefun windowSizeCallback;
|
||||
GLFWwindowclosefun windowCloseCallback;
|
||||
GLFWwindowrefreshfun windowRefreshCallback;
|
||||
GLFWmousebuttonfun mouseButtonCallback;
|
||||
GLFWmouseposfun mousePosCallback;
|
||||
GLFWmousewheelfun mouseWheelCallback;
|
||||
GLFWkeyfun keyCallback;
|
||||
GLFWcharfun charCallback;
|
||||
|
||||
// User selected window settings
|
||||
int fullscreen; // Fullscreen flag
|
||||
int mouseLock; // Mouse-lock flag
|
||||
int autoPollEvents; // Auto polling flag
|
||||
int sysKeysDisabled; // System keys disabled flag
|
||||
int windowNoResize; // Resize- and maximize gadgets disabled flag
|
||||
int refreshRate; // Vertical monitor refresh rate
|
||||
|
||||
// Window status & parameters
|
||||
int opened; // Flag telling if window is opened or not
|
||||
int active; // Application active flag
|
||||
int iconified; // Window iconified flag
|
||||
int width, height; // Window width and heigth
|
||||
int accelerated; // GL_TRUE if window is HW accelerated
|
||||
|
||||
// Framebuffer attributes
|
||||
int redBits;
|
||||
int greenBits;
|
||||
int blueBits;
|
||||
int alphaBits;
|
||||
int depthBits;
|
||||
int stencilBits;
|
||||
int accumRedBits;
|
||||
int accumGreenBits;
|
||||
int accumBlueBits;
|
||||
int accumAlphaBits;
|
||||
int auxBuffers;
|
||||
int stereo;
|
||||
int samples;
|
||||
|
||||
// OpenGL extensions and context attributes
|
||||
int has_GL_SGIS_generate_mipmap;
|
||||
int has_GL_ARB_texture_non_power_of_two;
|
||||
int glMajor, glMinor, glRevision;
|
||||
int glForward, glDebug, glProfile;
|
||||
|
||||
PFNGLGETSTRINGIPROC GetStringi;
|
||||
|
||||
|
||||
// ========= PLATFORM SPECIFIC PART ======================================
|
||||
|
||||
// Platform specific window resources
|
||||
HDC DC; // Private GDI device context
|
||||
HGLRC context; // Permanent rendering context
|
||||
HWND window; // Window handle
|
||||
ATOM classAtom; // Window class atom
|
||||
int modeID; // Mode ID for fullscreen mode
|
||||
HHOOK keyboardHook; // Keyboard hook handle
|
||||
DWORD dwStyle; // Window styles used for window creation
|
||||
DWORD dwExStyle; // --"--
|
||||
|
||||
// Platform specific extensions (context specific)
|
||||
WGLSWAPINTERVALEXT_T SwapIntervalEXT;
|
||||
WGLGETPIXELFORMATATTRIBIVARB_T GetPixelFormatAttribivARB;
|
||||
WGLGETEXTENSIONSSTRINGEXT_T GetExtensionsStringEXT;
|
||||
WGLGETEXTENSIONSSTRINGARB_T GetExtensionsStringARB;
|
||||
PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
|
||||
GLboolean has_WGL_EXT_swap_control;
|
||||
GLboolean has_WGL_ARB_multisample;
|
||||
GLboolean has_WGL_ARB_pixel_format;
|
||||
GLboolean has_WGL_ARB_create_context;
|
||||
|
||||
// Various platform specific internal variables
|
||||
int oldMouseLock; // Old mouse-lock flag (used for remembering
|
||||
// mouse-lock state when iconifying)
|
||||
int oldMouseLockValid;
|
||||
int desiredRefreshRate; // Desired vertical monitor refresh rate
|
||||
|
||||
};
|
||||
|
||||
GLFWGLOBAL _GLFWwin _glfwWin;
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// User input status (most of this should go in _GLFWwin)
|
||||
//------------------------------------------------------------------------
|
||||
GLFWGLOBAL struct {
|
||||
|
||||
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||
|
||||
// Mouse status
|
||||
int MousePosX, MousePosY;
|
||||
int WheelPos;
|
||||
char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];
|
||||
|
||||
// Keyboard status
|
||||
char Key[ GLFW_KEY_LAST+1 ];
|
||||
int LastChar;
|
||||
|
||||
// User selected settings
|
||||
int StickyKeys;
|
||||
int StickyMouseButtons;
|
||||
int KeyRepeat;
|
||||
|
||||
|
||||
// ========= PLATFORM SPECIFIC PART ======================================
|
||||
|
||||
// Platform specific internal variables
|
||||
int MouseMoved, OldMouseX, OldMouseY;
|
||||
|
||||
} _glfwInput;
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Library global data
|
||||
//------------------------------------------------------------------------
|
||||
GLFWGLOBAL struct {
|
||||
|
||||
// Window opening hints
|
||||
_GLFWhints hints;
|
||||
|
||||
// ========= PLATFORM SPECIFIC PART ======================================
|
||||
|
||||
HINSTANCE instance; // Instance of the application
|
||||
|
||||
// Timer data
|
||||
struct {
|
||||
int HasPerformanceCounter;
|
||||
double Resolution;
|
||||
unsigned int t0_32;
|
||||
__int64 t0_64;
|
||||
} Timer;
|
||||
|
||||
// System information
|
||||
struct {
|
||||
int winVer;
|
||||
int hasUnicode;
|
||||
DWORD foregroundLockTimeout;
|
||||
} Sys;
|
||||
|
||||
#if !defined(_GLFW_NO_DLOAD_WINMM) || !defined(_GLFW_NO_DLOAD_GDI32)
|
||||
// Library handles and function pointers
|
||||
struct {
|
||||
#ifndef _GLFW_NO_DLOAD_GDI32
|
||||
// gdi32.dll
|
||||
HINSTANCE gdi32;
|
||||
CHOOSEPIXELFORMAT_T ChoosePixelFormat;
|
||||
DESCRIBEPIXELFORMAT_T DescribePixelFormat;
|
||||
GETPIXELFORMAT_T GetPixelFormat;
|
||||
SETPIXELFORMAT_T SetPixelFormat;
|
||||
SWAPBUFFERS_T SwapBuffers;
|
||||
#endif // _GLFW_NO_DLOAD_GDI32
|
||||
|
||||
// winmm.dll
|
||||
#ifndef _GLFW_NO_DLOAD_WINMM
|
||||
HINSTANCE winmm;
|
||||
JOYGETDEVCAPSA_T joyGetDevCapsA;
|
||||
JOYGETPOS_T joyGetPos;
|
||||
JOYGETPOSEX_T joyGetPosEx;
|
||||
TIMEGETTIME_T timeGetTime;
|
||||
#endif // _GLFW_NO_DLOAD_WINMM
|
||||
} Libs;
|
||||
#endif
|
||||
|
||||
} _glfwLibrary;
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Various Windows version constants
|
||||
//========================================================================
|
||||
|
||||
#define _GLFW_WIN_UNKNOWN 0x0000 // Earlier than 95 or NT4
|
||||
#define _GLFW_WIN_95 0x0001
|
||||
#define _GLFW_WIN_98 0x0002
|
||||
#define _GLFW_WIN_ME 0x0003
|
||||
#define _GLFW_WIN_UNKNOWN_9x 0x0004 // Later than ME
|
||||
#define _GLFW_WIN_NT4 0x0101
|
||||
#define _GLFW_WIN_2K 0x0102
|
||||
#define _GLFW_WIN_XP 0x0103
|
||||
#define _GLFW_WIN_NET_SERVER 0x0104
|
||||
#define _GLFW_WIN_UNKNOWN_NT 0x0105 // Later than .NET Server
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Prototypes for platform specific internal functions
|
||||
//========================================================================
|
||||
|
||||
// Time
|
||||
void _glfwInitTimer( void );
|
||||
|
||||
// Fullscreen support
|
||||
int _glfwGetClosestVideoModeBPP( int *w, int *h, int *bpp, int *refresh );
|
||||
int _glfwGetClosestVideoMode( int *w, int *h, int *r, int *g, int *b, int *refresh );
|
||||
void _glfwSetVideoModeMODE( int mode );
|
||||
void _glfwSetVideoMode( int *w, int *h, int r, int g, int b, int refresh );
|
||||
|
||||
|
||||
#endif // _platform_h_
|
||||
@@ -0,0 +1,49 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Win32/WGL
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
#if defined(GLFW_BUILD_DLL)
|
||||
|
||||
//========================================================================
|
||||
// GLFW DLL entry point
|
||||
//========================================================================
|
||||
|
||||
BOOL WINAPI DllMain( HINSTANCE instance, DWORD reason, LPVOID reserved )
|
||||
{
|
||||
// NOTE: Some compilers complains about instance and x never being used -
|
||||
// never mind that (we don't want to use them)!
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif // GLFW_BUILD_DLL
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Win32/WGL
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW internal functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Low level keyboard hook (system callback) function
|
||||
// Used to disable system keys under Windows NT
|
||||
//========================================================================
|
||||
|
||||
static LRESULT CALLBACK keyboardHook( int nCode, WPARAM wParam, LPARAM lParam )
|
||||
{
|
||||
BOOL syskeys = FALSE;
|
||||
PKBDLLHOOKSTRUCT p;
|
||||
|
||||
// We are only looking for keyboard events - interpret lParam as a
|
||||
// pointer to a KBDLLHOOKSTRUCT
|
||||
p = (PKBDLLHOOKSTRUCT) lParam;
|
||||
|
||||
if( nCode == HC_ACTION )
|
||||
{
|
||||
// We have a keyboard event
|
||||
|
||||
switch( wParam )
|
||||
{
|
||||
case WM_KEYDOWN:
|
||||
case WM_SYSKEYDOWN:
|
||||
case WM_KEYUP:
|
||||
case WM_SYSKEYUP:
|
||||
// Detect: ALT+TAB, ALT+ESC, ALT+F4, CTRL+ESC,
|
||||
// LWIN, RWIN, APPS (mysterious menu key)
|
||||
syskeys = ( p->vkCode == VK_TAB &&
|
||||
p->flags & LLKHF_ALTDOWN ) ||
|
||||
( p->vkCode == VK_ESCAPE &&
|
||||
p->flags & LLKHF_ALTDOWN ) ||
|
||||
( p->vkCode == VK_F4 &&
|
||||
p->flags & LLKHF_ALTDOWN ) ||
|
||||
( p->vkCode == VK_ESCAPE &&
|
||||
(GetKeyState(VK_CONTROL) & 0x8000)) ||
|
||||
p->vkCode == VK_LWIN ||
|
||||
p->vkCode == VK_RWIN ||
|
||||
p->vkCode == VK_APPS;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Was it a system key combination (e.g. ALT+TAB)?
|
||||
if( syskeys )
|
||||
{
|
||||
// Pass the key event to our window message loop
|
||||
if( _glfwWin.opened )
|
||||
{
|
||||
PostMessage( _glfwWin.window, (UINT) wParam, p->vkCode, 0 );
|
||||
}
|
||||
|
||||
// We've taken care of it - don't let the system know about this
|
||||
// key event
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// It's a harmless key press, let the system deal with it
|
||||
return CallNextHookEx( _glfwWin.keyboardHook, nCode, wParam, lParam );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Enable system keys
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformEnableSystemKeys( void )
|
||||
{
|
||||
BOOL dummy;
|
||||
|
||||
// Use different methods depending on operating system version
|
||||
if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 )
|
||||
{
|
||||
if( _glfwWin.keyboardHook != NULL )
|
||||
{
|
||||
UnhookWindowsHookEx( _glfwWin.keyboardHook );
|
||||
_glfwWin.keyboardHook = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
(void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, FALSE, &dummy, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Disable system keys
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformDisableSystemKeys( void )
|
||||
{
|
||||
BOOL dummy;
|
||||
|
||||
// Use different methods depending on operating system version
|
||||
if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 )
|
||||
{
|
||||
// Under Windows NT, install a low level keyboard hook
|
||||
_glfwWin.keyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL,
|
||||
keyboardHook,
|
||||
_glfwLibrary.instance,
|
||||
0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Under Windows 95/98/ME, fool Windows that a screensaver
|
||||
// is running => prevents ALT+TAB, CTRL+ESC and CTRL+ALT+DEL
|
||||
(void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, TRUE, &dummy, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,320 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Win32/WGL
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW internal functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Convert BPP to RGB bits based on "best guess"
|
||||
//========================================================================
|
||||
|
||||
static void bpp2rgb( int bpp, int *r, int *g, int *b )
|
||||
{
|
||||
int delta;
|
||||
|
||||
// We assume that by 32 they really meant 24
|
||||
if( bpp == 32 )
|
||||
{
|
||||
bpp = 24;
|
||||
}
|
||||
|
||||
// Convert "bits per pixel" to red, green & blue sizes
|
||||
|
||||
*r = *g = *b = bpp / 3;
|
||||
delta = bpp - (*r * 3);
|
||||
if( delta >= 1 )
|
||||
{
|
||||
*g = *g + 1;
|
||||
}
|
||||
if( delta == 2 )
|
||||
{
|
||||
*r = *r + 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Return closest video mode by dimensions, refresh rate and bits per pixel
|
||||
//========================================================================
|
||||
|
||||
int _glfwGetClosestVideoModeBPP( int *w, int *h, int *bpp, int *refresh )
|
||||
{
|
||||
int mode, bestmode, match, bestmatch, rr, bestrr, success;
|
||||
DEVMODE dm;
|
||||
|
||||
// Find best match
|
||||
bestmatch = 0x7fffffff;
|
||||
bestrr = 0x7fffffff;
|
||||
mode = bestmode = 0;
|
||||
do
|
||||
{
|
||||
dm.dmSize = sizeof( DEVMODE );
|
||||
success = EnumDisplaySettings( NULL, mode, &dm );
|
||||
if( success )
|
||||
{
|
||||
match = dm.dmBitsPerPel - *bpp;
|
||||
if( match < 0 ) match = -match;
|
||||
match = ( match << 25 ) |
|
||||
( (dm.dmPelsWidth - *w) *
|
||||
(dm.dmPelsWidth - *w) +
|
||||
(dm.dmPelsHeight - *h) *
|
||||
(dm.dmPelsHeight - *h) );
|
||||
if( match < bestmatch )
|
||||
{
|
||||
bestmatch = match;
|
||||
bestmode = mode;
|
||||
bestrr = (dm.dmDisplayFrequency - *refresh) *
|
||||
(dm.dmDisplayFrequency - *refresh);
|
||||
}
|
||||
else if( match == bestmatch && *refresh > 0 )
|
||||
{
|
||||
rr = (dm.dmDisplayFrequency - *refresh) *
|
||||
(dm.dmDisplayFrequency - *refresh);
|
||||
if( rr < bestrr )
|
||||
{
|
||||
bestmatch = match;
|
||||
bestmode = mode;
|
||||
bestrr = rr;
|
||||
}
|
||||
}
|
||||
}
|
||||
mode ++;
|
||||
}
|
||||
while( success );
|
||||
|
||||
// Get the parameters for the best matching display mode
|
||||
dm.dmSize = sizeof( DEVMODE );
|
||||
(void) EnumDisplaySettings( NULL, bestmode, &dm );
|
||||
|
||||
// Fill out actual width and height
|
||||
*w = dm.dmPelsWidth;
|
||||
*h = dm.dmPelsHeight;
|
||||
|
||||
// Return bits per pixel
|
||||
*bpp = dm.dmBitsPerPel;
|
||||
|
||||
// Return vertical refresh rate
|
||||
*refresh = dm.dmDisplayFrequency;
|
||||
|
||||
return bestmode;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Return closest video mode by dimensions, refresh rate and channel sizes
|
||||
//========================================================================
|
||||
|
||||
static int getClosestVideoMode( int *w, int *h,
|
||||
int *r, int *g, int *b,
|
||||
int *refresh )
|
||||
{
|
||||
int bpp, bestmode;
|
||||
|
||||
// Colorbits = sum of red/green/blue bits
|
||||
bpp = *r + *g + *b;
|
||||
|
||||
// If colorbits < 15 (e.g. 0) or >= 24, default to 32 bpp
|
||||
if( bpp < 15 || bpp >= 24 )
|
||||
{
|
||||
bpp = 32;
|
||||
}
|
||||
|
||||
// Find best match
|
||||
bestmode = _glfwGetClosestVideoModeBPP( w, h, &bpp, refresh );
|
||||
|
||||
// Convert "bits per pixel" to red, green & blue sizes
|
||||
bpp2rgb( bpp, r, g, b );
|
||||
|
||||
return bestmode;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Change the current video mode
|
||||
//========================================================================
|
||||
|
||||
void _glfwSetVideoModeMODE( int mode )
|
||||
{
|
||||
DEVMODE dm;
|
||||
int success;
|
||||
|
||||
// Get the parameters for the best matching display mode
|
||||
dm.dmSize = sizeof( DEVMODE );
|
||||
(void) EnumDisplaySettings( NULL, mode, &dm );
|
||||
|
||||
// Set which fields we want to specify
|
||||
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;
|
||||
|
||||
// Do we have a prefered refresh rate?
|
||||
if( _glfwWin.desiredRefreshRate > 0 )
|
||||
{
|
||||
dm.dmFields = dm.dmFields | DM_DISPLAYFREQUENCY;
|
||||
dm.dmDisplayFrequency = _glfwWin.desiredRefreshRate;
|
||||
}
|
||||
|
||||
// Change display setting
|
||||
dm.dmSize = sizeof( DEVMODE );
|
||||
success = ChangeDisplaySettings( &dm, CDS_FULLSCREEN );
|
||||
|
||||
// If the mode change was not possible, query the current display
|
||||
// settings (we'll use the desktop resolution for fullscreen mode)
|
||||
if( success == DISP_CHANGE_SUCCESSFUL )
|
||||
{
|
||||
_glfwWin.modeID = mode;
|
||||
}
|
||||
else
|
||||
{
|
||||
_glfwWin.modeID = ENUM_REGISTRY_SETTINGS;
|
||||
EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dm );
|
||||
}
|
||||
|
||||
// Set the window size to that of the display mode
|
||||
_glfwWin.width = dm.dmPelsWidth;
|
||||
_glfwWin.height = dm.dmPelsHeight;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// _glfwSetVideoMode() - Change the current video mode
|
||||
//========================================================================
|
||||
|
||||
void _glfwSetVideoMode( int *w, int *h, int r, int g, int b, int refresh )
|
||||
{
|
||||
int bestmode;
|
||||
|
||||
// Find a best match mode
|
||||
bestmode = getClosestVideoMode( w, h, &r, &g, &b, &refresh );
|
||||
|
||||
// Change mode
|
||||
_glfwSetVideoModeMODE( bestmode );
|
||||
}
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW user functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// _glfwPlatformGetVideoModes() - Get a list of available video modes
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )
|
||||
{
|
||||
int count, success, mode, i, j;
|
||||
int m1, m2, bpp, r, g, b;
|
||||
DEVMODE dm;
|
||||
|
||||
// Loop through all video modes and extract all the UNIQUE modes
|
||||
count = 0;
|
||||
mode = 0;
|
||||
do
|
||||
{
|
||||
// Get video mode properties
|
||||
dm.dmSize = sizeof( DEVMODE );
|
||||
success = EnumDisplaySettings( NULL, mode, &dm );
|
||||
|
||||
// Is it a valid mode? (only list depths >= 15 bpp)
|
||||
if( success && dm.dmBitsPerPel >= 15 )
|
||||
{
|
||||
// Convert to RGB, and back to bpp ("mask out" alpha bits etc)
|
||||
bpp2rgb( dm.dmBitsPerPel, &r, &g, &b );
|
||||
bpp = r + g + b;
|
||||
|
||||
// Mode "code" for this mode
|
||||
m1 = (bpp << 25) | (dm.dmPelsWidth * dm.dmPelsHeight);
|
||||
|
||||
// Insert mode in list (sorted), and avoid duplicates
|
||||
for( i = 0; i < count; i ++ )
|
||||
{
|
||||
// Mode "code" for already listed mode
|
||||
bpp = list[i].RedBits + list[i].GreenBits +
|
||||
list[i].BlueBits;
|
||||
m2 = (bpp << 25) | (list[i].Width * list[i].Height);
|
||||
if( m1 <= m2 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// New entry at the end of the list?
|
||||
if( i >= count )
|
||||
{
|
||||
list[count].Width = dm.dmPelsWidth;
|
||||
list[count].Height = dm.dmPelsHeight;
|
||||
list[count].RedBits = r;
|
||||
list[count].GreenBits = g;
|
||||
list[count].BlueBits = b;
|
||||
count ++;
|
||||
}
|
||||
// Insert new entry in the list?
|
||||
else if( m1 < m2 )
|
||||
{
|
||||
for( j = count; j > i; j -- )
|
||||
{
|
||||
list[j] = list[j-1];
|
||||
}
|
||||
list[i].Width = dm.dmPelsWidth;
|
||||
list[i].Height = dm.dmPelsHeight;
|
||||
list[i].RedBits = r;
|
||||
list[i].GreenBits = g;
|
||||
list[i].BlueBits = b;
|
||||
count ++;
|
||||
}
|
||||
}
|
||||
mode ++;
|
||||
}
|
||||
while( success && (count < maxcount) );
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Get the desktop video mode
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )
|
||||
{
|
||||
DEVMODE dm;
|
||||
|
||||
// Get desktop display mode
|
||||
dm.dmSize = sizeof( DEVMODE );
|
||||
(void) EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dm );
|
||||
|
||||
// Return desktop mode parameters
|
||||
mode->Width = dm.dmPelsWidth;
|
||||
mode->Height = dm.dmPelsHeight;
|
||||
bpp2rgb( dm.dmBitsPerPel, &mode->RedBits, &mode->GreenBits, &mode->BlueBits );
|
||||
}
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Win32/WGL
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Check if the current context supports the specified WGL extension
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformExtensionSupported( const char *extension )
|
||||
{
|
||||
const GLubyte *extensions;
|
||||
|
||||
if( _glfwWin.GetExtensionsStringEXT != NULL )
|
||||
{
|
||||
extensions = (GLubyte *) _glfwWin.GetExtensionsStringEXT();
|
||||
if( extensions != NULL )
|
||||
{
|
||||
if( _glfwStringInExtensionString( extension, extensions ) )
|
||||
{
|
||||
return GL_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( _glfwWin.GetExtensionsStringARB != NULL )
|
||||
{
|
||||
extensions = (GLubyte *) _glfwWin.GetExtensionsStringARB( _glfwWin.DC );
|
||||
if( extensions != NULL )
|
||||
{
|
||||
if( _glfwStringInExtensionString( extension, extensions ) )
|
||||
{
|
||||
return GL_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Get the function pointer to an OpenGL function
|
||||
//========================================================================
|
||||
|
||||
void *_glfwPlatformGetProcAddress( const char *procname )
|
||||
{
|
||||
return (void *) wglGetProcAddress( procname );
|
||||
}
|
||||
|
||||
@@ -0,0 +1,281 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Win32/WGL
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
// With the Borland C++ compiler, we want to disable FPU exceptions
|
||||
#ifdef __BORLANDC__
|
||||
#include <float.h>
|
||||
#endif // __BORLANDC__
|
||||
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW internal functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// _glfwInitLibraries() - Load necessary libraries (DLLs)
|
||||
//========================================================================
|
||||
|
||||
static int _glfwInitLibraries( void )
|
||||
{
|
||||
// gdi32.dll (OpenGL pixel format functions & SwapBuffers)
|
||||
#ifndef _GLFW_NO_DLOAD_GDI32
|
||||
_glfwLibrary.Libs.gdi32 = LoadLibrary( "gdi32.dll" );
|
||||
if( _glfwLibrary.Libs.gdi32 != NULL )
|
||||
{
|
||||
_glfwLibrary.Libs.ChoosePixelFormat = (CHOOSEPIXELFORMAT_T)
|
||||
GetProcAddress( _glfwLibrary.Libs.gdi32, "ChoosePixelFormat" );
|
||||
_glfwLibrary.Libs.DescribePixelFormat = (DESCRIBEPIXELFORMAT_T)
|
||||
GetProcAddress( _glfwLibrary.Libs.gdi32, "DescribePixelFormat" );
|
||||
_glfwLibrary.Libs.GetPixelFormat = (GETPIXELFORMAT_T)
|
||||
GetProcAddress( _glfwLibrary.Libs.gdi32, "GetPixelFormat" );
|
||||
_glfwLibrary.Libs.SetPixelFormat = (SETPIXELFORMAT_T)
|
||||
GetProcAddress( _glfwLibrary.Libs.gdi32, "SetPixelFormat" );
|
||||
_glfwLibrary.Libs.SwapBuffers = (SWAPBUFFERS_T)
|
||||
GetProcAddress( _glfwLibrary.Libs.gdi32, "SwapBuffers" );
|
||||
if( _glfwLibrary.Libs.ChoosePixelFormat == NULL ||
|
||||
_glfwLibrary.Libs.DescribePixelFormat == NULL ||
|
||||
_glfwLibrary.Libs.GetPixelFormat == NULL ||
|
||||
_glfwLibrary.Libs.SetPixelFormat == NULL ||
|
||||
_glfwLibrary.Libs.SwapBuffers == NULL )
|
||||
{
|
||||
FreeLibrary( _glfwLibrary.Libs.gdi32 );
|
||||
_glfwLibrary.Libs.gdi32 = NULL;
|
||||
return GL_FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return GL_FALSE;
|
||||
}
|
||||
#endif // _GLFW_NO_DLOAD_GDI32
|
||||
|
||||
// winmm.dll (for joystick and timer support)
|
||||
#ifndef _GLFW_NO_DLOAD_WINMM
|
||||
_glfwLibrary.Libs.winmm = LoadLibrary( "winmm.dll" );
|
||||
if( _glfwLibrary.Libs.winmm != NULL )
|
||||
{
|
||||
_glfwLibrary.Libs.joyGetDevCapsA = (JOYGETDEVCAPSA_T)
|
||||
GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetDevCapsA" );
|
||||
_glfwLibrary.Libs.joyGetPos = (JOYGETPOS_T)
|
||||
GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetPos" );
|
||||
_glfwLibrary.Libs.joyGetPosEx = (JOYGETPOSEX_T)
|
||||
GetProcAddress( _glfwLibrary.Libs.winmm, "joyGetPosEx" );
|
||||
_glfwLibrary.Libs.timeGetTime = (TIMEGETTIME_T)
|
||||
GetProcAddress( _glfwLibrary.Libs.winmm, "timeGetTime" );
|
||||
if( _glfwLibrary.Libs.joyGetDevCapsA == NULL ||
|
||||
_glfwLibrary.Libs.joyGetPos == NULL ||
|
||||
_glfwLibrary.Libs.joyGetPosEx == NULL ||
|
||||
_glfwLibrary.Libs.timeGetTime == NULL )
|
||||
{
|
||||
FreeLibrary( _glfwLibrary.Libs.winmm );
|
||||
_glfwLibrary.Libs.winmm = NULL;
|
||||
return GL_FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return GL_FALSE;
|
||||
}
|
||||
#endif // _GLFW_NO_DLOAD_WINMM
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// _glfwFreeLibraries() - Unload used libraries (DLLs)
|
||||
//========================================================================
|
||||
|
||||
static void _glfwFreeLibraries( void )
|
||||
{
|
||||
// gdi32.dll
|
||||
#ifndef _GLFW_NO_DLOAD_GDI32
|
||||
if( _glfwLibrary.Libs.gdi32 != NULL )
|
||||
{
|
||||
FreeLibrary( _glfwLibrary.Libs.gdi32 );
|
||||
_glfwLibrary.Libs.gdi32 = NULL;
|
||||
}
|
||||
#endif // _GLFW_NO_DLOAD_GDI32
|
||||
|
||||
// winmm.dll
|
||||
#ifndef _GLFW_NO_DLOAD_WINMM
|
||||
if( _glfwLibrary.Libs.winmm != NULL )
|
||||
{
|
||||
FreeLibrary( _glfwLibrary.Libs.winmm );
|
||||
_glfwLibrary.Libs.winmm = NULL;
|
||||
}
|
||||
#endif // _GLFW_NO_DLOAD_WINMM
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// _glfwTerminate_atexit() - Terminate GLFW when exiting application
|
||||
//========================================================================
|
||||
|
||||
void _glfwTerminate_atexit( void )
|
||||
{
|
||||
glfwTerminate();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// _glfwPlatformInit() - Initialize various GLFW state
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformInit( void )
|
||||
{
|
||||
OSVERSIONINFO osi;
|
||||
|
||||
// To make SetForegroundWindow() work as we want, we need to fiddle
|
||||
// with the FOREGROUNDLOCKTIMEOUT system setting (we do this as early
|
||||
// as possible in the hope of still being the foreground process)
|
||||
SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0,
|
||||
&_glfwLibrary.Sys.foregroundLockTimeout, 0 );
|
||||
SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0,
|
||||
SPIF_SENDCHANGE );
|
||||
|
||||
// Check which OS version we are running
|
||||
osi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
|
||||
GetVersionEx( &osi );
|
||||
_glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN;
|
||||
if( osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
|
||||
{
|
||||
if( osi.dwMajorVersion == 4 && osi.dwMinorVersion < 10 )
|
||||
{
|
||||
_glfwLibrary.Sys.winVer = _GLFW_WIN_95;
|
||||
}
|
||||
else if( osi.dwMajorVersion == 4 && osi.dwMinorVersion < 90 )
|
||||
{
|
||||
_glfwLibrary.Sys.winVer = _GLFW_WIN_98;
|
||||
}
|
||||
else if( osi.dwMajorVersion == 4 && osi.dwMinorVersion == 90 )
|
||||
{
|
||||
_glfwLibrary.Sys.winVer = _GLFW_WIN_ME;
|
||||
}
|
||||
else if( osi.dwMajorVersion >= 4 )
|
||||
{
|
||||
_glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN_9x;
|
||||
}
|
||||
}
|
||||
else if( osi.dwPlatformId == VER_PLATFORM_WIN32_NT )
|
||||
{
|
||||
if( osi.dwMajorVersion == 4 && osi.dwMinorVersion == 0 )
|
||||
{
|
||||
_glfwLibrary.Sys.winVer = _GLFW_WIN_NT4;
|
||||
}
|
||||
else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 0 )
|
||||
{
|
||||
_glfwLibrary.Sys.winVer = _GLFW_WIN_2K;
|
||||
}
|
||||
else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 1 )
|
||||
{
|
||||
_glfwLibrary.Sys.winVer = _GLFW_WIN_XP;
|
||||
}
|
||||
else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 2 )
|
||||
{
|
||||
_glfwLibrary.Sys.winVer = _GLFW_WIN_NET_SERVER;
|
||||
}
|
||||
else if( osi.dwMajorVersion >= 5 )
|
||||
{
|
||||
_glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN_NT;
|
||||
}
|
||||
}
|
||||
|
||||
// Do we have Unicode support?
|
||||
if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 )
|
||||
{
|
||||
// Windows NT/2000/XP/.NET has Unicode support
|
||||
_glfwLibrary.Sys.hasUnicode = GL_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Windows 9x/ME does not have Unicode support
|
||||
_glfwLibrary.Sys.hasUnicode = GL_FALSE;
|
||||
}
|
||||
|
||||
// Load libraries (DLLs)
|
||||
if( !_glfwInitLibraries() )
|
||||
{
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
// With the Borland C++ compiler, we want to disable FPU exceptions
|
||||
// (this is recommended for OpenGL applications under Windows)
|
||||
#ifdef __BORLANDC__
|
||||
_control87( MCW_EM, MCW_EM );
|
||||
#endif
|
||||
|
||||
// Retrieve GLFW instance handle
|
||||
_glfwLibrary.instance = GetModuleHandle( NULL );
|
||||
|
||||
// System keys are not disabled
|
||||
_glfwWin.keyboardHook = NULL;
|
||||
|
||||
// Install atexit() routine
|
||||
atexit( _glfwTerminate_atexit );
|
||||
|
||||
// Start the timer
|
||||
_glfwInitTimer();
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Close window and shut down library
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformTerminate( void )
|
||||
{
|
||||
// Close OpenGL window
|
||||
glfwCloseWindow();
|
||||
|
||||
// Enable system keys again (if they were disabled)
|
||||
glfwEnable( GLFW_SYSTEM_KEYS );
|
||||
|
||||
// Unload libraries (DLLs)
|
||||
_glfwFreeLibraries();
|
||||
|
||||
// Restore FOREGROUNDLOCKTIMEOUT system setting
|
||||
SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0,
|
||||
(LPVOID)_glfwLibrary.Sys.foregroundLockTimeout,
|
||||
SPIF_SENDCHANGE );
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,234 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Win32/WGL
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW internal functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// _glfwJoystickPresent() - Return GL_TRUE if joystick is present,
|
||||
// else return GL_FALSE.
|
||||
//========================================================================
|
||||
|
||||
static int _glfwJoystickPresent( int joy )
|
||||
{
|
||||
JOYINFO ji;
|
||||
|
||||
// Windows NT 4.0 MMSYSTEM only supports 2 sticks (other Windows
|
||||
// versions support 16 sticks)
|
||||
if( _glfwLibrary.Sys.winVer == _GLFW_WIN_NT4 && joy > GLFW_JOYSTICK_2 )
|
||||
{
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
// Is it a valid stick ID (Windows don't support more than 16 sticks)?
|
||||
if( joy < GLFW_JOYSTICK_1 || joy > GLFW_JOYSTICK_16 )
|
||||
{
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
// Is the joystick present?
|
||||
if( _glfw_joyGetPos( joy - GLFW_JOYSTICK_1, &ji ) != JOYERR_NOERROR )
|
||||
{
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// _glfwCalcJoystickPos() - Calculate joystick position
|
||||
//========================================================================
|
||||
|
||||
static float _glfwCalcJoystickPos( DWORD pos, DWORD min, DWORD max )
|
||||
{
|
||||
float fpos = (float) pos;
|
||||
float fmin = (float) min;
|
||||
float fmax = (float) max;
|
||||
return (2.0f*(fpos - fmin) / (fmax - fmin)) - 1.0f;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// _glfwPlatformGetJoystickParam() - Determine joystick capabilities
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetJoystickParam( int joy, int param )
|
||||
{
|
||||
JOYCAPS jc;
|
||||
|
||||
// return 0;
|
||||
|
||||
// Is joystick present?
|
||||
if( !_glfwJoystickPresent( joy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// We got this far, the joystick is present
|
||||
if( param == GLFW_PRESENT )
|
||||
{
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
// Get joystick capabilities
|
||||
_glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );
|
||||
|
||||
switch( param )
|
||||
{
|
||||
case GLFW_AXES:
|
||||
// Return number of joystick axes
|
||||
return jc.wNumAxes;
|
||||
|
||||
case GLFW_BUTTONS:
|
||||
// Return number of joystick axes
|
||||
return jc.wNumButtons;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// _glfwPlatformGetJoystickPos() - Get joystick axis positions
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )
|
||||
{
|
||||
JOYCAPS jc;
|
||||
JOYINFOEX ji;
|
||||
int axis;
|
||||
|
||||
// return 0;
|
||||
|
||||
// Is joystick present?
|
||||
if( !_glfwJoystickPresent( joy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Get joystick capabilities
|
||||
_glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );
|
||||
|
||||
// Get joystick state
|
||||
ji.dwSize = sizeof( JOYINFOEX );
|
||||
ji.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ |
|
||||
JOY_RETURNR | JOY_RETURNU | JOY_RETURNV;
|
||||
_glfw_joyGetPosEx( joy - GLFW_JOYSTICK_1, &ji );
|
||||
|
||||
// Get position values for all axes
|
||||
axis = 0;
|
||||
if( axis < numaxes )
|
||||
{
|
||||
pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwXpos, jc.wXmin,
|
||||
jc.wXmax );
|
||||
}
|
||||
if( axis < numaxes )
|
||||
{
|
||||
pos[ axis++ ] = -_glfwCalcJoystickPos( ji.dwYpos, jc.wYmin,
|
||||
jc.wYmax );
|
||||
}
|
||||
if( axis < numaxes && jc.wCaps & JOYCAPS_HASZ )
|
||||
{
|
||||
pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwZpos, jc.wZmin,
|
||||
jc.wZmax );
|
||||
}
|
||||
if( axis < numaxes && jc.wCaps & JOYCAPS_HASR )
|
||||
{
|
||||
pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwRpos, jc.wRmin,
|
||||
jc.wRmax );
|
||||
}
|
||||
if( axis < numaxes && jc.wCaps & JOYCAPS_HASU )
|
||||
{
|
||||
pos[ axis++ ] = _glfwCalcJoystickPos( ji.dwUpos, jc.wUmin,
|
||||
jc.wUmax );
|
||||
}
|
||||
if( axis < numaxes && jc.wCaps & JOYCAPS_HASV )
|
||||
{
|
||||
pos[ axis++ ] = -_glfwCalcJoystickPos( ji.dwVpos, jc.wVmin,
|
||||
jc.wVmax );
|
||||
}
|
||||
|
||||
// Return number of returned axes
|
||||
return axis;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// _glfwPlatformGetJoystickButtons() - Get joystick button states
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons,
|
||||
int numbuttons )
|
||||
{
|
||||
JOYCAPS jc;
|
||||
JOYINFOEX ji;
|
||||
int button;
|
||||
|
||||
// return 0;
|
||||
|
||||
// Is joystick present?
|
||||
if( !_glfwJoystickPresent( joy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Get joystick capabilities
|
||||
_glfw_joyGetDevCaps( joy - GLFW_JOYSTICK_1, &jc, sizeof(JOYCAPS) );
|
||||
|
||||
// Get joystick state
|
||||
ji.dwSize = sizeof( JOYINFOEX );
|
||||
ji.dwFlags = JOY_RETURNBUTTONS;
|
||||
_glfw_joyGetPosEx( joy - GLFW_JOYSTICK_1, &ji );
|
||||
|
||||
// Get states of all requested buttons
|
||||
button = 0;
|
||||
while( button < numbuttons && button < (int) jc.wNumButtons )
|
||||
{
|
||||
buttons[ button ] = (unsigned char)
|
||||
(ji.dwButtons & (1UL << button) ? GLFW_PRESS : GLFW_RELEASE);
|
||||
button ++;
|
||||
}
|
||||
|
||||
return button;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: Win32/WGL
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW internal functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// _glfwInitTimer() - Initialise timer
|
||||
//========================================================================
|
||||
|
||||
void _glfwInitTimer( void )
|
||||
{
|
||||
__int64 freq;
|
||||
|
||||
// Check if we have a performance counter
|
||||
if( QueryPerformanceFrequency( (LARGE_INTEGER *)&freq ) )
|
||||
{
|
||||
// Performance counter is available => use it!
|
||||
_glfwLibrary.Timer.HasPerformanceCounter = GL_TRUE;
|
||||
|
||||
// Counter resolution is 1 / counter frequency
|
||||
_glfwLibrary.Timer.Resolution = 1.0 / (double)freq;
|
||||
|
||||
// Set start time for timer
|
||||
QueryPerformanceCounter( (LARGE_INTEGER *)&_glfwLibrary.Timer.t0_64 );
|
||||
}
|
||||
else
|
||||
{
|
||||
// No performace counter available => use the tick counter
|
||||
_glfwLibrary.Timer.HasPerformanceCounter = GL_FALSE;
|
||||
|
||||
// Counter resolution is 1 ms
|
||||
_glfwLibrary.Timer.Resolution = 0.001;
|
||||
|
||||
// Set start time for timer
|
||||
_glfwLibrary.Timer.t0_32 = _glfw_timeGetTime();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Return timer value in seconds
|
||||
//========================================================================
|
||||
|
||||
double _glfwPlatformGetTime( void )
|
||||
{
|
||||
double t;
|
||||
__int64 t_64;
|
||||
|
||||
if( _glfwLibrary.Timer.HasPerformanceCounter )
|
||||
{
|
||||
QueryPerformanceCounter( (LARGE_INTEGER *)&t_64 );
|
||||
t = (double)(t_64 - _glfwLibrary.Timer.t0_64);
|
||||
}
|
||||
else
|
||||
{
|
||||
t = (double)(_glfw_timeGetTime() - _glfwLibrary.Timer.t0_32);
|
||||
}
|
||||
|
||||
// Calculate the current time in seconds
|
||||
return t * _glfwLibrary.Timer.Resolution;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Set timer value in seconds
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformSetTime( double t )
|
||||
{
|
||||
__int64 t_64;
|
||||
|
||||
if( _glfwLibrary.Timer.HasPerformanceCounter )
|
||||
{
|
||||
QueryPerformanceCounter( (LARGE_INTEGER *)&t_64 );
|
||||
_glfwLibrary.Timer.t0_64 = t_64 - (__int64)(t/_glfwLibrary.Timer.Resolution);
|
||||
}
|
||||
else
|
||||
{
|
||||
_glfwLibrary.Timer.t0_32 = _glfw_timeGetTime() - (int)(t*1000.0);
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+1030
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,36 @@
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/x11_config.h.cmake
|
||||
${CMAKE_CURRENT_BINARY_DIR}/x11_config.h @ONLY)
|
||||
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/libglfw.pc.cmake
|
||||
${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc @ONLY)
|
||||
|
||||
include_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/..
|
||||
${GLFW_INCLUDE_DIR})
|
||||
|
||||
set(libglfw_SOURCES
|
||||
${common_SOURCES}
|
||||
x11_enable.c
|
||||
x11_fullscreen.c
|
||||
x11_glext.c
|
||||
x11_init.c
|
||||
x11_joystick.c
|
||||
x11_keysym2unicode.c
|
||||
x11_time.c
|
||||
x11_window.c)
|
||||
|
||||
add_library(libglfwStatic STATIC ${libglfw_SOURCES})
|
||||
add_library(libglfwShared SHARED ${libglfw_SOURCES})
|
||||
target_link_libraries(libglfwShared ${GLFW_LIBRARIES})
|
||||
set_target_properties(libglfwStatic libglfwShared PROPERTIES
|
||||
CLEAN_DIRECT_OUTPUT 1
|
||||
OUTPUT_NAME glfw
|
||||
)
|
||||
|
||||
install(TARGETS libglfwStatic libglfwShared DESTINATION lib)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libglfw.pc DESTINATION lib/pkgconfig)
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
prefix=@CMAKE_INSTALL_PREFIX@
|
||||
exec_prefix=${prefix}
|
||||
libdir=${exec_prefix}/lib
|
||||
includedir=${prefix}/include
|
||||
|
||||
Name: GLFW
|
||||
Description: A portable framework for OpenGL development
|
||||
Version: 2.7
|
||||
URL: http://glfw.sourceforge.net/
|
||||
Libs: -L${libdir} -lglfw @GLFW_LIBRARIES@
|
||||
Cflags: -I${includedir}
|
||||
@@ -0,0 +1,433 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: X11/GLX
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//========================================================================
|
||||
|
||||
#ifndef _platform_h_
|
||||
#define _platform_h_
|
||||
|
||||
|
||||
// This is the X11 version of GLFW
|
||||
#define _GLFW_X11
|
||||
|
||||
|
||||
// Include files
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/keysym.h>
|
||||
#include <X11/Xatom.h>
|
||||
#include <GL/glx.h>
|
||||
|
||||
#include "../../include/GL/glfw.h"
|
||||
#include "x11_config.h"
|
||||
|
||||
// We need declarations for GLX version 1.3 or above even if the server doesn't
|
||||
// support version 1.3
|
||||
#ifndef GLX_VERSION_1_3
|
||||
#error "GLX header version 1.3 or above is required"
|
||||
#endif
|
||||
|
||||
#if defined( _GLFW_HAS_XF86VIDMODE ) && defined( _GLFW_HAS_XRANDR )
|
||||
#error "Xf86VidMode and RandR extensions cannot both be enabled"
|
||||
#endif
|
||||
|
||||
// With XFree86, we can use the XF86VidMode extension
|
||||
#if defined( _GLFW_HAS_XF86VIDMODE )
|
||||
#include <X11/extensions/xf86vmode.h>
|
||||
#endif
|
||||
|
||||
#if defined( _GLFW_HAS_XRANDR )
|
||||
#include <X11/extensions/Xrandr.h>
|
||||
#endif
|
||||
|
||||
// Do we have support for dlopen/dlsym?
|
||||
#if defined( _GLFW_HAS_DLOPEN )
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
// We support two different ways for getting the number of processors in
|
||||
// the system: sysconf (POSIX) and sysctl (BSD?)
|
||||
#if defined( _GLFW_HAS_SYSCONF )
|
||||
|
||||
// Use a single constant for querying number of online processors using
|
||||
// the sysconf function (e.g. SGI defines _SC_NPROC_ONLN instead of
|
||||
// _SC_NPROCESSORS_ONLN)
|
||||
#ifndef _SC_NPROCESSORS_ONLN
|
||||
#ifdef _SC_NPROC_ONLN
|
||||
#define _SC_NPROCESSORS_ONLN _SC_NPROC_ONLN
|
||||
#else
|
||||
#error POSIX constant _SC_NPROCESSORS_ONLN not defined!
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Macro for querying the number of processors
|
||||
#define _glfw_numprocessors(n) n=(int)sysconf(_SC_NPROCESSORS_ONLN)
|
||||
|
||||
#elif defined( _GLFW_HAS_SYSCTL )
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
// Macro for querying the number of processors
|
||||
#define _glfw_numprocessors(n) { \
|
||||
int mib[2], ncpu; \
|
||||
size_t len = 1; \
|
||||
mib[0] = CTL_HW; \
|
||||
mib[1] = HW_NCPU; \
|
||||
n = 1; \
|
||||
if( sysctl( mib, 2, &ncpu, &len, NULL, 0 ) != -1 ) \
|
||||
{ \
|
||||
if( len > 0 ) \
|
||||
{ \
|
||||
n = ncpu; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// If neither sysconf nor sysctl is supported, assume single processor
|
||||
// system
|
||||
#define _glfw_numprocessors(n) n=1
|
||||
|
||||
#endif
|
||||
|
||||
// Pointer length integer
|
||||
// One day, this will most likely move into glfw.h
|
||||
typedef intptr_t GLFWintptr;
|
||||
|
||||
|
||||
#ifndef GLX_SGI_swap_control
|
||||
|
||||
// Function signature for GLX_SGI_swap_control
|
||||
typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval);
|
||||
|
||||
#endif /*GLX_SGI_swap_control*/
|
||||
|
||||
|
||||
#ifndef GLX_SGIX_fbconfig
|
||||
|
||||
/* Type definitions for GLX_SGIX_fbconfig */
|
||||
typedef XID GLXFBConfigIDSGIX;
|
||||
typedef struct __GLXFBConfigRec *GLXFBConfigSGIX;
|
||||
|
||||
/* Function signatures for GLX_SGIX_fbconfig */
|
||||
typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int attribute, int *value);
|
||||
typedef GLXFBConfigSGIX * ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, int *attrib_list, int *nelements);
|
||||
typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct);
|
||||
typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config);
|
||||
|
||||
/* Tokens for GLX_SGIX_fbconfig */
|
||||
#define GLX_WINDOW_BIT_SGIX 0x00000001
|
||||
#define GLX_PIXMAP_BIT_SGIX 0x00000002
|
||||
#define GLX_RGBA_BIT_SGIX 0x00000001
|
||||
#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002
|
||||
#define GLX_DRAWABLE_TYPE_SGIX 0x8010
|
||||
#define GLX_RENDER_TYPE_SGIX 0x8011
|
||||
#define GLX_X_RENDERABLE_SGIX 0x8012
|
||||
#define GLX_FBCONFIG_ID_SGIX 0x8013
|
||||
#define GLX_RGBA_TYPE_SGIX 0x8014
|
||||
#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015
|
||||
#define GLX_SCREEN_EXT 0x800C
|
||||
|
||||
#endif /*GLX_SGIX_fbconfig*/
|
||||
|
||||
|
||||
#ifndef GLX_ARB_create_context
|
||||
|
||||
/* Tokens for glXCreateContextAttribsARB attributes */
|
||||
#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
|
||||
#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
|
||||
#define GLX_CONTEXT_FLAGS_ARB 0x2094
|
||||
|
||||
/* Bits for WGL_CONTEXT_FLAGS_ARB */
|
||||
#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001
|
||||
#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
|
||||
|
||||
/* Prototype for glXCreateContextAttribs */
|
||||
typedef GLXContext (*PFNGLXCREATECONTEXTATTRIBSARBPROC)( Display *display, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);
|
||||
|
||||
#endif /*GLX_ARB_create_context*/
|
||||
|
||||
|
||||
#ifndef GLX_ARB_create_context_profile
|
||||
|
||||
/* Tokens for glXCreateContextAttribsARB attributes */
|
||||
#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
|
||||
|
||||
/* BIts for GLX_CONTEXT_PROFILE_MASK_ARB */
|
||||
#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
|
||||
#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
|
||||
|
||||
#endif /*GLX_ARB_create_context_profile*/
|
||||
|
||||
|
||||
#ifndef GL_VERSION_3_0
|
||||
|
||||
typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint);
|
||||
|
||||
#endif /*GL_VERSION_3_0*/
|
||||
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Global variables (GLFW internals)
|
||||
//========================================================================
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Window structure
|
||||
//------------------------------------------------------------------------
|
||||
typedef struct _GLFWwin_struct _GLFWwin;
|
||||
|
||||
struct _GLFWwin_struct {
|
||||
|
||||
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||
|
||||
// User callback functions
|
||||
GLFWwindowsizefun windowSizeCallback;
|
||||
GLFWwindowclosefun windowCloseCallback;
|
||||
GLFWwindowrefreshfun windowRefreshCallback;
|
||||
GLFWmousebuttonfun mouseButtonCallback;
|
||||
GLFWmouseposfun mousePosCallback;
|
||||
GLFWmousewheelfun mouseWheelCallback;
|
||||
GLFWkeyfun keyCallback;
|
||||
GLFWcharfun charCallback;
|
||||
|
||||
// User selected window settings
|
||||
int fullscreen; // Fullscreen flag
|
||||
int mouseLock; // Mouse-lock flag
|
||||
int autoPollEvents; // Auto polling flag
|
||||
int sysKeysDisabled; // System keys disabled flag
|
||||
int windowNoResize; // Resize- and maximize gadgets disabled flag
|
||||
int refreshRate; // Vertical monitor refresh rate
|
||||
|
||||
// Window status & parameters
|
||||
int opened; // Flag telling if window is opened or not
|
||||
int active; // Application active flag
|
||||
int iconified; // Window iconified flag
|
||||
int width, height; // Window width and heigth
|
||||
int accelerated; // GL_TRUE if window is HW accelerated
|
||||
|
||||
// Framebuffer attributes
|
||||
int redBits;
|
||||
int greenBits;
|
||||
int blueBits;
|
||||
int alphaBits;
|
||||
int depthBits;
|
||||
int stencilBits;
|
||||
int accumRedBits;
|
||||
int accumGreenBits;
|
||||
int accumBlueBits;
|
||||
int accumAlphaBits;
|
||||
int auxBuffers;
|
||||
int stereo;
|
||||
int samples;
|
||||
|
||||
// OpenGL extensions and context attributes
|
||||
int has_GL_SGIS_generate_mipmap;
|
||||
int has_GL_ARB_texture_non_power_of_two;
|
||||
int glMajor, glMinor, glRevision;
|
||||
int glForward, glDebug, glProfile;
|
||||
|
||||
PFNGLGETSTRINGIPROC GetStringi;
|
||||
|
||||
|
||||
// ========= PLATFORM SPECIFIC PART ======================================
|
||||
|
||||
// Platform specific window resources
|
||||
Colormap colormap; // Window colormap
|
||||
Window window; // Window
|
||||
Window root; // Root window for screen
|
||||
int screen; // Screen ID
|
||||
XVisualInfo *visual; // Visual for selected GLXFBConfig
|
||||
GLXFBConfigID fbconfigID; // ID of selected GLXFBConfig
|
||||
GLXContext context; // OpenGL rendering context
|
||||
Atom wmDeleteWindow; // WM_DELETE_WINDOW atom
|
||||
Atom wmPing; // _NET_WM_PING atom
|
||||
Atom wmState; // _NET_WM_STATE atom
|
||||
Atom wmStateFullscreen; // _NET_WM_STATE_FULLSCREEN atom
|
||||
Atom wmActiveWindow; // _NET_ACTIVE_WINDOW atom
|
||||
Cursor cursor; // Invisible cursor for hidden cursor
|
||||
|
||||
// GLX extensions
|
||||
PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI;
|
||||
PFNGLXGETFBCONFIGATTRIBSGIXPROC GetFBConfigAttribSGIX;
|
||||
PFNGLXCHOOSEFBCONFIGSGIXPROC ChooseFBConfigSGIX;
|
||||
PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC CreateContextWithConfigSGIX;
|
||||
PFNGLXGETVISUALFROMFBCONFIGSGIXPROC GetVisualFromFBConfigSGIX;
|
||||
PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB;
|
||||
GLboolean has_GLX_SGIX_fbconfig;
|
||||
GLboolean has_GLX_SGI_swap_control;
|
||||
GLboolean has_GLX_ARB_multisample;
|
||||
GLboolean has_GLX_ARB_create_context;
|
||||
GLboolean has_GLX_ARB_create_context_profile;
|
||||
|
||||
// Various platform specific internal variables
|
||||
GLboolean hasEWMH; // True if window manager supports EWMH
|
||||
GLboolean overrideRedirect; // True if window is OverrideRedirect
|
||||
GLboolean keyboardGrabbed; // True if keyboard is currently grabbed
|
||||
GLboolean pointerGrabbed; // True if pointer is currently grabbed
|
||||
GLboolean pointerHidden; // True if pointer is currently hidden
|
||||
|
||||
// Screensaver data
|
||||
struct {
|
||||
int changed;
|
||||
int timeout;
|
||||
int interval;
|
||||
int blanking;
|
||||
int exposure;
|
||||
} Saver;
|
||||
|
||||
// Fullscreen data
|
||||
struct {
|
||||
int modeChanged;
|
||||
#if defined( _GLFW_HAS_XF86VIDMODE )
|
||||
XF86VidModeModeInfo oldMode;
|
||||
#endif
|
||||
#if defined( _GLFW_HAS_XRANDR )
|
||||
SizeID oldSizeID;
|
||||
int oldWidth;
|
||||
int oldHeight;
|
||||
Rotation oldRotation;
|
||||
#endif
|
||||
} FS;
|
||||
};
|
||||
|
||||
GLFWGLOBAL _GLFWwin _glfwWin;
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// User input status (most of this should go in _GLFWwin)
|
||||
//------------------------------------------------------------------------
|
||||
GLFWGLOBAL struct {
|
||||
|
||||
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||
|
||||
// Mouse status
|
||||
int MousePosX, MousePosY;
|
||||
int WheelPos;
|
||||
char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ];
|
||||
|
||||
// Keyboard status
|
||||
char Key[ GLFW_KEY_LAST+1 ];
|
||||
int LastChar;
|
||||
|
||||
// User selected settings
|
||||
int StickyKeys;
|
||||
int StickyMouseButtons;
|
||||
int KeyRepeat;
|
||||
|
||||
|
||||
// ========= PLATFORM SPECIFIC PART ======================================
|
||||
|
||||
// Platform specific internal variables
|
||||
int MouseMoved, CursorPosX, CursorPosY;
|
||||
|
||||
} _glfwInput;
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Library global data
|
||||
//------------------------------------------------------------------------
|
||||
GLFWGLOBAL struct {
|
||||
|
||||
// ========= PLATFORM INDEPENDENT MANDATORY PART =========================
|
||||
|
||||
// Window opening hints
|
||||
_GLFWhints hints;
|
||||
|
||||
// ========= PLATFORM SPECIFIC PART ======================================
|
||||
|
||||
Display *display;
|
||||
|
||||
// Server-side GLX version
|
||||
int glxMajor, glxMinor;
|
||||
|
||||
struct {
|
||||
int available;
|
||||
int eventBase;
|
||||
int errorBase;
|
||||
} XF86VidMode;
|
||||
|
||||
struct {
|
||||
int available;
|
||||
int eventBase;
|
||||
int errorBase;
|
||||
} XRandR;
|
||||
|
||||
// Timer data
|
||||
struct {
|
||||
double resolution;
|
||||
long long t0;
|
||||
} Timer;
|
||||
|
||||
#if defined(_GLFW_DLOPEN_LIBGL)
|
||||
struct {
|
||||
void *libGL; // dlopen handle for libGL.so
|
||||
} Libs;
|
||||
#endif
|
||||
} _glfwLibrary;
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Joystick information & state
|
||||
//------------------------------------------------------------------------
|
||||
GLFWGLOBAL struct {
|
||||
int Present;
|
||||
int fd;
|
||||
int NumAxes;
|
||||
int NumButtons;
|
||||
float *Axis;
|
||||
unsigned char *Button;
|
||||
} _glfwJoy[ GLFW_JOYSTICK_LAST + 1 ];
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Prototypes for platform specific internal functions
|
||||
//========================================================================
|
||||
|
||||
// Time
|
||||
void _glfwInitTimer( void );
|
||||
|
||||
// Fullscreen support
|
||||
int _glfwGetClosestVideoMode( int screen, int *width, int *height, int *rate );
|
||||
void _glfwSetVideoModeMODE( int screen, int mode, int rate );
|
||||
void _glfwSetVideoMode( int screen, int *width, int *height, int *rate );
|
||||
void _glfwRestoreVideoMode( void );
|
||||
|
||||
// Joystick input
|
||||
void _glfwInitJoysticks( void );
|
||||
void _glfwTerminateJoysticks( void );
|
||||
|
||||
// Unicode support
|
||||
long _glfwKeySym2Unicode( KeySym keysym );
|
||||
|
||||
|
||||
#endif // _platform_h_
|
||||
@@ -0,0 +1,14 @@
|
||||
/* Configure build time options of GLFW */
|
||||
|
||||
/* Define this to 1 if XRandR is available */
|
||||
#cmakedefine _GLFW_HAS_XRANDR 1
|
||||
/* Define this to 1 if Xf86VidMode is available */
|
||||
#cmakedefine _GLFW_HAS_XF86VIDMODE 1
|
||||
|
||||
/* Define this to 1 if glXGetProcAddress is available */
|
||||
#cmakedefine _GLFW_HAS_GLXGETPROCADDRESS 1
|
||||
/* Define this to 1 if glXGetProcAddressARB is available */
|
||||
#cmakedefine _GLFW_HAS_GLXGETPROCADDRESSARB 1
|
||||
/* Define this to 1 if glXGetProcAddressEXT is available */
|
||||
#cmakedefine _GLFW_HAS_GLXGETPROCADDRESSEXT 1
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: X11 (Unix)
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Enable system keys
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformEnableSystemKeys( void )
|
||||
{
|
||||
if( _glfwWin.keyboardGrabbed )
|
||||
{
|
||||
XUngrabKeyboard( _glfwLibrary.display, CurrentTime );
|
||||
_glfwWin.keyboardGrabbed = GL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
//========================================================================
|
||||
// Disable system keys
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformDisableSystemKeys( void )
|
||||
{
|
||||
if( XGrabKeyboard( _glfwLibrary.display, _glfwWin.window, True,
|
||||
GrabModeAsync, GrabModeAsync, CurrentTime ) ==
|
||||
GrabSuccess )
|
||||
{
|
||||
_glfwWin.keyboardGrabbed = GL_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,572 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: X11/GLX
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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 <limits.h>
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW internal functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Convert BPP to RGB bits (based on "best guess")
|
||||
//========================================================================
|
||||
|
||||
static void BPP2RGB( int bpp, int *r, int *g, int *b )
|
||||
{
|
||||
int delta;
|
||||
|
||||
// Special case: BPP = 32 (I don't think this is necessary for X11??)
|
||||
if( bpp == 32 )
|
||||
bpp = 24;
|
||||
|
||||
// Convert "bits per pixel" to red, green & blue sizes
|
||||
*r = *g = *b = bpp / 3;
|
||||
delta = bpp - (*r * 3);
|
||||
if( delta >= 1 )
|
||||
{
|
||||
*g = *g + 1;
|
||||
}
|
||||
if( delta == 2 )
|
||||
{
|
||||
*r = *r + 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Finds the video mode closest in size to the specified desired size
|
||||
//========================================================================
|
||||
|
||||
int _glfwGetClosestVideoMode( int screen, int *width, int *height, int *rate )
|
||||
{
|
||||
#if defined( _GLFW_HAS_XRANDR )
|
||||
int i, match, bestmatch;
|
||||
int sizecount, bestsize;
|
||||
int ratecount, bestrate;
|
||||
short *ratelist;
|
||||
XRRScreenConfiguration *sc;
|
||||
XRRScreenSize *sizelist;
|
||||
|
||||
if( _glfwLibrary.XRandR.available )
|
||||
{
|
||||
sc = XRRGetScreenInfo( _glfwLibrary.display,
|
||||
RootWindow( _glfwLibrary.display, screen ) );
|
||||
|
||||
sizelist = XRRConfigSizes( sc, &sizecount );
|
||||
|
||||
// Find the best matching mode
|
||||
bestsize = -1;
|
||||
bestmatch = INT_MAX;
|
||||
for( i = 0; i < sizecount; i++ )
|
||||
{
|
||||
match = (*width - sizelist[i].width) *
|
||||
(*width - sizelist[i].width) +
|
||||
(*height - sizelist[i].height) *
|
||||
(*height - sizelist[i].height);
|
||||
if( match < bestmatch )
|
||||
{
|
||||
bestmatch = match;
|
||||
bestsize = i;
|
||||
}
|
||||
}
|
||||
|
||||
if( bestsize != -1 )
|
||||
{
|
||||
// Report width & height of best matching mode
|
||||
*width = sizelist[bestsize].width;
|
||||
*height = sizelist[bestsize].height;
|
||||
|
||||
if( *rate > 0 )
|
||||
{
|
||||
ratelist = XRRConfigRates( sc, bestsize, &ratecount );
|
||||
|
||||
bestrate = -1;
|
||||
bestmatch = INT_MAX;
|
||||
for( i = 0; i < ratecount; i++ )
|
||||
{
|
||||
match = abs( ratelist[i] - *rate );
|
||||
if( match < bestmatch )
|
||||
{
|
||||
bestmatch = match;
|
||||
bestrate = ratelist[i];
|
||||
}
|
||||
}
|
||||
|
||||
if( bestrate != -1 )
|
||||
{
|
||||
*rate = bestrate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Free modelist
|
||||
XRRFreeScreenConfigInfo( sc );
|
||||
|
||||
if( bestsize != -1 )
|
||||
{
|
||||
return bestsize;
|
||||
}
|
||||
}
|
||||
#elif defined( _GLFW_HAS_XF86VIDMODE )
|
||||
XF86VidModeModeInfo **modelist;
|
||||
int modecount, i, bestmode, bestmatch, match;
|
||||
|
||||
// Use the XF86VidMode extension to control video resolution
|
||||
if( _glfwLibrary.XF86VidMode.available )
|
||||
{
|
||||
// Get a list of all available display modes
|
||||
XF86VidModeGetAllModeLines( _glfwLibrary.display, screen,
|
||||
&modecount, &modelist );
|
||||
|
||||
// Find the best matching mode
|
||||
bestmode = -1;
|
||||
bestmatch = INT_MAX;
|
||||
for( i = 0; i < modecount; i++ )
|
||||
{
|
||||
match = (*width - modelist[i]->hdisplay) *
|
||||
(*width - modelist[i]->hdisplay) +
|
||||
(*height - modelist[i]->vdisplay) *
|
||||
(*height - modelist[i]->vdisplay);
|
||||
if( match < bestmatch )
|
||||
{
|
||||
bestmatch = match;
|
||||
bestmode = i;
|
||||
}
|
||||
}
|
||||
|
||||
if( bestmode != -1 )
|
||||
{
|
||||
// Report width & height of best matching mode
|
||||
*width = modelist[ bestmode ]->hdisplay;
|
||||
*height = modelist[ bestmode ]->vdisplay;
|
||||
}
|
||||
|
||||
// Free modelist
|
||||
XFree( modelist );
|
||||
|
||||
if( bestmode != -1 )
|
||||
{
|
||||
return bestmode;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Default: Simply use the screen resolution
|
||||
*width = DisplayWidth( _glfwLibrary.display, screen );
|
||||
*height = DisplayHeight( _glfwLibrary.display, screen );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Change the current video mode
|
||||
//========================================================================
|
||||
|
||||
void _glfwSetVideoModeMODE( int screen, int mode, int rate )
|
||||
{
|
||||
#if defined( _GLFW_HAS_XRANDR )
|
||||
XRRScreenConfiguration *sc;
|
||||
Window root;
|
||||
|
||||
if( _glfwLibrary.XRandR.available )
|
||||
{
|
||||
root = RootWindow( _glfwLibrary.display, screen );
|
||||
sc = XRRGetScreenInfo( _glfwLibrary.display, root );
|
||||
|
||||
// Remember old size and flag that we have changed the mode
|
||||
if( !_glfwWin.FS.modeChanged )
|
||||
{
|
||||
_glfwWin.FS.oldSizeID = XRRConfigCurrentConfiguration( sc, &_glfwWin.FS.oldRotation );
|
||||
_glfwWin.FS.oldWidth = DisplayWidth( _glfwLibrary.display, screen );
|
||||
_glfwWin.FS.oldHeight = DisplayHeight( _glfwLibrary.display, screen );
|
||||
|
||||
_glfwWin.FS.modeChanged = GL_TRUE;
|
||||
}
|
||||
|
||||
if( rate > 0 )
|
||||
{
|
||||
// Set desired configuration
|
||||
XRRSetScreenConfigAndRate( _glfwLibrary.display,
|
||||
sc,
|
||||
root,
|
||||
mode,
|
||||
RR_Rotate_0,
|
||||
(short) rate,
|
||||
CurrentTime );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Set desired configuration
|
||||
XRRSetScreenConfig( _glfwLibrary.display,
|
||||
sc,
|
||||
root,
|
||||
mode,
|
||||
RR_Rotate_0,
|
||||
CurrentTime );
|
||||
}
|
||||
|
||||
XRRFreeScreenConfigInfo( sc );
|
||||
}
|
||||
#elif defined( _GLFW_HAS_XF86VIDMODE )
|
||||
XF86VidModeModeInfo **modelist;
|
||||
int modecount;
|
||||
|
||||
// Use the XF86VidMode extension to control video resolution
|
||||
if( _glfwLibrary.XF86VidMode.available )
|
||||
{
|
||||
// Get a list of all available display modes
|
||||
XF86VidModeGetAllModeLines( _glfwLibrary.display, screen,
|
||||
&modecount, &modelist );
|
||||
|
||||
// Unlock mode switch if necessary
|
||||
if( _glfwWin.FS.modeChanged )
|
||||
{
|
||||
XF86VidModeLockModeSwitch( _glfwLibrary.display, screen, 0 );
|
||||
}
|
||||
|
||||
// Change the video mode to the desired mode
|
||||
XF86VidModeSwitchToMode( _glfwLibrary.display, screen,
|
||||
modelist[ mode ] );
|
||||
|
||||
// Set viewport to upper left corner (where our window will be)
|
||||
XF86VidModeSetViewPort( _glfwLibrary.display, screen, 0, 0 );
|
||||
|
||||
// Lock mode switch
|
||||
XF86VidModeLockModeSwitch( _glfwLibrary.display, screen, 1 );
|
||||
|
||||
// Remember old mode and flag that we have changed the mode
|
||||
if( !_glfwWin.FS.modeChanged )
|
||||
{
|
||||
_glfwWin.FS.oldMode = *modelist[ 0 ];
|
||||
_glfwWin.FS.modeChanged = GL_TRUE;
|
||||
}
|
||||
|
||||
// Free mode list
|
||||
XFree( modelist );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Change the current video mode
|
||||
//========================================================================
|
||||
|
||||
void _glfwSetVideoMode( int screen, int *width, int *height, int *rate )
|
||||
{
|
||||
int bestmode;
|
||||
|
||||
// Find a best match mode
|
||||
bestmode = _glfwGetClosestVideoMode( screen, width, height, rate );
|
||||
|
||||
// Change mode
|
||||
_glfwSetVideoModeMODE( screen, bestmode, *rate );
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Restore the previously saved (original) video mode
|
||||
//========================================================================
|
||||
|
||||
void _glfwRestoreVideoMode( void )
|
||||
{
|
||||
if( _glfwWin.FS.modeChanged )
|
||||
{
|
||||
#if defined( _GLFW_HAS_XRANDR )
|
||||
if( _glfwLibrary.XRandR.available )
|
||||
{
|
||||
XRRScreenConfiguration *sc;
|
||||
|
||||
if( _glfwLibrary.XRandR.available )
|
||||
{
|
||||
sc = XRRGetScreenInfo( _glfwLibrary.display, _glfwWin.root );
|
||||
|
||||
XRRSetScreenConfig( _glfwLibrary.display,
|
||||
sc,
|
||||
_glfwWin.root,
|
||||
_glfwWin.FS.oldSizeID,
|
||||
_glfwWin.FS.oldRotation,
|
||||
CurrentTime );
|
||||
|
||||
XRRFreeScreenConfigInfo( sc );
|
||||
}
|
||||
}
|
||||
#elif defined( _GLFW_HAS_XF86VIDMODE )
|
||||
if( _glfwLibrary.XF86VidMode.available )
|
||||
{
|
||||
// Unlock mode switch
|
||||
XF86VidModeLockModeSwitch( _glfwLibrary.display, _glfwWin.screen, 0 );
|
||||
|
||||
// Change the video mode back to the old mode
|
||||
XF86VidModeSwitchToMode( _glfwLibrary.display,
|
||||
_glfwWin.screen,
|
||||
&_glfwWin.FS.oldMode );
|
||||
}
|
||||
#endif
|
||||
_glfwWin.FS.modeChanged = GL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
struct _glfwResolution
|
||||
{
|
||||
int width;
|
||||
int height;
|
||||
};
|
||||
|
||||
//========================================================================
|
||||
// List available video modes
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )
|
||||
{
|
||||
int count, k, l, r, g, b, rgba, gl;
|
||||
int depth, screen;
|
||||
Display *dpy;
|
||||
XVisualInfo *vislist, dummy;
|
||||
int viscount, rgbcount, rescount;
|
||||
int *rgbarray;
|
||||
struct _glfwResolution *resarray;
|
||||
#if defined( _GLFW_HAS_XRANDR )
|
||||
XRRScreenConfiguration *sc;
|
||||
XRRScreenSize *sizelist;
|
||||
int sizecount;
|
||||
#elif defined( _GLFW_HAS_XF86VIDMODE )
|
||||
XF86VidModeModeInfo **modelist;
|
||||
int modecount, width, height;
|
||||
#endif
|
||||
|
||||
// Get display and screen
|
||||
dpy = _glfwLibrary.display;
|
||||
screen = DefaultScreen( dpy );
|
||||
|
||||
// Get list of visuals
|
||||
vislist = XGetVisualInfo( dpy, 0, &dummy, &viscount );
|
||||
if( vislist == NULL )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
rgbarray = (int*) malloc( sizeof(int) * viscount );
|
||||
rgbcount = 0;
|
||||
|
||||
// Build RGB array
|
||||
for( k = 0; k < viscount; k++ )
|
||||
{
|
||||
// Does the visual support OpenGL & true color?
|
||||
glXGetConfig( dpy, &vislist[k], GLX_USE_GL, &gl );
|
||||
glXGetConfig( dpy, &vislist[k], GLX_RGBA, &rgba );
|
||||
if( gl && rgba )
|
||||
{
|
||||
// Get color depth for this visual
|
||||
depth = vislist[k].depth;
|
||||
|
||||
// Convert to RGB
|
||||
BPP2RGB( depth, &r, &g, &b );
|
||||
depth = (r<<16) | (g<<8) | b;
|
||||
|
||||
// Is this mode unique?
|
||||
for( l = 0; l < rgbcount; l++ )
|
||||
{
|
||||
if( depth == rgbarray[ l ] )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( l >= rgbcount )
|
||||
{
|
||||
rgbarray[ rgbcount ] = depth;
|
||||
rgbcount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rescount = 0;
|
||||
resarray = NULL;
|
||||
|
||||
// Build resolution array
|
||||
#if defined( _GLFW_HAS_XRANDR )
|
||||
if( _glfwLibrary.XRandR.available )
|
||||
{
|
||||
sc = XRRGetScreenInfo( dpy, RootWindow( dpy, screen ) );
|
||||
sizelist = XRRConfigSizes( sc, &sizecount );
|
||||
|
||||
resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * sizecount );
|
||||
|
||||
for( k = 0; k < sizecount; k++ )
|
||||
{
|
||||
resarray[ rescount ].width = sizelist[ k ].width;
|
||||
resarray[ rescount ].height = sizelist[ k ].height;
|
||||
rescount++;
|
||||
}
|
||||
|
||||
XRRFreeScreenConfigInfo( sc );
|
||||
}
|
||||
#elif defined( _GLFW_HAS_XF86VIDMODE )
|
||||
if( _glfwLibrary.XF86VidMode.available )
|
||||
{
|
||||
XF86VidModeGetAllModeLines( dpy, screen, &modecount, &modelist );
|
||||
|
||||
resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * modecount );
|
||||
|
||||
for( k = 0; k < modecount; k++ )
|
||||
{
|
||||
width = modelist[ k ]->hdisplay;
|
||||
height = modelist[ k ]->vdisplay;
|
||||
|
||||
// Is this mode unique?
|
||||
for( l = 0; l < rescount; l++ )
|
||||
{
|
||||
if( width == resarray[ l ].width && height == resarray[ l ].height )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( l >= rescount )
|
||||
{
|
||||
resarray[ rescount ].width = width;
|
||||
resarray[ rescount ].height = height;
|
||||
rescount++;
|
||||
}
|
||||
}
|
||||
|
||||
XFree( modelist );
|
||||
}
|
||||
#endif
|
||||
|
||||
if( !resarray )
|
||||
{
|
||||
rescount = 1;
|
||||
resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * rescount );
|
||||
|
||||
resarray[ 0 ].width = DisplayWidth( dpy, screen );
|
||||
resarray[ 0 ].height = DisplayHeight( dpy, screen );
|
||||
}
|
||||
|
||||
// Build permutations of colors and resolutions
|
||||
count = 0;
|
||||
for( k = 0; k < rgbcount && count < maxcount; k++ )
|
||||
{
|
||||
for( l = 0; l < rescount && count < maxcount; l++ )
|
||||
{
|
||||
list[count].Width = resarray[ l ].width;
|
||||
list[count].Height = resarray[ l ].height;
|
||||
list[count].RedBits = (rgbarray[ k ] >> 16) & 255;
|
||||
list[count].GreenBits = (rgbarray[ k ] >> 8) & 255;
|
||||
list[count].BlueBits = rgbarray[ k ] & 255;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
// Free visuals list
|
||||
XFree( vislist );
|
||||
|
||||
free( resarray );
|
||||
free( rgbarray );
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Get the desktop video mode
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformGetDesktopMode( GLFWvidmode *mode )
|
||||
{
|
||||
Display *dpy;
|
||||
int bpp, screen;
|
||||
#if defined( _GLFW_HAS_XF86VIDMODE )
|
||||
XF86VidModeModeInfo **modelist;
|
||||
int modecount;
|
||||
#endif
|
||||
|
||||
// Get display and screen
|
||||
dpy = _glfwLibrary.display;
|
||||
screen = DefaultScreen( dpy );
|
||||
|
||||
// Get display depth
|
||||
bpp = DefaultDepth( dpy, screen );
|
||||
|
||||
// Convert BPP to RGB bits
|
||||
BPP2RGB( bpp, &mode->RedBits, &mode->GreenBits, &mode->BlueBits );
|
||||
|
||||
#if defined( _GLFW_HAS_XRANDR )
|
||||
if( _glfwLibrary.XRandR.available )
|
||||
{
|
||||
if( _glfwWin.FS.modeChanged )
|
||||
{
|
||||
mode->Width = _glfwWin.FS.oldWidth;
|
||||
mode->Height = _glfwWin.FS.oldHeight;
|
||||
return;
|
||||
}
|
||||
}
|
||||
#elif defined( _GLFW_HAS_XF86VIDMODE )
|
||||
if( _glfwLibrary.XF86VidMode.available )
|
||||
{
|
||||
if( _glfwWin.FS.modeChanged )
|
||||
{
|
||||
// The old (desktop) mode is stored in _glfwWin.FS.oldMode
|
||||
mode->Width = _glfwWin.FS.oldMode.hdisplay;
|
||||
mode->Height = _glfwWin.FS.oldMode.vdisplay;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Use the XF86VidMode extension to get list of video modes
|
||||
XF86VidModeGetAllModeLines( dpy, screen, &modecount,
|
||||
&modelist );
|
||||
|
||||
// The first mode in the list is the current (desktio) mode
|
||||
mode->Width = modelist[ 0 ]->hdisplay;
|
||||
mode->Height = modelist[ 0 ]->vdisplay;
|
||||
|
||||
// Free list
|
||||
XFree( modelist );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Get current display width and height
|
||||
mode->Width = DisplayWidth( dpy, screen );
|
||||
mode->Height = DisplayHeight( dpy, screen );
|
||||
}
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: X11/GLX
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
void (*glXGetProcAddress(const GLubyte *procName))();
|
||||
void (*glXGetProcAddressARB(const GLubyte *procName))();
|
||||
void (*glXGetProcAddressEXT(const GLubyte *procName))();
|
||||
|
||||
// We support four different ways for getting addresses for GL/GLX
|
||||
// extension functions: glXGetProcAddress, glXGetProcAddressARB,
|
||||
// glXGetProcAddressEXT, and dlsym
|
||||
#if defined( _GLFW_HAS_GLXGETPROCADDRESSARB )
|
||||
#define _glfw_glXGetProcAddress(x) glXGetProcAddressARB(x)
|
||||
#elif defined( _GLFW_HAS_GLXGETPROCADDRESS )
|
||||
#define _glfw_glXGetProcAddress(x) glXGetProcAddress(x)
|
||||
#elif defined( _GLFW_HAS_GLXGETPROCADDRESSEXT )
|
||||
#define _glfw_glXGetProcAddress(x) glXGetProcAddressEXT(x)
|
||||
#elif defined( _GLFW_HAS_DLOPEN )
|
||||
#define _glfw_glXGetProcAddress(x) dlsym(_glfwLibs.libGL,x)
|
||||
#define _GLFW_DLOPEN_LIBGL
|
||||
#else
|
||||
#define _glfw_glXGetProcAddress(x) NULL
|
||||
#endif
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Check if an OpenGL extension is available at runtime
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformExtensionSupported( const char *extension )
|
||||
{
|
||||
const GLubyte *extensions;
|
||||
|
||||
// Get list of GLX extensions
|
||||
extensions = (const GLubyte*) glXQueryExtensionsString( _glfwLibrary.display,
|
||||
_glfwWin.screen );
|
||||
if( extensions != NULL )
|
||||
{
|
||||
if( _glfwStringInExtensionString( extension, extensions ) )
|
||||
{
|
||||
return GL_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Get the function pointer to an OpenGL function
|
||||
//========================================================================
|
||||
|
||||
void * _glfwPlatformGetProcAddress( const char *procname )
|
||||
{
|
||||
return (void *) _glfw_glXGetProcAddress( (const GLubyte *) procname );
|
||||
}
|
||||
|
||||
@@ -0,0 +1,206 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: X11/GLX
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW internal functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Dynamically load libraries
|
||||
//========================================================================
|
||||
|
||||
static void initLibraries( void )
|
||||
{
|
||||
#ifdef _GLFW_DLOPEN_LIBGL
|
||||
int i;
|
||||
char *libGL_names[ ] =
|
||||
{
|
||||
"libGL.so",
|
||||
"libGL.so.1",
|
||||
"/usr/lib/libGL.so",
|
||||
"/usr/lib/libGL.so.1",
|
||||
NULL
|
||||
};
|
||||
|
||||
_glfwLibrary.Libs.libGL = NULL;
|
||||
for( i = 0; !libGL_names[ i ] != NULL; i ++ )
|
||||
{
|
||||
_glfwLibrary.Libs.libGL = dlopen( libGL_names[ i ],
|
||||
RTLD_LAZY | RTLD_GLOBAL );
|
||||
if( _glfwLibrary.Libs.libGL )
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Terminate GLFW when exiting application
|
||||
//========================================================================
|
||||
|
||||
static void glfw_atexit( void )
|
||||
{
|
||||
glfwTerminate();
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Initialize X11 display
|
||||
//========================================================================
|
||||
|
||||
static int initDisplay( void )
|
||||
{
|
||||
// Open display
|
||||
_glfwLibrary.display = XOpenDisplay( 0 );
|
||||
if( !_glfwLibrary.display )
|
||||
{
|
||||
fprintf(stderr, "Failed to open X display\n");
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
// Check for XF86VidMode extension
|
||||
#ifdef _GLFW_HAS_XF86VIDMODE
|
||||
_glfwLibrary.XF86VidMode.available =
|
||||
XF86VidModeQueryExtension( _glfwLibrary.display,
|
||||
&_glfwLibrary.XF86VidMode.eventBase,
|
||||
&_glfwLibrary.XF86VidMode.errorBase);
|
||||
#else
|
||||
_glfwLibrary.XF86VidMode.available = 0;
|
||||
#endif
|
||||
|
||||
// Check for XRandR extension
|
||||
#ifdef _GLFW_HAS_XRANDR
|
||||
_glfwLibrary.XRandR.available =
|
||||
XRRQueryExtension( _glfwLibrary.display,
|
||||
&_glfwLibrary.XRandR.eventBase,
|
||||
&_glfwLibrary.XRandR.errorBase );
|
||||
#else
|
||||
_glfwLibrary.XRandR.available = 0;
|
||||
#endif
|
||||
|
||||
// Fullscreen & screen saver settings
|
||||
// Check if GLX is supported on this display
|
||||
if( !glXQueryExtension( _glfwLibrary.display, NULL, NULL ) )
|
||||
{
|
||||
fprintf(stderr, "GLX not supported\n");
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
// Retrieve GLX version
|
||||
if( !glXQueryVersion( _glfwLibrary.display,
|
||||
&_glfwLibrary.glxMajor,
|
||||
&_glfwLibrary.glxMinor ) )
|
||||
{
|
||||
fprintf(stderr, "Unable to query GLX version\n");
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Terminate X11 display
|
||||
//========================================================================
|
||||
|
||||
static void terminateDisplay( void )
|
||||
{
|
||||
// Open display
|
||||
if( _glfwLibrary.display )
|
||||
{
|
||||
XCloseDisplay( _glfwLibrary.display );
|
||||
_glfwLibrary.display = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Initialize various GLFW state
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformInit( void )
|
||||
{
|
||||
// Initialize display
|
||||
if( !initDisplay() )
|
||||
{
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
// Try to load libGL.so if necessary
|
||||
initLibraries();
|
||||
|
||||
// Install atexit() routine
|
||||
atexit( glfw_atexit );
|
||||
|
||||
// Initialize joysticks
|
||||
_glfwInitJoysticks();
|
||||
|
||||
// Start the timer
|
||||
_glfwInitTimer();
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Close window and shut down library
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformTerminate( void )
|
||||
{
|
||||
// Close OpenGL window
|
||||
glfwCloseWindow();
|
||||
|
||||
// Terminate display
|
||||
terminateDisplay();
|
||||
|
||||
// Terminate joysticks
|
||||
_glfwTerminateJoysticks();
|
||||
|
||||
// Unload libGL.so if necessary
|
||||
#ifdef _GLFW_DLOPEN_LIBGL
|
||||
if( _glfwLibrary.Libs.libGL != NULL )
|
||||
{
|
||||
dlclose( _glfwLibrary.Libs.libGL );
|
||||
_glfwLibrary.Libs.libGL = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,367 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: X11/GLX
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Note: Only Linux joystick input is supported at the moment. Other
|
||||
// systems will behave as if there are no joysticks connected.
|
||||
//========================================================================
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW internal functions ****
|
||||
//************************************************************************
|
||||
|
||||
#ifdef _GLFW_USE_LINUX_JOYSTICKS
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Here are the Linux joystick driver v1.x interface definitions that we
|
||||
// use (we do not want to rely on <linux/joystick.h>):
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
|
||||
// Joystick event types
|
||||
#define JS_EVENT_BUTTON 0x01 /* button pressed/released */
|
||||
#define JS_EVENT_AXIS 0x02 /* joystick moved */
|
||||
#define JS_EVENT_INIT 0x80 /* initial state of device */
|
||||
|
||||
// Joystick event structure
|
||||
struct js_event {
|
||||
unsigned int time; /* (u32) event timestamp in milliseconds */
|
||||
signed short value; /* (s16) value */
|
||||
unsigned char type; /* (u8) event type */
|
||||
unsigned char number; /* (u8) axis/button number */
|
||||
};
|
||||
|
||||
// Joystick IOCTL commands
|
||||
#define JSIOCGVERSION _IOR('j', 0x01, int) /* get driver version (u32) */
|
||||
#define JSIOCGAXES _IOR('j', 0x11, char) /* get number of axes (u8) */
|
||||
#define JSIOCGBUTTONS _IOR('j', 0x12, char) /* get number of buttons (u8) */
|
||||
|
||||
#endif // _GLFW_USE_LINUX_JOYSTICKS
|
||||
|
||||
|
||||
//========================================================================
|
||||
// _glfwInitJoysticks() - Initialize joystick interface
|
||||
//========================================================================
|
||||
|
||||
void _glfwInitJoysticks( void )
|
||||
{
|
||||
#ifdef _GLFW_USE_LINUX_JOYSTICKS
|
||||
int k, n, fd, joy_count;
|
||||
char *joy_base_name, joy_dev_name[ 20 ];
|
||||
int driver_version = 0x000800;
|
||||
char ret_data;
|
||||
#endif // _GLFW_USE_LINUX_JOYSTICKS
|
||||
int i;
|
||||
|
||||
// Start by saying that there are no sticks
|
||||
for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i )
|
||||
{
|
||||
_glfwJoy[ i ].Present = GL_FALSE;
|
||||
}
|
||||
|
||||
#ifdef _GLFW_USE_LINUX_JOYSTICKS
|
||||
|
||||
// Try to open joysticks (nonblocking)
|
||||
joy_count = 0;
|
||||
for( k = 0; k <= 1 && joy_count <= GLFW_JOYSTICK_LAST; ++ k )
|
||||
{
|
||||
// Pick joystick base name
|
||||
switch( k )
|
||||
{
|
||||
case 0:
|
||||
joy_base_name = "/dev/input/js"; // USB sticks
|
||||
break;
|
||||
case 1:
|
||||
joy_base_name = "/dev/js"; // "Legacy" sticks
|
||||
break;
|
||||
default:
|
||||
continue; // (should never happen)
|
||||
}
|
||||
|
||||
// Try to open a few of these sticks
|
||||
for( i = 0; i <= 50 && joy_count <= GLFW_JOYSTICK_LAST; ++ i )
|
||||
{
|
||||
sprintf( joy_dev_name, "%s%d", joy_base_name, i );
|
||||
fd = open( joy_dev_name, O_NONBLOCK );
|
||||
if( fd != -1 )
|
||||
{
|
||||
// Remember fd
|
||||
_glfwJoy[ joy_count ].fd = fd;
|
||||
|
||||
// Check that the joystick driver version is 1.0+
|
||||
ioctl( fd, JSIOCGVERSION, &driver_version );
|
||||
if( driver_version < 0x010000 )
|
||||
{
|
||||
// It's an old 0.x interface (we don't support it)
|
||||
close( fd );
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get number of joystick axes
|
||||
ioctl( fd, JSIOCGAXES, &ret_data );
|
||||
_glfwJoy[ joy_count ].NumAxes = (int) ret_data;
|
||||
|
||||
// Get number of joystick buttons
|
||||
ioctl( fd, JSIOCGBUTTONS, &ret_data );
|
||||
_glfwJoy[ joy_count ].NumButtons = (int) ret_data;
|
||||
|
||||
// Allocate memory for joystick state
|
||||
_glfwJoy[ joy_count ].Axis =
|
||||
(float *) malloc( sizeof(float) *
|
||||
_glfwJoy[ joy_count ].NumAxes );
|
||||
if( _glfwJoy[ joy_count ].Axis == NULL )
|
||||
{
|
||||
close( fd );
|
||||
continue;
|
||||
}
|
||||
_glfwJoy[ joy_count ].Button =
|
||||
(unsigned char *) malloc( sizeof(char) *
|
||||
_glfwJoy[ joy_count ].NumButtons );
|
||||
if( _glfwJoy[ joy_count ].Button == NULL )
|
||||
{
|
||||
free( _glfwJoy[ joy_count ].Axis );
|
||||
close( fd );
|
||||
continue;
|
||||
}
|
||||
|
||||
// Clear joystick state
|
||||
for( n = 0; n < _glfwJoy[ joy_count ].NumAxes; ++ n )
|
||||
{
|
||||
_glfwJoy[ joy_count ].Axis[ n ] = 0.0f;
|
||||
}
|
||||
for( n = 0; n < _glfwJoy[ joy_count ].NumButtons; ++ n )
|
||||
{
|
||||
_glfwJoy[ joy_count ].Button[ n ] = GLFW_RELEASE;
|
||||
}
|
||||
|
||||
// The joystick is supported and connected
|
||||
_glfwJoy[ joy_count ].Present = GL_TRUE;
|
||||
joy_count ++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // _GLFW_USE_LINUX_JOYSTICKS
|
||||
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// _glfwTerminateJoysticks() - Close all opened joystick handles
|
||||
//========================================================================
|
||||
|
||||
void _glfwTerminateJoysticks( void )
|
||||
{
|
||||
|
||||
#ifdef _GLFW_USE_LINUX_JOYSTICKS
|
||||
|
||||
int i;
|
||||
|
||||
// Close any opened joysticks
|
||||
for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i )
|
||||
{
|
||||
if( _glfwJoy[ i ].Present )
|
||||
{
|
||||
close( _glfwJoy[ i ].fd );
|
||||
free( _glfwJoy[ i ].Axis );
|
||||
free( _glfwJoy[ i ].Button );
|
||||
_glfwJoy[ i ].Present = GL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // _GLFW_USE_LINUX_JOYSTICKS
|
||||
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Empty joystick event queue
|
||||
//========================================================================
|
||||
|
||||
static void pollJoystickEvents( void )
|
||||
{
|
||||
|
||||
#ifdef _GLFW_USE_LINUX_JOYSTICKS
|
||||
|
||||
struct js_event e;
|
||||
int i;
|
||||
|
||||
// Get joystick events for all GLFW joysticks
|
||||
for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i )
|
||||
{
|
||||
// Is the stick present?
|
||||
if( _glfwJoy[ i ].Present )
|
||||
{
|
||||
// Read all queued events (non-blocking)
|
||||
while( read(_glfwJoy[i].fd, &e, sizeof(struct js_event)) > 0 )
|
||||
{
|
||||
// We don't care if it's an init event or not
|
||||
e.type &= ~JS_EVENT_INIT;
|
||||
|
||||
// Check event type
|
||||
switch( e.type )
|
||||
{
|
||||
case JS_EVENT_AXIS:
|
||||
_glfwJoy[ i ].Axis[ e.number ] = (float) e.value /
|
||||
32767.0f;
|
||||
// We need to change the sign for the Y axes, so that
|
||||
// positive = up/forward, according to the GLFW spec.
|
||||
if( e.number & 1 )
|
||||
{
|
||||
_glfwJoy[ i ].Axis[ e.number ] =
|
||||
-_glfwJoy[ i ].Axis[ e.number ];
|
||||
}
|
||||
break;
|
||||
|
||||
case JS_EVENT_BUTTON:
|
||||
_glfwJoy[ i ].Button[ e.number ] =
|
||||
e.value ? GLFW_PRESS : GLFW_RELEASE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // _GLFW_USE_LINUX_JOYSTICKS
|
||||
|
||||
}
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// _glfwPlatformGetJoystickParam() - Determine joystick capabilities
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetJoystickParam( int joy, int param )
|
||||
{
|
||||
// Is joystick present?
|
||||
if( !_glfwJoy[ joy ].Present )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch( param )
|
||||
{
|
||||
case GLFW_PRESENT:
|
||||
return GL_TRUE;
|
||||
|
||||
case GLFW_AXES:
|
||||
return _glfwJoy[ joy ].NumAxes;
|
||||
|
||||
case GLFW_BUTTONS:
|
||||
return _glfwJoy[ joy ].NumButtons;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// _glfwPlatformGetJoystickPos() - Get joystick axis positions
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )
|
||||
{
|
||||
int i;
|
||||
|
||||
// Is joystick present?
|
||||
if( !_glfwJoy[ joy ].Present )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Update joystick state
|
||||
pollJoystickEvents();
|
||||
|
||||
// Does the joystick support less axes than requested?
|
||||
if( _glfwJoy[ joy ].NumAxes < numaxes )
|
||||
{
|
||||
numaxes = _glfwJoy[ joy ].NumAxes;
|
||||
}
|
||||
|
||||
// Copy axis positions from internal state
|
||||
for( i = 0; i < numaxes; ++ i )
|
||||
{
|
||||
pos[ i ] = _glfwJoy[ joy ].Axis[ i ];
|
||||
}
|
||||
|
||||
return numaxes;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// _glfwPlatformGetJoystickButtons() - Get joystick button states
|
||||
//========================================================================
|
||||
|
||||
int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons,
|
||||
int numbuttons )
|
||||
{
|
||||
int i;
|
||||
|
||||
// Is joystick present?
|
||||
if( !_glfwJoy[ joy ].Present )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Update joystick state
|
||||
pollJoystickEvents();
|
||||
|
||||
// Does the joystick support less buttons than requested?
|
||||
if( _glfwJoy[ joy ].NumButtons < numbuttons )
|
||||
{
|
||||
numbuttons = _glfwJoy[ joy ].NumButtons;
|
||||
}
|
||||
|
||||
// Copy button states from internal state
|
||||
for( i = 0; i < numbuttons; ++ i )
|
||||
{
|
||||
buttons[ i ] = _glfwJoy[ joy ].Button[ i ];
|
||||
}
|
||||
|
||||
return numbuttons;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,901 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: X11/GLX
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
/*
|
||||
* Marcus: This code was originally written by Markus G. Kuhn.
|
||||
* I have made some slight changes (trimmed it down a bit from >60 KB to
|
||||
* 20 KB), but the functionality is the same.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This module converts keysym values into the corresponding ISO 10646
|
||||
* (UCS, Unicode) values.
|
||||
*
|
||||
* The array keysymtab[] contains pairs of X11 keysym values for graphical
|
||||
* characters and the corresponding Unicode value. The function
|
||||
* _glfwKeySym2Unicode() maps a keysym onto a Unicode value using a binary
|
||||
* search, therefore keysymtab[] must remain SORTED by keysym value.
|
||||
*
|
||||
* We allow to represent any UCS character in the range U-00000000 to
|
||||
* U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff.
|
||||
* This admittedly does not cover the entire 31-bit space of UCS, but
|
||||
* it does cover all of the characters up to U-10FFFF, which can be
|
||||
* represented by UTF-16, and more, and it is very unlikely that higher
|
||||
* UCS codes will ever be assigned by ISO. So to get Unicode character
|
||||
* U+ABCD you can directly use keysym 0x0100abcd.
|
||||
*
|
||||
* Original author: Markus G. Kuhn <mkuhn@acm.org>, University of
|
||||
* Cambridge, April 2001
|
||||
*
|
||||
* Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing
|
||||
* an initial draft of the mapping table.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** KeySym to Unicode mapping table ****
|
||||
//************************************************************************
|
||||
|
||||
static struct codepair {
|
||||
unsigned short keysym;
|
||||
unsigned short ucs;
|
||||
} keysymtab[] = {
|
||||
{ 0x01a1, 0x0104 },
|
||||
{ 0x01a2, 0x02d8 },
|
||||
{ 0x01a3, 0x0141 },
|
||||
{ 0x01a5, 0x013d },
|
||||
{ 0x01a6, 0x015a },
|
||||
{ 0x01a9, 0x0160 },
|
||||
{ 0x01aa, 0x015e },
|
||||
{ 0x01ab, 0x0164 },
|
||||
{ 0x01ac, 0x0179 },
|
||||
{ 0x01ae, 0x017d },
|
||||
{ 0x01af, 0x017b },
|
||||
{ 0x01b1, 0x0105 },
|
||||
{ 0x01b2, 0x02db },
|
||||
{ 0x01b3, 0x0142 },
|
||||
{ 0x01b5, 0x013e },
|
||||
{ 0x01b6, 0x015b },
|
||||
{ 0x01b7, 0x02c7 },
|
||||
{ 0x01b9, 0x0161 },
|
||||
{ 0x01ba, 0x015f },
|
||||
{ 0x01bb, 0x0165 },
|
||||
{ 0x01bc, 0x017a },
|
||||
{ 0x01bd, 0x02dd },
|
||||
{ 0x01be, 0x017e },
|
||||
{ 0x01bf, 0x017c },
|
||||
{ 0x01c0, 0x0154 },
|
||||
{ 0x01c3, 0x0102 },
|
||||
{ 0x01c5, 0x0139 },
|
||||
{ 0x01c6, 0x0106 },
|
||||
{ 0x01c8, 0x010c },
|
||||
{ 0x01ca, 0x0118 },
|
||||
{ 0x01cc, 0x011a },
|
||||
{ 0x01cf, 0x010e },
|
||||
{ 0x01d0, 0x0110 },
|
||||
{ 0x01d1, 0x0143 },
|
||||
{ 0x01d2, 0x0147 },
|
||||
{ 0x01d5, 0x0150 },
|
||||
{ 0x01d8, 0x0158 },
|
||||
{ 0x01d9, 0x016e },
|
||||
{ 0x01db, 0x0170 },
|
||||
{ 0x01de, 0x0162 },
|
||||
{ 0x01e0, 0x0155 },
|
||||
{ 0x01e3, 0x0103 },
|
||||
{ 0x01e5, 0x013a },
|
||||
{ 0x01e6, 0x0107 },
|
||||
{ 0x01e8, 0x010d },
|
||||
{ 0x01ea, 0x0119 },
|
||||
{ 0x01ec, 0x011b },
|
||||
{ 0x01ef, 0x010f },
|
||||
{ 0x01f0, 0x0111 },
|
||||
{ 0x01f1, 0x0144 },
|
||||
{ 0x01f2, 0x0148 },
|
||||
{ 0x01f5, 0x0151 },
|
||||
{ 0x01f8, 0x0159 },
|
||||
{ 0x01f9, 0x016f },
|
||||
{ 0x01fb, 0x0171 },
|
||||
{ 0x01fe, 0x0163 },
|
||||
{ 0x01ff, 0x02d9 },
|
||||
{ 0x02a1, 0x0126 },
|
||||
{ 0x02a6, 0x0124 },
|
||||
{ 0x02a9, 0x0130 },
|
||||
{ 0x02ab, 0x011e },
|
||||
{ 0x02ac, 0x0134 },
|
||||
{ 0x02b1, 0x0127 },
|
||||
{ 0x02b6, 0x0125 },
|
||||
{ 0x02b9, 0x0131 },
|
||||
{ 0x02bb, 0x011f },
|
||||
{ 0x02bc, 0x0135 },
|
||||
{ 0x02c5, 0x010a },
|
||||
{ 0x02c6, 0x0108 },
|
||||
{ 0x02d5, 0x0120 },
|
||||
{ 0x02d8, 0x011c },
|
||||
{ 0x02dd, 0x016c },
|
||||
{ 0x02de, 0x015c },
|
||||
{ 0x02e5, 0x010b },
|
||||
{ 0x02e6, 0x0109 },
|
||||
{ 0x02f5, 0x0121 },
|
||||
{ 0x02f8, 0x011d },
|
||||
{ 0x02fd, 0x016d },
|
||||
{ 0x02fe, 0x015d },
|
||||
{ 0x03a2, 0x0138 },
|
||||
{ 0x03a3, 0x0156 },
|
||||
{ 0x03a5, 0x0128 },
|
||||
{ 0x03a6, 0x013b },
|
||||
{ 0x03aa, 0x0112 },
|
||||
{ 0x03ab, 0x0122 },
|
||||
{ 0x03ac, 0x0166 },
|
||||
{ 0x03b3, 0x0157 },
|
||||
{ 0x03b5, 0x0129 },
|
||||
{ 0x03b6, 0x013c },
|
||||
{ 0x03ba, 0x0113 },
|
||||
{ 0x03bb, 0x0123 },
|
||||
{ 0x03bc, 0x0167 },
|
||||
{ 0x03bd, 0x014a },
|
||||
{ 0x03bf, 0x014b },
|
||||
{ 0x03c0, 0x0100 },
|
||||
{ 0x03c7, 0x012e },
|
||||
{ 0x03cc, 0x0116 },
|
||||
{ 0x03cf, 0x012a },
|
||||
{ 0x03d1, 0x0145 },
|
||||
{ 0x03d2, 0x014c },
|
||||
{ 0x03d3, 0x0136 },
|
||||
{ 0x03d9, 0x0172 },
|
||||
{ 0x03dd, 0x0168 },
|
||||
{ 0x03de, 0x016a },
|
||||
{ 0x03e0, 0x0101 },
|
||||
{ 0x03e7, 0x012f },
|
||||
{ 0x03ec, 0x0117 },
|
||||
{ 0x03ef, 0x012b },
|
||||
{ 0x03f1, 0x0146 },
|
||||
{ 0x03f2, 0x014d },
|
||||
{ 0x03f3, 0x0137 },
|
||||
{ 0x03f9, 0x0173 },
|
||||
{ 0x03fd, 0x0169 },
|
||||
{ 0x03fe, 0x016b },
|
||||
{ 0x047e, 0x203e },
|
||||
{ 0x04a1, 0x3002 },
|
||||
{ 0x04a2, 0x300c },
|
||||
{ 0x04a3, 0x300d },
|
||||
{ 0x04a4, 0x3001 },
|
||||
{ 0x04a5, 0x30fb },
|
||||
{ 0x04a6, 0x30f2 },
|
||||
{ 0x04a7, 0x30a1 },
|
||||
{ 0x04a8, 0x30a3 },
|
||||
{ 0x04a9, 0x30a5 },
|
||||
{ 0x04aa, 0x30a7 },
|
||||
{ 0x04ab, 0x30a9 },
|
||||
{ 0x04ac, 0x30e3 },
|
||||
{ 0x04ad, 0x30e5 },
|
||||
{ 0x04ae, 0x30e7 },
|
||||
{ 0x04af, 0x30c3 },
|
||||
{ 0x04b0, 0x30fc },
|
||||
{ 0x04b1, 0x30a2 },
|
||||
{ 0x04b2, 0x30a4 },
|
||||
{ 0x04b3, 0x30a6 },
|
||||
{ 0x04b4, 0x30a8 },
|
||||
{ 0x04b5, 0x30aa },
|
||||
{ 0x04b6, 0x30ab },
|
||||
{ 0x04b7, 0x30ad },
|
||||
{ 0x04b8, 0x30af },
|
||||
{ 0x04b9, 0x30b1 },
|
||||
{ 0x04ba, 0x30b3 },
|
||||
{ 0x04bb, 0x30b5 },
|
||||
{ 0x04bc, 0x30b7 },
|
||||
{ 0x04bd, 0x30b9 },
|
||||
{ 0x04be, 0x30bb },
|
||||
{ 0x04bf, 0x30bd },
|
||||
{ 0x04c0, 0x30bf },
|
||||
{ 0x04c1, 0x30c1 },
|
||||
{ 0x04c2, 0x30c4 },
|
||||
{ 0x04c3, 0x30c6 },
|
||||
{ 0x04c4, 0x30c8 },
|
||||
{ 0x04c5, 0x30ca },
|
||||
{ 0x04c6, 0x30cb },
|
||||
{ 0x04c7, 0x30cc },
|
||||
{ 0x04c8, 0x30cd },
|
||||
{ 0x04c9, 0x30ce },
|
||||
{ 0x04ca, 0x30cf },
|
||||
{ 0x04cb, 0x30d2 },
|
||||
{ 0x04cc, 0x30d5 },
|
||||
{ 0x04cd, 0x30d8 },
|
||||
{ 0x04ce, 0x30db },
|
||||
{ 0x04cf, 0x30de },
|
||||
{ 0x04d0, 0x30df },
|
||||
{ 0x04d1, 0x30e0 },
|
||||
{ 0x04d2, 0x30e1 },
|
||||
{ 0x04d3, 0x30e2 },
|
||||
{ 0x04d4, 0x30e4 },
|
||||
{ 0x04d5, 0x30e6 },
|
||||
{ 0x04d6, 0x30e8 },
|
||||
{ 0x04d7, 0x30e9 },
|
||||
{ 0x04d8, 0x30ea },
|
||||
{ 0x04d9, 0x30eb },
|
||||
{ 0x04da, 0x30ec },
|
||||
{ 0x04db, 0x30ed },
|
||||
{ 0x04dc, 0x30ef },
|
||||
{ 0x04dd, 0x30f3 },
|
||||
{ 0x04de, 0x309b },
|
||||
{ 0x04df, 0x309c },
|
||||
{ 0x05ac, 0x060c },
|
||||
{ 0x05bb, 0x061b },
|
||||
{ 0x05bf, 0x061f },
|
||||
{ 0x05c1, 0x0621 },
|
||||
{ 0x05c2, 0x0622 },
|
||||
{ 0x05c3, 0x0623 },
|
||||
{ 0x05c4, 0x0624 },
|
||||
{ 0x05c5, 0x0625 },
|
||||
{ 0x05c6, 0x0626 },
|
||||
{ 0x05c7, 0x0627 },
|
||||
{ 0x05c8, 0x0628 },
|
||||
{ 0x05c9, 0x0629 },
|
||||
{ 0x05ca, 0x062a },
|
||||
{ 0x05cb, 0x062b },
|
||||
{ 0x05cc, 0x062c },
|
||||
{ 0x05cd, 0x062d },
|
||||
{ 0x05ce, 0x062e },
|
||||
{ 0x05cf, 0x062f },
|
||||
{ 0x05d0, 0x0630 },
|
||||
{ 0x05d1, 0x0631 },
|
||||
{ 0x05d2, 0x0632 },
|
||||
{ 0x05d3, 0x0633 },
|
||||
{ 0x05d4, 0x0634 },
|
||||
{ 0x05d5, 0x0635 },
|
||||
{ 0x05d6, 0x0636 },
|
||||
{ 0x05d7, 0x0637 },
|
||||
{ 0x05d8, 0x0638 },
|
||||
{ 0x05d9, 0x0639 },
|
||||
{ 0x05da, 0x063a },
|
||||
{ 0x05e0, 0x0640 },
|
||||
{ 0x05e1, 0x0641 },
|
||||
{ 0x05e2, 0x0642 },
|
||||
{ 0x05e3, 0x0643 },
|
||||
{ 0x05e4, 0x0644 },
|
||||
{ 0x05e5, 0x0645 },
|
||||
{ 0x05e6, 0x0646 },
|
||||
{ 0x05e7, 0x0647 },
|
||||
{ 0x05e8, 0x0648 },
|
||||
{ 0x05e9, 0x0649 },
|
||||
{ 0x05ea, 0x064a },
|
||||
{ 0x05eb, 0x064b },
|
||||
{ 0x05ec, 0x064c },
|
||||
{ 0x05ed, 0x064d },
|
||||
{ 0x05ee, 0x064e },
|
||||
{ 0x05ef, 0x064f },
|
||||
{ 0x05f0, 0x0650 },
|
||||
{ 0x05f1, 0x0651 },
|
||||
{ 0x05f2, 0x0652 },
|
||||
{ 0x06a1, 0x0452 },
|
||||
{ 0x06a2, 0x0453 },
|
||||
{ 0x06a3, 0x0451 },
|
||||
{ 0x06a4, 0x0454 },
|
||||
{ 0x06a5, 0x0455 },
|
||||
{ 0x06a6, 0x0456 },
|
||||
{ 0x06a7, 0x0457 },
|
||||
{ 0x06a8, 0x0458 },
|
||||
{ 0x06a9, 0x0459 },
|
||||
{ 0x06aa, 0x045a },
|
||||
{ 0x06ab, 0x045b },
|
||||
{ 0x06ac, 0x045c },
|
||||
{ 0x06ae, 0x045e },
|
||||
{ 0x06af, 0x045f },
|
||||
{ 0x06b0, 0x2116 },
|
||||
{ 0x06b1, 0x0402 },
|
||||
{ 0x06b2, 0x0403 },
|
||||
{ 0x06b3, 0x0401 },
|
||||
{ 0x06b4, 0x0404 },
|
||||
{ 0x06b5, 0x0405 },
|
||||
{ 0x06b6, 0x0406 },
|
||||
{ 0x06b7, 0x0407 },
|
||||
{ 0x06b8, 0x0408 },
|
||||
{ 0x06b9, 0x0409 },
|
||||
{ 0x06ba, 0x040a },
|
||||
{ 0x06bb, 0x040b },
|
||||
{ 0x06bc, 0x040c },
|
||||
{ 0x06be, 0x040e },
|
||||
{ 0x06bf, 0x040f },
|
||||
{ 0x06c0, 0x044e },
|
||||
{ 0x06c1, 0x0430 },
|
||||
{ 0x06c2, 0x0431 },
|
||||
{ 0x06c3, 0x0446 },
|
||||
{ 0x06c4, 0x0434 },
|
||||
{ 0x06c5, 0x0435 },
|
||||
{ 0x06c6, 0x0444 },
|
||||
{ 0x06c7, 0x0433 },
|
||||
{ 0x06c8, 0x0445 },
|
||||
{ 0x06c9, 0x0438 },
|
||||
{ 0x06ca, 0x0439 },
|
||||
{ 0x06cb, 0x043a },
|
||||
{ 0x06cc, 0x043b },
|
||||
{ 0x06cd, 0x043c },
|
||||
{ 0x06ce, 0x043d },
|
||||
{ 0x06cf, 0x043e },
|
||||
{ 0x06d0, 0x043f },
|
||||
{ 0x06d1, 0x044f },
|
||||
{ 0x06d2, 0x0440 },
|
||||
{ 0x06d3, 0x0441 },
|
||||
{ 0x06d4, 0x0442 },
|
||||
{ 0x06d5, 0x0443 },
|
||||
{ 0x06d6, 0x0436 },
|
||||
{ 0x06d7, 0x0432 },
|
||||
{ 0x06d8, 0x044c },
|
||||
{ 0x06d9, 0x044b },
|
||||
{ 0x06da, 0x0437 },
|
||||
{ 0x06db, 0x0448 },
|
||||
{ 0x06dc, 0x044d },
|
||||
{ 0x06dd, 0x0449 },
|
||||
{ 0x06de, 0x0447 },
|
||||
{ 0x06df, 0x044a },
|
||||
{ 0x06e0, 0x042e },
|
||||
{ 0x06e1, 0x0410 },
|
||||
{ 0x06e2, 0x0411 },
|
||||
{ 0x06e3, 0x0426 },
|
||||
{ 0x06e4, 0x0414 },
|
||||
{ 0x06e5, 0x0415 },
|
||||
{ 0x06e6, 0x0424 },
|
||||
{ 0x06e7, 0x0413 },
|
||||
{ 0x06e8, 0x0425 },
|
||||
{ 0x06e9, 0x0418 },
|
||||
{ 0x06ea, 0x0419 },
|
||||
{ 0x06eb, 0x041a },
|
||||
{ 0x06ec, 0x041b },
|
||||
{ 0x06ed, 0x041c },
|
||||
{ 0x06ee, 0x041d },
|
||||
{ 0x06ef, 0x041e },
|
||||
{ 0x06f0, 0x041f },
|
||||
{ 0x06f1, 0x042f },
|
||||
{ 0x06f2, 0x0420 },
|
||||
{ 0x06f3, 0x0421 },
|
||||
{ 0x06f4, 0x0422 },
|
||||
{ 0x06f5, 0x0423 },
|
||||
{ 0x06f6, 0x0416 },
|
||||
{ 0x06f7, 0x0412 },
|
||||
{ 0x06f8, 0x042c },
|
||||
{ 0x06f9, 0x042b },
|
||||
{ 0x06fa, 0x0417 },
|
||||
{ 0x06fb, 0x0428 },
|
||||
{ 0x06fc, 0x042d },
|
||||
{ 0x06fd, 0x0429 },
|
||||
{ 0x06fe, 0x0427 },
|
||||
{ 0x06ff, 0x042a },
|
||||
{ 0x07a1, 0x0386 },
|
||||
{ 0x07a2, 0x0388 },
|
||||
{ 0x07a3, 0x0389 },
|
||||
{ 0x07a4, 0x038a },
|
||||
{ 0x07a5, 0x03aa },
|
||||
{ 0x07a7, 0x038c },
|
||||
{ 0x07a8, 0x038e },
|
||||
{ 0x07a9, 0x03ab },
|
||||
{ 0x07ab, 0x038f },
|
||||
{ 0x07ae, 0x0385 },
|
||||
{ 0x07af, 0x2015 },
|
||||
{ 0x07b1, 0x03ac },
|
||||
{ 0x07b2, 0x03ad },
|
||||
{ 0x07b3, 0x03ae },
|
||||
{ 0x07b4, 0x03af },
|
||||
{ 0x07b5, 0x03ca },
|
||||
{ 0x07b6, 0x0390 },
|
||||
{ 0x07b7, 0x03cc },
|
||||
{ 0x07b8, 0x03cd },
|
||||
{ 0x07b9, 0x03cb },
|
||||
{ 0x07ba, 0x03b0 },
|
||||
{ 0x07bb, 0x03ce },
|
||||
{ 0x07c1, 0x0391 },
|
||||
{ 0x07c2, 0x0392 },
|
||||
{ 0x07c3, 0x0393 },
|
||||
{ 0x07c4, 0x0394 },
|
||||
{ 0x07c5, 0x0395 },
|
||||
{ 0x07c6, 0x0396 },
|
||||
{ 0x07c7, 0x0397 },
|
||||
{ 0x07c8, 0x0398 },
|
||||
{ 0x07c9, 0x0399 },
|
||||
{ 0x07ca, 0x039a },
|
||||
{ 0x07cb, 0x039b },
|
||||
{ 0x07cc, 0x039c },
|
||||
{ 0x07cd, 0x039d },
|
||||
{ 0x07ce, 0x039e },
|
||||
{ 0x07cf, 0x039f },
|
||||
{ 0x07d0, 0x03a0 },
|
||||
{ 0x07d1, 0x03a1 },
|
||||
{ 0x07d2, 0x03a3 },
|
||||
{ 0x07d4, 0x03a4 },
|
||||
{ 0x07d5, 0x03a5 },
|
||||
{ 0x07d6, 0x03a6 },
|
||||
{ 0x07d7, 0x03a7 },
|
||||
{ 0x07d8, 0x03a8 },
|
||||
{ 0x07d9, 0x03a9 },
|
||||
{ 0x07e1, 0x03b1 },
|
||||
{ 0x07e2, 0x03b2 },
|
||||
{ 0x07e3, 0x03b3 },
|
||||
{ 0x07e4, 0x03b4 },
|
||||
{ 0x07e5, 0x03b5 },
|
||||
{ 0x07e6, 0x03b6 },
|
||||
{ 0x07e7, 0x03b7 },
|
||||
{ 0x07e8, 0x03b8 },
|
||||
{ 0x07e9, 0x03b9 },
|
||||
{ 0x07ea, 0x03ba },
|
||||
{ 0x07eb, 0x03bb },
|
||||
{ 0x07ec, 0x03bc },
|
||||
{ 0x07ed, 0x03bd },
|
||||
{ 0x07ee, 0x03be },
|
||||
{ 0x07ef, 0x03bf },
|
||||
{ 0x07f0, 0x03c0 },
|
||||
{ 0x07f1, 0x03c1 },
|
||||
{ 0x07f2, 0x03c3 },
|
||||
{ 0x07f3, 0x03c2 },
|
||||
{ 0x07f4, 0x03c4 },
|
||||
{ 0x07f5, 0x03c5 },
|
||||
{ 0x07f6, 0x03c6 },
|
||||
{ 0x07f7, 0x03c7 },
|
||||
{ 0x07f8, 0x03c8 },
|
||||
{ 0x07f9, 0x03c9 },
|
||||
{ 0x08a1, 0x23b7 },
|
||||
{ 0x08a2, 0x250c },
|
||||
{ 0x08a3, 0x2500 },
|
||||
{ 0x08a4, 0x2320 },
|
||||
{ 0x08a5, 0x2321 },
|
||||
{ 0x08a6, 0x2502 },
|
||||
{ 0x08a7, 0x23a1 },
|
||||
{ 0x08a8, 0x23a3 },
|
||||
{ 0x08a9, 0x23a4 },
|
||||
{ 0x08aa, 0x23a6 },
|
||||
{ 0x08ab, 0x239b },
|
||||
{ 0x08ac, 0x239d },
|
||||
{ 0x08ad, 0x239e },
|
||||
{ 0x08ae, 0x23a0 },
|
||||
{ 0x08af, 0x23a8 },
|
||||
{ 0x08b0, 0x23ac },
|
||||
{ 0x08bc, 0x2264 },
|
||||
{ 0x08bd, 0x2260 },
|
||||
{ 0x08be, 0x2265 },
|
||||
{ 0x08bf, 0x222b },
|
||||
{ 0x08c0, 0x2234 },
|
||||
{ 0x08c1, 0x221d },
|
||||
{ 0x08c2, 0x221e },
|
||||
{ 0x08c5, 0x2207 },
|
||||
{ 0x08c8, 0x223c },
|
||||
{ 0x08c9, 0x2243 },
|
||||
{ 0x08cd, 0x21d4 },
|
||||
{ 0x08ce, 0x21d2 },
|
||||
{ 0x08cf, 0x2261 },
|
||||
{ 0x08d6, 0x221a },
|
||||
{ 0x08da, 0x2282 },
|
||||
{ 0x08db, 0x2283 },
|
||||
{ 0x08dc, 0x2229 },
|
||||
{ 0x08dd, 0x222a },
|
||||
{ 0x08de, 0x2227 },
|
||||
{ 0x08df, 0x2228 },
|
||||
{ 0x08ef, 0x2202 },
|
||||
{ 0x08f6, 0x0192 },
|
||||
{ 0x08fb, 0x2190 },
|
||||
{ 0x08fc, 0x2191 },
|
||||
{ 0x08fd, 0x2192 },
|
||||
{ 0x08fe, 0x2193 },
|
||||
{ 0x09e0, 0x25c6 },
|
||||
{ 0x09e1, 0x2592 },
|
||||
{ 0x09e2, 0x2409 },
|
||||
{ 0x09e3, 0x240c },
|
||||
{ 0x09e4, 0x240d },
|
||||
{ 0x09e5, 0x240a },
|
||||
{ 0x09e8, 0x2424 },
|
||||
{ 0x09e9, 0x240b },
|
||||
{ 0x09ea, 0x2518 },
|
||||
{ 0x09eb, 0x2510 },
|
||||
{ 0x09ec, 0x250c },
|
||||
{ 0x09ed, 0x2514 },
|
||||
{ 0x09ee, 0x253c },
|
||||
{ 0x09ef, 0x23ba },
|
||||
{ 0x09f0, 0x23bb },
|
||||
{ 0x09f1, 0x2500 },
|
||||
{ 0x09f2, 0x23bc },
|
||||
{ 0x09f3, 0x23bd },
|
||||
{ 0x09f4, 0x251c },
|
||||
{ 0x09f5, 0x2524 },
|
||||
{ 0x09f6, 0x2534 },
|
||||
{ 0x09f7, 0x252c },
|
||||
{ 0x09f8, 0x2502 },
|
||||
{ 0x0aa1, 0x2003 },
|
||||
{ 0x0aa2, 0x2002 },
|
||||
{ 0x0aa3, 0x2004 },
|
||||
{ 0x0aa4, 0x2005 },
|
||||
{ 0x0aa5, 0x2007 },
|
||||
{ 0x0aa6, 0x2008 },
|
||||
{ 0x0aa7, 0x2009 },
|
||||
{ 0x0aa8, 0x200a },
|
||||
{ 0x0aa9, 0x2014 },
|
||||
{ 0x0aaa, 0x2013 },
|
||||
{ 0x0aae, 0x2026 },
|
||||
{ 0x0aaf, 0x2025 },
|
||||
{ 0x0ab0, 0x2153 },
|
||||
{ 0x0ab1, 0x2154 },
|
||||
{ 0x0ab2, 0x2155 },
|
||||
{ 0x0ab3, 0x2156 },
|
||||
{ 0x0ab4, 0x2157 },
|
||||
{ 0x0ab5, 0x2158 },
|
||||
{ 0x0ab6, 0x2159 },
|
||||
{ 0x0ab7, 0x215a },
|
||||
{ 0x0ab8, 0x2105 },
|
||||
{ 0x0abb, 0x2012 },
|
||||
{ 0x0abc, 0x2329 },
|
||||
{ 0x0abe, 0x232a },
|
||||
{ 0x0ac3, 0x215b },
|
||||
{ 0x0ac4, 0x215c },
|
||||
{ 0x0ac5, 0x215d },
|
||||
{ 0x0ac6, 0x215e },
|
||||
{ 0x0ac9, 0x2122 },
|
||||
{ 0x0aca, 0x2613 },
|
||||
{ 0x0acc, 0x25c1 },
|
||||
{ 0x0acd, 0x25b7 },
|
||||
{ 0x0ace, 0x25cb },
|
||||
{ 0x0acf, 0x25af },
|
||||
{ 0x0ad0, 0x2018 },
|
||||
{ 0x0ad1, 0x2019 },
|
||||
{ 0x0ad2, 0x201c },
|
||||
{ 0x0ad3, 0x201d },
|
||||
{ 0x0ad4, 0x211e },
|
||||
{ 0x0ad6, 0x2032 },
|
||||
{ 0x0ad7, 0x2033 },
|
||||
{ 0x0ad9, 0x271d },
|
||||
{ 0x0adb, 0x25ac },
|
||||
{ 0x0adc, 0x25c0 },
|
||||
{ 0x0add, 0x25b6 },
|
||||
{ 0x0ade, 0x25cf },
|
||||
{ 0x0adf, 0x25ae },
|
||||
{ 0x0ae0, 0x25e6 },
|
||||
{ 0x0ae1, 0x25ab },
|
||||
{ 0x0ae2, 0x25ad },
|
||||
{ 0x0ae3, 0x25b3 },
|
||||
{ 0x0ae4, 0x25bd },
|
||||
{ 0x0ae5, 0x2606 },
|
||||
{ 0x0ae6, 0x2022 },
|
||||
{ 0x0ae7, 0x25aa },
|
||||
{ 0x0ae8, 0x25b2 },
|
||||
{ 0x0ae9, 0x25bc },
|
||||
{ 0x0aea, 0x261c },
|
||||
{ 0x0aeb, 0x261e },
|
||||
{ 0x0aec, 0x2663 },
|
||||
{ 0x0aed, 0x2666 },
|
||||
{ 0x0aee, 0x2665 },
|
||||
{ 0x0af0, 0x2720 },
|
||||
{ 0x0af1, 0x2020 },
|
||||
{ 0x0af2, 0x2021 },
|
||||
{ 0x0af3, 0x2713 },
|
||||
{ 0x0af4, 0x2717 },
|
||||
{ 0x0af5, 0x266f },
|
||||
{ 0x0af6, 0x266d },
|
||||
{ 0x0af7, 0x2642 },
|
||||
{ 0x0af8, 0x2640 },
|
||||
{ 0x0af9, 0x260e },
|
||||
{ 0x0afa, 0x2315 },
|
||||
{ 0x0afb, 0x2117 },
|
||||
{ 0x0afc, 0x2038 },
|
||||
{ 0x0afd, 0x201a },
|
||||
{ 0x0afe, 0x201e },
|
||||
{ 0x0ba3, 0x003c },
|
||||
{ 0x0ba6, 0x003e },
|
||||
{ 0x0ba8, 0x2228 },
|
||||
{ 0x0ba9, 0x2227 },
|
||||
{ 0x0bc0, 0x00af },
|
||||
{ 0x0bc2, 0x22a5 },
|
||||
{ 0x0bc3, 0x2229 },
|
||||
{ 0x0bc4, 0x230a },
|
||||
{ 0x0bc6, 0x005f },
|
||||
{ 0x0bca, 0x2218 },
|
||||
{ 0x0bcc, 0x2395 },
|
||||
{ 0x0bce, 0x22a4 },
|
||||
{ 0x0bcf, 0x25cb },
|
||||
{ 0x0bd3, 0x2308 },
|
||||
{ 0x0bd6, 0x222a },
|
||||
{ 0x0bd8, 0x2283 },
|
||||
{ 0x0bda, 0x2282 },
|
||||
{ 0x0bdc, 0x22a2 },
|
||||
{ 0x0bfc, 0x22a3 },
|
||||
{ 0x0cdf, 0x2017 },
|
||||
{ 0x0ce0, 0x05d0 },
|
||||
{ 0x0ce1, 0x05d1 },
|
||||
{ 0x0ce2, 0x05d2 },
|
||||
{ 0x0ce3, 0x05d3 },
|
||||
{ 0x0ce4, 0x05d4 },
|
||||
{ 0x0ce5, 0x05d5 },
|
||||
{ 0x0ce6, 0x05d6 },
|
||||
{ 0x0ce7, 0x05d7 },
|
||||
{ 0x0ce8, 0x05d8 },
|
||||
{ 0x0ce9, 0x05d9 },
|
||||
{ 0x0cea, 0x05da },
|
||||
{ 0x0ceb, 0x05db },
|
||||
{ 0x0cec, 0x05dc },
|
||||
{ 0x0ced, 0x05dd },
|
||||
{ 0x0cee, 0x05de },
|
||||
{ 0x0cef, 0x05df },
|
||||
{ 0x0cf0, 0x05e0 },
|
||||
{ 0x0cf1, 0x05e1 },
|
||||
{ 0x0cf2, 0x05e2 },
|
||||
{ 0x0cf3, 0x05e3 },
|
||||
{ 0x0cf4, 0x05e4 },
|
||||
{ 0x0cf5, 0x05e5 },
|
||||
{ 0x0cf6, 0x05e6 },
|
||||
{ 0x0cf7, 0x05e7 },
|
||||
{ 0x0cf8, 0x05e8 },
|
||||
{ 0x0cf9, 0x05e9 },
|
||||
{ 0x0cfa, 0x05ea },
|
||||
{ 0x0da1, 0x0e01 },
|
||||
{ 0x0da2, 0x0e02 },
|
||||
{ 0x0da3, 0x0e03 },
|
||||
{ 0x0da4, 0x0e04 },
|
||||
{ 0x0da5, 0x0e05 },
|
||||
{ 0x0da6, 0x0e06 },
|
||||
{ 0x0da7, 0x0e07 },
|
||||
{ 0x0da8, 0x0e08 },
|
||||
{ 0x0da9, 0x0e09 },
|
||||
{ 0x0daa, 0x0e0a },
|
||||
{ 0x0dab, 0x0e0b },
|
||||
{ 0x0dac, 0x0e0c },
|
||||
{ 0x0dad, 0x0e0d },
|
||||
{ 0x0dae, 0x0e0e },
|
||||
{ 0x0daf, 0x0e0f },
|
||||
{ 0x0db0, 0x0e10 },
|
||||
{ 0x0db1, 0x0e11 },
|
||||
{ 0x0db2, 0x0e12 },
|
||||
{ 0x0db3, 0x0e13 },
|
||||
{ 0x0db4, 0x0e14 },
|
||||
{ 0x0db5, 0x0e15 },
|
||||
{ 0x0db6, 0x0e16 },
|
||||
{ 0x0db7, 0x0e17 },
|
||||
{ 0x0db8, 0x0e18 },
|
||||
{ 0x0db9, 0x0e19 },
|
||||
{ 0x0dba, 0x0e1a },
|
||||
{ 0x0dbb, 0x0e1b },
|
||||
{ 0x0dbc, 0x0e1c },
|
||||
{ 0x0dbd, 0x0e1d },
|
||||
{ 0x0dbe, 0x0e1e },
|
||||
{ 0x0dbf, 0x0e1f },
|
||||
{ 0x0dc0, 0x0e20 },
|
||||
{ 0x0dc1, 0x0e21 },
|
||||
{ 0x0dc2, 0x0e22 },
|
||||
{ 0x0dc3, 0x0e23 },
|
||||
{ 0x0dc4, 0x0e24 },
|
||||
{ 0x0dc5, 0x0e25 },
|
||||
{ 0x0dc6, 0x0e26 },
|
||||
{ 0x0dc7, 0x0e27 },
|
||||
{ 0x0dc8, 0x0e28 },
|
||||
{ 0x0dc9, 0x0e29 },
|
||||
{ 0x0dca, 0x0e2a },
|
||||
{ 0x0dcb, 0x0e2b },
|
||||
{ 0x0dcc, 0x0e2c },
|
||||
{ 0x0dcd, 0x0e2d },
|
||||
{ 0x0dce, 0x0e2e },
|
||||
{ 0x0dcf, 0x0e2f },
|
||||
{ 0x0dd0, 0x0e30 },
|
||||
{ 0x0dd1, 0x0e31 },
|
||||
{ 0x0dd2, 0x0e32 },
|
||||
{ 0x0dd3, 0x0e33 },
|
||||
{ 0x0dd4, 0x0e34 },
|
||||
{ 0x0dd5, 0x0e35 },
|
||||
{ 0x0dd6, 0x0e36 },
|
||||
{ 0x0dd7, 0x0e37 },
|
||||
{ 0x0dd8, 0x0e38 },
|
||||
{ 0x0dd9, 0x0e39 },
|
||||
{ 0x0dda, 0x0e3a },
|
||||
{ 0x0ddf, 0x0e3f },
|
||||
{ 0x0de0, 0x0e40 },
|
||||
{ 0x0de1, 0x0e41 },
|
||||
{ 0x0de2, 0x0e42 },
|
||||
{ 0x0de3, 0x0e43 },
|
||||
{ 0x0de4, 0x0e44 },
|
||||
{ 0x0de5, 0x0e45 },
|
||||
{ 0x0de6, 0x0e46 },
|
||||
{ 0x0de7, 0x0e47 },
|
||||
{ 0x0de8, 0x0e48 },
|
||||
{ 0x0de9, 0x0e49 },
|
||||
{ 0x0dea, 0x0e4a },
|
||||
{ 0x0deb, 0x0e4b },
|
||||
{ 0x0dec, 0x0e4c },
|
||||
{ 0x0ded, 0x0e4d },
|
||||
{ 0x0df0, 0x0e50 },
|
||||
{ 0x0df1, 0x0e51 },
|
||||
{ 0x0df2, 0x0e52 },
|
||||
{ 0x0df3, 0x0e53 },
|
||||
{ 0x0df4, 0x0e54 },
|
||||
{ 0x0df5, 0x0e55 },
|
||||
{ 0x0df6, 0x0e56 },
|
||||
{ 0x0df7, 0x0e57 },
|
||||
{ 0x0df8, 0x0e58 },
|
||||
{ 0x0df9, 0x0e59 },
|
||||
{ 0x0ea1, 0x3131 },
|
||||
{ 0x0ea2, 0x3132 },
|
||||
{ 0x0ea3, 0x3133 },
|
||||
{ 0x0ea4, 0x3134 },
|
||||
{ 0x0ea5, 0x3135 },
|
||||
{ 0x0ea6, 0x3136 },
|
||||
{ 0x0ea7, 0x3137 },
|
||||
{ 0x0ea8, 0x3138 },
|
||||
{ 0x0ea9, 0x3139 },
|
||||
{ 0x0eaa, 0x313a },
|
||||
{ 0x0eab, 0x313b },
|
||||
{ 0x0eac, 0x313c },
|
||||
{ 0x0ead, 0x313d },
|
||||
{ 0x0eae, 0x313e },
|
||||
{ 0x0eaf, 0x313f },
|
||||
{ 0x0eb0, 0x3140 },
|
||||
{ 0x0eb1, 0x3141 },
|
||||
{ 0x0eb2, 0x3142 },
|
||||
{ 0x0eb3, 0x3143 },
|
||||
{ 0x0eb4, 0x3144 },
|
||||
{ 0x0eb5, 0x3145 },
|
||||
{ 0x0eb6, 0x3146 },
|
||||
{ 0x0eb7, 0x3147 },
|
||||
{ 0x0eb8, 0x3148 },
|
||||
{ 0x0eb9, 0x3149 },
|
||||
{ 0x0eba, 0x314a },
|
||||
{ 0x0ebb, 0x314b },
|
||||
{ 0x0ebc, 0x314c },
|
||||
{ 0x0ebd, 0x314d },
|
||||
{ 0x0ebe, 0x314e },
|
||||
{ 0x0ebf, 0x314f },
|
||||
{ 0x0ec0, 0x3150 },
|
||||
{ 0x0ec1, 0x3151 },
|
||||
{ 0x0ec2, 0x3152 },
|
||||
{ 0x0ec3, 0x3153 },
|
||||
{ 0x0ec4, 0x3154 },
|
||||
{ 0x0ec5, 0x3155 },
|
||||
{ 0x0ec6, 0x3156 },
|
||||
{ 0x0ec7, 0x3157 },
|
||||
{ 0x0ec8, 0x3158 },
|
||||
{ 0x0ec9, 0x3159 },
|
||||
{ 0x0eca, 0x315a },
|
||||
{ 0x0ecb, 0x315b },
|
||||
{ 0x0ecc, 0x315c },
|
||||
{ 0x0ecd, 0x315d },
|
||||
{ 0x0ece, 0x315e },
|
||||
{ 0x0ecf, 0x315f },
|
||||
{ 0x0ed0, 0x3160 },
|
||||
{ 0x0ed1, 0x3161 },
|
||||
{ 0x0ed2, 0x3162 },
|
||||
{ 0x0ed3, 0x3163 },
|
||||
{ 0x0ed4, 0x11a8 },
|
||||
{ 0x0ed5, 0x11a9 },
|
||||
{ 0x0ed6, 0x11aa },
|
||||
{ 0x0ed7, 0x11ab },
|
||||
{ 0x0ed8, 0x11ac },
|
||||
{ 0x0ed9, 0x11ad },
|
||||
{ 0x0eda, 0x11ae },
|
||||
{ 0x0edb, 0x11af },
|
||||
{ 0x0edc, 0x11b0 },
|
||||
{ 0x0edd, 0x11b1 },
|
||||
{ 0x0ede, 0x11b2 },
|
||||
{ 0x0edf, 0x11b3 },
|
||||
{ 0x0ee0, 0x11b4 },
|
||||
{ 0x0ee1, 0x11b5 },
|
||||
{ 0x0ee2, 0x11b6 },
|
||||
{ 0x0ee3, 0x11b7 },
|
||||
{ 0x0ee4, 0x11b8 },
|
||||
{ 0x0ee5, 0x11b9 },
|
||||
{ 0x0ee6, 0x11ba },
|
||||
{ 0x0ee7, 0x11bb },
|
||||
{ 0x0ee8, 0x11bc },
|
||||
{ 0x0ee9, 0x11bd },
|
||||
{ 0x0eea, 0x11be },
|
||||
{ 0x0eeb, 0x11bf },
|
||||
{ 0x0eec, 0x11c0 },
|
||||
{ 0x0eed, 0x11c1 },
|
||||
{ 0x0eee, 0x11c2 },
|
||||
{ 0x0eef, 0x316d },
|
||||
{ 0x0ef0, 0x3171 },
|
||||
{ 0x0ef1, 0x3178 },
|
||||
{ 0x0ef2, 0x317f },
|
||||
{ 0x0ef3, 0x3181 },
|
||||
{ 0x0ef4, 0x3184 },
|
||||
{ 0x0ef5, 0x3186 },
|
||||
{ 0x0ef6, 0x318d },
|
||||
{ 0x0ef7, 0x318e },
|
||||
{ 0x0ef8, 0x11eb },
|
||||
{ 0x0ef9, 0x11f0 },
|
||||
{ 0x0efa, 0x11f9 },
|
||||
{ 0x0eff, 0x20a9 },
|
||||
{ 0x13a4, 0x20ac },
|
||||
{ 0x13bc, 0x0152 },
|
||||
{ 0x13bd, 0x0153 },
|
||||
{ 0x13be, 0x0178 },
|
||||
{ 0x20ac, 0x20ac },
|
||||
// Numeric keypad with numlock on
|
||||
{ XK_KP_Space, ' ' },
|
||||
{ XK_KP_Equal, '=' },
|
||||
{ XK_KP_Multiply, '*' },
|
||||
{ XK_KP_Add, '+' },
|
||||
{ XK_KP_Separator, ',' },
|
||||
{ XK_KP_Subtract, '-' },
|
||||
{ XK_KP_Decimal, '.' },
|
||||
{ XK_KP_Divide, '/' },
|
||||
{ XK_KP_0, 0x0030 },
|
||||
{ XK_KP_1, 0x0031 },
|
||||
{ XK_KP_2, 0x0032 },
|
||||
{ XK_KP_3, 0x0033 },
|
||||
{ XK_KP_4, 0x0034 },
|
||||
{ XK_KP_5, 0x0035 },
|
||||
{ XK_KP_6, 0x0036 },
|
||||
{ XK_KP_7, 0x0037 },
|
||||
{ XK_KP_8, 0x0038 },
|
||||
{ XK_KP_9, 0x0039 }
|
||||
};
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** GLFW internal functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// _glfwKeySym2Unicode() - Convert X11 KeySym to Unicode
|
||||
//========================================================================
|
||||
|
||||
long _glfwKeySym2Unicode( KeySym keysym )
|
||||
{
|
||||
int min = 0;
|
||||
int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;
|
||||
int mid;
|
||||
|
||||
/* First check for Latin-1 characters (1:1 mapping) */
|
||||
if( (keysym >= 0x0020 && keysym <= 0x007e) ||
|
||||
(keysym >= 0x00a0 && keysym <= 0x00ff) )
|
||||
{ return keysym;
|
||||
}
|
||||
|
||||
/* Also check for directly encoded 24-bit UCS characters */
|
||||
if( (keysym & 0xff000000) == 0x01000000 )
|
||||
{
|
||||
return keysym & 0x00ffffff;
|
||||
}
|
||||
|
||||
/* Binary search in table */
|
||||
while( max >= min )
|
||||
{
|
||||
mid = (min + max) / 2;
|
||||
if( keysymtab[mid].keysym < keysym )
|
||||
{
|
||||
min = mid + 1;
|
||||
}
|
||||
else if( keysymtab[mid].keysym > keysym )
|
||||
{
|
||||
max = mid - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Found it! */
|
||||
return keysymtab[mid].ucs;
|
||||
}
|
||||
}
|
||||
|
||||
/* No matching Unicode value found */
|
||||
return -1;
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
//========================================================================
|
||||
// GLFW - An OpenGL framework
|
||||
// Platform: X11/GLX
|
||||
// API version: 2.7
|
||||
// WWW: http://www.glfw.org/
|
||||
//------------------------------------------------------------------------
|
||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||
//
|
||||
// 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"
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Initialise timer
|
||||
//========================================================================
|
||||
|
||||
void _glfwInitTimer( void )
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
// "Resolution" is 1 us
|
||||
_glfwLibrary.Timer.resolution = 1e-6;
|
||||
|
||||
// Set start-time for timer
|
||||
gettimeofday( &tv, NULL );
|
||||
_glfwLibrary.Timer.t0 = (long long) tv.tv_sec * (long long) 1000000 +
|
||||
(long long) tv.tv_usec;
|
||||
}
|
||||
|
||||
|
||||
//************************************************************************
|
||||
//**** Platform implementation functions ****
|
||||
//************************************************************************
|
||||
|
||||
//========================================================================
|
||||
// Return timer value in seconds
|
||||
//========================================================================
|
||||
|
||||
double _glfwPlatformGetTime( void )
|
||||
{
|
||||
long long t;
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday( &tv, NULL );
|
||||
t = (long long) tv.tv_sec * (long long) 1000000 +
|
||||
(long long) tv.tv_usec;
|
||||
|
||||
return (double)(t - _glfwLibrary.Timer.t0) * _glfwLibrary.Timer.resolution;
|
||||
}
|
||||
|
||||
|
||||
//========================================================================
|
||||
// Set timer value in seconds
|
||||
//========================================================================
|
||||
|
||||
void _glfwPlatformSetTime( double t )
|
||||
{
|
||||
long long t0;
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday( &tv, NULL );
|
||||
t0 = (long long) tv.tv_sec * (long long) 1000000 +
|
||||
(long long) tv.tv_usec;
|
||||
|
||||
// Calulate new starting time
|
||||
_glfwLibrary.Timer.t0 = t0 - (long long)(t/_glfwLibrary.Timer.resolution);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user