diff --git a/GLFW-b.cabal b/GLFW-b.cabal
--- a/GLFW-b.cabal
+++ b/GLFW-b.cabal
@@ -1,5 +1,5 @@
 name:         GLFW-b
-version:      0.1.0.1
+version:      0.1.0.2
 
 category:     Graphics
 
diff --git a/glfw/include/GL/glfw.h b/glfw/include/GL/glfw.h
--- a/glfw/include/GL/glfw.h
+++ b/glfw/include/GL/glfw.h
@@ -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
 
 
 /*************************************************************************
diff --git a/glfw/lib/cocoa/cocoa_enable.m b/glfw/lib/cocoa/cocoa_enable.m
--- a/glfw/lib/cocoa/cocoa_enable.m
+++ b/glfw/lib/cocoa/cocoa_enable.m
@@ -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
diff --git a/glfw/lib/cocoa/cocoa_fullscreen.m b/glfw/lib/cocoa/cocoa_fullscreen.m
--- a/glfw/lib/cocoa/cocoa_fullscreen.m
+++ b/glfw/lib/cocoa/cocoa_fullscreen.m
@@ -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 ) )
diff --git a/glfw/lib/cocoa/cocoa_glext.m b/glfw/lib/cocoa/cocoa_glext.m
--- a/glfw/lib/cocoa/cocoa_glext.m
+++ b/glfw/lib/cocoa/cocoa_glext.m
@@ -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
diff --git a/glfw/lib/cocoa/cocoa_init.m b/glfw/lib/cocoa/cocoa_init.m
--- a/glfw/lib/cocoa/cocoa_init.m
+++ b/glfw/lib/cocoa/cocoa_init.m
@@ -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();
 
diff --git a/glfw/lib/cocoa/cocoa_joystick.m b/glfw/lib/cocoa/cocoa_joystick.m
--- a/glfw/lib/cocoa/cocoa_joystick.m
+++ b/glfw/lib/cocoa/cocoa_joystick.m
@@ -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
diff --git a/glfw/lib/cocoa/cocoa_time.m b/glfw/lib/cocoa/cocoa_time.m
--- a/glfw/lib/cocoa/cocoa_time.m
+++ b/glfw/lib/cocoa/cocoa_time.m
@@ -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
diff --git a/glfw/lib/cocoa/cocoa_window.m b/glfw/lib/cocoa/cocoa_window.m
--- a/glfw/lib/cocoa/cocoa_window.m
+++ b/glfw/lib/cocoa/cocoa_window.m
@@ -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;
 }
 
 //========================================================================
diff --git a/glfw/lib/cocoa/platform.h b/glfw/lib/cocoa/platform.h
--- a/glfw/lib/cocoa/platform.h
+++ b/glfw/lib/cocoa/platform.h
@@ -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 ======================================
 
diff --git a/glfw/lib/enable.c b/glfw/lib/enable.c
--- a/glfw/lib/enable.c
+++ b/glfw/lib/enable.c
@@ -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
diff --git a/glfw/lib/fullscreen.c b/glfw/lib/fullscreen.c
--- a/glfw/lib/fullscreen.c
+++ b/glfw/lib/fullscreen.c
@@ -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 )
diff --git a/glfw/lib/glext.c b/glfw/lib/glext.c
--- a/glfw/lib/glext.c
+++ b/glfw/lib/glext.c
@@ -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 )
diff --git a/glfw/lib/image.c b/glfw/lib/image.c
--- a/glfw/lib/image.c
+++ b/glfw/lib/image.c
@@ -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 )
diff --git a/glfw/lib/init.c b/glfw/lib/init.c
--- a/glfw/lib/init.c
+++ b/glfw/lib/init.c
@@ -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;
diff --git a/glfw/lib/input.c b/glfw/lib/input.c
--- a/glfw/lib/input.c
+++ b/glfw/lib/input.c
@@ -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;
diff --git a/glfw/lib/joystick.c b/glfw/lib/joystick.c
--- a/glfw/lib/joystick.c
+++ b/glfw/lib/joystick.c
@@ -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;
diff --git a/glfw/lib/stream.c b/glfw/lib/stream.c
--- a/glfw/lib/stream.c
+++ b/glfw/lib/stream.c
@@ -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 )
diff --git a/glfw/lib/tga.c b/glfw/lib/tga.c
--- a/glfw/lib/tga.c
+++ b/glfw/lib/tga.c
@@ -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 )
diff --git a/glfw/lib/thread.c b/glfw/lib/thread.c
--- a/glfw/lib/thread.c
+++ b/glfw/lib/thread.c
@@ -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();
 }
+
diff --git a/glfw/lib/time.c b/glfw/lib/time.c
--- a/glfw/lib/time.c
+++ b/glfw/lib/time.c
@@ -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 );
 }
+
diff --git a/glfw/lib/win32/platform.h b/glfw/lib/win32/platform.h
--- a/glfw/lib/win32/platform.h
+++ b/glfw/lib/win32/platform.h
@@ -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
diff --git a/glfw/lib/win32/win32_dllmain.c b/glfw/lib/win32/win32_dllmain.c
--- a/glfw/lib/win32/win32_dllmain.c
+++ b/glfw/lib/win32/win32_dllmain.c
@@ -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;
 }
diff --git a/glfw/lib/win32/win32_enable.c b/glfw/lib/win32/win32_enable.c
--- a/glfw/lib/win32/win32_enable.c
+++ b/glfw/lib/win32/win32_enable.c
@@ -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
diff --git a/glfw/lib/win32/win32_fullscreen.c b/glfw/lib/win32/win32_fullscreen.c
--- a/glfw/lib/win32/win32_fullscreen.c
+++ b/glfw/lib/win32/win32_fullscreen.c
@@ -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 )
diff --git a/glfw/lib/win32/win32_glext.c b/glfw/lib/win32/win32_glext.c
--- a/glfw/lib/win32/win32_glext.c
+++ b/glfw/lib/win32/win32_glext.c
@@ -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
diff --git a/glfw/lib/win32/win32_init.c b/glfw/lib/win32/win32_init.c
--- a/glfw/lib/win32/win32_init.c
+++ b/glfw/lib/win32/win32_init.c
@@ -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;
diff --git a/glfw/lib/win32/win32_joystick.c b/glfw/lib/win32/win32_joystick.c
--- a/glfw/lib/win32/win32_joystick.c
+++ b/glfw/lib/win32/win32_joystick.c
@@ -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,
diff --git a/glfw/lib/win32/win32_thread.c b/glfw/lib/win32/win32_thread.c
--- a/glfw/lib/win32/win32_thread.c
+++ b/glfw/lib/win32/win32_thread.c
@@ -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;
 }
+
diff --git a/glfw/lib/win32/win32_time.c b/glfw/lib/win32/win32_time.c
--- a/glfw/lib/win32/win32_time.c
+++ b/glfw/lib/win32/win32_time.c
@@ -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 )
diff --git a/glfw/lib/win32/win32_window.c b/glfw/lib/win32/win32_window.c
--- a/glfw/lib/win32/win32_window.c
+++ b/glfw/lib/win32/win32_window.c
@@ -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 )
diff --git a/glfw/lib/window.c b/glfw/lib/window.c
--- a/glfw/lib/window.c
+++ b/glfw/lib/window.c
@@ -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;
diff --git a/glfw/lib/x11/platform.h b/glfw/lib/x11/platform.h
--- a/glfw/lib/x11/platform.h
+++ b/glfw/lib/x11/platform.h
@@ -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 );
diff --git a/glfw/lib/x11/x11_enable.c b/glfw/lib/x11/x11_enable.c
--- a/glfw/lib/x11/x11_enable.c
+++ b/glfw/lib/x11/x11_enable.c
@@ -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;
+    }
 }
 
diff --git a/glfw/lib/x11/x11_fullscreen.c b/glfw/lib/x11/x11_fullscreen.c
--- a/glfw/lib/x11/x11_fullscreen.c
+++ b/glfw/lib/x11/x11_fullscreen.c
@@ -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
 
diff --git a/glfw/lib/x11/x11_glext.c b/glfw/lib/x11/x11_glext.c
--- a/glfw/lib/x11/x11_glext.c
+++ b/glfw/lib/x11/x11_glext.c
@@ -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
diff --git a/glfw/lib/x11/x11_init.c b/glfw/lib/x11/x11_init.c
--- a/glfw/lib/x11/x11_init.c
+++ b/glfw/lib/x11/x11_init.c
@@ -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();
diff --git a/glfw/lib/x11/x11_joystick.c b/glfw/lib/x11/x11_joystick.c
--- a/glfw/lib/x11/x11_joystick.c
+++ b/glfw/lib/x11/x11_joystick.c
@@ -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,
diff --git a/glfw/lib/x11/x11_keysym2unicode.c b/glfw/lib/x11/x11_keysym2unicode.c
--- a/glfw/lib/x11/x11_keysym2unicode.c
+++ b/glfw/lib/x11/x11_keysym2unicode.c
@@ -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 )
diff --git a/glfw/lib/x11/x11_thread.c b/glfw/lib/x11/x11_thread.c
--- a/glfw/lib/x11/x11_thread.c
+++ b/glfw/lib/x11/x11_thread.c
@@ -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 )
diff --git a/glfw/lib/x11/x11_time.c b/glfw/lib/x11/x11_time.c
--- a/glfw/lib/x11/x11_time.c
+++ b/glfw/lib/x11/x11_time.c
@@ -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
diff --git a/glfw/lib/x11/x11_window.c b/glfw/lib/x11/x11_window.c
--- a/glfw/lib/x11/x11_window.c
+++ b/glfw/lib/x11/x11_window.c
@@ -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 );
 }
 
diff --git a/src/Graphics/UI/GLFW.hsc b/src/Graphics/UI/GLFW.hsc
--- a/src/Graphics/UI/GLFW.hsc
+++ b/src/Graphics/UI/GLFW.hsc
@@ -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
