Added more input functions to clarify internal API.
diff --git a/src/cocoa_window.m b/src/cocoa_window.m
index 93e3708..136a437 100644
--- a/src/cocoa_window.m
+++ b/src/cocoa_window.m
@@ -67,11 +67,8 @@
 
     NSRect contentRect =
         [window->NS.window contentRectForFrameRect:[window->NS.window frame]];
-    window->width = contentRect.size.width;
-    window->height = contentRect.size.height;
 
-    if (_glfwLibrary.windowSizeCallback)
-        _glfwLibrary.windowSizeCallback(window, window->width, window->height);
+    _glfwInputWindowSize(window, contentRect.size.width, contentRect.size.height);
 }
 
 - (void)windowDidMove:(NSNotification *)notification
@@ -87,24 +84,17 @@
                                       mainScreenHeight - contentRect.origin.y -
                                           mainScreenOrigin.y - window->height);
 
-    window->positionX = flippedPos.x;
-    window->positionY = flippedPos.y;
+    _glfwInputWindowPos(window, flippedPos.x, flippedPos.y);
 }
 
 - (void)windowDidMiniaturize:(NSNotification *)notification
 {
-    window->iconified = GL_TRUE;
-
-    if (_glfwLibrary.windowIconifyCallback)
-        _glfwLibrary.windowIconifyCallback(window, window->iconified);
+    _glfwInputWindowIconify(window, GL_TRUE);
 }
 
 - (void)windowDidDeminiaturize:(NSNotification *)notification
 {
-    window->iconified = GL_FALSE;
-
-    if (_glfwLibrary.windowIconifyCallback)
-        _glfwLibrary.windowIconifyCallback(window, window->iconified);
+    _glfwInputWindowIconify(window, GL_FALSE);
 }
 
 - (void)windowDidBecomeKey:(NSNotification *)notification
@@ -349,24 +339,15 @@
 - (void)mouseMoved:(NSEvent *)event
 {
     if (window->cursorMode == GLFW_CURSOR_CAPTURED)
-    {
-        window->mousePosX += [event deltaX];
-        window->mousePosY += [event deltaY];
-    }
+        _glfwInputCursorMotion(window, [event deltaX], [event deltaY]);
     else
     {
         NSPoint p = [event locationInWindow];
 
         // Cocoa coordinate system has origin at lower left
-        window->mousePosX = p.x;
-        window->mousePosY = [[window->NS.window contentView] bounds].size.height - p.y;
-    }
+        p.y = [[window->NS.window contentView] bounds].size.height - p.y;
 
-    if (_glfwLibrary.mousePosCallback)
-    {
-        _glfwLibrary.mousePosCallback(window,
-                                      window->mousePosX,
-                                      window->mousePosY);
+        _glfwInputCursorMotion(window, p.x, p.y);
     }
 }
 
diff --git a/src/internal.h b/src/internal.h
index 2d38912..bfe24fb 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -339,12 +339,18 @@
 // Window management (window.c)
 void _glfwSetDefaultWindowHints(void);
 
-// Input handling (window.c)
+// WIndow event notification
+void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean activated);
+void _glfwInputWindowPos(_GLFWwindow* window, int x, int y);
+void _glfwInputWindowSize(_GLFWwindow* window, int width, int height);
+void _glfwInputWindowIconify(_GLFWwindow* window, int iconified);
+
+// Input event notification
 void _glfwInputKey(_GLFWwindow* window, int key, int action);
 void _glfwInputChar(_GLFWwindow* window, int character);
 void _glfwInputScroll(_GLFWwindow* window, int x, int y);
 void _glfwInputMouseClick(_GLFWwindow* window, int button, int action);
-void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean activated);
+void _glfwInputCursorMotion(_GLFWwindow* window, int x, int y);
 
 // OpenGL context helpers (opengl.c)
 int _glfwStringInExtensionString(const char* string, const GLubyte* extensions);
diff --git a/src/win32_window.c b/src/win32_window.c
index e975235..6343f90 100644
--- a/src/win32_window.c
+++ b/src/win32_window.c
@@ -852,15 +852,7 @@
             }
 
             _glfwInputWindowFocus(window, active);
