GLFW-b 0.1.0.1 → 0.1.0.2
raw patch · 43 files changed
+2736/−2519 lines, 43 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ Graphics.UI.GLFW: disableAutoPoll :: IO ()
+ Graphics.UI.GLFW: enableAutoPoll :: IO ()
Files
- GLFW-b.cabal +1/−1
- glfw/include/GL/glfw.h +4/−4
- glfw/lib/cocoa/cocoa_enable.m +3/−4
- glfw/lib/cocoa/cocoa_fullscreen.m +4/−5
- glfw/lib/cocoa/cocoa_glext.m +3/−4
- glfw/lib/cocoa/cocoa_init.m +61/−5
- glfw/lib/cocoa/cocoa_joystick.m +3/−4
- glfw/lib/cocoa/cocoa_time.m +3/−4
- glfw/lib/cocoa/cocoa_window.m +80/−36
- glfw/lib/cocoa/platform.h +13/−4
- glfw/lib/enable.c +3/−3
- glfw/lib/fullscreen.c +6/−7
- glfw/lib/glext.c +86/−14
- glfw/lib/image.c +9/−11
- glfw/lib/init.c +7/−8
- glfw/lib/input.c +14/−25
- glfw/lib/joystick.c +6/−9
- glfw/lib/stream.c +5/−4
- glfw/lib/tga.c +6/−7
- glfw/lib/thread.c +26/−25
- glfw/lib/time.c +7/−6
- glfw/lib/win32/platform.h +42/−17
- glfw/lib/win32/win32_dllmain.c +4/−15
- glfw/lib/win32/win32_enable.c +4/−4
- glfw/lib/win32/win32_fullscreen.c +6/−6
- glfw/lib/win32/win32_glext.c +4/−4
- glfw/lib/win32/win32_init.c +12/−12
- glfw/lib/win32/win32_joystick.c +9/−10
- glfw/lib/win32/win32_thread.c +22/−27
- glfw/lib/win32/win32_time.c +5/−5
- glfw/lib/win32/win32_window.c +94/−41
- glfw/lib/window.c +140/−116
- glfw/lib/x11/platform.h +38/−19
- glfw/lib/x11/x11_enable.c +14/−5
- glfw/lib/x11/x11_fullscreen.c +46/−5
- glfw/lib/x11/x11_glext.c +6/−7
- glfw/lib/x11/x11_init.c +5/−5
- glfw/lib/x11/x11_joystick.c +9/−9
- glfw/lib/x11/x11_keysym2unicode.c +5/−5
- glfw/lib/x11/x11_thread.c +20/−25
- glfw/lib/x11/x11_time.c +4/−4
- glfw/lib/x11/x11_window.c +1886/−1988
- src/Graphics/UI/GLFW.hsc +11/−0
GLFW-b.cabal view
@@ -1,5 +1,5 @@ name: GLFW-b-version: 0.1.0.1+version: 0.1.0.2 category: Graphics
glfw/include/GL/glfw.h view
@@ -1,10 +1,10 @@ /************************************************************************ * GLFW - An OpenGL framework- * File: glfw.h * API version: 2.7- * WWW: http://glfw.sourceforge.net+ * WWW: http://www.glfw.org/ *------------------------------------------------------------------------- * Copyright (c) 2002-2006 Camilla Berglund+ * Copyright (c) 2002-2006 Marcus Geelnard+ * Copyright (c) 2006-2010 Camilla Berglund * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages@@ -178,7 +178,7 @@ #define GLFW_VERSION_MAJOR 2 #define GLFW_VERSION_MINOR 7-#define GLFW_VERSION_REVISION 0+#define GLFW_VERSION_REVISION 2 /*************************************************************************
glfw/lib/cocoa/cocoa_enable.m view
@@ -1,11 +1,10 @@ //======================================================================== // GLFW - An OpenGL framework-// File: macosx_enable.m-// Platform: Mac OS X+// Platform: Cocoa/NSOpenGL // API Version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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
glfw/lib/cocoa/cocoa_fullscreen.m view
@@ -1,11 +1,10 @@ //======================================================================== // GLFW - An OpenGL framework-// File: macosx_fullscreen.m-// Platform: Mac OS X+// Platform: Cocoa/NSOpenGL // API Version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -80,7 +79,7 @@ NSArray *modes = (NSArray *)CGDisplayAvailableModes( CGMainDisplayID() ); unsigned int i, j = 0, n = [modes count];- for( i = 0; i < n && i < (unsigned)maxcount; i++ )+ for( i = 0; i < n && j < (unsigned)maxcount; i++ ) { NSDictionary *mode = [modes objectAtIndex:i]; if( modeIsGood( mode ) )
glfw/lib/cocoa/cocoa_glext.m view
@@ -1,11 +1,10 @@ //======================================================================== // GLFW - An OpenGL framework-// File: macosx_glext.m-// Platform: Mac OS X+// Platform: Cocoa/NSOpenGL // API Version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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
glfw/lib/cocoa/cocoa_init.m view
@@ -1,11 +1,10 @@ //======================================================================== // GLFW - An OpenGL framework-// File: macosx_init.m-// Platform: Mac OS X+// Platform: Cocoa/NSOpenGL // API Version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -33,6 +32,39 @@ #include "internal.h" +@interface GLFWThread : NSThread+@end++@implementation GLFWThread++- (void)main+{+}++@end++@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.@@ -164,6 +196,16 @@ } //========================================================================+// Terminate GLFW when exiting application+//========================================================================++static void glfw_atexit( void )+{+ glfwTerminate();+}+++//======================================================================== // Initialize GLFW thread package //======================================================================== @@ -196,8 +238,19 @@ _glfwLibrary.AutoreleasePool = [[NSAutoreleasePool alloc] init]; // Implicitly create shared NSApplication instance- [NSApplication sharedApplication];+ [GLFWApplication sharedApplication]; + _glfwLibrary.OpenGLFramework =+ CFBundleGetBundleWithIdentifier( CFSTR( "com.apple.opengl" ) );+ if( _glfwLibrary.OpenGLFramework == NULL )+ {+ return GL_FALSE;+ }++ GLFWThread* thread = [[GLFWThread alloc] init];+ [thread start];+ [thread release];+ NSString* resourcePath = [[NSBundle mainBundle] resourcePath]; if( access( [resourcePath cStringUsingEncoding:NSUTF8StringEncoding], R_OK ) == 0 )@@ -209,6 +262,9 @@ setUpMenuBar(); [NSApp finishLaunching];++ // Install atexit routine+ atexit( glfw_atexit ); initThreads();
glfw/lib/cocoa/cocoa_joystick.m view
@@ -1,11 +1,10 @@ //======================================================================== // GLFW - An OpenGL framework-// File: macosx_joystick.m-// Platform: Mac OS X+// Platform: Cocoa/NSOpenGL // API Version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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
glfw/lib/cocoa/cocoa_time.m view
@@ -1,11 +1,10 @@ //======================================================================== // GLFW - An OpenGL framework-// File: macosx_time.m-// Platform: Mac OS X+// Platform: Cocoa/NSOpenGL // API Version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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
glfw/lib/cocoa/cocoa_window.m view
@@ -1,11 +1,10 @@ //======================================================================== // GLFW - An OpenGL framework-// File: macosx_window.m-// Platform: Mac OS X+// Platform: Cocoa/NSOpenGL // API Version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -30,6 +29,8 @@ #include "internal.h" +#include <AvailabilityMacros.h>+ //======================================================================== // Delegate for window related notifications // (but also used as an application delegate)@@ -70,6 +71,27 @@ } } +- (void)windowDidMiniaturize:(NSNotification *)notification+{+ _glfwWin.iconified = GL_TRUE;+}++- (void)windowDidDeminiaturize:(NSNotification *)notification+{+ _glfwWin.iconified = GL_FALSE;+}++- (void)windowDidBecomeKey:(NSNotification *)notification+{+ _glfwWin.active = GL_TRUE;+}++- (void)windowDidResignKey:(NSNotification *)notification+{+ _glfwWin.active = GL_FALSE;+ _glfwInputDeactivation();+}+ - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { if( _glfwWin.windowCloseCallback )@@ -114,7 +136,7 @@ /* 15 */ '4', /* 16 */ '6', /* 17 */ '5',- /* 18 */ GLFW_KEY_KP_EQUAL,+ /* 18 */ '=', /* 19 */ '9', /* 1a */ '7', /* 1b */ '-',@@ -153,25 +175,25 @@ /* 3c */ GLFW_KEY_RSHIFT, /* 3d */ GLFW_KEY_RALT, /* 3e */ GLFW_KEY_RCTRL,- /* 3f */ -1,- /* 40 */ -1,+ /* 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,- /* 48 */ -1,- /* 49 */ -1,- /* 4a */ -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 */ -1,- /* 50 */ -1,- /* 51 */ -1,+ /* 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,@@ -180,7 +202,7 @@ /* 57 */ GLFW_KEY_KP_5, /* 58 */ GLFW_KEY_KP_6, /* 59 */ GLFW_KEY_KP_7,- /* 5a */ -1,+ /* 5a */ GLFW_KEY_F20, /* 5b */ GLFW_KEY_KP_8, /* 5c */ GLFW_KEY_KP_9, /* 5d */ -1,@@ -191,20 +213,20 @@ /* 62 */ GLFW_KEY_F7, /* 63 */ GLFW_KEY_F3, /* 64 */ GLFW_KEY_F8,- /* 65 */ -1,+ /* 65 */ GLFW_KEY_F9, /* 66 */ -1,- /* 67 */ -1,+ /* 67 */ GLFW_KEY_F11, /* 68 */ -1, /* 69 */ GLFW_KEY_F13, /* 6a */ GLFW_KEY_F16,- /* 6b */ -1,+ /* 6b */ GLFW_KEY_F14, /* 6c */ -1,- /* 6d */ -1,+ /* 6d */ GLFW_KEY_F10, /* 6e */ -1,- /* 6f */ -1,+ /* 6f */ GLFW_KEY_F12, /* 70 */ -1,- /* 71 */ -1,- /* 72 */ GLFW_KEY_INSERT,+ /* 71 */ GLFW_KEY_F15,+ /* 72 */ GLFW_KEY_INSERT, /*Help*/ /* 73 */ GLFW_KEY_HOME, /* 74 */ GLFW_KEY_PAGEUP, /* 75 */ GLFW_KEY_DEL,@@ -281,7 +303,7 @@ if( _glfwWin.mouseLock ) { _glfwInput.MousePosX += [event deltaX];- _glfwInput.MousePosY -= [event deltaY];+ _glfwInput.MousePosY += [event deltaY]; } else {@@ -360,7 +382,7 @@ - (void)flagsChanged:(NSEvent *)event {- unsigned int newModifierFlags = [event modifierFlags];+ unsigned int newModifierFlags = [event modifierFlags] | NSDeviceIndependentModifierFlagsMask; int mode; if( newModifierFlags > _glfwWin.modifierFlags )@@ -429,10 +451,32 @@ _glfwWin.context = nil; _glfwWin.delegate = nil; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070+ // Fail if OpenGL 3.3 or above was requested+ if( wndconfig->glMajor > 3 || wndconfig->glMajor == 3 && wndconfig->glMinor > 2 )+ {+ return GL_FALSE;+ }++ if( wndconfig->glProfile )+ {+ // Fail if a profile other than core was explicitly selected+ if( wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE )+ {+ return GL_FALSE;+ }+ }+#else+ // Fail if OpenGL 3.0 or above was requested+ if( wndconfig->glMajor > 2 )+ {+ return GL_FALSE;+ }+#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/+ _glfwWin.delegate = [[GLFWWindowDelegate alloc] init]; if( _glfwWin.delegate == nil ) {- _glfwPlatformCloseWindow(); return GL_FALSE; } @@ -450,8 +494,6 @@ } // Ignored hints:- // OpenGLMajor, OpenGLMinor, OpenGLForward:- // pending Mac OS X support for OpenGL 3.x // OpenGLDebug // pending it meaning anything on Mac OS X @@ -496,9 +538,9 @@ _glfwWin.window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, width, height)- styleMask:styleMask- backing:NSBackingStoreBuffered- defer:NO];+ styleMask:styleMask+ backing:NSBackingStoreBuffered+ defer:NO]; [_glfwWin.window setContentView:[[GLFWContentView alloc] init]]; [_glfwWin.window setDelegate:_glfwWin.delegate]; [_glfwWin.window setAcceptsMouseMovedEvents:YES];@@ -513,7 +555,7 @@ 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+#define MAX_ATTRS 64 // urrgh NSOpenGLPixelFormatAttribute attributes[MAX_ATTRS]; ADD_ATTR( NSOpenGLPFADoubleBuffer );@@ -526,6 +568,13 @@ CGDisplayIDToOpenGLDisplayMask( CGMainDisplayID() ) ); } +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070+ if( wndconfig->glMajor > 2 )+ {+ ADD_ATTR2( NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core );+ }+#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/+ ADD_ATTR2( NSOpenGLPFAColorSize, colorBits ); if( fbconfig->alphaBits > 0)@@ -572,7 +621,6 @@ _glfwWin.pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; if( _glfwWin.pixelFormat == nil ) {- _glfwPlatformCloseWindow(); return GL_FALSE; } @@ -580,7 +628,6 @@ shareContext:nil]; if( _glfwWin.context == nil ) {- _glfwPlatformCloseWindow(); return GL_FALSE; } @@ -777,10 +824,7 @@ 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; } //========================================================================
glfw/lib/cocoa/platform.h view
@@ -1,11 +1,10 @@ //======================================================================== // GLFW - An OpenGL framework-// File: platform.h-// Platform: Mac OS X+// Platform: Cocoa/NSOpenGL // API Version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -45,6 +44,14 @@ #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 //========================================================================@@ -108,6 +115,8 @@ int has_GL_ARB_texture_non_power_of_two; int glMajor, glMinor, glRevision; int glForward, glDebug, glProfile;++ PFNGLGETSTRINGIPROC GetStringi; // ========= PLATFORM SPECIFIC PART ======================================
glfw/lib/enable.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: enable.c // Platform: Any // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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
glfw/lib/fullscreen.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: fullscreen.c // Platform: Any // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -36,11 +36,10 @@ //************************************************************************ //========================================================================-// glfwGetVideoModes() - Get a list of available video modes+// Get a list of available video modes //======================================================================== -GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list,- int maxcount )+GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list, int maxcount ) { int count, i, swap, res1, res2, depth1, depth2; GLFWvidmode vm;@@ -80,7 +79,7 @@ //========================================================================-// glfwGetDesktopMode() - Get the desktop video mode+// Get the desktop video mode //======================================================================== GLFWAPI void GLFWAPIENTRY glfwGetDesktopMode( GLFWvidmode *mode )
glfw/lib/glext.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: glext.c // Platform: Any // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -35,6 +35,18 @@ //**** GLFW internal functions **** //************************************************************************ +#ifndef GL_VERSION_3_0+#define GL_NUM_EXTENSIONS 0x821D+#define GL_CONTEXT_FLAGS 0x821E+#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001+#endif++#ifndef GL_VERSION_3_2+#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001+#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002+#define GL_CONTEXT_PROFILE_MASK 0x9126+#endif+ //======================================================================== // Parses the OpenGL version string and extracts the version number //========================================================================@@ -82,8 +94,7 @@ } //========================================================================-// _glfwStringInExtensionString() - Check if a string can be found in an-// OpenGL extension string+// Check if a string can be found in an OpenGL extension string //======================================================================== int _glfwStringInExtensionString( const char *string,@@ -118,20 +129,62 @@ } +//========================================================================+// Reads back OpenGL context properties from the current context+//======================================================================== +void _glfwRefreshContextParams( void )+{+ _glfwParseGLVersion( &_glfwWin.glMajor, &_glfwWin.glMinor,+ &_glfwWin.glRevision );++ _glfwWin.glProfile = 0;+ _glfwWin.glForward = GL_FALSE;++ // Read back the context profile, if applicable+ if( _glfwWin.glMajor >= 3 )+ {+ GLint flags;+ glGetIntegerv( GL_CONTEXT_FLAGS, &flags );++ if( flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT )+ {+ _glfwWin.glForward = GL_TRUE;+ }+ }++ if( _glfwWin.glMajor > 3 ||+ ( _glfwWin.glMajor == 3 && _glfwWin.glMinor >= 2 ) )+ {+ GLint mask;+ glGetIntegerv( GL_CONTEXT_PROFILE_MASK, &mask );++ if( mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT )+ {+ _glfwWin.glProfile = GLFW_OPENGL_COMPAT_PROFILE;+ }+ else if( mask & GL_CONTEXT_CORE_PROFILE_BIT )+ {+ _glfwWin.glProfile = GLFW_OPENGL_CORE_PROFILE;+ }+ }+}++ //************************************************************************ //**** GLFW user functions **** //************************************************************************ //========================================================================-// glfwExtensionSupported() - Check if an OpenGL extension is available-// at runtime+// Check if an OpenGL extension is available at runtime //======================================================================== GLFWAPI int GLFWAPIENTRY glfwExtensionSupported( const char *extension ) { const GLubyte *extensions; GLubyte *where;+ GLint count;+ int i; // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened )@@ -146,16 +199,35 @@ return GL_FALSE; } - // Check if extension is in the standard OpenGL extensions string- extensions = glGetString( GL_EXTENSIONS );- if( extensions != NULL )+ if( _glfwWin.glMajor < 3 ) {- if( _glfwStringInExtensionString( extension, extensions ) )+ // Check if extension is in the old style OpenGL extensions string++ extensions = glGetString( GL_EXTENSIONS );+ if( extensions != NULL ) {- return GL_TRUE;+ 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 ) ) {@@ -167,8 +239,8 @@ //========================================================================-// glfwGetProcAddress() - Get the function pointer to an OpenGL function.-// This function can be used to get access to extended OpenGL functions.+// Get the function pointer to an OpenGL function. This function can be+// used to get access to extended OpenGL functions. //======================================================================== GLFWAPI void * GLFWAPIENTRY glfwGetProcAddress( const char *procname )
glfw/lib/image.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: image.c // Platform: Any // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -270,7 +270,7 @@ //************************************************************************ //========================================================================-// glfwReadImage() - Read an image from a named file+// Read an image from a named file //======================================================================== GLFWAPI int GLFWAPIENTRY glfwReadImage( const char *name, GLFWimage *img,@@ -342,7 +342,7 @@ //========================================================================-// glfwReadMemoryImage() - Read an image file from a memory buffer+// Read an image file from a memory buffer //======================================================================== GLFWAPI int GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags )@@ -413,7 +413,7 @@ //========================================================================-// glfwFreeImage() - Free allocated memory for an image+// Free allocated memory for an image //======================================================================== GLFWAPI void GLFWAPIENTRY glfwFreeImage( GLFWimage *img )@@ -440,8 +440,7 @@ //========================================================================-// glfwLoadTexture2D() - Read an image from a file, and upload it to-// texture memory+// Read an image from a file, and upload it to texture memory //======================================================================== GLFWAPI int GLFWAPIENTRY glfwLoadTexture2D( const char *name, int flags )@@ -479,8 +478,7 @@ //========================================================================-// glfwLoadMemoryTexture2D() - Read an image from a buffer, and upload it to-// texture memory+// Read an image from a buffer, and upload it to texture memory //======================================================================== GLFWAPI int GLFWAPIENTRY glfwLoadMemoryTexture2D( const void *data, long size, int flags )@@ -518,7 +516,7 @@ //========================================================================-// glfwLoadTextureImage2D() - Upload an image object to texture memory+// Upload an image object to texture memory //======================================================================== GLFWAPI int GLFWAPIENTRY glfwLoadTextureImage2D( GLFWimage *img, int flags )
glfw/lib/init.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: init.c // Platform: Any // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -37,7 +37,7 @@ //************************************************************************ //========================================================================-// glfwInit() - Initialize various GLFW state+// Initialize various GLFW state //======================================================================== GLFWAPI int GLFWAPIENTRY glfwInit( void )@@ -75,7 +75,7 @@ //========================================================================-// glfwTerminate() - Close window and kill all threads.+// Close window and kill all threads. //======================================================================== GLFWAPI void GLFWAPIENTRY glfwTerminate( void )@@ -98,11 +98,10 @@ //========================================================================-// glfwGetVersion() - Get GLFW version+// Get GLFW version //======================================================================== -GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor,- int *rev )+GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor, int *rev ) { if( major != NULL ) *major = GLFW_VERSION_MAJOR; if( minor != NULL ) *minor = GLFW_VERSION_MINOR;
glfw/lib/input.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: input.c // Platform: Any // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -32,12 +32,11 @@ //========================================================================-// glfwGetKey()+// Return key state //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetKey( int key ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return GLFW_RELEASE;@@ -61,12 +60,11 @@ //========================================================================-// glfwGetMouseButton()+// Return mouse button state //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetMouseButton( int button ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return GLFW_RELEASE;@@ -90,12 +88,11 @@ //========================================================================-// glfwGetMousePos()+// Return mouse cursor position //======================================================================== GLFWAPI void GLFWAPIENTRY glfwGetMousePos( int *xpos, int *ypos ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -114,12 +111,11 @@ //========================================================================-// glfwSetMousePos()+// Sets the mouse cursor position //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMousePos( int xpos, int ypos ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -147,12 +143,11 @@ //========================================================================-// glfwGetMouseWheel()+// Return mouse wheel position //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetMouseWheel( void ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return 0;@@ -164,12 +159,11 @@ //========================================================================-// glfwSetMouseWheel()+// Set mouse wheel position //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMouseWheel( int pos ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -181,12 +175,11 @@ //========================================================================-// glfwSetKeyCallback() - Set callback function for keyboard input+// Set callback function for keyboard input //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetKeyCallback( GLFWkeyfun cbfun ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -198,12 +191,11 @@ //========================================================================-// glfwSetCharCallback() - Set callback function for character input+// Set callback function for character input //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetCharCallback( GLFWcharfun cbfun ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -215,12 +207,11 @@ //========================================================================-// glfwSetMouseButtonCallback() - Set callback function for mouse clicks+// Set callback function for mouse clicks //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -232,12 +223,11 @@ //========================================================================-// glfwSetMousePosCallback() - Set callback function for mouse moves+// Set callback function for mouse moves //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMousePosCallback( GLFWmouseposfun cbfun ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -256,12 +246,11 @@ //========================================================================-// glfwSetMouseWheelCallback() - Set callback function for mouse wheel+// Set callback function for mouse wheel //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;
glfw/lib/joystick.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: joystick.c // Platform: Any // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -36,12 +36,11 @@ //************************************************************************ //========================================================================-// glfwGetJoystickParam() - Determine joystick capabilities+// Determine joystick capabilities //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetJoystickParam( int joy, int param ) {- // Is GLFW initialized? if( !_glfwInitialized ) { return 0;@@ -52,14 +51,13 @@ //========================================================================-// glfwGetJoystickPos() - Get joystick axis positions+// Get joystick axis positions //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos( int joy, float *pos, int numaxes ) { int i; - // Is GLFW initialized? if( !_glfwInitialized ) { return 0;@@ -76,7 +74,7 @@ //========================================================================-// glfwGetJoystickButtons() - Get joystick button states+// Get joystick button states //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetJoystickButtons( int joy,@@ -85,7 +83,6 @@ { int i; - // Is GLFW initialized? if( !_glfwInitialized ) { return 0;
glfw/lib/stream.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: stream.c // Platform: Any // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -28,6 +28,7 @@ // //======================================================================== +#define _CRT_SECURE_NO_WARNINGS #include "internal.h" @@ -72,7 +73,7 @@ { if( stream->file != NULL ) {- return fread( data, 1, size, stream->file );+ return (long) fread( data, 1, size, stream->file ); } if( stream->data != NULL )
glfw/lib/tga.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: tga.c // Platform: Any // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -90,8 +90,7 @@ //========================================================================-// _glfwReadTGAHeader() - Read TGA file header (and check that it is-// valid)+// Read TGA file header (and check that it is valid) //======================================================================== static int ReadTGAHeader( _GLFWstream *s, _tga_header_t *h )@@ -151,7 +150,7 @@ //======================================================================== static void ReadTGA_RLE( unsigned char *buf, int size, int bpp,- _GLFWstream *s )+ _GLFWstream *s ) { int repcount, bytes, k, n; unsigned char pixel[ 4 ];@@ -199,7 +198,7 @@ //========================================================================-// _glfwReadTGA() - Read a TGA image from a file+// Read a TGA image from a file //======================================================================== int _glfwReadTGA( _GLFWstream *s, GLFWimage *img, int flags )
glfw/lib/thread.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: thread.c // Platform: Any // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -37,7 +37,7 @@ //************************************************************************ //========================================================================-// _glfwGetThreadPointer() - Find pointer to thread with a matching ID+// Find pointer to thread with a matching ID //======================================================================== _GLFWthread * _glfwGetThreadPointer( int ID )@@ -57,7 +57,7 @@ //========================================================================-// _glfwAppendThread() - Append thread to thread list+// Append thread to thread list //======================================================================== void _glfwAppendThread( _GLFWthread * t )@@ -76,7 +76,7 @@ //========================================================================-// _glfwRemoveThread() - Remove thread from thread list+// Remove thread from thread list //======================================================================== void _glfwRemoveThread( _GLFWthread * t )@@ -99,11 +99,11 @@ //************************************************************************ //========================================================================-// glfwCreateThread() - Create a new thread+// Create a new thread //======================================================================== GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun,- void *arg )+ void *arg ) { // Is GLFW initialized? if( !_glfwInitialized )@@ -117,8 +117,8 @@ //========================================================================-// glfwDestroyThread() - Kill a thread. NOTE: THIS IS A VERY DANGEROUS-// OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME SITUATIONS!+// Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT+// BE USED EXCEPT IN EXTREME SITUATIONS! //======================================================================== GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID )@@ -140,7 +140,7 @@ //========================================================================-// glfwWaitThread() - Wait for a thread to die+// Wait for a thread to die //======================================================================== GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode )@@ -162,7 +162,7 @@ //========================================================================-// glfwGetThreadID() - Return the thread ID for the current thread+// Return the thread ID for the current thread //======================================================================== GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID( void )@@ -178,7 +178,7 @@ //========================================================================-// glfwCreateMutex() - Create a mutual exclusion object+// Create a mutual exclusion object //======================================================================== GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex( void )@@ -194,7 +194,7 @@ //========================================================================-// glfwDestroyMutex() - Destroy a mutual exclusion object+// Destroy a mutual exclusion object //======================================================================== GLFWAPI void GLFWAPIENTRY glfwDestroyMutex( GLFWmutex mutex )@@ -210,7 +210,7 @@ //========================================================================-// glfwLockMutex() - Request access to a mutex+// Request access to a mutex //======================================================================== GLFWAPI void GLFWAPIENTRY glfwLockMutex( GLFWmutex mutex )@@ -226,7 +226,7 @@ //========================================================================-// glfwUnlockMutex() - Release a mutex+// Release a mutex //======================================================================== GLFWAPI void GLFWAPIENTRY glfwUnlockMutex( GLFWmutex mutex )@@ -242,7 +242,7 @@ //========================================================================-// glfwCreateCond() - Create a new condition variable object+// Create a new condition variable object //======================================================================== GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond( void )@@ -258,7 +258,7 @@ //========================================================================-// glfwDestroyCond() - Destroy a condition variable object+// Destroy a condition variable object //======================================================================== GLFWAPI void GLFWAPIENTRY glfwDestroyCond( GLFWcond cond )@@ -274,11 +274,11 @@ //========================================================================-// glfwWaitCond() - Wait for a condition to be raised+// Wait for a condition to be raised //======================================================================== GLFWAPI void GLFWAPIENTRY glfwWaitCond( GLFWcond cond, GLFWmutex mutex,- double timeout )+ double timeout ) { // Initialized & valid condition variable and mutex? if( !_glfwInitialized || !cond || !mutex )@@ -291,7 +291,7 @@ //========================================================================-// glfwSignalCond() - Signal a condition to one waiting thread+// Signal a condition to one waiting thread //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSignalCond( GLFWcond cond )@@ -307,7 +307,7 @@ //========================================================================-// glfwBroadcastCond() - Broadcast a condition to all waiting threads+// Broadcast a condition to all waiting threads //======================================================================== GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond )@@ -323,9 +323,9 @@ //========================================================================-// glfwGetNumberOfProcessors() - Return the number of processors in the-// system. This information can be useful for determining the optimal-// number of threads to use for performing a certain task.+// Return the number of processors in the system. This information can be+// useful for determining the optimal number of threads to use for+// performing a certain task. //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void )@@ -338,3 +338,4 @@ return _glfwPlatformGetNumberOfProcessors(); }+
glfw/lib/time.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: time.c // Platform: Any // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -36,7 +36,7 @@ //************************************************************************ //========================================================================-// glfwGetTime() - Return timer value in seconds+// Return timer value in seconds //======================================================================== GLFWAPI double GLFWAPIENTRY glfwGetTime( void )@@ -52,7 +52,7 @@ //========================================================================-// glfwSetTime() - Set timer value in seconds+// Set timer value in seconds //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetTime( double time )@@ -68,7 +68,7 @@ //========================================================================-// glfwSleep() - Put a thread to sleep for a specified amount of time+// Put a thread to sleep for a specified amount of time //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSleep( double time )@@ -81,3 +81,4 @@ _glfwPlatformSleep( time ); }+
glfw/lib/win32/platform.h view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: platform.h-// Platform: Windows+// Platform: Win32/WGL // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -133,16 +133,31 @@ #define XBUTTON2 2 #endif +#ifndef WGL_EXT_swap_control++/* Entry points */+typedef int (APIENTRY * PFNWGLSWAPINTERVALEXTPROC) (int);++#endif /*WGL_EXT_swap_control*/++#ifndef WGL_ARB_extensions_string++/* Entry points */+typedef const char *(APIENTRY * PFNWGLGETEXTENSIONSSTRINGARBPROC)( HDC );++#endif /*WGL_ARB_extensions_string*/++#ifndef WGL_EXT_extension_string++/* Entry points */+typedef const char *(APIENTRY * PFNWGLGETEXTENSIONSSTRINGEXTPROC)( void );++#endif /*WGL_EXT_extension_string*/+ #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 );+/* Entry points */+typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC, int, int, UINT, const int *, int *); /* Constants for wglGetPixelFormatAttribivARB */ #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000@@ -182,7 +197,7 @@ #ifndef WGL_ARB_create_context -/* wglCreateContextAttribsARB */+/* Entry points */ typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC, HGLRC, const int *); /* Tokens for wglCreateContextAttribsARB attributes */@@ -203,6 +218,13 @@ #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() //========================================================================@@ -319,7 +341,9 @@ int glMajor, glMinor, glRevision; int glForward, glDebug, glProfile; + PFNGLGETSTRINGIPROC GetStringi; + // ========= PLATFORM SPECIFIC PART ====================================== // Platform specific window resources@@ -333,15 +357,16 @@ DWORD dwExStyle; // --"-- // Platform specific extensions (context specific)- WGLSWAPINTERVALEXT_T SwapIntervalEXT;- WGLGETPIXELFORMATATTRIBIVARB_T GetPixelFormatAttribivARB;- WGLGETEXTENSIONSSTRINGEXT_T GetExtensionsStringEXT;- WGLGETEXTENSIONSSTRINGARB_T GetExtensionsStringARB;+ PFNWGLSWAPINTERVALEXTPROC SwapIntervalEXT;+ PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB;+ PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT;+ PFNWGLGETEXTENSIONSSTRINGARBPROC 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;+ GLboolean has_WGL_ARB_create_context_profile; // Various platform specific internal variables int oldMouseLock; // Old mouse-lock flag (used for remembering
glfw/lib/win32/win32_dllmain.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: win32_dllmain.c-// Platform: Windows+// Platform: Win32/WGL // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -41,17 +41,6 @@ { // NOTE: Some compilers complains about instance and x never being used - // never mind that (we don't want to use them)!-- switch( reason )- {- case DLL_PROCESS_ATTACH:- // Initializations- break;- case DLL_PROCESS_DETACH:- // Do some cleanup- glfwTerminate();- break;- }; return TRUE; }
glfw/lib/win32/win32_enable.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: win32_enable.c-// Platform: Windows+// Platform: Win32/WGL // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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
glfw/lib/win32/win32_fullscreen.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: win32_fullscreen.c-// Platform: Windows+// Platform: Win32/WGL // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -206,7 +206,7 @@ //========================================================================-// _glfwSetVideoMode() - Change the current video mode+// Change the current video mode //======================================================================== void _glfwSetVideoMode( int *w, int *h, int r, int g, int b, int refresh )@@ -226,7 +226,7 @@ //************************************************************************ //========================================================================-// _glfwPlatformGetVideoModes() - Get a list of available video modes+// Get a list of available video modes //======================================================================== int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount )
glfw/lib/win32/win32_glext.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: win32_glext.c-// Platform: Windows+// Platform: Win32/WGL // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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
glfw/lib/win32/win32_init.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: win32_init.c-// Platform: Windows+// Platform: Win32/WGL // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -42,7 +42,7 @@ //************************************************************************ //========================================================================-// _glfwInitLibraries() - Load necessary libraries (DLLs)+// Load necessary libraries (DLLs) //======================================================================== static int _glfwInitLibraries( void )@@ -113,7 +113,7 @@ //========================================================================-// _glfwFreeLibraries() - Unload used libraries (DLLs)+// Unload used libraries (DLLs) //======================================================================== static void _glfwFreeLibraries( void )@@ -139,7 +139,7 @@ //========================================================================-// _glfwInitThreads() - Initialize GLFW thread package+// Initialize GLFW thread package //======================================================================== static void _glfwInitThreads( void )@@ -161,7 +161,7 @@ //========================================================================-// _glfwTerminateThreads() - Terminate GLFW thread package+// Terminate GLFW thread package //======================================================================== static void _glfwTerminateThreads( void )@@ -202,7 +202,7 @@ //========================================================================-// _glfwTerminate_atexit() - Terminate GLFW when exiting application+// Terminate GLFW when exiting application //======================================================================== void _glfwTerminate_atexit( void )@@ -217,7 +217,7 @@ //************************************************************************ //========================================================================-// _glfwPlatformInit() - Initialize various GLFW state+// Initialize various GLFW state //======================================================================== int _glfwPlatformInit( void )@@ -323,7 +323,7 @@ //========================================================================-// _glfwPlatformTerminate() - Close window and kill all threads+// Close window and kill all threads //======================================================================== int _glfwPlatformTerminate( void )@@ -348,7 +348,7 @@ // Restore FOREGROUNDLOCKTIMEOUT system setting SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0,- (LPVOID)_glfwLibrary.Sys.foregroundLockTimeout,+ (LPVOID) _glfwLibrary.Sys.foregroundLockTimeout, SPIF_SENDCHANGE ); return GL_TRUE;
glfw/lib/win32/win32_joystick.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: win32_joystick.c-// Platform: Windows+// Platform: Win32/WGL // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -36,8 +36,7 @@ //************************************************************************ //========================================================================-// _glfwJoystickPresent() - Return GL_TRUE if joystick is present,-// else return GL_FALSE.+// Return GL_TRUE if joystick is present, else return GL_FALSE. //======================================================================== static int _glfwJoystickPresent( int joy )@@ -68,7 +67,7 @@ //========================================================================-// _glfwCalcJoystickPos() - Calculate joystick position+// Calculate joystick position //======================================================================== static float _glfwCalcJoystickPos( DWORD pos, DWORD min, DWORD max )@@ -86,7 +85,7 @@ //************************************************************************ //========================================================================-// _glfwPlatformGetJoystickParam() - Determine joystick capabilities+// Determine joystick capabilities //======================================================================== int _glfwPlatformGetJoystickParam( int joy, int param )@@ -129,7 +128,7 @@ //========================================================================-// _glfwPlatformGetJoystickPos() - Get joystick axis positions+// Get joystick axis positions //======================================================================== int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )@@ -194,7 +193,7 @@ //========================================================================-// _glfwPlatformGetJoystickButtons() - Get joystick button states+// Get joystick button states //======================================================================== int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons,
glfw/lib/win32/win32_thread.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: win32_thread.c-// Platform: Windows+// Platform: Win32/WGL // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -60,8 +60,7 @@ //************************************************************************ //========================================================================-// _glfwNewThread() - This is simply a "wrapper" for calling the user-// thread function.+// This is simply a "wrapper" for calling the user thread function. //======================================================================== DWORD WINAPI _glfwNewThread( LPVOID lpParam )@@ -98,7 +97,7 @@ //************************************************************************ //========================================================================-// _glfwPlatformCreateThread() - Create a new thread+// Create a new thread //======================================================================== GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg )@@ -168,9 +167,8 @@ //========================================================================-// _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY-// DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME-// SITUATIONS!+// Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT+// BE USED EXCEPT IN EXTREME SITUATIONS! //======================================================================== void _glfwPlatformDestroyThread( GLFWthread ID )@@ -204,7 +202,7 @@ //========================================================================-// _glfwPlatformWaitThread() - Wait for a thread to die+// Wait for a thread to die //======================================================================== int _glfwPlatformWaitThread( GLFWthread ID, int waitmode )@@ -256,8 +254,7 @@ //========================================================================-// _glfwPlatformGetThreadID() - Return the thread ID for the current-// thread+// Return the thread ID for the current thread //======================================================================== GLFWthread _glfwPlatformGetThreadID( void )@@ -292,7 +289,7 @@ //========================================================================-// _glfwPlatformCreateMutex() - Create a mutual exclusion object+// Create a mutual exclusion object //======================================================================== GLFWmutex _glfwPlatformCreateMutex( void )@@ -315,7 +312,7 @@ //========================================================================-// glfwDestroyMutex() - Destroy a mutual exclusion object+// Destroy a mutual exclusion object //======================================================================== void _glfwPlatformDestroyMutex( GLFWmutex mutex )@@ -327,7 +324,7 @@ //========================================================================-// _glfwPlatformLockMutex() - Request access to a mutex+// Request access to a mutex //======================================================================== void _glfwPlatformLockMutex( GLFWmutex mutex )@@ -338,7 +335,7 @@ //========================================================================-// _glfwPlatformUnlockMutex() - Release a mutex+// Release a mutex //======================================================================== void _glfwPlatformUnlockMutex( GLFWmutex mutex )@@ -349,7 +346,7 @@ //========================================================================-// _glfwPlatformCreateCond() - Create a new condition variable object+// Create a new condition variable object //======================================================================== GLFWcond _glfwPlatformCreateCond( void )@@ -377,7 +374,7 @@ //========================================================================-// _glfwPlatformDestroyCond() - Destroy a condition variable object+// Destroy a condition variable object //======================================================================== void _glfwPlatformDestroyCond( GLFWcond cond )@@ -395,11 +392,10 @@ //========================================================================-// _glfwPlatformWaitCond() - Wait for a condition to be raised+// Wait for a condition to be raised //======================================================================== -void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex,- double timeout )+void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout ) { _GLFWcond *cv = (_GLFWcond *) cond; int result, last_waiter;@@ -453,7 +449,7 @@ //========================================================================-// _glfwPlatformSignalCond() - Signal a condition to one waiting thread+// Signal a condition to one waiting thread //======================================================================== void _glfwPlatformSignalCond( GLFWcond cond )@@ -474,8 +470,7 @@ //========================================================================-// _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting-// threads+// Broadcast a condition to all waiting threads //======================================================================== void _glfwPlatformBroadcastCond( GLFWcond cond )@@ -496,8 +491,7 @@ //========================================================================-// _glfwPlatformGetNumberOfProcessors() - Return the number of processors-// in the system.+// Return the number of processors in the system. //======================================================================== int _glfwPlatformGetNumberOfProcessors( void )@@ -509,3 +503,4 @@ return (int) si.dwNumberOfProcessors; }+
glfw/lib/win32/win32_time.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: win32_time.c-// Platform: Windows+// Platform: Win32/WGL // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -36,7 +36,7 @@ //************************************************************************ //========================================================================-// _glfwInitTimer() - Initialise timer+// Initialise timer //======================================================================== void _glfwInitTimer( void )
glfw/lib/win32/win32_window.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: win32_window.c-// Platform: Windows+// Platform: Win32/WGL // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -202,6 +202,13 @@ continue; } + // Only consider "hardware-accelerated" pixel formats+ if( getPixelFormatAttrib( i, WGL_ACCELERATION_ARB ) ==+ WGL_NO_ACCELERATION_ARB )+ {+ continue;+ }+ result[*found].redBits = getPixelFormatAttrib( i, WGL_RED_BITS_ARB ); result[*found].greenBits = getPixelFormatAttrib( i, WGL_GREEN_BITS_ARB ); result[*found].blueBits = getPixelFormatAttrib( i, WGL_BLUE_BITS_ARB );@@ -289,26 +296,26 @@ // Creates an OpenGL context on the specified device context //======================================================================== -static HGLRC createContext( HDC dc, const _GLFWwndconfig* wndconfig, int pixelFormat )+static GLboolean createContext( HDC dc, const _GLFWwndconfig* wndconfig, int pixelFormat ) { PIXELFORMATDESCRIPTOR pfd;- int flags, i = 0, attribs[7];+ int flags, i = 0, attribs[40]; if( !_glfw_DescribePixelFormat( dc, pixelFormat, sizeof(pfd), &pfd ) ) {- return NULL;+ return GL_FALSE; } if( !_glfw_SetPixelFormat( dc, pixelFormat, &pfd ) ) {- return NULL;+ return GL_FALSE; } if( _glfwWin.has_WGL_ARB_create_context ) { // Use the newer wglCreateContextAttribsARB - if( wndconfig->glMajor != 0 || wndconfig->glMinor != 0 )+ if( wndconfig->glMajor != 1 || wndconfig->glMinor != 0 ) { // Request an explicitly versioned context @@ -338,6 +345,11 @@ if( wndconfig->glProfile ) {+ if( !_glfwWin.has_WGL_ARB_create_context_profile )+ {+ return GL_FALSE;+ }+ if( wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE ) { flags = WGL_CONTEXT_CORE_PROFILE_BIT_ARB;@@ -353,10 +365,22 @@ attribs[i++] = 0; - return _glfwWin.CreateContextAttribsARB( dc, NULL, attribs );+ _glfwWin.context = _glfwWin.CreateContextAttribsARB( dc, NULL, attribs );+ if( !_glfwWin.context )+ {+ return GL_FALSE;+ } }+ else+ {+ _glfwWin.context = wglCreateContext( dc );+ if( !_glfwWin.context )+ {+ return GL_FALSE;+ }+ } - return wglCreateContext( dc );+ return GL_TRUE; } @@ -658,7 +682,7 @@ if( !iconified ) { // Minimize window- CloseWindow( _glfwWin.window );+ ShowWindow( _glfwWin.window, SW_MINIMIZE ); iconified = GL_TRUE; } @@ -686,7 +710,7 @@ if( iconified ) { // Restore window- OpenIcon( _glfwWin.window );+ ShowWindow( _glfwWin.window, SW_RESTORE ); iconified = GL_FALSE; // Activate window@@ -988,12 +1012,13 @@ _glfwWin.has_WGL_ARB_pixel_format = GL_FALSE; _glfwWin.has_WGL_ARB_multisample = GL_FALSE; _glfwWin.has_WGL_ARB_create_context = GL_FALSE;+ _glfwWin.has_WGL_ARB_create_context_profile = GL_FALSE; - _glfwWin.GetExtensionsStringEXT = (WGLGETEXTENSIONSSTRINGEXT_T)+ _glfwWin.GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) wglGetProcAddress( "wglGetExtensionsStringEXT" ); if( !_glfwWin.GetExtensionsStringEXT ) {- _glfwWin.GetExtensionsStringARB = (WGLGETEXTENSIONSSTRINGARB_T)+ _glfwWin.GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress( "wglGetExtensionsStringARB" ); if( !_glfwWin.GetExtensionsStringARB ) {@@ -1013,17 +1038,25 @@ wglGetProcAddress( "wglCreateContextAttribsARB" ); } + if( _glfwWin.has_WGL_ARB_create_context )+ {+ if( _glfwPlatformExtensionSupported( "WGL_ARB_create_context_profile" ) )+ {+ _glfwWin.has_WGL_ARB_create_context_profile = GL_TRUE;+ }+ }+ if( _glfwPlatformExtensionSupported( "WGL_EXT_swap_control" ) ) { _glfwWin.has_WGL_EXT_swap_control = GL_TRUE;- _glfwWin.SwapIntervalEXT = (WGLSWAPINTERVALEXT_T)+ _glfwWin.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress( "wglSwapIntervalEXT" ); } if( _glfwPlatformExtensionSupported( "WGL_ARB_pixel_format" ) ) { _glfwWin.has_WGL_ARB_pixel_format = GL_TRUE;- _glfwWin.GetPixelFormatAttribivARB = (WGLGETPIXELFORMATATTRIBIVARB_T)+ _glfwWin.GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC) wglGetProcAddress( "wglGetPixelFormatAttribivARB" ); } }@@ -1195,8 +1228,7 @@ return GL_FALSE; } - _glfwWin.context = createContext( _glfwWin.DC, wndconfig, pixelFormat );- if( !_glfwWin.context )+ if( !createContext( _glfwWin.DC, wndconfig, pixelFormat ) ) { fprintf( stderr, "Unable to create OpenGL context\n" ); return GL_FALSE;@@ -1280,7 +1312,6 @@ if( !_glfwWin.classAtom ) { fprintf( stderr, "Failed to register GLFW window class\n" );- _glfwPlatformCloseWindow(); return GL_FALSE; } @@ -1296,21 +1327,10 @@ if( !createWindow( wndconfig, fbconfig ) ) { fprintf( stderr, "Failed to create GLFW window\n" );- _glfwPlatformCloseWindow(); return GL_FALSE; } - if( wndconfig->glMajor > 2 )- {- if( !_glfwWin.has_WGL_ARB_create_context )- {- fprintf( stderr, "OpenGL 3.0+ is not supported\n" );- _glfwPlatformCloseWindow();- return GL_FALSE;- }-- recreateContext = GL_TRUE;- }+ _glfwRefreshContextParams(); if( fbconfig->samples > 0 ) {@@ -1324,6 +1344,45 @@ } } + if( wndconfig->glMajor > 2 )+ {+ if ( wndconfig->glMajor != _glfwWin.glMajor ||+ wndconfig->glMinor != _glfwWin.glMinor )+ {+ // We want a different OpenGL version, but can we get it?+ // Otherwise, if we got a version greater than required, that's fine,+ // whereas if we got a version lesser than required, it will be dealt+ // with in glfwOpenWindow++ if( _glfwWin.has_WGL_ARB_create_context )+ {+ recreateContext = GL_TRUE;+ }+ }++ if( wndconfig->glForward )+ {+ if( !_glfwWin.has_WGL_ARB_create_context )+ {+ // Forward-compatibility is a hard constraint+ return GL_FALSE;+ }++ recreateContext = GL_TRUE;+ }++ if( wndconfig->glProfile )+ {+ if( !_glfwWin.has_WGL_ARB_create_context_profile )+ {+ // Context profile is a hard constraint+ return GL_FALSE;+ }++ recreateContext = GL_TRUE;+ }+ }+ if( recreateContext ) { // Some window hints require us to re-create the context using WGL@@ -1346,7 +1405,6 @@ if( !createWindow( wndconfig, fbconfig ) ) { fprintf( stderr, "Unable to re-create GLFW window\n" );- _glfwPlatformCloseWindow(); return GL_FALSE; } }@@ -1361,11 +1419,6 @@ setForegroundWindow( _glfwWin.window ); SetFocus( _glfwWin.window ); - // Start by clearing the front buffer to black (avoid ugly desktop- // remains in our OpenGL window)- glClear( GL_COLOR_BUFFER_BIT );- _glfw_SwapBuffers( _glfwWin.DC );- return GL_TRUE; } @@ -1497,7 +1550,7 @@ void _glfwPlatformIconifyWindow( void ) { // Iconify window- CloseWindow( _glfwWin.window );+ ShowWindow( _glfwWin.window, SW_MINIMIZE ); _glfwWin.iconified = GL_TRUE; // If we are in fullscreen mode we need to change video modes@@ -1531,7 +1584,7 @@ } // Un-iconify window- OpenIcon( _glfwWin.window );+ ShowWindow( _glfwWin.window, SW_RESTORE ); // Make sure that our window ends up on top of things ShowWindow( _glfwWin.window, SW_SHOW );@@ -1756,7 +1809,7 @@ //========================================================================-// _glfwPlatformWaitEvents() - Wait for new window and input events+// Wait for new window and input events //======================================================================== void _glfwPlatformWaitEvents( void )
glfw/lib/window.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: window.c // Platform: Any // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -33,7 +33,16 @@ #include <limits.h> +#ifndef GL_VERSION_3_2 +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001+#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002+#define GL_CONTEXT_PROFILE_MASK 0x9126++#endif /*GL_VERSION_3_2*/+++ //************************************************************************ //**** GLFW internal functions **** //************************************************************************@@ -50,6 +59,7 @@ void _glfwClearWindowHints( void ) { memset( &_glfwLibrary.hints, 0, sizeof( _glfwLibrary.hints ) );+ _glfwLibrary.hints.glMajor = 1; } @@ -82,7 +92,7 @@ //========================================================================-// _glfwClearInput() - Clear all input state+// Clear all input state //======================================================================== void _glfwClearInput( void )@@ -121,7 +131,7 @@ //========================================================================-// _glfwInputKey() - Register keyboard activity+// Register keyboard activity //======================================================================== void _glfwInputKey( int key, int action )@@ -215,7 +225,7 @@ //========================================================================-// _glfwInputMouseClick() - Register mouse button clicks+// Register mouse button clicks //======================================================================== void _glfwInputMouseClick( int button, int action )@@ -254,18 +264,9 @@ unsigned int missing, leastMissing = UINT_MAX; unsigned int colorDiff, leastColorDiff = UINT_MAX; unsigned int extraDiff, leastExtraDiff = UINT_MAX;- GLboolean desiresColor = GL_FALSE; const _GLFWfbconfig *current; const _GLFWfbconfig *closest = NULL; - // Cache some long-winded preferences-- if( desired->redBits || desired->greenBits || desired->blueBits ||- desired->alphaBits )- {- desiresColor = GL_TRUE;- }- for( i = 0; i < count; i++ ) { current = alternatives + i;@@ -396,21 +397,10 @@ } else if( missing == leastMissing ) {- if( desiresColor )- {- if( ( colorDiff < leastColorDiff ) ||- ( colorDiff == leastColorDiff && extraDiff < leastExtraDiff ) )- {- closest = current;- }- }- else+ if( ( colorDiff < leastColorDiff ) ||+ ( colorDiff == leastColorDiff && extraDiff < leastExtraDiff ) ) {- if( ( extraDiff < leastExtraDiff ) ||- ( extraDiff == leastExtraDiff && colorDiff < leastColorDiff ) )- {- closest = current;- }+ closest = current; } } @@ -441,37 +431,69 @@ _GLFWfbconfig fbconfig; _GLFWwndconfig wndconfig; - // Is GLFW initialized? if( !_glfwInitialized || _glfwWin.opened ) { return GL_FALSE; } // Set up desired framebuffer config- fbconfig.redBits = redbits;- fbconfig.greenBits = greenbits;- fbconfig.blueBits = bluebits;- fbconfig.alphaBits = alphabits;- fbconfig.depthBits = depthbits;- fbconfig.stencilBits = stencilbits;- fbconfig.accumRedBits = _glfwLibrary.hints.accumRedBits;- fbconfig.accumGreenBits = _glfwLibrary.hints.accumGreenBits;- fbconfig.accumBlueBits = _glfwLibrary.hints.accumBlueBits;- fbconfig.accumAlphaBits = _glfwLibrary.hints.accumAlphaBits;- fbconfig.auxBuffers = _glfwLibrary.hints.auxBuffers;- fbconfig.stereo = _glfwLibrary.hints.stereo;- fbconfig.samples = _glfwLibrary.hints.samples;+ fbconfig.redBits = Max( redbits, 0 );+ fbconfig.greenBits = Max( greenbits, 0 );+ fbconfig.blueBits = Max( bluebits, 0 );+ fbconfig.alphaBits = Max( alphabits, 0 );+ fbconfig.depthBits = Max( depthbits, 0 );+ fbconfig.stencilBits = Max( stencilbits, 0 );+ fbconfig.accumRedBits = Max( _glfwLibrary.hints.accumRedBits, 0 );+ fbconfig.accumGreenBits = Max( _glfwLibrary.hints.accumGreenBits, 0 );+ fbconfig.accumBlueBits = Max( _glfwLibrary.hints.accumBlueBits, 0 );+ fbconfig.accumAlphaBits = Max( _glfwLibrary.hints.accumAlphaBits, 0 );+ fbconfig.auxBuffers = Max( _glfwLibrary.hints.auxBuffers, 0 );+ fbconfig.stereo = _glfwLibrary.hints.stereo ? GL_TRUE : GL_FALSE;+ fbconfig.samples = Max( _glfwLibrary.hints.samples, 0 ); // Set up desired window config wndconfig.mode = mode;- wndconfig.refreshRate = _glfwLibrary.hints.refreshRate;- wndconfig.windowNoResize = _glfwLibrary.hints.windowNoResize;- wndconfig.glMajor = _glfwLibrary.hints.glMajor;- wndconfig.glMinor = _glfwLibrary.hints.glMinor;- wndconfig.glForward = _glfwLibrary.hints.glForward;- wndconfig.glDebug = _glfwLibrary.hints.glDebug;+ wndconfig.refreshRate = Max( _glfwLibrary.hints.refreshRate, 0 );+ wndconfig.windowNoResize = _glfwLibrary.hints.windowNoResize ? GL_TRUE : GL_FALSE;+ wndconfig.glMajor = Max( _glfwLibrary.hints.glMajor, 1 );+ wndconfig.glMinor = Max( _glfwLibrary.hints.glMinor, 0 );+ wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE;+ wndconfig.glDebug = _glfwLibrary.hints.glDebug ? GL_TRUE : GL_FALSE; wndconfig.glProfile = _glfwLibrary.hints.glProfile; + if( wndconfig.glMajor == 1 && wndconfig.glMinor > 5 )+ {+ // OpenGL 1.x series ended with version 1.5+ return GL_FALSE;+ }+ else if( wndconfig.glMajor == 2 && wndconfig.glMinor > 1 )+ {+ // OpenGL 2.x series ended with version 2.1+ return GL_FALSE;+ }+ else if( wndconfig.glMajor == 3 && wndconfig.glMinor > 3 )+ {+ // OpenGL 3.x series ended with version 3.3+ return GL_FALSE;+ }+ else+ {+ // For now, let everything else through+ }++ if( wndconfig.glProfile &&+ ( wndconfig.glMajor < 3 || ( wndconfig.glMajor == 3 && wndconfig.glMinor < 2 ) ) )+ {+ // Context profiles are only defined for OpenGL version 3.2 and above+ return GL_FALSE;+ }++ if( wndconfig.glForward && wndconfig.glMajor < 3 )+ {+ // Forward-compatible contexts are only defined for OpenGL version 3.0 and above+ return GL_FALSE;+ }+ // Clear for next open call _glfwClearWindowHints(); @@ -524,35 +546,62 @@ // Platform specific window opening routine if( !_glfwPlatformOpenWindow( width, height, &wndconfig, &fbconfig ) ) {+ glfwCloseWindow(); return GL_FALSE; } // Flag that window is now opened _glfwWin.opened = GL_TRUE; - // Get window parameters (such as color buffer bits etc)+ // Read back window and context parameters _glfwPlatformRefreshWindowParams();+ _glfwRefreshContextParams(); - // Get OpenGL version- _glfwParseGLVersion( &_glfwWin.glMajor, &_glfwWin.glMinor,- &_glfwWin.glRevision );+ if( _glfwWin.glMajor < wndconfig.glMajor ||+ ( _glfwWin.glMajor == wndconfig.glMajor &&+ _glfwWin.glMinor < wndconfig.glMinor ) )+ {+ glfwCloseWindow();+ return GL_FALSE;+ } - // Do we have non-power-of-two textures?+ // Do we have non-power-of-two textures (added to core in version 2.0)? _glfwWin.has_GL_ARB_texture_non_power_of_two = ( _glfwWin.glMajor >= 2 ) || glfwExtensionSupported( "GL_ARB_texture_non_power_of_two" ); - // Do we have automatic mipmap generation?+ // Do we have automatic mipmap generation (added to core in version 1.4)? _glfwWin.has_GL_SGIS_generate_mipmap = ( _glfwWin.glMajor >= 2 ) || ( _glfwWin.glMinor >= 4 ) || glfwExtensionSupported( "GL_SGIS_generate_mipmap" ); + if( _glfwWin.glMajor > 2 )+ {+ _glfwWin.GetStringi = (PFNGLGETSTRINGIPROC) glfwGetProcAddress( "glGetStringi" );+ if( !_glfwWin.GetStringi )+ {+ // This is a very common problem among people who compile GLFW+ // on X11/GLX using custom build systems, as it needs explicit+ // configuration in order to work+ //+ // See readme.html section 2.2 for details++ glfwCloseWindow();+ return GL_FALSE;+ }+ }+ // If full-screen mode was requested, disable mouse cursor if( mode == GLFW_FULLSCREEN ) { glfwDisable( GLFW_MOUSE_CURSOR ); } + // Start by clearing the front buffer to black (avoid ugly desktop+ // remains in our OpenGL window)+ glClear( GL_COLOR_BUFFER_BIT );+ _glfwPlatformSwapBuffers();+ return GL_TRUE; } @@ -563,7 +612,6 @@ GLFWAPI void GLFWAPIENTRY glfwOpenWindowHint( int target, int hint ) {- // Is GLFW initialized? if( !_glfwInitialized ) { return;@@ -572,54 +620,47 @@ switch( target ) { case GLFW_REFRESH_RATE:- _glfwLibrary.hints.refreshRate = Max(hint, 0);+ _glfwLibrary.hints.refreshRate = hint; break; case GLFW_ACCUM_RED_BITS:- _glfwLibrary.hints.accumRedBits = Max(hint, 0);+ _glfwLibrary.hints.accumRedBits = hint; break; case GLFW_ACCUM_GREEN_BITS:- _glfwLibrary.hints.accumGreenBits = Max(hint, 0);+ _glfwLibrary.hints.accumGreenBits = hint; break; case GLFW_ACCUM_BLUE_BITS:- _glfwLibrary.hints.accumBlueBits = Max(hint, 0);+ _glfwLibrary.hints.accumBlueBits = hint; break; case GLFW_ACCUM_ALPHA_BITS:- _glfwLibrary.hints.accumAlphaBits = Max(hint, 0);+ _glfwLibrary.hints.accumAlphaBits = hint; break; case GLFW_AUX_BUFFERS:- _glfwLibrary.hints.auxBuffers = Max(hint, 0);+ _glfwLibrary.hints.auxBuffers = hint; break; case GLFW_STEREO:- _glfwLibrary.hints.stereo = hint ? GL_TRUE : GL_FALSE;+ _glfwLibrary.hints.stereo = hint; break; case GLFW_WINDOW_NO_RESIZE:- _glfwLibrary.hints.windowNoResize = hint ? GL_TRUE : GL_FALSE;+ _glfwLibrary.hints.windowNoResize = hint; break; case GLFW_FSAA_SAMPLES:- _glfwLibrary.hints.samples = Max(hint, 0);+ _glfwLibrary.hints.samples = hint; break; case GLFW_OPENGL_VERSION_MAJOR:- _glfwLibrary.hints.glMajor = Max(hint, 0);+ _glfwLibrary.hints.glMajor = hint; break; case GLFW_OPENGL_VERSION_MINOR:- _glfwLibrary.hints.glMinor = Max(hint, 0);+ _glfwLibrary.hints.glMinor = hint; break; case GLFW_OPENGL_FORWARD_COMPAT:- _glfwLibrary.hints.glForward = hint ? GL_TRUE : GL_FALSE;+ _glfwLibrary.hints.glForward = hint; break; case GLFW_OPENGL_DEBUG_CONTEXT:- _glfwLibrary.hints.glDebug = hint ? GL_TRUE : GL_FALSE;+ _glfwLibrary.hints.glDebug = hint; break; case GLFW_OPENGL_PROFILE:- if( hint == GLFW_OPENGL_CORE_PROFILE ||- hint == GLFW_OPENGL_COMPAT_PROFILE )- {- _glfwLibrary.hints.glProfile = hint;- }- else- {- _glfwLibrary.hints.glProfile = 0;- }+ _glfwLibrary.hints.glProfile = hint;+ break; default: break; }@@ -643,17 +684,15 @@ _glfwPlatformCloseWindow(); memset( &_glfwWin, 0, sizeof(_glfwWin) );- _glfwWin.opened = GL_FALSE; } //========================================================================-// glfwSetWindowTitle() - Set the window title+// Set the window title //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowTitle( const char *title ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -665,11 +704,16 @@ //========================================================================-// glfwGetWindowSize() - Get the window size+// Get the window size //======================================================================== GLFWAPI void GLFWAPIENTRY glfwGetWindowSize( int *width, int *height ) {+ if( !_glfwInitialized || !_glfwWin.opened )+ {+ return;+ }+ if( width != NULL ) { *width = _glfwWin.width;@@ -682,12 +726,11 @@ //========================================================================-// glfwSetWindowSize() - Set the window size+// Set the window size //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowSize( int width, int height ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened || _glfwWin.iconified ) { return;@@ -709,12 +752,11 @@ //========================================================================-// glfwSetWindowPos() - Set the window position+// Set the window position //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowPos( int x, int y ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened || _glfwWin.fullscreen || _glfwWin.iconified ) {@@ -727,12 +769,11 @@ //========================================================================-// glfwIconfyWindow() - Window iconification+// Window iconification //======================================================================== GLFWAPI void GLFWAPIENTRY glfwIconifyWindow( void ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened || _glfwWin.iconified ) { return;@@ -744,12 +785,11 @@ //========================================================================-// glfwRestoreWindow() - Window un-iconification+// Window un-iconification //======================================================================== GLFWAPI void GLFWAPIENTRY glfwRestoreWindow( void ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened || !_glfwWin.iconified ) { return;@@ -764,39 +804,32 @@ //========================================================================-// glfwSwapBuffers() - Swap buffers (double-buffering) and poll any new-// events+// Swap buffers (double-buffering) and poll any new events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSwapBuffers( void ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return; } + _glfwPlatformSwapBuffers();+ // Check for window messages if( _glfwWin.autoPollEvents ) { glfwPollEvents(); }-- // Update display-buffer- if( _glfwWin.opened )- {- _glfwPlatformSwapBuffers();- } } //========================================================================-// glfwSwapInterval() - Set double buffering swap interval (0 = vsync off)+// Set double buffering swap interval (0 = vsync off) //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSwapInterval( int interval ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -808,12 +841,11 @@ //========================================================================-// glfwGetWindowParam() - Get window parameter+// Get window parameter //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetWindowParam( int param ) {- // Is GLFW initialized? if( !_glfwInitialized ) { return 0;@@ -887,13 +919,11 @@ //========================================================================-// glfwSetWindowSizeCallback() - Set callback function for window size-// changes+// Set callback function for window size changes //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowSizeCallback( GLFWwindowsizefun cbfun ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -911,13 +941,11 @@ } //========================================================================-// glfwSetWindowCloseCallback() - Set callback function for window close-// events+// Set callback function for window close events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -929,13 +957,11 @@ //========================================================================-// glfwSetWindowRefreshCallback() - Set callback function for window-// refresh events+// Set callback function for window refresh events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -947,12 +973,11 @@ //========================================================================-// glfwPollEvents() - Poll for new window and input events+// Poll for new window and input events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwPollEvents( void ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;@@ -964,12 +989,11 @@ //========================================================================-// glfwWaitEvents() - Wait for new window and input events+// Wait for new window and input events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwWaitEvents( void ) {- // Is GLFW initialized? if( !_glfwInitialized || !_glfwWin.opened ) { return;
glfw/lib/x11/platform.h view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: platform.h-// Platform: X11 (Unix)+// Platform: X11/GLX // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -58,6 +58,10 @@ #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>@@ -189,6 +193,14 @@ #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) //========================================================================@@ -248,18 +260,25 @@ int glMajor, glMinor, glRevision; int glForward, glDebug, glProfile; + PFNGLGETSTRINGIPROC GetStringi; + // ========= PLATFORM SPECIFIC PART ====================================== // Platform specific window resources- Colormap colormap; // Window colormap:- Window window; // Window- int screen; // Screen ID- XVisualInfo *visual; // Visual- GLXFBConfigID fbconfigID; // ID of the selected GLXFBConfig- GLXContext context; // OpenGL rendering context- Atom WMDeleteWindow; // For WM close detection- Atom WMPing; // For WM ping response+ 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;@@ -275,12 +294,11 @@ GLboolean has_GLX_ARB_create_context_profile; // Various platform specific internal variables- int overrideRedirect; // True if window is OverrideRedirect- int keyboardGrabbed; // True if keyboard is currently grabbed- int pointerGrabbed; // True if pointer is currently grabbed- int pointerHidden; // True if pointer is currently hidden- int mapNotifyCount; // Used for during processing- int focusInCount; // Used for during processing+ 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 {@@ -374,7 +392,7 @@ long long t0; } Timer; -#if defined(_GLFW_DLOPEN_LIBGL)+#if defined(_GLFW_HAS_DLOPEN) struct { void *libGL; // dlopen handle for libGL.so } Libs;@@ -472,6 +490,7 @@ 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 );
glfw/lib/x11/x11_enable.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: x11_enable.c // Platform: X11 (Unix) // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -41,7 +41,11 @@ void _glfwPlatformEnableSystemKeys( void ) {- // Not supported under X11 (yet)+ if( _glfwWin.keyboardGrabbed )+ {+ XUngrabKeyboard( _glfwLibrary.display, CurrentTime );+ _glfwWin.keyboardGrabbed = GL_FALSE;+ } } //========================================================================@@ -50,6 +54,11 @@ void _glfwPlatformDisableSystemKeys( void ) {- // Not supported under X11 (yet)+ if( XGrabKeyboard( _glfwLibrary.display, _glfwWin.window, True,+ GrabModeAsync, GrabModeAsync, CurrentTime ) ==+ GrabSuccess )+ {+ _glfwWin.keyboardGrabbed = GL_TRUE;+ } }
glfw/lib/x11/x11_fullscreen.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: x11_fullscreen.c-// Platform: X11 (Unix)+// Platform: X11/GLX // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -295,7 +295,48 @@ } +//========================================================================+// 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;++ 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 **** //************************************************************************@@ -517,7 +558,7 @@ XFree( modelist ); } - return;+ return; } #endif
glfw/lib/x11/x11_glext.c view
@@ -1,11 +1,11 @@-//========================================================================+//================== // GLFW - An OpenGL framework-// File: x11_glext.c-// Platform: X11 (Unix)+// Platform: X11/GLX // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -45,8 +45,7 @@ #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+ #define _glfw_glXGetProcAddress(x) dlsym(_glfwLibrary.Libs.libGL,x) #else #define _glfw_glXGetProcAddress(x) NULL #endif
glfw/lib/x11/x11_init.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: x11_init.c-// Platform: X11 (Unix)+// Platform: X11/GLX // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -234,7 +234,7 @@ initLibraries(); // Install atexit() routine- // atexit( glfw_atexit );+ atexit( glfw_atexit ); // Initialize joysticks _glfwInitJoysticks();
glfw/lib/x11/x11_joystick.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: x11_joystick.c-// Platform: X11 (Unix)+// Platform: X11/GLX // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -74,7 +74,7 @@ //========================================================================-// _glfwInitJoysticks() - Initialize joystick interface+// Initialize joystick interface //======================================================================== void _glfwInitJoysticks( void )@@ -181,7 +181,7 @@ //========================================================================-// _glfwTerminateJoysticks() - Close all opened joystick handles+// Close all opened joystick handles //======================================================================== void _glfwTerminateJoysticks( void )@@ -269,7 +269,7 @@ //************************************************************************ //========================================================================-// _glfwPlatformGetJoystickParam() - Determine joystick capabilities+// Determine joystick capabilities //======================================================================== int _glfwPlatformGetJoystickParam( int joy, int param )@@ -300,7 +300,7 @@ //========================================================================-// _glfwPlatformGetJoystickPos() - Get joystick axis positions+// Get joystick axis positions //======================================================================== int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes )@@ -333,7 +333,7 @@ //========================================================================-// _glfwPlatformGetJoystickButtons() - Get joystick button states+// Get joystick button states //======================================================================== int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons,
glfw/lib/x11/x11_keysym2unicode.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: x11_keysym2unicode.c-// Platform: X11 (Unix)+// Platform: X11/GLX // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -856,7 +856,7 @@ //************************************************************************ //========================================================================-// _glfwKeySym2Unicode() - Convert X11 KeySym to Unicode+// Convert X11 KeySym to Unicode //======================================================================== long _glfwKeySym2Unicode( KeySym keysym )
glfw/lib/x11/x11_thread.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: x11_thread.c-// Platform: X11 (Unix)+// Platform: X11/GLX // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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@@ -39,8 +39,7 @@ #ifdef _GLFW_HAS_PTHREAD //========================================================================-// _glfwNewThread() - This is simply a "wrapper" for calling the user-// thread function.+// This is simply a "wrapper" for calling the user thread function. //======================================================================== void * _glfwNewThread( void * arg )@@ -97,7 +96,7 @@ //************************************************************************ //========================================================================-// _glfwPlatformCreateThread() - Create a new thread+// Create a new thread //======================================================================== GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg )@@ -161,9 +160,8 @@ //========================================================================-// _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY-// DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME-// SITUATIONS!+// Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT+// BE USED EXCEPT IN EXTREME SITUATIONS! //======================================================================== void _glfwPlatformDestroyThread( GLFWthread ID )@@ -197,7 +195,7 @@ //========================================================================-// _glfwPlatformWaitThread() - Wait for a thread to die+// Wait for a thread to die //======================================================================== int _glfwPlatformWaitThread( GLFWthread ID, int waitmode )@@ -247,8 +245,7 @@ //========================================================================-// _glfwPlatformGetThreadID() - Return the thread ID for the current-// thread+// Return the thread ID for the current thread //======================================================================== GLFWthread _glfwPlatformGetThreadID( void )@@ -291,7 +288,7 @@ //========================================================================-// _glfwPlatformCreateMutex() - Create a mutual exclusion object+// Create a mutual exclusion object //======================================================================== GLFWmutex _glfwPlatformCreateMutex( void )@@ -322,7 +319,7 @@ //========================================================================-// _glfwPlatformDestroyMutex() - Destroy a mutual exclusion object+// Destroy a mutual exclusion object //======================================================================== void _glfwPlatformDestroyMutex( GLFWmutex mutex )@@ -340,7 +337,7 @@ //========================================================================-// _glfwPlatformLockMutex() - Request access to a mutex+// Request access to a mutex //======================================================================== void _glfwPlatformLockMutex( GLFWmutex mutex )@@ -355,7 +352,7 @@ //========================================================================-// _glfwPlatformUnlockMutex() - Release a mutex+// Release a mutex //======================================================================== void _glfwPlatformUnlockMutex( GLFWmutex mutex )@@ -370,7 +367,7 @@ //========================================================================-// _glfwPlatformCreateCond() - Create a new condition variable object+// Create a new condition variable object //======================================================================== GLFWcond _glfwPlatformCreateCond( void )@@ -401,7 +398,7 @@ //========================================================================-// _glfwPlatformDestroyCond() - Destroy a condition variable object+// Destroy a condition variable object //======================================================================== void _glfwPlatformDestroyCond( GLFWcond cond )@@ -419,7 +416,7 @@ //========================================================================-// _glfwPlatformWaitCond() - Wait for a condition to be raised+// Wait for a condition to be raised //======================================================================== void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex,@@ -462,7 +459,7 @@ //========================================================================-// _glfwPlatformSignalCond() - Signal a condition to one waiting thread+// Signal a condition to one waiting thread //======================================================================== void _glfwPlatformSignalCond( GLFWcond cond )@@ -477,8 +474,7 @@ //========================================================================-// _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting-// threads+// Broadcast a condition to all waiting threads //======================================================================== void _glfwPlatformBroadcastCond( GLFWcond cond )@@ -493,8 +489,7 @@ //========================================================================-// _glfwPlatformGetNumberOfProcessors() - Return the number of processors-// in the system.+// Return the number of processors in the system. //======================================================================== int _glfwPlatformGetNumberOfProcessors( void )
glfw/lib/x11/x11_time.c view
@@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework-// File: x11_time.c-// Platform: X11 (Unix)+// Platform: X11/GLX // API version: 2.7-// WWW: http://glfw.sourceforge.net+// WWW: http://www.glfw.org/ //-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund+// 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
glfw/lib/x11/x11_window.c view
@@ -1,1993 +1,1891 @@ //======================================================================== // GLFW - An OpenGL framework-// File: x11_window.c-// Platform: X11 (Unix)-// API version: 2.7-// WWW: http://glfw.sourceforge.net-//-------------------------------------------------------------------------// Copyright (c) 2002-2006 Camilla Berglund-//-// This software is provided 'as-is', without any express or implied-// warranty. In no event will the authors be held liable for any damages-// arising from the use of this software.-//-// Permission is granted to anyone to use this software for any purpose,-// including commercial applications, and to alter it and redistribute it-// freely, subject to the following restrictions:-//-// 1. The origin of this software must not be misrepresented; you must not-// claim that you wrote the original software. If you use this software-// in a product, an acknowledgment in the product documentation would-// be appreciated but is not required.-//-// 2. Altered source versions must be plainly marked as such, and must not-// be misrepresented as being the original software.-//-// 3. This notice may not be removed or altered from any source-// distribution.-//-//========================================================================--#include "internal.h"---/* KDE decoration values */-enum {- KDE_noDecoration = 0,- KDE_normalDecoration = 1,- KDE_tinyDecoration = 2,- KDE_noFocus = 256,- KDE_standaloneMenuBar = 512,- KDE_desktopIcon = 1024 ,- KDE_staysOnTop = 2048-};---/* Define GLX 1.4 FSAA tokens if not already defined */-#ifndef GLX_VERSION_1_4--#define GLX_SAMPLE_BUFFERS 100000-#define GLX_SAMPLES 100001--#endif /*GLX_VERSION_1_4*/----//************************************************************************-//**** GLFW internal functions ****-//************************************************************************--//========================================================================-// Checks whether the event is a MapNotify for the specified window-//========================================================================--static Bool isMapNotify( Display *d, XEvent *e, char *arg )-{- return (e->type == MapNotify) && (e->xmap.window == (Window)arg);-}---//========================================================================-// Turn off window decorations-// Based on xawdecode: src/wmhooks.c-//========================================================================--#define MWM_HINTS_DECORATIONS (1L << 1)--static void disableDecorations( void )-{- GLboolean removedDecorations;- Atom hintAtom;- XSetWindowAttributes attributes;-- removedDecorations = GL_FALSE;-- // First try to set MWM hints- hintAtom = XInternAtom( _glfwLibrary.display, "_MOTIF_WM_HINTS", True );- if ( hintAtom != None )- {- struct {- unsigned long flags;- unsigned long functions;- unsigned long decorations;- long input_mode;- unsigned long status;- } MWMHints = { MWM_HINTS_DECORATIONS, 0, 0, 0, 0 };-- XChangeProperty( _glfwLibrary.display, _glfwWin.window, hintAtom, hintAtom,- 32, PropModeReplace, (unsigned char *)&MWMHints,- sizeof(MWMHints) / 4 );- removedDecorations = GL_TRUE;- }-- // Now try to set KWM hints- hintAtom = XInternAtom( _glfwLibrary.display, "KWM_WIN_DECORATION", True );- if ( hintAtom != None )- {- long KWMHints = KDE_tinyDecoration;-- XChangeProperty( _glfwLibrary.display, _glfwWin.window, hintAtom, hintAtom,- 32, PropModeReplace, (unsigned char *)&KWMHints,- sizeof(KWMHints) / 4 );- removedDecorations = GL_TRUE;- }-- // Now try to set GNOME hints- hintAtom = XInternAtom( _glfwLibrary.display, "_WIN_HINTS", True );- if ( hintAtom != None )- {- long GNOMEHints = 0;-- XChangeProperty( _glfwLibrary.display, _glfwWin.window, hintAtom, hintAtom,- 32, PropModeReplace, (unsigned char *)&GNOMEHints,- sizeof(GNOMEHints) / 4 );- removedDecorations = GL_TRUE;- }-- // Now try to set KDE NET_WM hints- hintAtom = XInternAtom( _glfwLibrary.display, "_NET_WM_WINDOW_TYPE", True );- if ( hintAtom != None )- {- Atom NET_WMHints[2];-- NET_WMHints[0] = XInternAtom( _glfwLibrary.display,- "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE",- True );- /* define a fallback... */- NET_WMHints[1] = XInternAtom( _glfwLibrary.display,- "_NET_WM_WINDOW_TYPE_NORMAL",- True );-- XChangeProperty( _glfwLibrary.display, _glfwWin.window, hintAtom, XA_ATOM,- 32, PropModeReplace, (unsigned char *)&NET_WMHints,- 2 );- removedDecorations = GL_TRUE;- }-- // Set ICCCM fullscreen WM hint- hintAtom = XInternAtom( _glfwLibrary.display, "_NET_WM_STATE", True );- if ( hintAtom != None )- {- Atom NET_WMHints[1];-- NET_WMHints[0] = XInternAtom( _glfwLibrary.display,- "_NET_WM_STATE_FULLSCREEN",- True );-- XChangeProperty( _glfwLibrary.display, _glfwWin.window, hintAtom, XA_ATOM,- 32, PropModeReplace, (unsigned char *)&NET_WMHints, 1 );- }-- // Did we sucessfully remove the window decorations?- if( removedDecorations )- {- // Finally set the transient hints- XSetTransientForHint( _glfwLibrary.display,- _glfwWin.window,- RootWindow( _glfwLibrary.display, _glfwWin.screen) );- XUnmapWindow( _glfwLibrary.display, _glfwWin.window );- XMapWindow( _glfwLibrary.display, _glfwWin.window );- }- else- {- // The Butcher way of removing window decorations- attributes.override_redirect = True;- XChangeWindowAttributes( _glfwLibrary.display,- _glfwWin.window,- CWOverrideRedirect,- &attributes );- _glfwWin.overrideRedirect = GL_TRUE;- }-}---//========================================================================-// Turn on window decorations-//========================================================================--static void enableDecorations( void )-{- GLboolean activatedDecorations;- Atom hintAtom;-- // If this is an override redirect window, skip it...- if( _glfwWin.overrideRedirect )- {- return;- }-- activatedDecorations = 0;-- // First try to unset MWM hints- hintAtom = XInternAtom( _glfwLibrary.display, "_MOTIF_WM_HINTS", True );- if ( hintAtom != None )- {- XDeleteProperty( _glfwLibrary.display, _glfwWin.window, hintAtom );- activatedDecorations = GL_TRUE;- }-- // Now try to unset KWM hints- hintAtom = XInternAtom( _glfwLibrary.display, "KWM_WIN_DECORATION", True );- if ( hintAtom != None )- {- XDeleteProperty( _glfwLibrary.display, _glfwWin.window, hintAtom );- activatedDecorations = GL_TRUE;- }-- // Now try to unset GNOME hints- hintAtom = XInternAtom( _glfwLibrary.display, "_WIN_HINTS", True );- if ( hintAtom != None )- {- XDeleteProperty( _glfwLibrary.display, _glfwWin.window, hintAtom );- activatedDecorations = GL_TRUE;- }-- // Now try to unset NET_WM hints- hintAtom = XInternAtom( _glfwLibrary.display, "_NET_WM_WINDOW_TYPE", True );- if ( hintAtom != None )- {- Atom NET_WMHints = XInternAtom( _glfwLibrary.display,- "_NET_WM_WINDOW_TYPE_NORMAL",- True);- if( NET_WMHints != None )- {- XChangeProperty( _glfwLibrary.display, _glfwWin.window,- hintAtom, XA_ATOM, 32, PropModeReplace,- (unsigned char *)&NET_WMHints, 1 );- activatedDecorations = GL_TRUE;- }- }-- // Finally unset the transient hints if necessary- if( activatedDecorations )- {- // NOTE: Does this work?- XSetTransientForHint( _glfwLibrary.display, _glfwWin.window, None );- XUnmapWindow( _glfwLibrary.display, _glfwWin.window );- XMapWindow( _glfwLibrary.display, _glfwWin.window );- }-}---//========================================================================-// Translates an X Window key to internal coding-//========================================================================--static int translateKey( int keycode )-{- KeySym key, key_lc, key_uc;-- // Try secondary keysym, for numeric keypad keys- // Note: This way we always force "NumLock = ON", which at least- // enables GLFW users to detect numeric keypad keys- key = XKeycodeToKeysym( _glfwLibrary.display, keycode, 1 );- switch( key )- {- // Numeric keypad- case XK_KP_0: return GLFW_KEY_KP_0;- case XK_KP_1: return GLFW_KEY_KP_1;- case XK_KP_2: return GLFW_KEY_KP_2;- case XK_KP_3: return GLFW_KEY_KP_3;- case XK_KP_4: return GLFW_KEY_KP_4;- case XK_KP_5: return GLFW_KEY_KP_5;- case XK_KP_6: return GLFW_KEY_KP_6;- case XK_KP_7: return GLFW_KEY_KP_7;- case XK_KP_8: return GLFW_KEY_KP_8;- case XK_KP_9: return GLFW_KEY_KP_9;- case XK_KP_Separator:- case XK_KP_Decimal: return GLFW_KEY_KP_DECIMAL;- case XK_KP_Equal: return GLFW_KEY_KP_EQUAL;- case XK_KP_Enter: return GLFW_KEY_KP_ENTER;- default: break;- }-- // Now try pimary keysym- key = XKeycodeToKeysym( _glfwLibrary.display, keycode, 0 );- switch( key )- {- // Special keys (non character keys)- case XK_Escape: return GLFW_KEY_ESC;- case XK_Tab: return GLFW_KEY_TAB;- case XK_Shift_L: return GLFW_KEY_LSHIFT;- case XK_Shift_R: return GLFW_KEY_RSHIFT;- case XK_Control_L: return GLFW_KEY_LCTRL;- case XK_Control_R: return GLFW_KEY_RCTRL;- case XK_Meta_L:- case XK_Alt_L: return GLFW_KEY_LALT;- case XK_Mode_switch: // Mapped to Alt_R on many keyboards- case XK_Meta_R:- case XK_ISO_Level3_Shift: // AltGr on at least some machines- case XK_Alt_R: return GLFW_KEY_RALT;- case XK_Super_L: return GLFW_KEY_LSUPER;- case XK_Super_R: return GLFW_KEY_RSUPER;- case XK_Menu: return GLFW_KEY_MENU;- case XK_Num_Lock: return GLFW_KEY_KP_NUM_LOCK;- case XK_Caps_Lock: return GLFW_KEY_CAPS_LOCK;- case XK_Scroll_Lock: return GLFW_KEY_SCROLL_LOCK;- case XK_Pause: return GLFW_KEY_PAUSE;- case XK_KP_Delete:- case XK_Delete: return GLFW_KEY_DEL;- case XK_BackSpace: return GLFW_KEY_BACKSPACE;- case XK_Return: return GLFW_KEY_ENTER;- case XK_KP_Home:- case XK_Home: return GLFW_KEY_HOME;- case XK_KP_End:- case XK_End: return GLFW_KEY_END;- case XK_KP_Page_Up:- case XK_Page_Up: return GLFW_KEY_PAGEUP;- case XK_KP_Page_Down:- case XK_Page_Down: return GLFW_KEY_PAGEDOWN;- case XK_KP_Insert:- case XK_Insert: return GLFW_KEY_INSERT;- case XK_KP_Left:- case XK_Left: return GLFW_KEY_LEFT;- case XK_KP_Right:- case XK_Right: return GLFW_KEY_RIGHT;- case XK_KP_Down:- case XK_Down: return GLFW_KEY_DOWN;- case XK_KP_Up:- case XK_Up: return GLFW_KEY_UP;- case XK_F1: return GLFW_KEY_F1;- case XK_F2: return GLFW_KEY_F2;- case XK_F3: return GLFW_KEY_F3;- case XK_F4: return GLFW_KEY_F4;- case XK_F5: return GLFW_KEY_F5;- case XK_F6: return GLFW_KEY_F6;- case XK_F7: return GLFW_KEY_F7;- case XK_F8: return GLFW_KEY_F8;- case XK_F9: return GLFW_KEY_F9;- case XK_F10: return GLFW_KEY_F10;- case XK_F11: return GLFW_KEY_F11;- case XK_F12: return GLFW_KEY_F12;- case XK_F13: return GLFW_KEY_F13;- case XK_F14: return GLFW_KEY_F14;- case XK_F15: return GLFW_KEY_F15;- case XK_F16: return GLFW_KEY_F16;- case XK_F17: return GLFW_KEY_F17;- case XK_F18: return GLFW_KEY_F18;- case XK_F19: return GLFW_KEY_F19;- case XK_F20: return GLFW_KEY_F20;- case XK_F21: return GLFW_KEY_F21;- case XK_F22: return GLFW_KEY_F22;- case XK_F23: return GLFW_KEY_F23;- case XK_F24: return GLFW_KEY_F24;- case XK_F25: return GLFW_KEY_F25;-- // Numeric keypad (should have been detected in secondary keysym!)- case XK_KP_Divide: return GLFW_KEY_KP_DIVIDE;- case XK_KP_Multiply: return GLFW_KEY_KP_MULTIPLY;- case XK_KP_Subtract: return GLFW_KEY_KP_SUBTRACT;- case XK_KP_Add: return GLFW_KEY_KP_ADD;- case XK_KP_Equal: return GLFW_KEY_KP_EQUAL;- case XK_KP_Enter: return GLFW_KEY_KP_ENTER;-- // The rest (should be printable keys)- default:- // Make uppercase- XConvertCase( key, &key_lc, &key_uc );- key = key_uc;-- // Valid ISO 8859-1 character?- if( (key >= 32 && key <= 126) ||- (key >= 160 && key <= 255) )- {- return (int) key;- }- return GLFW_KEY_UNKNOWN;- }-}---//========================================================================-// Translates an X Window event to Unicode-//========================================================================--static int translateChar( XKeyEvent *event )-{- KeySym keysym;-- // Get X11 keysym- XLookupString( event, NULL, 0, &keysym, NULL );-- // Convert to Unicode (see x11_keysym2unicode.c)- return (int) _glfwKeySym2Unicode( keysym );-}----//========================================================================-// Get next X event (called by glfwPollEvents)-//========================================================================--static int getNextEvent( void )-{- XEvent event, next_event;-- // Pull next event from event queue- XNextEvent( _glfwLibrary.display, &event );-- // Handle certain window messages- switch( event.type )- {- // Is a key being pressed?- case KeyPress:- {- // Translate and report key press- _glfwInputKey( translateKey( event.xkey.keycode ), GLFW_PRESS );-- // Translate and report character input- if( _glfwWin.charCallback )- {- _glfwInputChar( translateChar( &event.xkey ), GLFW_PRESS );- }- break;- }-- // Is a key being released?- case KeyRelease:- {- // Do not report key releases for key repeats. For key repeats- // we will get KeyRelease/KeyPress pairs with identical time- // stamps. User selected key repeat filtering is handled in- // _glfwInputKey()/_glfwInputChar().- if( XEventsQueued( _glfwLibrary.display, QueuedAfterReading ) )- {- XPeekEvent( _glfwLibrary.display, &next_event );- if( next_event.type == KeyPress &&- next_event.xkey.window == event.xkey.window &&- next_event.xkey.keycode == event.xkey.keycode )- {- // This last check is a hack to work around key repeats- // leaking through due to some sort of time drift- // Toshiyuki Takahashi can press a button 16 times per- // second so it's fairly safe to assume that no human is- // pressing the key 50 times per second (value is ms)- if( ( next_event.xkey.time - event.xkey.time ) < 20 )- {- // Do not report anything for this event- break;- }- }- }-- // Translate and report key release- _glfwInputKey( translateKey( event.xkey.keycode ), GLFW_RELEASE );-- // Translate and report character input- if( _glfwWin.charCallback )- {- _glfwInputChar( translateChar( &event.xkey ), GLFW_RELEASE );- }- break;- }-- // Were any of the mouse-buttons pressed?- case ButtonPress:- {- if( event.xbutton.button == Button1 )- {- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS );- }- else if( event.xbutton.button == Button2 )- {- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS );- }- else if( event.xbutton.button == Button3 )- {- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS );- }-- // XFree86 3.3.2 and later translates mouse wheel up/down into- // mouse button 4 & 5 presses- else if( event.xbutton.button == Button4 )- {- _glfwInput.WheelPos++; // To verify: is this up or down?- if( _glfwWin.mouseWheelCallback )- {- _glfwWin.mouseWheelCallback( _glfwInput.WheelPos );- }- }- else if( event.xbutton.button == Button5 )- {- _glfwInput.WheelPos--;- if( _glfwWin.mouseWheelCallback )- {- _glfwWin.mouseWheelCallback( _glfwInput.WheelPos );- }- }- break;- }-- // Were any of the mouse-buttons released?- case ButtonRelease:- {- if( event.xbutton.button == Button1 )- {- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT,- GLFW_RELEASE );- }- else if( event.xbutton.button == Button2 )- {- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE,- GLFW_RELEASE );- }- else if( event.xbutton.button == Button3 )- {- _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT,- GLFW_RELEASE );- }- break;- }-- // Was the mouse moved?- case MotionNotify:- {- if( event.xmotion.x != _glfwInput.CursorPosX ||- event.xmotion.y != _glfwInput.CursorPosY )- {- if( _glfwWin.mouseLock )- {- _glfwInput.MousePosX += event.xmotion.x -- _glfwInput.CursorPosX;- _glfwInput.MousePosY += event.xmotion.y -- _glfwInput.CursorPosY;- }- else- {- _glfwInput.MousePosX = event.xmotion.x;- _glfwInput.MousePosY = event.xmotion.y;- }- _glfwInput.CursorPosX = event.xmotion.x;- _glfwInput.CursorPosY = event.xmotion.y;- _glfwInput.MouseMoved = GL_TRUE;-- // Call user callback function- if( _glfwWin.mousePosCallback )- {- _glfwWin.mousePosCallback( _glfwInput.MousePosX,- _glfwInput.MousePosY );- }- }- break;- }-- // Was the window resized?- case ConfigureNotify:- {- if( event.xconfigure.width != _glfwWin.width ||- event.xconfigure.height != _glfwWin.height )- {- _glfwWin.width = event.xconfigure.width;- _glfwWin.height = event.xconfigure.height;- if( _glfwWin.windowSizeCallback )- {- _glfwWin.windowSizeCallback( _glfwWin.width,- _glfwWin.height );- }- }- break;- }-- // Was the window closed by the window manager?- case ClientMessage:- {- if( (Atom) event.xclient.data.l[ 0 ] == _glfwWin.WMDeleteWindow )- {- return GL_TRUE;- }-- if( (Atom) event.xclient.data.l[ 0 ] == _glfwWin.WMPing )- {- XSendEvent( _glfwLibrary.display,- RootWindow( _glfwLibrary.display, _glfwWin.screen ),- False, SubstructureNotifyMask | SubstructureRedirectMask, &event );- }- break;- }-- // Was the window mapped (un-iconified)?- case MapNotify:- _glfwWin.mapNotifyCount++;- break;-- // Was the window unmapped (iconified)?- case UnmapNotify:- _glfwWin.mapNotifyCount--;- break;-- // Was the window activated?- case FocusIn:- _glfwWin.focusInCount++;- break;-- // Was the window de-activated?- case FocusOut:- _glfwWin.focusInCount--;- break;-- // Was the window contents damaged?- case Expose:- {- // Call user callback function- if( _glfwWin.windowRefreshCallback )- {- _glfwWin.windowRefreshCallback();- }- break;- }-- // Was the window destroyed?- case DestroyNotify:- return GL_FALSE;-- default:- {-#if defined( _GLFW_HAS_XRANDR )- switch( event.type - _glfwLibrary.XRandR.eventBase )- {- case RRScreenChangeNotify:- {- // Show XRandR that we really care- XRRUpdateConfiguration( &event );- break;- }- }-#endif- break;- }- }-- // The window was not destroyed- return GL_FALSE;-}---//========================================================================-// Create a blank cursor (for locked mouse mode)-//========================================================================--static Cursor createNULLCursor( Display *display, Window root )-{- Pixmap cursormask;- XGCValues xgc;- GC gc;- XColor col;- Cursor cursor;-- cursormask = XCreatePixmap( display, root, 1, 1, 1 );- xgc.function = GXclear;- gc = XCreateGC( display, cursormask, GCFunction, &xgc );- XFillRectangle( display, cursormask, gc, 0, 0, 1, 1 );- col.pixel = 0;- col.red = 0;- col.flags = 4;- cursor = XCreatePixmapCursor( display, cursormask, cursormask,- &col,&col, 0,0 );- XFreePixmap( display, cursormask );- XFreeGC( display, gc );-- return cursor;-}---//========================================================================-// Returns the specified attribute of the specified GLXFBConfig-// NOTE: Do not call this unless we have found GLX 1.3 or GLX_SGIX_fbconfig-//========================================================================--static int getFBConfigAttrib( GLXFBConfig fbconfig, int attrib )-{- int value;-- if( _glfwWin.has_GLX_SGIX_fbconfig )- {- _glfwWin.GetFBConfigAttribSGIX( _glfwLibrary.display, fbconfig, attrib, &value );- }- else- {- glXGetFBConfigAttrib( _glfwLibrary.display, fbconfig, attrib, &value );- }-- return value;-}---//========================================================================-// Return a list of available and usable framebuffer configs-//========================================================================--static _GLFWfbconfig *getFBConfigs( unsigned int *found )-{- GLXFBConfig *fbconfigs;- _GLFWfbconfig *result;- int i, count = 0;-- *found = 0;-- if( _glfwLibrary.glxMajor == 1 && _glfwLibrary.glxMinor < 3 )- {- if( !_glfwWin.has_GLX_SGIX_fbconfig )- {- fprintf(stderr, "GLXFBConfigs are not supported by the X server\n");- return NULL;- }- }-- if( _glfwWin.has_GLX_SGIX_fbconfig )- {- fbconfigs = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display,- _glfwWin.screen,- NULL,- &count );- if( !count )- {- fprintf(stderr, "No GLXFBConfigs returned");- return NULL;- }- }- else- {- fbconfigs = glXGetFBConfigs( _glfwLibrary.display, _glfwWin.screen, &count );- if( !count )- {- fprintf(stderr, "No GLXFBConfigs returned");- return NULL;- }- }-- result = (_GLFWfbconfig*) malloc(sizeof(_GLFWfbconfig) * count);- if( !result )- {- fprintf(stderr, "Out of memory");- return NULL;- }-- for( i = 0; i < count; i++ )- {- if( !getFBConfigAttrib( fbconfigs[i], GLX_DOUBLEBUFFER ) ||- !getFBConfigAttrib( fbconfigs[i], GLX_VISUAL_ID ) )- {- // Only consider doublebuffered GLXFBConfigs with associated visuals- continue;- }-- if( !( getFBConfigAttrib( fbconfigs[i], GLX_RENDER_TYPE ) & GLX_RGBA_BIT ) )- {- // Only consider RGBA GLXFBConfigs- continue;- }-- if( !( getFBConfigAttrib( fbconfigs[i], GLX_DRAWABLE_TYPE ) & GLX_WINDOW_BIT ) )- {- // Only consider window GLXFBConfigs- continue;- }-- result[*found].redBits = getFBConfigAttrib( fbconfigs[i], GLX_RED_SIZE );- result[*found].greenBits = getFBConfigAttrib( fbconfigs[i], GLX_GREEN_SIZE );- result[*found].blueBits = getFBConfigAttrib( fbconfigs[i], GLX_BLUE_SIZE );-- result[*found].alphaBits = getFBConfigAttrib( fbconfigs[i], GLX_ALPHA_SIZE );- result[*found].depthBits = getFBConfigAttrib( fbconfigs[i], GLX_DEPTH_SIZE );- result[*found].stencilBits = getFBConfigAttrib( fbconfigs[i], GLX_STENCIL_SIZE );-- result[*found].accumRedBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_RED_SIZE );- result[*found].accumGreenBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_GREEN_SIZE );- result[*found].accumBlueBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_BLUE_SIZE );- result[*found].accumAlphaBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_ALPHA_SIZE );-- result[*found].auxBuffers = getFBConfigAttrib( fbconfigs[i], GLX_AUX_BUFFERS );- result[*found].stereo = getFBConfigAttrib( fbconfigs[i], GLX_STEREO );-- if( _glfwWin.has_GLX_ARB_multisample )- {- result[*found].samples = getFBConfigAttrib( fbconfigs[i], GLX_SAMPLES );- }- else- {- result[*found].samples = 0;- }-- result[*found].platformID = (GLFWintptr) getFBConfigAttrib( fbconfigs[i], GLX_FBCONFIG_ID );-- (*found)++;- }-- XFree( fbconfigs );-- return result;-}---//========================================================================-// Create the OpenGL context-//========================================================================--#define setGLXattrib( attribs, index, attribName, attribValue ) \- attribs[index++] = attribName; \- attribs[index++] = attribValue;--static int createContext( const _GLFWwndconfig *wndconfig, GLXFBConfigID fbconfigID )-{- int attribs[40];- int flags, dummy, index;- GLXFBConfig *fbconfig;-- if( wndconfig->glMajor > 2 )- {- if( !_glfwWin.has_GLX_ARB_create_context )- {- fprintf(stderr, "GLX_ARB_create_context extension not found\n");- return GL_FALSE;- }- }-- // Retrieve the previously selected GLXFBConfig- {- index = 0;-- setGLXattrib( attribs, index, GLX_FBCONFIG_ID, (int) fbconfigID );- setGLXattrib( attribs, index, None, None );-- if( _glfwWin.has_GLX_SGIX_fbconfig )- {- fbconfig = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display,- _glfwWin.screen,- attribs,- &dummy );- }- else- {- fbconfig = glXChooseFBConfig( _glfwLibrary.display,- _glfwWin.screen,- attribs,- &dummy );- }-- if( fbconfig == NULL )- {- fprintf(stderr, "Unable to retrieve the selected GLXFBConfig\n");- return GL_FALSE;- }- }-- // Retrieve the corresponding visual- if( _glfwWin.has_GLX_SGIX_fbconfig )- {- _glfwWin.visual = _glfwWin.GetVisualFromFBConfigSGIX( _glfwLibrary.display,- *fbconfig );- }- else- {- _glfwWin.visual = glXGetVisualFromFBConfig( _glfwLibrary.display, *fbconfig );- }-- if( _glfwWin.visual == NULL )- {- XFree( fbconfig );-- fprintf(stderr, "Unable to retrieve visual for GLXFBconfig\n");- return GL_FALSE;- }-- if( _glfwWin.has_GLX_ARB_create_context )- {- index = 0;-- if( wndconfig->glMajor != 0 || wndconfig->glMinor != 0 )- {- // Request an explicitly versioned context-- setGLXattrib( attribs, index, GLX_CONTEXT_MAJOR_VERSION_ARB, wndconfig->glMajor );- setGLXattrib( attribs, index, GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor );- }-- if( wndconfig->glForward || wndconfig->glDebug )- {- flags = 0;-- if( wndconfig->glForward )- {- flags |= GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;- }-- if( wndconfig->glDebug )- {- flags |= GLX_CONTEXT_DEBUG_BIT_ARB;- }-- setGLXattrib( attribs, index, GLX_CONTEXT_FLAGS_ARB, flags );- }-- if( wndconfig->glProfile )- {- if( !_glfwWin.has_GLX_ARB_create_context_profile )- {- fprintf( stderr, "OpenGL profile requested but GLX_ARB_create_context_profile "- "is unavailable\n" );- return GL_FALSE;- }-- if( wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE )- {- flags = GLX_CONTEXT_CORE_PROFILE_BIT_ARB;- }- else- {- flags = GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;- }-- setGLXattrib( attribs, index, GLX_CONTEXT_PROFILE_MASK_ARB, flags );- }-- setGLXattrib( attribs, index, None, None );-- _glfwWin.context = _glfwWin.CreateContextAttribsARB( _glfwLibrary.display,- *fbconfig,- NULL,- True,- attribs );- }- else- {- if( _glfwWin.has_GLX_SGIX_fbconfig )- {- _glfwWin.context = _glfwWin.CreateContextWithConfigSGIX( _glfwLibrary.display,- *fbconfig,- GLX_RGBA_TYPE,- NULL,- True );- }- else- {- _glfwWin.context = glXCreateNewContext( _glfwLibrary.display,- *fbconfig,- GLX_RGBA_TYPE,- NULL,- True );- }- }-- XFree( fbconfig );-- if( _glfwWin.context == NULL )- {- fprintf(stderr, "Unable to create OpenGL context\n");- return GL_FALSE;- }-- _glfwWin.fbconfigID = fbconfigID;-- return GL_TRUE;-}---//========================================================================-// Initialize GLX-specific extensions-//========================================================================--static void initGLXExtensions( void )-{- // This needs to include every function pointer loaded below- _glfwWin.SwapIntervalSGI = NULL;- _glfwWin.GetFBConfigAttribSGIX = NULL;- _glfwWin.ChooseFBConfigSGIX = NULL;- _glfwWin.CreateContextWithConfigSGIX = NULL;- _glfwWin.GetVisualFromFBConfigSGIX = NULL;- _glfwWin.CreateContextAttribsARB = NULL;-- // This needs to include every extension used below- _glfwWin.has_GLX_SGIX_fbconfig = GL_FALSE;- _glfwWin.has_GLX_SGI_swap_control = GL_FALSE;- _glfwWin.has_GLX_ARB_multisample = GL_FALSE;- _glfwWin.has_GLX_ARB_create_context = GL_FALSE;- _glfwWin.has_GLX_ARB_create_context_profile = GL_FALSE;-- if( _glfwPlatformExtensionSupported( "GLX_SGI_swap_control" ) )- {- _glfwWin.SwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)- _glfwPlatformGetProcAddress( "glXSwapIntervalSGI" );-- if( _glfwWin.SwapIntervalSGI )- {- _glfwWin.has_GLX_SGI_swap_control = GL_TRUE;- }- }-- if( _glfwPlatformExtensionSupported( "GLX_SGIX_fbconfig" ) )- {- _glfwWin.GetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)- _glfwPlatformGetProcAddress( "glXGetFBConfigAttribSGIX" );- _glfwWin.ChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)- _glfwPlatformGetProcAddress( "glXChooseFBConfigSGIX" );- _glfwWin.CreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)- _glfwPlatformGetProcAddress( "glXCreateContextWithConfigSGIX" );- _glfwWin.GetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)- _glfwPlatformGetProcAddress( "glXGetVisualFromFBConfigSGIX" );-- if( _glfwWin.GetFBConfigAttribSGIX &&- _glfwWin.ChooseFBConfigSGIX &&- _glfwWin.CreateContextWithConfigSGIX &&- _glfwWin.GetVisualFromFBConfigSGIX )- {- _glfwWin.has_GLX_SGIX_fbconfig = GL_TRUE;- }- }-- if( _glfwPlatformExtensionSupported( "GLX_ARB_multisample" ) )- {- _glfwWin.has_GLX_ARB_multisample = GL_TRUE;- }-- if( _glfwPlatformExtensionSupported( "GLX_ARB_create_context" ) )- {- _glfwWin.CreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)- _glfwPlatformGetProcAddress( "glXCreateContextAttribsARB" );-- if( _glfwWin.CreateContextAttribsARB )- {- _glfwWin.has_GLX_ARB_create_context = GL_TRUE;- }- }-- if( _glfwPlatformExtensionSupported( "GLX_ARB_create_context_profile" ) )- {- _glfwWin.has_GLX_ARB_create_context_profile = GL_TRUE;- }-}---//========================================================================-// Create the X11 window (and its colormap)-//========================================================================--static GLboolean createWindow( int width, int height,- const _GLFWwndconfig *wndconfig )-{- XEvent event;- Atom protocols[2];- XSizeHints *sizehints;- unsigned long wamask;- XSetWindowAttributes wa;-- // Every window needs a colormap- // We create one based on the visual used by the current context-- _glfwWin.colormap = XCreateColormap( _glfwLibrary.display,- RootWindow( _glfwLibrary.display,- _glfwWin.screen ),- _glfwWin.visual->visual,- AllocNone );-- // Create the actual window- {- wamask = CWBorderPixel | CWColormap | CWEventMask;-- wa.colormap = _glfwWin.colormap;- wa.border_pixel = 0;- wa.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask |- PointerMotionMask | ButtonPressMask | ButtonReleaseMask |- ExposureMask | FocusChangeMask | VisibilityChangeMask;-- if( wndconfig->mode == GLFW_WINDOW )- {- // The /only/ reason we are setting the background pixel here is- // because otherwise our window wont get any decorations on systems- // using Compiz on Intel hardware- wa.background_pixel = BlackPixel( _glfwLibrary.display, _glfwWin.screen );- wamask |= CWBackPixel;- }-- _glfwWin.window = XCreateWindow(- _glfwLibrary.display,- RootWindow( _glfwLibrary.display, _glfwWin.screen ),- 0, 0, // Upper left corner of this window on root- _glfwWin.width, _glfwWin.height,- 0, // Border width- _glfwWin.visual->depth, // Color depth- InputOutput,- _glfwWin.visual->visual,- wamask,- &wa- );- if( !_glfwWin.window )- {- _glfwPlatformCloseWindow();- return GL_FALSE;- }- }-- // Declare which WM protocols we support- {- // Basic window close notification protocol- _glfwWin.WMDeleteWindow = XInternAtom( _glfwLibrary.display,- "WM_DELETE_WINDOW",- False );-- // Tells the WM to ping our window and flag us as unresponsive if we- // don't reply within a few seconds- _glfwWin.WMPing = XInternAtom( _glfwLibrary.display, "_NET_WM_PING", False );-- protocols[0] = _glfwWin.WMDeleteWindow;- protocols[1] = _glfwWin.WMPing;-- XSetWMProtocols( _glfwLibrary.display, _glfwWin.window, protocols,- sizeof(protocols) / sizeof(Atom) );- }-- if( wndconfig->mode == GLFW_FULLSCREEN )- {- disableDecorations();- }-- // Set window position and size WM hints- {- sizehints = XAllocSizeHints();- sizehints->flags = 0;-- if( wndconfig->windowNoResize )- {- sizehints->flags |= (PMinSize | PMaxSize);- sizehints->min_width = sizehints->max_width = _glfwWin.width;- sizehints->min_height = sizehints->max_height = _glfwWin.height;- }-- if( wndconfig->mode == GLFW_FULLSCREEN )- {- sizehints->flags |= PPosition;- sizehints->x = 0;- sizehints->y = 0;- }-- XSetWMNormalHints( _glfwLibrary.display, _glfwWin.window, sizehints );- XFree( sizehints );- }-- _glfwPlatformSetWindowTitle( "GLFW Window" );-- XMapWindow( _glfwLibrary.display, _glfwWin.window );-- // Wait for map notification- XIfEvent( _glfwLibrary.display, &event, isMapNotify,- (char*)_glfwWin.window );-- // Make sure that our window ends up on top of things- XRaiseWindow( _glfwLibrary.display, _glfwWin.window );-- return GL_TRUE;-}----//************************************************************************-//**** 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 )-{- unsigned int mask, fbcount;- _GLFWfbconfig *fbconfigs;- _GLFWfbconfig closest;- const _GLFWfbconfig *result;- Window window, root;- int windowX, windowY, rootX, rootY;-- // Clear platform specific GLFW window state- _glfwWin.visual = (XVisualInfo*)NULL;- _glfwWin.colormap = (Colormap)0;- _glfwWin.context = (GLXContext)NULL;- _glfwWin.window = (Window)0;- _glfwWin.pointerGrabbed = GL_FALSE;- _glfwWin.pointerHidden = GL_FALSE;- _glfwWin.keyboardGrabbed = GL_FALSE;- _glfwWin.overrideRedirect = GL_FALSE;- _glfwWin.FS.modeChanged = GL_FALSE;- _glfwWin.Saver.changed = GL_FALSE;- _glfwWin.refreshRate = wndconfig->refreshRate;- _glfwWin.windowNoResize = wndconfig->windowNoResize;-- // As the 2.x API doesn't understand screens, we hardcode this choice and- // hope for the best- _glfwWin.screen = DefaultScreen( _glfwLibrary.display );-- initGLXExtensions();-- // Choose the best available fbconfig- {- fbconfigs = getFBConfigs( &fbcount );- if( !fbconfigs )- {- _glfwPlatformCloseWindow();- return GL_FALSE;- }-- result = _glfwChooseFBConfig( fbconfig, fbconfigs, fbcount );- if( !result )- {- free( fbconfigs );- _glfwPlatformCloseWindow();- return GL_FALSE;- }-- closest = *result;- free( fbconfigs );- fbconfigs = NULL;- result = NULL;- }-- if( !createContext( wndconfig, (GLXFBConfigID) closest.platformID ) )- {- _glfwPlatformCloseWindow();- return GL_FALSE;- }-- if( wndconfig->mode == GLFW_FULLSCREEN )- {- // Change video mode- _glfwSetVideoMode( _glfwWin.screen, &_glfwWin.width,- &_glfwWin.height, &_glfwWin.refreshRate );-- // Remember old screen saver settings- XGetScreenSaver( _glfwLibrary.display, &_glfwWin.Saver.timeout,- &_glfwWin.Saver.interval, &_glfwWin.Saver.blanking,- &_glfwWin.Saver.exposure );-- // Disable screen saver- XSetScreenSaver( _glfwLibrary.display, 0, 0, DontPreferBlanking,- DefaultExposures );- }-- if( !createWindow( width, height, wndconfig ) )- {- _glfwPlatformCloseWindow();- return GL_FALSE;- }-- if( wndconfig->mode == GLFW_FULLSCREEN )- {- // Fullscreen mode post-window-creation work--#if defined( _GLFW_HAS_XRANDR )- // Request screen change notifications- if( _glfwLibrary.XRandR.available )- {- XRRSelectInput( _glfwLibrary.display,- _glfwWin.window,- RRScreenChangeNotifyMask );- }-#endif-- // Force window position/size (some WMs do their own window- // geometry, which we want to override)- XMoveWindow( _glfwLibrary.display, _glfwWin.window, 0, 0 );- XResizeWindow( _glfwLibrary.display, _glfwWin.window, _glfwWin.width,- _glfwWin.height );-- if( XGrabKeyboard( _glfwLibrary.display, _glfwWin.window, True,- GrabModeAsync, GrabModeAsync, CurrentTime ) ==- GrabSuccess )- {- _glfwWin.keyboardGrabbed = GL_TRUE;- }-- if( XGrabPointer( _glfwLibrary.display, _glfwWin.window, True,- ButtonPressMask | ButtonReleaseMask |- PointerMotionMask, GrabModeAsync, GrabModeAsync,- _glfwWin.window, None, CurrentTime ) ==- GrabSuccess )- {- _glfwWin.pointerGrabbed = GL_TRUE;- }-- // Try to get window inside viewport (for virtual displays) by- // moving the mouse cursor to the upper left corner (and then to- // the center) - this works for XFree86- XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0, 0,0 );- XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0,- _glfwWin.width/2, _glfwWin.height/2 );- }-- // Retrieve and set initial cursor position- {- XQueryPointer( _glfwLibrary.display,- _glfwWin.window,- &root,- &window,- &rootX, &rootY,- &windowX, &windowY,- &mask );-- // TODO: Probably check for some corner cases here.-- _glfwInput.MousePosX = windowX;- _glfwInput.MousePosY = windowY;- }-- // Connect the context to the window- glXMakeCurrent( _glfwLibrary.display, _glfwWin.window, _glfwWin.context );-- // Start by clearing the front buffer to black (avoid ugly desktop- // remains in our OpenGL window)- glClear( GL_COLOR_BUFFER_BIT );- glXSwapBuffers( _glfwLibrary.display, _glfwWin.window );-- return GL_TRUE;-}---//========================================================================-// Properly kill the window/video display-//========================================================================--void _glfwPlatformCloseWindow( void )-{-#if defined( _GLFW_HAS_XRANDR )- XRRScreenConfiguration *sc;- Window root;-#endif-- // Do we have a rendering context?- if( _glfwWin.context )- {- // Release the context- glXMakeCurrent( _glfwLibrary.display, None, NULL );-- // Delete the context- glXDestroyContext( _glfwLibrary.display, _glfwWin.context );- _glfwWin.context = NULL;- }-- // Do we have a visual?- if( _glfwWin.visual )- {- XFree( _glfwWin.visual );- _glfwWin.visual = NULL;- }-- // Ungrab pointer and/or keyboard?- if( _glfwWin.keyboardGrabbed )- {- XUngrabKeyboard( _glfwLibrary.display, CurrentTime );- _glfwWin.keyboardGrabbed = GL_FALSE;- }- if( _glfwWin.pointerGrabbed )- {- XUngrabPointer( _glfwLibrary.display, CurrentTime );- _glfwWin.pointerGrabbed = GL_FALSE;- }-- // Do we have a window?- if( _glfwWin.window )- {- // Unmap the window- XUnmapWindow( _glfwLibrary.display, _glfwWin.window );-- // Destroy the window- XDestroyWindow( _glfwLibrary.display, _glfwWin.window );- _glfwWin.window = (Window) 0;- }-- if( _glfwWin.colormap )- {- XFreeColormap( _glfwLibrary.display, _glfwWin.colormap );- _glfwWin.colormap = (Colormap) 0;- }-- // Did we change the fullscreen resolution?- if( _glfwWin.FS.modeChanged )- {-#if defined( _GLFW_HAS_XRANDR )- if( _glfwLibrary.XRandR.available )- {- root = RootWindow( _glfwLibrary.display, _glfwWin.screen );- sc = XRRGetScreenInfo( _glfwLibrary.display, root );-- XRRSetScreenConfig( _glfwLibrary.display,- sc,- 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;- }-- // Did we change the screen saver setting?- if( _glfwWin.Saver.changed )- {- // Restore old screen saver settings- XSetScreenSaver( _glfwLibrary.display,- _glfwWin.Saver.timeout,- _glfwWin.Saver.interval,- _glfwWin.Saver.blanking,- _glfwWin.Saver.exposure );- _glfwWin.Saver.changed = GL_FALSE;- }-}---//========================================================================-// _glfwPlatformSetWindowTitle() - Set the window title.-//========================================================================--void _glfwPlatformSetWindowTitle( const char *title )-{- // Set window & icon title- XStoreName( _glfwLibrary.display, _glfwWin.window, title );- XSetIconName( _glfwLibrary.display, _glfwWin.window, title );-}---//========================================================================-// _glfwPlatformSetWindowSize() - Set the window size.-//========================================================================--void _glfwPlatformSetWindowSize( int width, int height )-{- int mode = 0, rate, sizeChanged = GL_FALSE;- XSizeHints *sizehints;-- rate = _glfwWin.refreshRate;-- // If we are in fullscreen mode, get some info about the current mode- if( _glfwWin.fullscreen )- {- // Get closest match for target video mode- mode = _glfwGetClosestVideoMode( _glfwWin.screen, &width, &height, &rate );- }-- if( _glfwWin.windowNoResize )- {- sizehints = XAllocSizeHints();- sizehints->flags = 0;-- sizehints->min_width = sizehints->max_width = width;- sizehints->min_height = sizehints->max_height = height;-- XSetWMNormalHints( _glfwLibrary.display, _glfwWin.window, sizehints );- XFree( sizehints );- }-- // Change window size before changing fullscreen mode?- if( _glfwWin.fullscreen && (width > _glfwWin.width) )- {- XResizeWindow( _glfwLibrary.display, _glfwWin.window, width, height );- sizeChanged = GL_TRUE;- }-- // Change fullscreen video mode?- if( _glfwWin.fullscreen )- {- // Change video mode (keeping current rate)- _glfwSetVideoModeMODE( _glfwWin.screen, mode, _glfwWin.refreshRate );- }-- // Set window size (if not already changed)- if( !sizeChanged )- {- XResizeWindow( _glfwLibrary.display, _glfwWin.window, width, height );- }-}---//========================================================================-// _glfwPlatformSetWindowPos() - Set the window position.-//========================================================================--void _glfwPlatformSetWindowPos( int x, int y )-{- // Set window position- XMoveWindow( _glfwLibrary.display, _glfwWin.window, x, y );-}---//========================================================================-// _glfwPlatformIconfyWindow() - Window iconification-//========================================================================--void _glfwPlatformIconifyWindow( void )-{- // We can't do this for override redirect windows- if( _glfwWin.overrideRedirect )- {- return;- }-- // In fullscreen mode, we need to restore the desktop video mode- if( _glfwWin.fullscreen )- {-#if defined( _GLFW_HAS_XRANDR )- if( _glfwLibrary.XRandR.available )- {- // TODO: The code.- }-#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;- }-- // Show mouse pointer- if( _glfwWin.pointerHidden )- {- XUndefineCursor( _glfwLibrary.display, _glfwWin.window );- _glfwWin.pointerHidden = GL_FALSE;- }-- // Un-grab mouse pointer- if( _glfwWin.pointerGrabbed )- {- XUngrabPointer( _glfwLibrary.display, CurrentTime );- _glfwWin.pointerGrabbed = GL_FALSE;- }-- // Iconify window- XIconifyWindow( _glfwLibrary.display, _glfwWin.window,- _glfwWin.screen );-- // Window is now iconified- _glfwWin.iconified = GL_TRUE;-}---//========================================================================-// Window un-iconification-//========================================================================--void _glfwPlatformRestoreWindow( void )-{- // We can't do this for override redirect windows- if( _glfwWin.overrideRedirect )- {- return;- }-- // In fullscreen mode, change back video mode to user selected mode- if( _glfwWin.fullscreen )- {- _glfwSetVideoMode( _glfwWin.screen,- &_glfwWin.width, &_glfwWin.height, &_glfwWin.refreshRate );- }-- // Un-iconify window- XMapWindow( _glfwLibrary.display, _glfwWin.window );-- // In fullscreen mode...- if( _glfwWin.fullscreen )- {- // Make sure window is in upper left corner- XMoveWindow( _glfwLibrary.display, _glfwWin.window, 0, 0 );-- // Get input focus- XSetInputFocus( _glfwLibrary.display, _glfwWin.window, RevertToParent,- CurrentTime );- }-- // Lock mouse, if necessary- if( _glfwWin.mouseLock )- {- // Hide cursor- if( !_glfwWin.pointerHidden )- {- XDefineCursor( _glfwLibrary.display, _glfwWin.window,- createNULLCursor( _glfwLibrary.display,- _glfwWin.window ) );-- _glfwWin.pointerHidden = GL_TRUE;- }-- // Grab cursor- if( !_glfwWin.pointerGrabbed )- {- if( XGrabPointer( _glfwLibrary.display, _glfwWin.window, True,- ButtonPressMask | ButtonReleaseMask |- PointerMotionMask, GrabModeAsync,- GrabModeAsync, _glfwWin.window, None,- CurrentTime ) == GrabSuccess )- {- _glfwWin.pointerGrabbed = GL_TRUE;- }- }- }-- // Window is no longer iconified- _glfwWin.iconified = GL_FALSE;-}---//========================================================================-// _glfwPlatformSwapBuffers() - Swap buffers (double-buffering) and poll-// any new events.-//========================================================================--void _glfwPlatformSwapBuffers( void )-{- // Update display-buffer- glXSwapBuffers( _glfwLibrary.display, _glfwWin.window );-}---//========================================================================-// _glfwPlatformSwapInterval() - Set double buffering swap interval-//========================================================================--void _glfwPlatformSwapInterval( int interval )-{- if( _glfwWin.has_GLX_SGI_swap_control )- {- _glfwWin.SwapIntervalSGI( interval );- }-}---//========================================================================-// Read back framebuffer parameters from the context-//========================================================================--void _glfwPlatformRefreshWindowParams( void )-{- int dummy;- GLXFBConfig *fbconfig;-#if defined( _GLFW_HAS_XRANDR )- XRRScreenConfiguration *sc;-#elif defined( _GLFW_HAS_XF86VIDMODE )- XF86VidModeModeLine modeline;- int dotclock;- float pixels_per_second, pixels_per_frame;-#endif- int attribs[] = { GLX_FBCONFIG_ID, _glfwWin.fbconfigID, None };-- if( _glfwWin.has_GLX_SGIX_fbconfig )- {- fbconfig = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display,- _glfwWin.screen,- attribs,- &dummy );- }- else- {- fbconfig = glXChooseFBConfig( _glfwLibrary.display,- _glfwWin.screen,- attribs,- &dummy );- }-- if( fbconfig == NULL )- {- // This should never ever happen- // TODO: Figure out what to do when this happens- fprintf( stderr, "Cannot find known GLXFBConfig by ID. "- "This cannot happen. Have a nice day.\n");- abort();- }-- // There is no clear definition of an "accelerated" context on X11/GLX, and- // true sounds better than false, so we hardcode true here- _glfwWin.accelerated = GL_TRUE;-- // "Standard" window parameters- _glfwWin.redBits = getFBConfigAttrib( *fbconfig, GLX_RED_SIZE );- _glfwWin.greenBits = getFBConfigAttrib( *fbconfig, GLX_GREEN_SIZE );- _glfwWin.blueBits = getFBConfigAttrib( *fbconfig, GLX_BLUE_SIZE );-- _glfwWin.alphaBits = getFBConfigAttrib( *fbconfig, GLX_ALPHA_SIZE );- _glfwWin.depthBits = getFBConfigAttrib( *fbconfig, GLX_DEPTH_SIZE );- _glfwWin.stencilBits = getFBConfigAttrib( *fbconfig, GLX_STENCIL_SIZE );-- _glfwWin.accumRedBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_RED_SIZE );- _glfwWin.accumGreenBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_GREEN_SIZE );- _glfwWin.accumBlueBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_BLUE_SIZE );- _glfwWin.accumAlphaBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_ALPHA_SIZE );-- _glfwWin.auxBuffers = getFBConfigAttrib( *fbconfig, GLX_AUX_BUFFERS );-- // Get stereo rendering setting- _glfwWin.stereo = getFBConfigAttrib( *fbconfig, GLX_STEREO ) ? 1 : 0;-- // Get multisample buffer samples- if( _glfwWin.has_GLX_ARB_multisample )- {- _glfwWin.samples = getFBConfigAttrib( *fbconfig, GLX_SAMPLES );- }- else- {- _glfwWin.samples = 0;- }-- // Default to refresh rate unknown (=0 according to GLFW spec)- _glfwWin.refreshRate = 0;-- // Retrieve refresh rate if possible-#if defined( _GLFW_HAS_XRANDR )- if( _glfwLibrary.XRandR.available )- {- sc = XRRGetScreenInfo( _glfwLibrary.display,- RootWindow( _glfwLibrary.display, _glfwWin.screen ) );- _glfwWin.refreshRate = XRRConfigCurrentRate( sc );- XRRFreeScreenConfigInfo( sc );- }-#elif defined( _GLFW_HAS_XF86VIDMODE )- if( _glfwLibrary.XF86VidMode.available )- {- // Use the XF86VidMode extension to get current video mode- XF86VidModeGetModeLine( _glfwLibrary.display, _glfwWin.screen,- &dotclock, &modeline );- pixels_per_second = 1000.0f * (float) dotclock;- pixels_per_frame = (float) modeline.htotal * modeline.vtotal;- _glfwWin.refreshRate = (int)(pixels_per_second/pixels_per_frame+0.5);- }-#endif-- XFree( fbconfig );-}---//========================================================================-// _glfwPlatformPollEvents() - Poll for new window and input events-//========================================================================--void _glfwPlatformPollEvents( void )-{- int winclosed = GL_FALSE;-- // Flag that the cursor has not moved- _glfwInput.MouseMoved = GL_FALSE;-- // Clear MapNotify and FocusIn counts- _glfwWin.mapNotifyCount = 0;- _glfwWin.focusInCount = 0;-- // Empty the window event queue- while( XPending( _glfwLibrary.display ) )- {- if( getNextEvent() )- {- winclosed = GL_TRUE;- }- }-- // Did we get mouse movement in locked cursor mode?- if( _glfwInput.MouseMoved && _glfwWin.mouseLock )- {- int maxx, minx, maxy, miny;-- // Calculate movement threshold- minx = _glfwWin.width / 4;- maxx = (_glfwWin.width * 3) / 4;- miny = _glfwWin.height / 4;- maxy = (_glfwWin.height * 3) / 4;-- // Did the mouse cursor move beyond our movement threshold- if(_glfwInput.CursorPosX < minx || _glfwInput.CursorPosX > maxx ||- _glfwInput.CursorPosY < miny || _glfwInput.CursorPosY > maxy)- {- // Move the mouse pointer back to the window center so that it- // does not wander off...- _glfwPlatformSetMouseCursorPos( _glfwWin.width/2,- _glfwWin.height/2 );- }- }-- // Was the window (un)iconified?- if( _glfwWin.mapNotifyCount < 0 && !_glfwWin.iconified )- {- // Show mouse pointer- if( _glfwWin.pointerHidden )- {- XUndefineCursor( _glfwLibrary.display, _glfwWin.window );- _glfwWin.pointerHidden = GL_FALSE;- }-- // Un-grab mouse pointer- if( _glfwWin.pointerGrabbed )- {- XUngrabPointer( _glfwLibrary.display, CurrentTime );- _glfwWin.pointerGrabbed = GL_FALSE;- }-- _glfwWin.iconified = GL_TRUE;- }- else if( _glfwWin.mapNotifyCount > 0 && _glfwWin.iconified )- {- // Restore fullscreen mode properties- if( _glfwWin.fullscreen )- {- // Change back video mode to user selected mode- _glfwSetVideoMode( _glfwWin.screen, &_glfwWin.width,- &_glfwWin.height, &_glfwWin.refreshRate );- // Disable window manager decorations- enableDecorations();-- // Make sure window is in upper left corner- XMoveWindow( _glfwLibrary.display, _glfwWin.window, 0, 0 );-- // Get input focus- XSetInputFocus( _glfwLibrary.display, _glfwWin.window,- RevertToParent, CurrentTime );- }-- // Hide cursor if necessary- if( _glfwWin.mouseLock && !_glfwWin.pointerHidden )- {- if( !_glfwWin.pointerHidden )- {- XDefineCursor( _glfwLibrary.display, _glfwWin.window,- createNULLCursor( _glfwLibrary.display,- _glfwWin.window ) );-- _glfwWin.pointerHidden = GL_TRUE;- }- }-- // Grab cursor if necessary- if( (_glfwWin.mouseLock || _glfwWin.fullscreen) &&- !_glfwWin.pointerGrabbed )- {- if( XGrabPointer( _glfwLibrary.display, _glfwWin.window, True,- ButtonPressMask | ButtonReleaseMask |- PointerMotionMask, GrabModeAsync,- GrabModeAsync, _glfwWin.window, None,- CurrentTime ) == GrabSuccess )- {- _glfwWin.pointerGrabbed = GL_TRUE;- }- }-- _glfwWin.iconified = GL_FALSE;- }-- // Did the window get/lose focus- if( _glfwWin.focusInCount > 0 && !_glfwWin.active )- {- // If we are in fullscreen mode, restore window- if( _glfwWin.fullscreen && _glfwWin.iconified )- {- _glfwPlatformRestoreWindow();- }-- // Window is now active- _glfwWin.active = GL_TRUE;- }- else if( _glfwWin.focusInCount < 0 && _glfwWin.active )- {- // If we are in fullscreen mode, iconfify window- if( _glfwWin.fullscreen )- {- _glfwPlatformIconifyWindow();- }-- // Window is not active- _glfwWin.active = GL_FALSE;- _glfwInputDeactivation();- }-- // Was there a window close request?- if( winclosed && _glfwWin.windowCloseCallback )- {- // Check if the program wants us to close the window- winclosed = _glfwWin.windowCloseCallback();- }- if( winclosed )- {- glfwCloseWindow();- }-}---//========================================================================-// _glfwPlatformWaitEvents() - Wait for new window and input events-//========================================================================--void _glfwPlatformWaitEvents( void )-{- XEvent event;-- // Wait for new events (blocking)- XNextEvent( _glfwLibrary.display, &event );- XPutBackEvent( _glfwLibrary.display, &event );-- // Poll events from queue- _glfwPlatformPollEvents();-}---//========================================================================-// _glfwPlatformHideMouseCursor() - Hide mouse cursor (lock it)-//========================================================================--void _glfwPlatformHideMouseCursor( void )-{- // Hide cursor- if( !_glfwWin.pointerHidden )- {- XDefineCursor( _glfwLibrary.display, _glfwWin.window,- createNULLCursor( _glfwLibrary.display,- _glfwWin.window ) );-- _glfwWin.pointerHidden = GL_TRUE;- }-- // Grab cursor to user window- if( !_glfwWin.pointerGrabbed )- {- if( XGrabPointer( _glfwLibrary.display, _glfwWin.window, True,- ButtonPressMask | ButtonReleaseMask |- PointerMotionMask, GrabModeAsync, GrabModeAsync,- _glfwWin.window, None, CurrentTime ) ==- GrabSuccess )- {- _glfwWin.pointerGrabbed = GL_TRUE;- }- }-}---//========================================================================-// _glfwPlatformShowMouseCursor() - Show mouse cursor (unlock it)-//========================================================================--void _glfwPlatformShowMouseCursor( void )-{- // Un-grab cursor (only in windowed mode: in fullscreen mode we still- // want the mouse grabbed in order to confine the cursor to the window- // area)- if( _glfwWin.pointerGrabbed && !_glfwWin.fullscreen )- {- XUngrabPointer( _glfwLibrary.display, CurrentTime );- _glfwWin.pointerGrabbed = GL_FALSE;- }-- // Show cursor- if( _glfwWin.pointerHidden )- {- XUndefineCursor( _glfwLibrary.display, _glfwWin.window );- _glfwWin.pointerHidden = GL_FALSE;- }-}---//========================================================================-// _glfwPlatformSetMouseCursorPos() - Set physical mouse cursor position-//========================================================================--void _glfwPlatformSetMouseCursorPos( int x, int y )-{- // Change cursor position- _glfwInput.CursorPosX = x;- _glfwInput.CursorPosY = y;+// 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>+++/* Define GLX 1.4 FSAA tokens if not already defined */+#ifndef GLX_VERSION_1_4++#define GLX_SAMPLE_BUFFERS 100000+#define GLX_SAMPLES 100001++#endif /*GLX_VERSION_1_4*/++// Action for EWMH client messages+#define _NET_WM_STATE_REMOVE 0+#define _NET_WM_STATE_ADD 1+#define _NET_WM_STATE_TOGGLE 2+++//************************************************************************+//**** GLFW internal functions ****+//************************************************************************++//========================================================================+// Error handler for BadMatch errors when requesting context with+// unavailable OpenGL versions using the GLX_ARB_create_context extension+//========================================================================++static int errorHandler( Display *display, XErrorEvent *event )+{+ return 0;+}+++//========================================================================+// Checks whether the event is a MapNotify for the specified window+//========================================================================++static Bool isMapNotify( Display *d, XEvent *e, char *arg )+{+ return (e->type == MapNotify) && (e->xmap.window == (Window)arg);+}+++//========================================================================+// Retrieve a single window property of the specified type+// Inspired by fghGetWindowProperty from freeglut+//========================================================================++static unsigned long getWindowProperty( Window window,+ Atom property,+ Atom type,+ unsigned char** value )+{+ Atom actualType;+ int actualFormat;+ unsigned long itemCount, bytesAfter;++ XGetWindowProperty( _glfwLibrary.display,+ window,+ property,+ 0,+ LONG_MAX,+ False,+ type,+ &actualType,+ &actualFormat,+ &itemCount,+ &bytesAfter,+ value );++ if( actualType != type )+ {+ return 0;+ }++ return itemCount;+}+++//========================================================================+// Check whether the specified atom is supported+//========================================================================++static Atom getSupportedAtom( Atom* supportedAtoms,+ unsigned long atomCount,+ const char* atomName )+{+ Atom atom = XInternAtom( _glfwLibrary.display, atomName, True );+ if( atom != None )+ {+ unsigned long i;++ for( i = 0; i < atomCount; i++ )+ {+ if( supportedAtoms[i] == atom )+ {+ return atom;+ }+ }+ }++ return None;+}+++//========================================================================+// Check whether the running window manager is EWMH-compliant+//========================================================================++static GLboolean checkForEWMH( void )+{+ Window *windowFromRoot = NULL;+ Window *windowFromChild = NULL;++ // Hey kids; let's see if the window manager supports EWMH!++ // First we need a couple of atoms, which should already be there+ Atom supportingWmCheck = XInternAtom( _glfwLibrary.display,+ "_NET_SUPPORTING_WM_CHECK",+ True );+ Atom wmSupported = XInternAtom( _glfwLibrary.display,+ "_NET_SUPPORTED",+ True );+ if( supportingWmCheck == None || wmSupported == None )+ {+ return GL_FALSE;+ }++ // Then we look for the _NET_SUPPORTING_WM_CHECK property of the root window+ if( getWindowProperty( _glfwWin.root,+ supportingWmCheck,+ XA_WINDOW,+ (unsigned char**) &windowFromRoot ) != 1 )+ {+ XFree( windowFromRoot );+ return GL_FALSE;+ }++ // It should be the ID of a child window (of the root)+ // Then we look for the same property on the child window+ if( getWindowProperty( *windowFromRoot,+ supportingWmCheck,+ XA_WINDOW,+ (unsigned char**) &windowFromChild ) != 1 )+ {+ XFree( windowFromRoot );+ XFree( windowFromChild );+ return GL_FALSE;+ }++ // It should be the ID of that same child window+ if( *windowFromRoot != *windowFromChild )+ {+ XFree( windowFromRoot );+ XFree( windowFromChild );+ return GL_FALSE;+ }++ XFree( windowFromRoot );+ XFree( windowFromChild );++ // We are now fairly sure that an EWMH-compliant window manager is running++ Atom *supportedAtoms;+ unsigned long atomCount;++ // Now we need to check the _NET_SUPPORTED property of the root window+ atomCount = getWindowProperty( _glfwWin.root,+ wmSupported,+ XA_ATOM,+ (unsigned char**) &supportedAtoms );++ // See which of the atoms we support that are supported by the WM++ _glfwWin.wmState = getSupportedAtom( supportedAtoms,+ atomCount,+ "_NET_WM_STATE" );++ _glfwWin.wmStateFullscreen = getSupportedAtom( supportedAtoms,+ atomCount,+ "_NET_WM_STATE_FULLSCREEN" );++ _glfwWin.wmPing = getSupportedAtom( supportedAtoms,+ atomCount,+ "_NET_WM_PING" );++ _glfwWin.wmActiveWindow = getSupportedAtom( supportedAtoms,+ atomCount,+ "_NET_ACTIVE_WINDOW" );++ XFree( supportedAtoms );++ return GL_TRUE;+}++//========================================================================+// Translates an X Window key to internal coding+//========================================================================++static int translateKey( int keycode )+{+ KeySym key, key_lc, key_uc;++ // Try secondary keysym, for numeric keypad keys+ // Note: This way we always force "NumLock = ON", which at least+ // enables GLFW users to detect numeric keypad keys+ key = XKeycodeToKeysym( _glfwLibrary.display, keycode, 1 );+ switch( key )+ {+ // Numeric keypad+ case XK_KP_0: return GLFW_KEY_KP_0;+ case XK_KP_1: return GLFW_KEY_KP_1;+ case XK_KP_2: return GLFW_KEY_KP_2;+ case XK_KP_3: return GLFW_KEY_KP_3;+ case XK_KP_4: return GLFW_KEY_KP_4;+ case XK_KP_5: return GLFW_KEY_KP_5;+ case XK_KP_6: return GLFW_KEY_KP_6;+ case XK_KP_7: return GLFW_KEY_KP_7;+ case XK_KP_8: return GLFW_KEY_KP_8;+ case XK_KP_9: return GLFW_KEY_KP_9;+ case XK_KP_Separator:+ case XK_KP_Decimal: return GLFW_KEY_KP_DECIMAL;+ case XK_KP_Equal: return GLFW_KEY_KP_EQUAL;+ case XK_KP_Enter: return GLFW_KEY_KP_ENTER;+ default: break;+ }++ // Now try pimary keysym+ key = XKeycodeToKeysym( _glfwLibrary.display, keycode, 0 );+ switch( key )+ {+ // Special keys (non character keys)+ case XK_Escape: return GLFW_KEY_ESC;+ case XK_Tab: return GLFW_KEY_TAB;+ case XK_Shift_L: return GLFW_KEY_LSHIFT;+ case XK_Shift_R: return GLFW_KEY_RSHIFT;+ case XK_Control_L: return GLFW_KEY_LCTRL;+ case XK_Control_R: return GLFW_KEY_RCTRL;+ case XK_Meta_L:+ case XK_Alt_L: return GLFW_KEY_LALT;+ case XK_Mode_switch: // Mapped to Alt_R on many keyboards+ case XK_Meta_R:+ case XK_ISO_Level3_Shift: // AltGr on at least some machines+ case XK_Alt_R: return GLFW_KEY_RALT;+ case XK_Super_L: return GLFW_KEY_LSUPER;+ case XK_Super_R: return GLFW_KEY_RSUPER;+ case XK_Menu: return GLFW_KEY_MENU;+ case XK_Num_Lock: return GLFW_KEY_KP_NUM_LOCK;+ case XK_Caps_Lock: return GLFW_KEY_CAPS_LOCK;+ case XK_Scroll_Lock: return GLFW_KEY_SCROLL_LOCK;+ case XK_Pause: return GLFW_KEY_PAUSE;+ case XK_KP_Delete:+ case XK_Delete: return GLFW_KEY_DEL;+ case XK_BackSpace: return GLFW_KEY_BACKSPACE;+ case XK_Return: return GLFW_KEY_ENTER;+ case XK_KP_Home:+ case XK_Home: return GLFW_KEY_HOME;+ case XK_KP_End:+ case XK_End: return GLFW_KEY_END;+ case XK_KP_Page_Up:+ case XK_Page_Up: return GLFW_KEY_PAGEUP;+ case XK_KP_Page_Down:+ case XK_Page_Down: return GLFW_KEY_PAGEDOWN;+ case XK_KP_Insert:+ case XK_Insert: return GLFW_KEY_INSERT;+ case XK_KP_Left:+ case XK_Left: return GLFW_KEY_LEFT;+ case XK_KP_Right:+ case XK_Right: return GLFW_KEY_RIGHT;+ case XK_KP_Down:+ case XK_Down: return GLFW_KEY_DOWN;+ case XK_KP_Up:+ case XK_Up: return GLFW_KEY_UP;+ case XK_F1: return GLFW_KEY_F1;+ case XK_F2: return GLFW_KEY_F2;+ case XK_F3: return GLFW_KEY_F3;+ case XK_F4: return GLFW_KEY_F4;+ case XK_F5: return GLFW_KEY_F5;+ case XK_F6: return GLFW_KEY_F6;+ case XK_F7: return GLFW_KEY_F7;+ case XK_F8: return GLFW_KEY_F8;+ case XK_F9: return GLFW_KEY_F9;+ case XK_F10: return GLFW_KEY_F10;+ case XK_F11: return GLFW_KEY_F11;+ case XK_F12: return GLFW_KEY_F12;+ case XK_F13: return GLFW_KEY_F13;+ case XK_F14: return GLFW_KEY_F14;+ case XK_F15: return GLFW_KEY_F15;+ case XK_F16: return GLFW_KEY_F16;+ case XK_F17: return GLFW_KEY_F17;+ case XK_F18: return GLFW_KEY_F18;+ case XK_F19: return GLFW_KEY_F19;+ case XK_F20: return GLFW_KEY_F20;+ case XK_F21: return GLFW_KEY_F21;+ case XK_F22: return GLFW_KEY_F22;+ case XK_F23: return GLFW_KEY_F23;+ case XK_F24: return GLFW_KEY_F24;+ case XK_F25: return GLFW_KEY_F25;++ // Numeric keypad (should have been detected in secondary keysym!)+ case XK_KP_Divide: return GLFW_KEY_KP_DIVIDE;+ case XK_KP_Multiply: return GLFW_KEY_KP_MULTIPLY;+ case XK_KP_Subtract: return GLFW_KEY_KP_SUBTRACT;+ case XK_KP_Add: return GLFW_KEY_KP_ADD;+ case XK_KP_Equal: return GLFW_KEY_KP_EQUAL;+ case XK_KP_Enter: return GLFW_KEY_KP_ENTER;++ // The rest (should be printable keys)+ default:+ // Make uppercase+ XConvertCase( key, &key_lc, &key_uc );+ key = key_uc;++ // Valid ISO 8859-1 character?+ if( (key >= 32 && key <= 126) ||+ (key >= 160 && key <= 255) )+ {+ return (int) key;+ }+ return GLFW_KEY_UNKNOWN;+ }+}+++//========================================================================+// Translates an X Window event to Unicode+//========================================================================++static int translateChar( XKeyEvent *event )+{+ KeySym keysym;++ // Get X11 keysym+ XLookupString( event, NULL, 0, &keysym, NULL );++ // Convert to Unicode (see x11_keysym2unicode.c)+ return (int) _glfwKeySym2Unicode( keysym );+}+++//========================================================================+// Create a blank cursor (for locked mouse mode)+//========================================================================++static Cursor createNULLCursor( Display *display, Window root )+{+ Pixmap cursormask;+ XGCValues xgc;+ GC gc;+ XColor col;+ Cursor cursor;++ cursormask = XCreatePixmap( display, root, 1, 1, 1 );+ xgc.function = GXclear;+ gc = XCreateGC( display, cursormask, GCFunction, &xgc );+ XFillRectangle( display, cursormask, gc, 0, 0, 1, 1 );+ col.pixel = 0;+ col.red = 0;+ col.flags = 4;+ cursor = XCreatePixmapCursor( display, cursormask, cursormask,+ &col,&col, 0,0 );+ XFreePixmap( display, cursormask );+ XFreeGC( display, gc );++ return cursor;+}+++//========================================================================+// Returns the specified attribute of the specified GLXFBConfig+// NOTE: Do not call this unless we have found GLX 1.3+ or GLX_SGIX_fbconfig+//========================================================================++static int getFBConfigAttrib( GLXFBConfig fbconfig, int attrib )+{+ int value;++ if( _glfwWin.has_GLX_SGIX_fbconfig )+ {+ _glfwWin.GetFBConfigAttribSGIX( _glfwLibrary.display, fbconfig, attrib, &value );+ }+ else+ {+ glXGetFBConfigAttrib( _glfwLibrary.display, fbconfig, attrib, &value );+ }++ return value;+}+++//========================================================================+// Return a list of available and usable framebuffer configs+//========================================================================++static _GLFWfbconfig *getFBConfigs( unsigned int *found )+{+ GLXFBConfig *fbconfigs;+ _GLFWfbconfig *result;+ int i, count = 0;++ *found = 0;++ if( _glfwLibrary.glxMajor == 1 && _glfwLibrary.glxMinor < 3 )+ {+ if( !_glfwWin.has_GLX_SGIX_fbconfig )+ {+ fprintf( stderr, "GLXFBConfigs are not supported by the X server\n" );+ return NULL;+ }+ }++ if( _glfwWin.has_GLX_SGIX_fbconfig )+ {+ fbconfigs = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display,+ _glfwWin.screen,+ NULL,+ &count );+ if( !count )+ {+ fprintf( stderr, "No GLXFBConfigs returned\n" );+ return NULL;+ }+ }+ else+ {+ fbconfigs = glXGetFBConfigs( _glfwLibrary.display, _glfwWin.screen, &count );+ if( !count )+ {+ fprintf( stderr, "No GLXFBConfigs returned\n" );+ return NULL;+ }+ }++ result = (_GLFWfbconfig*) malloc( sizeof(_GLFWfbconfig) * count );+ if( !result )+ {+ fprintf( stderr, "Out of memory\n" );+ return NULL;+ }++ for( i = 0; i < count; i++ )+ {+ if( !getFBConfigAttrib( fbconfigs[i], GLX_DOUBLEBUFFER ) ||+ !getFBConfigAttrib( fbconfigs[i], GLX_VISUAL_ID ) )+ {+ // Only consider double-buffered GLXFBConfigs with associated visuals+ continue;+ }++ if( !( getFBConfigAttrib( fbconfigs[i], GLX_RENDER_TYPE ) & GLX_RGBA_BIT ) )+ {+ // Only consider RGBA GLXFBConfigs+ continue;+ }++ if( !( getFBConfigAttrib( fbconfigs[i], GLX_DRAWABLE_TYPE ) & GLX_WINDOW_BIT ) )+ {+ // Only consider window GLXFBConfigs+ continue;+ }++ result[*found].redBits = getFBConfigAttrib( fbconfigs[i], GLX_RED_SIZE );+ result[*found].greenBits = getFBConfigAttrib( fbconfigs[i], GLX_GREEN_SIZE );+ result[*found].blueBits = getFBConfigAttrib( fbconfigs[i], GLX_BLUE_SIZE );++ result[*found].alphaBits = getFBConfigAttrib( fbconfigs[i], GLX_ALPHA_SIZE );+ result[*found].depthBits = getFBConfigAttrib( fbconfigs[i], GLX_DEPTH_SIZE );+ result[*found].stencilBits = getFBConfigAttrib( fbconfigs[i], GLX_STENCIL_SIZE );++ result[*found].accumRedBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_RED_SIZE );+ result[*found].accumGreenBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_GREEN_SIZE );+ result[*found].accumBlueBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_BLUE_SIZE );+ result[*found].accumAlphaBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_ALPHA_SIZE );++ result[*found].auxBuffers = getFBConfigAttrib( fbconfigs[i], GLX_AUX_BUFFERS );+ result[*found].stereo = getFBConfigAttrib( fbconfigs[i], GLX_STEREO );++ if( _glfwWin.has_GLX_ARB_multisample )+ {+ result[*found].samples = getFBConfigAttrib( fbconfigs[i], GLX_SAMPLES );+ }+ else+ {+ result[*found].samples = 0;+ }++ result[*found].platformID = (GLFWintptr) getFBConfigAttrib( fbconfigs[i], GLX_FBCONFIG_ID );++ (*found)++;+ }++ XFree( fbconfigs );++ return result;+}+++//========================================================================+// Create the OpenGL context+//========================================================================++#define setGLXattrib( attribs, index, attribName, attribValue ) \+ attribs[index++] = attribName; \+ attribs[index++] = attribValue;++static int createContext( const _GLFWwndconfig *wndconfig, GLXFBConfigID fbconfigID )+{+ int attribs[40];+ int flags, dummy, index;+ GLXFBConfig *fbconfig;++ // Retrieve the previously selected GLXFBConfig+ {+ index = 0;++ setGLXattrib( attribs, index, GLX_FBCONFIG_ID, (int) fbconfigID );+ setGLXattrib( attribs, index, None, None );++ if( _glfwWin.has_GLX_SGIX_fbconfig )+ {+ fbconfig = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display,+ _glfwWin.screen,+ attribs,+ &dummy );+ }+ else+ {+ fbconfig = glXChooseFBConfig( _glfwLibrary.display,+ _glfwWin.screen,+ attribs,+ &dummy );+ }++ if( fbconfig == NULL )+ {+ fprintf(stderr, "Unable to retrieve the selected GLXFBConfig\n");+ return GL_FALSE;+ }+ }++ // Retrieve the corresponding visual+ if( _glfwWin.has_GLX_SGIX_fbconfig )+ {+ _glfwWin.visual = _glfwWin.GetVisualFromFBConfigSGIX( _glfwLibrary.display,+ *fbconfig );+ }+ else+ {+ _glfwWin.visual = glXGetVisualFromFBConfig( _glfwLibrary.display, *fbconfig );+ }++ if( _glfwWin.visual == NULL )+ {+ XFree( fbconfig );++ fprintf(stderr, "Unable to retrieve visual for GLXFBconfig\n");+ return GL_FALSE;+ }++ if( _glfwWin.has_GLX_ARB_create_context )+ {+ index = 0;++ if( wndconfig->glMajor != 1 || wndconfig->glMinor != 0 )+ {+ // Request an explicitly versioned context++ setGLXattrib( attribs, index, GLX_CONTEXT_MAJOR_VERSION_ARB, wndconfig->glMajor );+ setGLXattrib( attribs, index, GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor );+ }++ if( wndconfig->glForward || wndconfig->glDebug )+ {+ flags = 0;++ if( wndconfig->glForward )+ {+ flags |= GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;+ }++ if( wndconfig->glDebug )+ {+ flags |= GLX_CONTEXT_DEBUG_BIT_ARB;+ }++ setGLXattrib( attribs, index, GLX_CONTEXT_FLAGS_ARB, flags );+ }++ if( wndconfig->glProfile )+ {+ if( !_glfwWin.has_GLX_ARB_create_context_profile )+ {+ fprintf( stderr, "OpenGL profile requested but GLX_ARB_create_context_profile "+ "is unavailable\n" );+ return GL_FALSE;+ }++ if( wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE )+ {+ flags = GLX_CONTEXT_CORE_PROFILE_BIT_ARB;+ }+ else+ {+ flags = GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;+ }++ setGLXattrib( attribs, index, GLX_CONTEXT_PROFILE_MASK_ARB, flags );+ }++ setGLXattrib( attribs, index, None, None );++ // This is the only place we set an Xlib error handler, and we only do+ // it because glXCreateContextAttribsARB generates a BadMatch error if+ // the requested OpenGL version is unavailable (instead of a civilized+ // response like returning NULL)+ XSetErrorHandler( errorHandler );++ _glfwWin.context = _glfwWin.CreateContextAttribsARB( _glfwLibrary.display,+ *fbconfig,+ NULL,+ True,+ attribs );++ // We are done, so unset the error handler again (see above)+ XSetErrorHandler( NULL );+ }+ else+ {+ if( _glfwWin.has_GLX_SGIX_fbconfig )+ {+ _glfwWin.context = _glfwWin.CreateContextWithConfigSGIX( _glfwLibrary.display,+ *fbconfig,+ GLX_RGBA_TYPE,+ NULL,+ True );+ }+ else+ {+ _glfwWin.context = glXCreateNewContext( _glfwLibrary.display,+ *fbconfig,+ GLX_RGBA_TYPE,+ NULL,+ True );+ }+ }++ XFree( fbconfig );++ if( _glfwWin.context == NULL )+ {+ fprintf(stderr, "Unable to create OpenGL context\n");+ return GL_FALSE;+ }++ _glfwWin.fbconfigID = fbconfigID;++ return GL_TRUE;+}++#undef setGLXattrib+++//========================================================================+// Initialize GLX-specific extensions+//========================================================================++static void initGLXExtensions( void )+{+ // This needs to include every function pointer loaded below+ _glfwWin.SwapIntervalSGI = NULL;+ _glfwWin.GetFBConfigAttribSGIX = NULL;+ _glfwWin.ChooseFBConfigSGIX = NULL;+ _glfwWin.CreateContextWithConfigSGIX = NULL;+ _glfwWin.GetVisualFromFBConfigSGIX = NULL;+ _glfwWin.CreateContextAttribsARB = NULL;++ // This needs to include every extension used below+ _glfwWin.has_GLX_SGIX_fbconfig = GL_FALSE;+ _glfwWin.has_GLX_SGI_swap_control = GL_FALSE;+ _glfwWin.has_GLX_ARB_multisample = GL_FALSE;+ _glfwWin.has_GLX_ARB_create_context = GL_FALSE;+ _glfwWin.has_GLX_ARB_create_context_profile = GL_FALSE;++ if( _glfwPlatformExtensionSupported( "GLX_SGI_swap_control" ) )+ {+ _glfwWin.SwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)+ _glfwPlatformGetProcAddress( "glXSwapIntervalSGI" );++ if( _glfwWin.SwapIntervalSGI )+ {+ _glfwWin.has_GLX_SGI_swap_control = GL_TRUE;+ }+ }++ if( _glfwPlatformExtensionSupported( "GLX_SGIX_fbconfig" ) )+ {+ _glfwWin.GetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)+ _glfwPlatformGetProcAddress( "glXGetFBConfigAttribSGIX" );+ _glfwWin.ChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)+ _glfwPlatformGetProcAddress( "glXChooseFBConfigSGIX" );+ _glfwWin.CreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)+ _glfwPlatformGetProcAddress( "glXCreateContextWithConfigSGIX" );+ _glfwWin.GetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)+ _glfwPlatformGetProcAddress( "glXGetVisualFromFBConfigSGIX" );++ if( _glfwWin.GetFBConfigAttribSGIX &&+ _glfwWin.ChooseFBConfigSGIX &&+ _glfwWin.CreateContextWithConfigSGIX &&+ _glfwWin.GetVisualFromFBConfigSGIX )+ {+ _glfwWin.has_GLX_SGIX_fbconfig = GL_TRUE;+ }+ }++ if( _glfwPlatformExtensionSupported( "GLX_ARB_multisample" ) )+ {+ _glfwWin.has_GLX_ARB_multisample = GL_TRUE;+ }++ if( _glfwPlatformExtensionSupported( "GLX_ARB_create_context" ) )+ {+ _glfwWin.CreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)+ _glfwPlatformGetProcAddress( "glXCreateContextAttribsARB" );++ if( _glfwWin.CreateContextAttribsARB )+ {+ _glfwWin.has_GLX_ARB_create_context = GL_TRUE;+ }+ }++ if( _glfwPlatformExtensionSupported( "GLX_ARB_create_context_profile" ) )+ {+ _glfwWin.has_GLX_ARB_create_context_profile = GL_TRUE;+ }+}+++//========================================================================+// Create the X11 window (and its colormap)+//========================================================================++static GLboolean createWindow( int width, int height,+ const _GLFWwndconfig *wndconfig )+{+ XEvent event;+ unsigned long wamask;+ XSetWindowAttributes wa;++ // Every window needs a colormap+ // Create one based on the visual used by the current context++ _glfwWin.colormap = XCreateColormap( _glfwLibrary.display,+ _glfwWin.root,+ _glfwWin.visual->visual,+ AllocNone );++ // Create the actual window+ {+ wamask = CWBorderPixel | CWColormap | CWEventMask;++ wa.colormap = _glfwWin.colormap;+ wa.border_pixel = 0;+ wa.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask |+ PointerMotionMask | ButtonPressMask | ButtonReleaseMask |+ ExposureMask | FocusChangeMask | VisibilityChangeMask;++ if( wndconfig->mode == GLFW_WINDOW )+ {+ // The /only/ reason we are setting the background pixel here is+ // that otherwise our window wont get any decorations on systems+ // using Compiz on Intel hardware+ wa.background_pixel = BlackPixel( _glfwLibrary.display, _glfwWin.screen );+ wamask |= CWBackPixel;+ }++ _glfwWin.window = XCreateWindow(+ _glfwLibrary.display,+ _glfwWin.root,+ 0, 0, // Upper left corner of this window on root+ _glfwWin.width, _glfwWin.height,+ 0, // Border width+ _glfwWin.visual->depth, // Color depth+ InputOutput,+ _glfwWin.visual->visual,+ wamask,+ &wa+ );+ if( !_glfwWin.window )+ {+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }+ }++ // Check whether an EWMH-compliant window manager is running+ _glfwWin.hasEWMH = checkForEWMH();++ if( _glfwWin.fullscreen && !_glfwWin.hasEWMH )+ {+ // This is the butcher's way of removing window decorations+ // Setting the override-redirect attribute on a window makes the window+ // manager ignore the window completely (ICCCM, section 4)+ // The good thing is that this makes undecorated fullscreen windows+ // easy to do; the bad thing is that we have to do everything manually+ // and some things (like iconify/restore) won't work at all, as they're+ // usually performed by the window manager++ XSetWindowAttributes attributes;+ attributes.override_redirect = True;+ XChangeWindowAttributes( _glfwLibrary.display,+ _glfwWin.window,+ CWOverrideRedirect,+ &attributes );++ _glfwWin.overrideRedirect = GL_TRUE;+ }++ // Find or create the protocol atom for window close notifications+ _glfwWin.wmDeleteWindow = XInternAtom( _glfwLibrary.display,+ "WM_DELETE_WINDOW",+ False );++ // Declare the WM protocols we support+ {+ int count = 0;+ Atom protocols[2];++ // The WM_DELETE_WINDOW ICCCM protocol+ // Basic window close notification protocol+ if( _glfwWin.wmDeleteWindow != None )+ {+ protocols[count++] = _glfwWin.wmDeleteWindow;+ }++ // The _NET_WM_PING EWMH protocol+ // Tells the WM to ping our window and flag us as unresponsive if we+ // don't reply within a few seconds+ if( _glfwWin.wmPing != None )+ {+ protocols[count++] = _glfwWin.wmPing;+ }++ if( count > 0 )+ {+ XSetWMProtocols( _glfwLibrary.display, _glfwWin.window,+ protocols, count );+ }+ }++ // Set ICCCM WM_HINTS property+ {+ XWMHints *hints = XAllocWMHints();+ if( !hints )+ {+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ hints->flags = StateHint;+ hints->initial_state = NormalState;++ XSetWMHints( _glfwLibrary.display, _glfwWin.window, hints );+ XFree( hints );+ }++ // Set ICCCM WM_NORMAL_HINTS property (even if no parts are set)+ {+ XSizeHints *hints = XAllocSizeHints();+ if( !hints )+ {+ _glfwPlatformCloseWindow();+ return GL_FALSE;+ }++ hints->flags = 0;++ if( wndconfig->windowNoResize && !_glfwWin.fullscreen )+ {+ hints->flags |= (PMinSize | PMaxSize);+ hints->min_width = hints->max_width = _glfwWin.width;+ hints->min_height = hints->max_height = _glfwWin.height;+ }++ XSetWMNormalHints( _glfwLibrary.display, _glfwWin.window, hints );+ XFree( hints );+ }++ _glfwPlatformSetWindowTitle( "GLFW Window" );++ // Make sure the window is mapped before proceeding+ XMapWindow( _glfwLibrary.display, _glfwWin.window );+ XPeekIfEvent( _glfwLibrary.display, &event, isMapNotify,+ (char*)_glfwWin.window );++ return GL_TRUE;+}+++//========================================================================+// Enter fullscreen mode+//========================================================================++static void enterFullscreenMode( void )+{+ if( !_glfwWin.Saver.changed )+ {+ // Remember old screen saver settings+ XGetScreenSaver( _glfwLibrary.display,+ &_glfwWin.Saver.timeout, &_glfwWin.Saver.interval,+ &_glfwWin.Saver.blanking, &_glfwWin.Saver.exposure );++ // Disable screen saver+ XSetScreenSaver( _glfwLibrary.display, 0, 0, DontPreferBlanking,+ DefaultExposures );++ _glfwWin.Saver.changed = GL_TRUE;+ }++ _glfwSetVideoMode( _glfwWin.screen,+ &_glfwWin.width, &_glfwWin.height,+ &_glfwWin.refreshRate );++ if( _glfwWin.hasEWMH &&+ _glfwWin.wmState != None &&+ _glfwWin.wmStateFullscreen != None )+ {+ if( _glfwWin.wmActiveWindow != None )+ {+ // Ask the window manager to raise and focus the GLFW window+ // Only focused windows with the _NET_WM_STATE_FULLSCREEN state end+ // up on top of all other windows ("Stacking order" in EWMH spec)++ XEvent event;+ memset( &event, 0, sizeof(event) );++ event.type = ClientMessage;+ event.xclient.window = _glfwWin.window;+ event.xclient.format = 32; // Data is 32-bit longs+ event.xclient.message_type = _glfwWin.wmActiveWindow;+ event.xclient.data.l[0] = 1; // Sender is a normal application+ event.xclient.data.l[1] = 0; // We don't really know the timestamp++ XSendEvent( _glfwLibrary.display,+ _glfwWin.root,+ False,+ SubstructureNotifyMask | SubstructureRedirectMask,+ &event );+ }++ // Ask the window manager to make the GLFW window a fullscreen window+ // Fullscreen windows are undecorated and, when focused, are kept+ // on top of all other windows++ XEvent event;+ memset( &event, 0, sizeof(event) );++ event.type = ClientMessage;+ event.xclient.window = _glfwWin.window;+ event.xclient.format = 32; // Data is 32-bit longs+ event.xclient.message_type = _glfwWin.wmState;+ event.xclient.data.l[0] = _NET_WM_STATE_ADD;+ event.xclient.data.l[1] = _glfwWin.wmStateFullscreen;+ event.xclient.data.l[2] = 0; // No secondary property+ event.xclient.data.l[3] = 1; // Sender is a normal application++ XSendEvent( _glfwLibrary.display,+ _glfwWin.root,+ False,+ SubstructureNotifyMask | SubstructureRedirectMask,+ &event );+ }+ else if( _glfwWin.overrideRedirect )+ {+ // In override-redirect mode, we have divorced ourselves from the+ // window manager, so we need to do everything manually++ XRaiseWindow( _glfwLibrary.display, _glfwWin.window );+ XSetInputFocus( _glfwLibrary.display, _glfwWin.window,+ RevertToParent, CurrentTime );+ XMoveWindow( _glfwLibrary.display, _glfwWin.window, 0, 0 );+ XResizeWindow( _glfwLibrary.display, _glfwWin.window,+ _glfwWin.width, _glfwWin.height );+ }++ if( _glfwWin.mouseLock )+ {+ _glfwPlatformHideMouseCursor();+ }++ // HACK: Try to get window inside viewport (for virtual displays) by moving+ // the mouse cursor to the upper left corner (and then to the center)+ // This hack should be harmless on saner systems as well+ XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0, 0,0 );+ XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0,+ _glfwWin.width / 2, _glfwWin.height / 2 );+}++//========================================================================+// Leave fullscreen mode+//========================================================================++static void leaveFullscreenMode( void )+{+ _glfwRestoreVideoMode();++ // Did we change the screen saver setting?+ if( _glfwWin.Saver.changed )+ {+ // Restore old screen saver settings+ XSetScreenSaver( _glfwLibrary.display,+ _glfwWin.Saver.timeout,+ _glfwWin.Saver.interval,+ _glfwWin.Saver.blanking,+ _glfwWin.Saver.exposure );++ _glfwWin.Saver.changed = GL_FALSE;+ }++ if( _glfwWin.hasEWMH &&+ _glfwWin.wmState != None &&+ _glfwWin.wmStateFullscreen != None )+ {+ // Ask the window manager to make the GLFW window a normal window+ // Normal windows usually have frames and other decorations++ XEvent event;+ memset( &event, 0, sizeof(event) );++ event.type = ClientMessage;+ event.xclient.window = _glfwWin.window;+ event.xclient.format = 32; // Data is 32-bit longs+ event.xclient.message_type = _glfwWin.wmState;+ event.xclient.data.l[0] = _NET_WM_STATE_REMOVE;+ event.xclient.data.l[1] = _glfwWin.wmStateFullscreen;+ event.xclient.data.l[2] = 0; // No secondary property+ event.xclient.data.l[3] = 1; // Sender is a normal application++ XSendEvent( _glfwLibrary.display,+ _glfwWin.root,+ False,+ SubstructureNotifyMask | SubstructureRedirectMask,+ &event );+ }++ if( _glfwWin.mouseLock )+ {+ _glfwPlatformShowMouseCursor();+ }+}++//========================================================================+// Get and process next X event (called by _glfwPlatformPollEvents)+// Returns GL_TRUE if a window close request was received+//========================================================================++static GLboolean processSingleEvent( void )+{+ XEvent event;+ XNextEvent( _glfwLibrary.display, &event );++ switch( event.type )+ {+ case KeyPress:+ {+ // A keyboard key was pressed++ // Translate and report key press+ _glfwInputKey( translateKey( event.xkey.keycode ), GLFW_PRESS );++ // Translate and report character input+ if( _glfwWin.charCallback )+ {+ _glfwInputChar( translateChar( &event.xkey ), GLFW_PRESS );+ }+ break;+ }++ case KeyRelease:+ {+ // A keyboard key was released++ // Do not report key releases for key repeats. For key repeats we+ // will get KeyRelease/KeyPress pairs with similar or identical+ // time stamps. User selected key repeat filtering is handled in+ // _glfwInputKey()/_glfwInputChar().+ if( XEventsQueued( _glfwLibrary.display, QueuedAfterReading ) )+ {+ XEvent nextEvent;+ XPeekEvent( _glfwLibrary.display, &nextEvent );++ if( nextEvent.type == KeyPress &&+ nextEvent.xkey.window == event.xkey.window &&+ nextEvent.xkey.keycode == event.xkey.keycode )+ {+ // This last check is a hack to work around key repeats+ // leaking through due to some sort of time drift+ // Toshiyuki Takahashi can press a button 16 times per+ // second so it's fairly safe to assume that no human is+ // pressing the key 50 times per second (value is ms)+ if( ( nextEvent.xkey.time - event.xkey.time ) < 20 )+ {+ // Do not report anything for this event+ break;+ }+ }+ }++ // Translate and report key release+ _glfwInputKey( translateKey( event.xkey.keycode ), GLFW_RELEASE );++ // Translate and report character input+ if( _glfwWin.charCallback )+ {+ _glfwInputChar( translateChar( &event.xkey ), GLFW_RELEASE );+ }+ break;+ }++ case ButtonPress:+ {+ // A mouse button was pressed or a scrolling event occurred++ if( event.xbutton.button == Button1 )+ {+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS );+ }+ else if( event.xbutton.button == Button2 )+ {+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS );+ }+ else if( event.xbutton.button == Button3 )+ {+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS );+ }++ // XFree86 3.3.2 and later translates mouse wheel up/down into+ // mouse button 4 & 5 presses+ else if( event.xbutton.button == Button4 )+ {+ _glfwInput.WheelPos++; // To verify: is this up or down?+ if( _glfwWin.mouseWheelCallback )+ {+ _glfwWin.mouseWheelCallback( _glfwInput.WheelPos );+ }+ }+ else if( event.xbutton.button == Button5 )+ {+ _glfwInput.WheelPos--;+ if( _glfwWin.mouseWheelCallback )+ {+ _glfwWin.mouseWheelCallback( _glfwInput.WheelPos );+ }+ }+ break;+ }++ case ButtonRelease:+ {+ // A mouse button was released++ if( event.xbutton.button == Button1 )+ {+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT,+ GLFW_RELEASE );+ }+ else if( event.xbutton.button == Button2 )+ {+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_MIDDLE,+ GLFW_RELEASE );+ }+ else if( event.xbutton.button == Button3 )+ {+ _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT,+ GLFW_RELEASE );+ }+ break;+ }++ case MotionNotify:+ {+ // The mouse cursor was moved++ if( event.xmotion.x != _glfwInput.CursorPosX ||+ event.xmotion.y != _glfwInput.CursorPosY )+ {+ // The mouse cursor was moved and we didn't do it++ if( _glfwWin.mouseLock )+ {+ if( _glfwWin.pointerHidden )+ {+ _glfwInput.MousePosX += event.xmotion.x -+ _glfwInput.CursorPosX;+ _glfwInput.MousePosY += event.xmotion.y -+ _glfwInput.CursorPosY;+ }+ }+ else+ {+ _glfwInput.MousePosX = event.xmotion.x;+ _glfwInput.MousePosY = event.xmotion.y;+ }++ _glfwInput.CursorPosX = event.xmotion.x;+ _glfwInput.CursorPosY = event.xmotion.y;+ _glfwInput.MouseMoved = GL_TRUE;++ if( _glfwWin.mousePosCallback )+ {+ _glfwWin.mousePosCallback( _glfwInput.MousePosX,+ _glfwInput.MousePosY );+ }+ }+ break;+ }++ case ConfigureNotify:+ {+ if( event.xconfigure.width != _glfwWin.width ||+ event.xconfigure.height != _glfwWin.height )+ {+ // The window was resized++ _glfwWin.width = event.xconfigure.width;+ _glfwWin.height = event.xconfigure.height;+ if( _glfwWin.windowSizeCallback )+ {+ _glfwWin.windowSizeCallback( _glfwWin.width,+ _glfwWin.height );+ }+ }+ break;+ }++ case ClientMessage:+ {+ if( (Atom) event.xclient.data.l[ 0 ] == _glfwWin.wmDeleteWindow )+ {+ // The window manager was asked to close the window, for example by+ // the user pressing a 'close' window decoration button++ return GL_TRUE;+ }+ else if( _glfwWin.wmPing != None &&+ (Atom) event.xclient.data.l[ 0 ] == _glfwWin.wmPing )+ {+ // The window manager is pinging us to make sure we are still+ // responding to events++ event.xclient.window = _glfwWin.root;+ XSendEvent( _glfwLibrary.display,+ event.xclient.window,+ False,+ SubstructureNotifyMask | SubstructureRedirectMask,+ &event );+ }++ break;+ }++ case MapNotify:+ {+ // The window was mapped++ _glfwWin.iconified = GL_FALSE;+ break;+ }++ case UnmapNotify:+ {+ // The window was unmapped++ _glfwWin.iconified = GL_TRUE;+ break;+ }++ case FocusIn:+ {+ // The window gained focus++ _glfwWin.active = GL_TRUE;++ if( _glfwWin.mouseLock )+ {+ _glfwPlatformHideMouseCursor();+ }++ break;+ }++ case FocusOut:+ {+ // The window lost focus++ _glfwWin.active = GL_FALSE;+ _glfwInputDeactivation();++ if( _glfwWin.mouseLock )+ {+ _glfwPlatformShowMouseCursor();+ }++ break;+ }++ case Expose:+ {+ // The window's contents was damaged++ if( _glfwWin.windowRefreshCallback )+ {+ _glfwWin.windowRefreshCallback();+ }+ break;+ }++ // Was the window destroyed?+ case DestroyNotify:+ return GL_FALSE;++ default:+ {+#if defined( _GLFW_HAS_XRANDR )+ switch( event.type - _glfwLibrary.XRandR.eventBase )+ {+ case RRScreenChangeNotify:+ {+ // Show XRandR that we really care+ XRRUpdateConfiguration( &event );+ break;+ }+ }+#endif+ break;+ }+ }++ // The window was not destroyed+ return GL_FALSE;+}++++//************************************************************************+//**** 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 )+{+ _GLFWfbconfig closest;++ // Clear platform specific GLFW window state+ _glfwWin.visual = (XVisualInfo*)NULL;+ _glfwWin.colormap = (Colormap)0;+ _glfwWin.context = (GLXContext)NULL;+ _glfwWin.window = (Window)0;+ _glfwWin.pointerGrabbed = GL_FALSE;+ _glfwWin.pointerHidden = GL_FALSE;+ _glfwWin.keyboardGrabbed = GL_FALSE;+ _glfwWin.overrideRedirect = GL_FALSE;+ _glfwWin.FS.modeChanged = GL_FALSE;+ _glfwWin.Saver.changed = GL_FALSE;+ _glfwWin.refreshRate = wndconfig->refreshRate;+ _glfwWin.windowNoResize = wndconfig->windowNoResize;++ _glfwWin.wmDeleteWindow = None;+ _glfwWin.wmPing = None;+ _glfwWin.wmState = None;+ _glfwWin.wmStateFullscreen = None;+ _glfwWin.wmActiveWindow = None;++ // As the 2.x API doesn't understand multiple display devices, we hardcode+ // this choice and hope for the best+ _glfwWin.screen = DefaultScreen( _glfwLibrary.display );+ _glfwWin.root = RootWindow( _glfwLibrary.display, _glfwWin.screen );++ // Create the invisible cursor for hidden cursor mode+ _glfwWin.cursor = createNULLCursor( _glfwLibrary.display, _glfwWin.root );++ initGLXExtensions();++ // Choose the best available fbconfig+ {+ unsigned int fbcount;+ _GLFWfbconfig *fbconfigs;+ const _GLFWfbconfig *result;++ fbconfigs = getFBConfigs( &fbcount );+ if( !fbconfigs )+ {+ return GL_FALSE;+ }++ result = _glfwChooseFBConfig( fbconfig, fbconfigs, fbcount );+ if( !result )+ {+ free( fbconfigs );+ return GL_FALSE;+ }++ closest = *result;+ free( fbconfigs );+ }++ if( !createContext( wndconfig, (GLXFBConfigID) closest.platformID ) )+ {+ return GL_FALSE;+ }++ if( !createWindow( width, height, wndconfig ) )+ {+ return GL_FALSE;+ }++ if( wndconfig->mode == GLFW_FULLSCREEN )+ {+#if defined( _GLFW_HAS_XRANDR )+ // Request screen change notifications+ if( _glfwLibrary.XRandR.available )+ {+ XRRSelectInput( _glfwLibrary.display,+ _glfwWin.window,+ RRScreenChangeNotifyMask );+ }+#endif+ enterFullscreenMode();+ }++ // Process the window map event and any other that may have arrived+ _glfwPlatformPollEvents();++ // Retrieve and set initial cursor position+ {+ Window window, root;+ int windowX, windowY, rootX, rootY;+ unsigned int mask;++ XQueryPointer( _glfwLibrary.display,+ _glfwWin.window,+ &root,+ &window,+ &rootX, &rootY,+ &windowX, &windowY,+ &mask );++ // TODO: Probably check for some corner cases here.++ _glfwInput.MousePosX = windowX;+ _glfwInput.MousePosY = windowY;+ }++ // Connect the context to the window+ glXMakeCurrent( _glfwLibrary.display, _glfwWin.window, _glfwWin.context );++ return GL_TRUE;+}+++//========================================================================+// Properly kill the window/video display+//========================================================================++void _glfwPlatformCloseWindow( void )+{+ if( _glfwWin.fullscreen )+ {+ leaveFullscreenMode();+ }++ if( _glfwWin.context )+ {+ // Release and destroy the context+ glXMakeCurrent( _glfwLibrary.display, None, NULL );+ glXDestroyContext( _glfwLibrary.display, _glfwWin.context );+ _glfwWin.context = NULL;+ }++ if( _glfwWin.visual )+ {+ XFree( _glfwWin.visual );+ _glfwWin.visual = NULL;+ }++ if( _glfwWin.window )+ {+ XUnmapWindow( _glfwLibrary.display, _glfwWin.window );+ XDestroyWindow( _glfwLibrary.display, _glfwWin.window );+ _glfwWin.window = (Window) 0;+ }++ if( _glfwWin.colormap )+ {+ XFreeColormap( _glfwLibrary.display, _glfwWin.colormap );+ _glfwWin.colormap = (Colormap) 0;+ }++ if( _glfwWin.cursor )+ {+ XFreeCursor( _glfwLibrary.display, _glfwWin.cursor );+ _glfwWin.cursor = (Cursor) 0;+ }+}+++//========================================================================+// Set the window title+//========================================================================++void _glfwPlatformSetWindowTitle( const char *title )+{+ // Set window & icon title+ XStoreName( _glfwLibrary.display, _glfwWin.window, title );+ XSetIconName( _glfwLibrary.display, _glfwWin.window, title );+}+++//========================================================================+// Set the window size+//========================================================================++void _glfwPlatformSetWindowSize( int width, int height )+{+ int mode = 0, rate, sizeChanged = GL_FALSE;+ XSizeHints *sizehints;++ rate = _glfwWin.refreshRate;++ if( _glfwWin.fullscreen )+ {+ // Get the closest matching video mode for the specified window size+ mode = _glfwGetClosestVideoMode( _glfwWin.screen, &width, &height, &rate );+ }++ if( _glfwWin.windowNoResize )+ {+ // Update window size restrictions to match new window size++ sizehints = XAllocSizeHints();+ sizehints->flags = 0;++ sizehints->min_width = sizehints->max_width = width;+ sizehints->min_height = sizehints->max_height = height;++ XSetWMNormalHints( _glfwLibrary.display, _glfwWin.window, sizehints );+ XFree( sizehints );+ }++ // Change window size before changing fullscreen mode?+ if( _glfwWin.fullscreen && (width > _glfwWin.width) )+ {+ XResizeWindow( _glfwLibrary.display, _glfwWin.window, width, height );+ sizeChanged = GL_TRUE;+ }++ if( _glfwWin.fullscreen )+ {+ // Change video mode, keeping current refresh rate+ _glfwSetVideoModeMODE( _glfwWin.screen, mode, _glfwWin.refreshRate );+ }++ // Set window size (if not already changed)+ if( !sizeChanged )+ {+ XResizeWindow( _glfwLibrary.display, _glfwWin.window, width, height );+ }+}+++//========================================================================+// Set the window position.+//========================================================================++void _glfwPlatformSetWindowPos( int x, int y )+{+ XMoveWindow( _glfwLibrary.display, _glfwWin.window, x, y );+}+++//========================================================================+// Window iconification+//========================================================================++void _glfwPlatformIconifyWindow( void )+{+ if( _glfwWin.overrideRedirect )+ {+ // We can't iconify/restore override-redirect windows, as that's+ // performed by the window manager+ return;+ }++ XIconifyWindow( _glfwLibrary.display, _glfwWin.window, _glfwWin.screen );+}+++//========================================================================+// Window un-iconification+//========================================================================++void _glfwPlatformRestoreWindow( void )+{+ if( _glfwWin.overrideRedirect )+ {+ // We can't iconify/restore override-redirect windows, as that's+ // performed by the window manager+ return;+ }++ XMapWindow( _glfwLibrary.display, _glfwWin.window );+}+++//========================================================================+// Swap OpenGL buffers and poll any new events+//========================================================================++void _glfwPlatformSwapBuffers( void )+{+ // Update display-buffer+ glXSwapBuffers( _glfwLibrary.display, _glfwWin.window );+}+++//========================================================================+// Set double buffering swap interval+//========================================================================++void _glfwPlatformSwapInterval( int interval )+{+ if( _glfwWin.has_GLX_SGI_swap_control )+ {+ _glfwWin.SwapIntervalSGI( interval );+ }+}+++//========================================================================+// Read back framebuffer parameters from the context+//========================================================================++void _glfwPlatformRefreshWindowParams( void )+{+ int dummy;+ GLXFBConfig *fbconfig;+#if defined( _GLFW_HAS_XRANDR )+ XRRScreenConfiguration *sc;+#elif defined( _GLFW_HAS_XF86VIDMODE )+ XF86VidModeModeLine modeline;+ int dotclock;+ float pixels_per_second, pixels_per_frame;+#endif+ int attribs[] = { GLX_FBCONFIG_ID, _glfwWin.fbconfigID, None };++ if( _glfwWin.has_GLX_SGIX_fbconfig )+ {+ fbconfig = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display,+ _glfwWin.screen,+ attribs,+ &dummy );+ }+ else+ {+ fbconfig = glXChooseFBConfig( _glfwLibrary.display,+ _glfwWin.screen,+ attribs,+ &dummy );+ }++ if( fbconfig == NULL )+ {+ // This should never ever happen+ // TODO: Figure out what to do when this happens+ fprintf( stderr, "Cannot find known GLXFBConfig by ID. "+ "This cannot happen. Have a nice day.\n");+ abort();+ }++ // There is no clear definition of an "accelerated" context on X11/GLX, and+ // true sounds better than false, so we hardcode true here+ _glfwWin.accelerated = GL_TRUE;++ _glfwWin.redBits = getFBConfigAttrib( *fbconfig, GLX_RED_SIZE );+ _glfwWin.greenBits = getFBConfigAttrib( *fbconfig, GLX_GREEN_SIZE );+ _glfwWin.blueBits = getFBConfigAttrib( *fbconfig, GLX_BLUE_SIZE );++ _glfwWin.alphaBits = getFBConfigAttrib( *fbconfig, GLX_ALPHA_SIZE );+ _glfwWin.depthBits = getFBConfigAttrib( *fbconfig, GLX_DEPTH_SIZE );+ _glfwWin.stencilBits = getFBConfigAttrib( *fbconfig, GLX_STENCIL_SIZE );++ _glfwWin.accumRedBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_RED_SIZE );+ _glfwWin.accumGreenBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_GREEN_SIZE );+ _glfwWin.accumBlueBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_BLUE_SIZE );+ _glfwWin.accumAlphaBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_ALPHA_SIZE );++ _glfwWin.auxBuffers = getFBConfigAttrib( *fbconfig, GLX_AUX_BUFFERS );+ _glfwWin.stereo = getFBConfigAttrib( *fbconfig, GLX_STEREO ) ? 1 : 0;++ // Get FSAA buffer sample count+ if( _glfwWin.has_GLX_ARB_multisample )+ {+ _glfwWin.samples = getFBConfigAttrib( *fbconfig, GLX_SAMPLES );+ }+ else+ {+ _glfwWin.samples = 0;+ }++ // Default to refresh rate unknown (=0 according to GLFW spec)+ _glfwWin.refreshRate = 0;++ // Retrieve refresh rate if possible+#if defined( _GLFW_HAS_XRANDR )+ if( _glfwLibrary.XRandR.available )+ {+ sc = XRRGetScreenInfo( _glfwLibrary.display, _glfwWin.root );+ _glfwWin.refreshRate = XRRConfigCurrentRate( sc );+ XRRFreeScreenConfigInfo( sc );+ }+#elif defined( _GLFW_HAS_XF86VIDMODE )+ if( _glfwLibrary.XF86VidMode.available )+ {+ // Use the XF86VidMode extension to get current video mode+ XF86VidModeGetModeLine( _glfwLibrary.display, _glfwWin.screen,+ &dotclock, &modeline );+ pixels_per_second = 1000.0f * (float) dotclock;+ pixels_per_frame = (float) modeline.htotal * modeline.vtotal;+ _glfwWin.refreshRate = (int)(pixels_per_second/pixels_per_frame+0.5);+ }+#endif++ XFree( fbconfig );+}+++//========================================================================+// Poll for new window and input events+//========================================================================++void _glfwPlatformPollEvents( void )+{+ GLboolean closeRequested = GL_FALSE;++ // Flag that the cursor has not moved+ _glfwInput.MouseMoved = GL_FALSE;++ // Process all pending events+ while( XPending( _glfwLibrary.display ) )+ {+ if( processSingleEvent() )+ {+ closeRequested = GL_TRUE;+ }+ }++ // Did we get mouse movement in fully enabled hidden cursor mode?+ if( _glfwInput.MouseMoved && _glfwWin.pointerHidden )+ {+ _glfwPlatformSetMouseCursorPos( _glfwWin.width/2,+ _glfwWin.height/2 );+ }++ if( closeRequested && _glfwWin.windowCloseCallback )+ {+ closeRequested = _glfwWin.windowCloseCallback();+ }+ if( closeRequested )+ {+ glfwCloseWindow();+ }+}+++//========================================================================+// Wait for new window and input events+//========================================================================++void _glfwPlatformWaitEvents( void )+{+ XEvent event;++ // Block waiting for an event to arrive+ XNextEvent( _glfwLibrary.display, &event );+ XPutBackEvent( _glfwLibrary.display, &event );++ _glfwPlatformPollEvents();+}+++//========================================================================+// Hide mouse cursor (lock it)+//========================================================================++void _glfwPlatformHideMouseCursor( void )+{+ // Hide cursor+ if( !_glfwWin.pointerHidden )+ {+ XDefineCursor( _glfwLibrary.display, _glfwWin.window, _glfwWin.cursor );+ _glfwWin.pointerHidden = GL_TRUE;+ }++ // Grab cursor to user window+ if( !_glfwWin.pointerGrabbed )+ {+ if( XGrabPointer( _glfwLibrary.display, _glfwWin.window, True,+ ButtonPressMask | ButtonReleaseMask |+ PointerMotionMask, GrabModeAsync, GrabModeAsync,+ _glfwWin.window, None, CurrentTime ) ==+ GrabSuccess )+ {+ _glfwWin.pointerGrabbed = GL_TRUE;+ }+ }+}+++//========================================================================+// Show mouse cursor (unlock it)+//========================================================================++void _glfwPlatformShowMouseCursor( void )+{+ // Un-grab cursor (only in windowed mode: in fullscreen mode we still+ // want the mouse grabbed in order to confine the cursor to the window+ // area)+ if( _glfwWin.pointerGrabbed )+ {+ XUngrabPointer( _glfwLibrary.display, CurrentTime );+ _glfwWin.pointerGrabbed = GL_FALSE;+ }++ // Show cursor+ if( _glfwWin.pointerHidden )+ {+ XUndefineCursor( _glfwLibrary.display, _glfwWin.window );+ _glfwWin.pointerHidden = GL_FALSE;+ }+}+++//========================================================================+// Set physical mouse cursor position+//========================================================================++void _glfwPlatformSetMouseCursorPos( int x, int y )+{+ // Store the new position so we can recognise it later+ _glfwInput.CursorPosX = x;+ _glfwInput.CursorPosY = y;+ XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0, x, y ); }
src/Graphics/UI/GLFW.hsc view
@@ -56,6 +56,8 @@ -- * Input , pollEvents , waitEvents+ , enableAutoPoll+ , disableAutoPoll -- ** Keyboard , keyIsPressed , setCharCallback@@ -553,6 +555,15 @@ waitEvents :: IO () waitEvents = glfwWaitEvents+++-- Make 'swapBuffers' implicitly call 'pollEvents' (Default)+enableAutoPoll :: IO ()+enableAutoPoll = glfwEnable (#const GLFW_AUTO_POLL_EVENTS)++-- Disable 'swapBuffers' implicitly calling 'pollEvents'+disableAutoPoll :: IO ()+disableAutoPoll = glfwDisable (#const GLFW_AUTO_POLL_EVENTS) -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Keyboard