packages feed

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 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