-
-            if (iconified != window->iconified)
-            {
-                window->iconified = iconified;
-
-                if (_glfwLibrary.windowIconifyCallback)
-                    _glfwLibrary.windowIconifyCallback(window, window->iconified);
-            }
-
+            _glfwInputWindowIconify(window, iconified);
             return 0;
         }
 
@@ -1006,32 +998,27 @@
             if (newMouseX != window->Win32.oldMouseX ||
                 newMouseY != window->Win32.oldMouseY)
             {
+                int x, y;
+
                 if (window->cursorMode == GLFW_CURSOR_CAPTURED)
                 {
                     if (_glfwLibrary.activeWindow != window)
                         return 0;
 
-                    window->mousePosX += newMouseX -
-                                         window->Win32.oldMouseX;
-                    window->mousePosY += newMouseY -
-                                         window->Win32.oldMouseY;
+                    x += newMouseX - window->Win32.oldMouseX;
+                    y += newMouseY - window->Win32.oldMouseY;
                 }
                 else
                 {
-                    window->mousePosX = newMouseX;
-                    window->mousePosY = newMouseY;
+                    x = newMouseX;
+                    x = newMouseY;
                 }
 
                 window->Win32.oldMouseX = newMouseX;
                 window->Win32.oldMouseY = newMouseY;
                 window->Win32.cursorCentered = GL_FALSE;
 
-                if (_glfwLibrary.mousePosCallback)
-                {
-                    _glfwLibrary.mousePosCallback(window,
-                                                  window->mousePosX,
-                                                  window->mousePosY);
-                }
+                _glfwInputCursorMotion(window, x, y);
             }
 
             return 0;
@@ -1053,9 +1040,6 @@
 
         case WM_SIZE:
         {
-            window->width  = LOWORD(lParam);
-            window->height = HIWORD(lParam);
-
             // If window is in cursor capture mode, update clipping rect
             if (window->cursorMode == GLFW_CURSOR_CAPTURED)
             {
@@ -1064,21 +1048,12 @@
                     ClipCursor(&ClipWindowRect);
             }
 
-            if (_glfwLibrary.windowSizeCallback)
-            {
-                _glfwLibrary.windowSizeCallback(window,
-                                                window->width,
-                                                window->height);
-            }
-
+            _glfwInputWindowSize(window, LOWORD(lParam), HIWORD(lParam));
             return 0;
         }
 
         case WM_MOVE:
         {
-            window->positionX = LOWORD(lParam);
-            window->positionY = HIWORD(lParam);
-
             // If window is in cursor capture mode, update clipping rect
             if (window->cursorMode == GLFW_CURSOR_CAPTURED)
             {
@@ -1086,6 +1061,8 @@
                 if (GetWindowRect(window->Win32.handle, &ClipWindowRect))
                     ClipCursor(&ClipWindowRect);
             }
+
+            _glfwInputWindowPos(window, LOWORD(lParam), HIWORD(lParam));
             return 0;
         }
 
diff --git a/src/window.c b/src/window.c
index 06c32b8..73d3211 100644
--- a/src/window.c
+++ b/src/window.c
@@ -183,6 +183,28 @@
 
 
 //========================================================================
+// Register cursor moves
+//========================================================================
+
+void _glfwInputCursorMotion(_GLFWwindow* window, int x, int y)
+{
+    if (window->cursorMode == GLFW_CURSOR_CAPTURED)
+    {
+        window->mousePosX += x;
+        window->mousePosY += y;
+    }
+    else
+    {
+        window->mousePosX = x;
+        window->mousePosY = y;
+    }
+
+    if (_glfwLibrary.mousePosCallback)
+        _glfwLibrary.mousePosCallback(window, x, y);
+}
+
+
+//========================================================================
 // Register window focus events
 //========================================================================
 
@@ -227,6 +249,53 @@
 }
 
 
