Initial pass for multi-window support.
diff --git a/lib/internal.h b/lib/internal.h
index a7d09af..cb217b9 100644
--- a/lib/internal.h
+++ b/lib/internal.h
@@ -52,6 +52,14 @@
 
 
 //------------------------------------------------------------------------
+// Platform specific definitions goes in platform.h (which also includes
+// glfw.h)
+//------------------------------------------------------------------------
+
+#include "platform.h"
+
+
+//------------------------------------------------------------------------
 // Window opening hints (set by glfwOpenWindowHint)
 // A bucket of semi-random stuff bunched together for historical reasons
 // This is used only by the platform independent code and only to store
@@ -76,14 +84,6 @@
 
 
 //------------------------------------------------------------------------
-// Platform specific definitions goes in platform.h (which also includes
-// glfw.h)
-//------------------------------------------------------------------------
-
-#include "platform.h"
-
-
-//------------------------------------------------------------------------
 // Parameters relating to the creation of the context and window but not
 // directly related to the properties of the framebuffer
 // This is used to pass window and context creation parameters from the
@@ -126,6 +126,81 @@
 } _GLFWfbconfig;
 
 
+//------------------------------------------------------------------------
+// Window structure
+//------------------------------------------------------------------------
+typedef struct _GLFWwindow {
+
+    // User callback functions
+    GLFWwindowsizefun    windowSizeCallback;
+    GLFWwindowclosefun   windowCloseCallback;
+    GLFWwindowrefreshfun windowRefreshCallback;
+    GLFWmousebuttonfun   mouseButtonCallback;
+    GLFWmouseposfun      mousePosCallback;
+    GLFWmousewheelfun    mouseWheelCallback;
+    GLFWkeyfun           keyCallback;
+    GLFWcharfun          charCallback;
+
+    // User selected window settings
+    int       mode;
+    GLboolean sysKeysDisabled; // System keys disabled flag
+    GLboolean windowNoResize;  // Resize- and maximize gadgets disabled flag
+    int       refreshRate;     // Vertical monitor refresh rate
+
+    // Input
+    GLboolean stickyKeys;
+    GLboolean stickyMouseButtons;
+    GLboolean keyRepeat;
+    int       mousePosX, mousePosY;
+    int       wheelPos;
+    char      mouseButton[GLFW_MOUSE_BUTTON_LAST + 1];
+    char      key[GLFW_KEY_LAST + 1];
+    int       lastChar;
+
+    // Window status & parameters
+    GLboolean active;          // Application active flag
+    GLboolean iconified;       // Window iconified flag
+    int       width, height;   // Window width and heigth
+    GLboolean accelerated;     // GL_TRUE if window is HW accelerated
+
+    // Framebuffer attributes
+    int       redBits;
+    int       greenBits;
+    int       blueBits;
+    int       alphaBits;
+    int       depthBits;
+    int       stencilBits;
+    int       accumRedBits;
+    int       accumGreenBits;
+    int       accumBlueBits;
+    int       accumAlphaBits;
+    int       auxBuffers;
+    GLboolean stereo;
+    int       samples;
+
+    // OpenGL extensions and context attributes
+    int       glMajor, glMinor, glRevision;
+    int       glForward, glDebug, glProfile;
+
+    PFNGLGETSTRINGIPROC GetStringi;
+
+    _GLFW_PLATFORM_WINDOW_STATE;
+} _GLFWwindow;
+
+
+//------------------------------------------------------------------------
+// Library global data
+//------------------------------------------------------------------------
+typedef struct {
+    _GLFWhints   hints;
+    _GLFWwindow* window;
+    _GLFWwindow* currentWindow;
+    _GLFWwindow* cursorLockWindow;
+
+    _GLFW_PLATFORM_LIBRARY_STATE;
+} _GLFWlibrary;
+
+
 //========================================================================
 // System independent global variables (GLFW internals)
 //========================================================================
@@ -137,6 +212,8 @@
 GLFWGLOBAL int _glfwInitialized;
 #endif
 
