Added internal docs.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e150cda..f23a862 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,7 +19,7 @@
 
 option(GLFW_DOCUMENT_INTERNALS "Include internals in documentation" OFF)
 if (GLFW_DOCUMENT_INTERNALS)
-    set(GLFW_DOC_HEADERS "${GLFW_SOURCE_DIR}/src/internal.h")
+    set(GLFW_INTERNAL_DOCS "${GLFW_SOURCE_DIR}/src/internal.h ${GLFW_SOURCE_DIR}/docs/internal.dox")
 endif()
 
 if (APPLE)
diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in
index 8da177d..f3c9a0d 100644
--- a/docs/Doxyfile.in
+++ b/docs/Doxyfile.in
@@ -668,7 +668,17 @@
 # directories like "/usr/src/myproject". Separate the files or directories
 # with spaces.
 
-INPUT                  = @GLFW_DOC_HEADERS@ @GLFW_SOURCE_DIR@/include/GLFW/ @GLFW_SOURCE_DIR@/docs/
+INPUT                  = @GLFW_INTERNAL_DOCS@                         \
+                         @GLFW_SOURCE_DIR@/include/GLFW/glfw3.h       \
+                         @GLFW_SOURCE_DIR@/include/GLFW/glfw3native.h \
+                         @GLFW_SOURCE_DIR@/docs/compat.dox            \
+                         @GLFW_SOURCE_DIR@/docs/context.dox           \
+                         @GLFW_SOURCE_DIR@/docs/main.dox              \
+                         @GLFW_SOURCE_DIR@/docs/monitor.dox           \
+                         @GLFW_SOURCE_DIR@/docs/moving.dox            \
+                         @GLFW_SOURCE_DIR@/docs/news.dox              \
+                         @GLFW_SOURCE_DIR@/docs/quick.dox             \
+                         @GLFW_SOURCE_DIR@/docs/window.dox
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
diff --git a/docs/internal.dox b/docs/internal.dox
new file mode 100644
index 0000000..e32db62
--- /dev/null
+++ b/docs/internal.dox
@@ -0,0 +1,116 @@
+/*!
+
+@page internals Internal structure
+
+@tableofcontents
+
+There are several interfaces inside GLFW.  Each interface has its own area of
+responsibility and its own naming conventions.
+
+
+@section internals_public Public interface
+
+The most well-known is the public interface, described in the glfw3.h header
+file.  This is implemented in source files shared by all platforms and these
+files contain no platform-specific code.  This code usually ends up calling the
+platform and internal interfaces to do the actual work.
+
+The public interface uses the OpenGL naming conventions except with GLFW and
+glfw instead of GL and gl.  For struct members, where OpenGL sets no precedent,
+it use headless camel case.
+
+Examples: @ref glfwCreateWindow, @ref GLFWwindow, @ref GLFWvidmode.redBits,
+`GLFW_RED_BITS`
+
+
+@section internals_native Native interface
+
+The [native interface](@ref native) is a small set of publicly available
+but platform-specific functions, described in the glfw3native.h header file and
+used to gain access to the underlying window, context and (on some platforms)
+display handles used by the platform interface.
+
+The function names of the native interface are similar to those of the public
+interface, but embeds the name of the interface that the returned handle is
+from.
+
+Examples: @ref glfwGetX11Window, @ref glfwGetWGLContext
+
+
+@section internals_internal Internal interface
+
+The internal interface consists of utility functions used by all other
+interfaces.  It is shared code implemented in the same shared source files as
+the public and event interfaces.  The internal interface is described in the
+internal.h header file.
+
+The internal interface is in charge of GLFW's global data, which it stores in
+a `_GLFWlibrary` struct named `_glfw`.
+
+The internal interface uses the same style as the public interface, except all
+global names have a leading underscore.
+
+Examples: @ref _glfwIsValidContextConfig, @ref _GLFWwindow, `_glfw.currentRamp`
+
+
+@section internals_platform Platform interface
+
+The platform interface implements all platform-specific operations as a service
+to the public interface.  This includes event processing.  The platform
+interface is never directly called by users of GLFW and never directly calls the
+user's code.  It is also prohibited from modifying the platform-independent part
+of the internal structs.  Instead, it calls the event interface when events
+interesting to GLFW are received.
+
+The platform interface mirrors those parts of the public interface that needs to
+perform platform-specific operations on some or all platforms.  The are also
+named the same except that the glfw function prefix is replaced by
+_glfwPlatform.
+
+Examples: @ref _glfwPlatformCreateWindow
+
+The platform interface also defines structs that contain platform-specific
+global and per-object state.  Their names mirror those of the internal
+interface, except that an interface-specific suffix is added.
+
+Examples: `_GLFWwindowX11`, `_GLFWcontextWGL`
+
+These structs are incorporated as members into the internal interface structs
+using special macros that name them after the specific interface used.  This
+prevents shared code from accidentally using these members.
+
+Examples: `window.win32.handle`, `_glfw.x11.display`
+
+
+@section internals_event Event interface
+
+The event interface is implemented in the same shared source files as the public
+interface and is responsible for delivering the events it receives to the user,
+either via callbacks, via window state changes or both.
+
+The function names of the event interface use a `_glfwInput` prefix and the
+ObjectEvent pattern.
+
+Examples: @ref _glfwInputWindowFocus, @ref _glfwInputCursorMotion
+
+
+@section internals_static Static functions
+
+Static functions may be used by any interface and have no prefixes or suffixes.
+These use headless camel case.
+
+Examples: `clearScrollOffsets`
+
+
+@section internals_config Configuration macros
+
+GLFW uses a number of configuration macros to select at compile time which
+interfaces and code paths to use.  They are defined in the config.h header file,
+which is generated from the `config.h.in` file by CMake.
+
+Configuration macros the same style as tokens in the public interface, except
+with a leading underscore.
+
+Examples: `_GLFW_HAS_GLXGETPROCADDRESS` 
+
+*/