diff --git a/include/GL/glfw3.h b/include/GL/glfw3.h
index 2fffa1d9..a1e53499 100644
--- a/include/GL/glfw3.h
+++ b/include/GL/glfw3.h
@@ -418,6 +418,7 @@ GLFWAPI void glfwCloseWindow(GLFWwindow window);
GLFWAPI void glfwSetWindowTitle(GLFWwindow, const char* title);
GLFWAPI void glfwGetWindowSize(GLFWwindow, int* width, int* height);
GLFWAPI void glfwSetWindowSize(GLFWwindow, int width, int height);
+GLFWAPI void glfwGetWindowPos(GLFWwindow, int* x, int* y);
GLFWAPI void glfwSetWindowPos(GLFWwindow, int x, int y);
GLFWAPI void glfwIconifyWindow(GLFWwindow window);
GLFWAPI void glfwRestoreWindow(GLFWwindow window);
diff --git a/readme.html b/readme.html
index 04c2b8a2..6bde1f76 100644
--- a/readme.html
+++ b/readme.html
@@ -267,6 +267,7 @@ version of GLFW.
Added glfwGetError
and glfwErrorString
error reporting functions and a number of error tokens
Added glfwSetWindowUserPointer
and glfwGetWindowUserPointer
functions for per-window user pointers
Added glfwGetVersionString
function for determining which code paths were enabled at compile time
+ Added glfwGetWindowPos
function for querying the position of the specified window
Added windows
simple multi-window test program
Added initial window title parameter to glfwOpenWindow
Changed buffer bit depth parameters of glfwOpenWindow
to window hints
diff --git a/src/internal.h b/src/internal.h
index 93499b19..cb19d5e2 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -157,6 +157,7 @@ typedef struct _GLFWwindow
GLboolean iconified; // GL_TRUE if this window is iconified
GLboolean closed; // GL_TRUE if this window should be closed
int width, height;
+ int positionX, positionY;
int mode; // GLFW_WINDOW or GLFW_FULLSCREEN
GLboolean sysKeysDisabled; // system keys disabled flag
GLboolean windowNoResize; // resize- and maximize gadgets disabled flag
diff --git a/src/win32/win32_window.c b/src/win32/win32_window.c
index 30ba8145..3e158e6f 100644
--- a/src/win32/win32_window.c
+++ b/src/win32/win32_window.c
@@ -906,6 +906,9 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
case WM_MOVE:
{
+ window->positionX = LOWORD(lParam);
+ window->positionY = HIWORD(lParam);
+
// If the mouse is locked, update the clipping rect
if (window == _glfwLibrary.cursorLockWindow)
{
diff --git a/src/window.c b/src/window.c
index 3c89abd6..3d044c6a 100644
--- a/src/window.c
+++ b/src/window.c
@@ -807,6 +807,26 @@ GLFWAPI void glfwSetWindowSize(GLFWwindow window, int width, int height)
}
+//========================================================================
+// Get the window position
+//========================================================================
+
+GLFWAPI void glfwGetWindowPos(GLFWwindow window, int* x, int* y)
+{
+ if (!_glfwInitialized)
+ {
+ _glfwSetError(GLFW_NOT_INITIALIZED);
+ return;
+ }
+
+ if (x != NULL)
+ *x = window->positionX;
+
+ if (y != NULL)
+ *y = window->positionY;
+}
+
+
//========================================================================
// Set the window position
//========================================================================
diff --git a/src/x11/x11_window.c b/src/x11/x11_window.c
index 906f1ffc..2825d853 100644
--- a/src/x11/x11_window.c
+++ b/src/x11/x11_window.c
@@ -1215,6 +1215,14 @@ static void processSingleEvent(void)
window->height);
}
}
+
+ if (event.xconfigure.x != window->positionX ||
+ event.xconfigure.y != window->positionY)
+ {
+ window->positionX = event.xconfigure.x;
+ window->positionY = event.xconfigure.y;
+ }
+
break;
}