+//========================================================================
+// Register window position events
+//========================================================================
+
+void _glfwInputWindowPos(_GLFWwindow* window, int x, int y)
+{
+    if (window->positionX == x && window->positionY == y)
+        return;
+
+    window->positionX = x;
+    window->positionY = y;
+}
+
+
+//========================================================================
+// Register window size events
+//========================================================================
+
+void _glfwInputWindowSize(_GLFWwindow* window, int width, int height)
+{
+    if (window->width == width && window->height == height)
+        return;
+
+    window->width = width;
+    window->height = height;
+
+    if (_glfwLibrary.windowSizeCallback)
+        _glfwLibrary.windowSizeCallback(window, width, height);
+}
+
+
+//========================================================================
+// Register window size events
+//========================================================================
+
+void _glfwInputWindowIconify(_GLFWwindow* window, int iconified)
+{
+    if (window->iconified == iconified)
+        return;
+
+    window->iconified = iconified;
+
+    if (_glfwLibrary.windowIconifyCallback)
+        _glfwLibrary.windowIconifyCallback(window, iconified);
+}
+
+
 //////////////////////////////////////////////////////////////////////////
 //////                        GLFW public API                       //////
 //////////////////////////////////////////////////////////////////////////
diff --git a/src/x11_window.c b/src/x11_window.c
index 962da7f..c08b9b3 100644
--- a/src/x11_window.c
+++ b/src/x11_window.c
@@ -1194,33 +1194,27 @@
                 event.xmotion.y != window->X11.cursorPosY)
             {
                 // The mouse cursor was moved and we didn't do it
+                int x, y;
 
                 if (window->cursorMode == GLFW_CURSOR_CAPTURED)
                 {
                     if (_glfwLibrary.activeWindow != window)
                         break;
 
-                    window->mousePosX += event.xmotion.x -
-                                         window->X11.cursorPosX;
-                    window->mousePosY += event.xmotion.y -
-                                         window->X11.cursorPosY;
+                    x = event.xmotion.x - window->X11.cursorPosX;
+                    y = event.xmotion.y - window->X11.cursorPosY;
                 }
                 else
                 {
-                    window->mousePosX = event.xmotion.x;
-                    window->mousePosY = event.xmotion.y;
+                    x = event.xmotion.x;
+                    x = event.xmotion.y;
                 }
 
                 window->X11.cursorPosX = event.xmotion.x;
                 window->X11.cursorPosY = event.xmotion.y;
                 window->X11.cursorCentered = GL_FALSE;
 
-                if (_glfwLibrary.mousePosCallback)
-                {
-                    _glfwLibrary.mousePosCallback(window,
-                                                  window->mousePosX,
-                                                  window->mousePosY);
-                }
+                _glfwInputCursorMotion(window, x, y);
             }
 
             break;
@@ -1236,27 +1230,13 @@
                 return;
             }
 
-            if (event.xconfigure.width != window->width ||
-                event.xconfigure.height != window->height)
-            {
-                // The window was resized
+            _glfwInputWindowSize(window,
+                                 event.xconfigure.width,
+                                 event.xconfigure.height);
 
-                window->width = event.xconfigure.width;
-                window->height = event.xconfigure.height;
-                if (_glfwLibrary.windowSizeCallback)
-                {
-                    _glfwLibrary.windowSizeCallback(window,
-                                                    window->width,
-                                                    window->height);
-                }
-            }
-
-            if (event.xconfigure.x != window->positionX ||
-                event.xconfigure.y != window->positionY)
-            {
-                window->positionX = event.xconfigure.x;
-                window->positionY = event.xconfigure.y;
-            }
+            _glfwInputWindowPos(window,
+                                event.xconfigure.x,
+                                event.xconfigure.y);
 
             break;
         }
@@ -1305,11 +1285,7 @@
                 return;
             }
 
-            window->iconified = GL_FALSE;
-
-            if (_glfwLibrary.windowIconifyCallback)
-                _glfwLibrary.windowIconifyCallback(window, window->iconified);
-
+            _glfwInputWindowIconify(window, GL_FALSE);
             break;
         }
 
@@ -1323,11 +1299,7 @@
                 return;
             }
 
-            window->iconified = GL_TRUE;
-
-            if (_glfwLibrary.windowIconifyCallback)
-                _glfwLibrary.windowIconifyCallback(window, window->iconified);
-
+            _glfwInputWindowIconify(window, GL_TRUE);
             break;
         }