+GLFWGLOBAL _GLFWlibrary _glfwLibrary;
+
 
 //========================================================================
 // Prototypes for platform specific implementation functions
@@ -147,17 +224,13 @@
 int _glfwPlatformTerminate(void);
 
 // Enable/Disable
-void _glfwPlatformEnableSystemKeys(void);
-void _glfwPlatformDisableSystemKeys(void);
+void _glfwPlatformEnableSystemKeys(_GLFWwindow* window);
+void _glfwPlatformDisableSystemKeys(_GLFWwindow* window);
 
 // Fullscreen
 int  _glfwPlatformGetVideoModes(GLFWvidmode* list, int maxcount);
 void _glfwPlatformGetDesktopMode(GLFWvidmode* mode);
 
-// OpenGL extensions
-int _glfwPlatformExtensionSupported(const char* extension);
-void* _glfwPlatformGetProcAddress(const char* procname);
-
 // Joystick
 int _glfwPlatformGetJoystickParam(int joy, int param);
 int _glfwPlatformGetJoystickPos(int joy, float* pos, int numaxes);
@@ -168,21 +241,28 @@
 void _glfwPlatformSetTime(double time);
 
 // Window management
-int  _glfwPlatformOpenWindow(int width, int height, const _GLFWwndconfig* wndconfig, const _GLFWfbconfig* fbconfig);
-void _glfwPlatformCloseWindow(void);
-void _glfwPlatformSetWindowTitle(const char* title);
-void _glfwPlatformSetWindowSize(int width, int height);
-void _glfwPlatformSetWindowPos(int x, int y);
-void _glfwPlatformIconifyWindow(void);
-void _glfwPlatformRestoreWindow(void);
+int  _glfwPlatformOpenWindow(_GLFWwindow* window, int width, int height, const _GLFWwndconfig* wndconfig, const _GLFWfbconfig* fbconfig);
+int  _glfwPlatformMakeWindowCurrent(_GLFWwindow* window);
+void _glfwPlatformCloseWindow(_GLFWwindow* window);
+void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title);
+void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height);
+void _glfwPlatformSetWindowPos(_GLFWwindow* window, int x, int y);
+void _glfwPlatformIconifyWindow(_GLFWwindow* window);
+void _glfwPlatformRestoreWindow(_GLFWwindow* window);
+void _glfwPlatformHideMouseCursor(_GLFWwindow* window);
+void _glfwPlatformShowMouseCursor(_GLFWwindow* window);
+void _glfwPlatformSetMouseCursorPos(_GLFWwindow* window, int x, int y);
+
+// Event management
+void _glfwPlatformPollEvents(void);
+void _glfwPlatformWaitEvents(void);
+
+// OpenGL context management
 void _glfwPlatformSwapBuffers(void);
 void _glfwPlatformSwapInterval(int interval);
 void _glfwPlatformRefreshWindowParams(void);
-void _glfwPlatformPollEvents(void);
-void _glfwPlatformWaitEvents(void);
-void _glfwPlatformHideMouseCursor(void);
-void _glfwPlatformShowMouseCursor(void);
-void _glfwPlatformSetMouseCursorPos(int x, int y);
+int  _glfwPlatformExtensionSupported(const char* extension);
+void* _glfwPlatformGetProcAddress(const char* procname);
 
 
 //========================================================================
@@ -193,11 +273,11 @@
 void _glfwClearWindowHints(void);
 
 // Input handling (window.c)
-void _glfwClearInput(void);
-void _glfwInputDeactivation(void);
-void _glfwInputKey(int key, int action);
-void _glfwInputChar(int character, int action);
-void _glfwInputMouseClick(int button, int action);
+void _glfwClearInput(_GLFWwindow* window);
+void _glfwInputDeactivation(_GLFWwindow* window);
+void _glfwInputKey(_GLFWwindow* window, int key, int action);
+void _glfwInputChar(_GLFWwindow* window, int character, int action);
+void _glfwInputMouseClick(_GLFWwindow* window, int button, int action);
 
 // OpenGL extensions (glext.c)
 void _glfwParseGLVersion(int* major, int* minor, int* rev);