diff --git a/src/fullscreen.c b/src/fullscreen.c index 7cc96bb7..631f6193 100644 --- a/src/fullscreen.c +++ b/src/fullscreen.c @@ -110,9 +110,18 @@ GLFWAPI int glfwGetVideoModes(GLFWvidmode* list, int maxcount) return 0; } - if (maxcount <= 0 || list == NULL) + if (maxcount <= 0) { - // TODO: Figure out if this is an error + _glfwSetError(GLFW_INVALID_VALUE, + "glfwGetVideoModes: Parameter 'maxcount' must be " + "greater than zero"); + return 0; + } + + if (list == NULL) + { + _glfwSetError(GLFW_INVALID_VALUE, + "glfwGetVideoModes: Parameter 'list' cannot be NULL"); return 0; } diff --git a/src/win32_platform.h b/src/win32_platform.h index a2b94ebc..8aa3561b 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -254,7 +254,7 @@ typedef struct _GLFWwindowWin32 // Various platform specific internal variables int desiredRefreshRate; // Desired vertical monitor refresh rate - GLboolean mouseMoved; + GLboolean cursorCentered; int oldMouseX, oldMouseY; } _GLFWwindowWin32; diff --git a/src/win32_window.c b/src/win32_window.c index 1bfef9f5..e975235b 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -472,6 +472,50 @@ static GLboolean createContext(_GLFWwindow* window, } +//======================================================================== +// Hide mouse cursor +//======================================================================== + +static void hideMouseCursor(_GLFWwindow* window) +{ +} + + +//======================================================================== +// Capture mouse cursor +//======================================================================== + +static void captureMouseCursor(_GLFWwindow* window) +{ + RECT ClipWindowRect; + + ShowCursor(FALSE); + + // Clip cursor to the window + if (GetWindowRect(window->Win32.handle, &ClipWindowRect)) + ClipCursor(&ClipWindowRect); + + // Capture cursor to user window + SetCapture(window->Win32.handle); +} + + +//======================================================================== +// Show mouse cursor +//======================================================================== + +static void showMouseCursor(_GLFWwindow* window) +{ + // Un-capture cursor + ReleaseCapture(); + + // Release the cursor from the window + ClipCursor(NULL); + + ShowCursor(TRUE); +} + + //======================================================================== // Translates a Windows key to the corresponding GLFW key //======================================================================== @@ -1761,7 +1805,7 @@ void _glfwPlatformPollEvents(void) window = _glfwLibrary.activeWindow; if (window) { - window->Win32.mouseMoved = GL_FALSE; + window->Win32.cursorCentered = GL_FALSE; window->Win32.oldMouseX = window->width / 2; window->Win32.oldMouseY = window->height / 2; } @@ -1846,41 +1890,6 @@ void _glfwPlatformWaitEvents(void) } -//======================================================================== -// Hide mouse cursor (lock it) -//======================================================================== - -void _glfwPlatformHideMouseCursor(_GLFWwindow* window) -{ - RECT ClipWindowRect; - - ShowCursor(FALSE); - - // Clip cursor to the window - if (GetWindowRect(window->Win32.handle, &ClipWindowRect)) - ClipCursor(&ClipWindowRect); - - // Capture cursor to user window - SetCapture(window->Win32.handle); -} - - -//======================================================================== -// Show mouse cursor (unlock it) -//======================================================================== - -void _glfwPlatformShowMouseCursor(_GLFWwindow* window) -{ - // Un-capture cursor - ReleaseCapture(); - - // Release the cursor from the window - ClipCursor(NULL); - - ShowCursor(TRUE); -} - - //======================================================================== // Set physical mouse cursor position //======================================================================== @@ -1897,3 +1906,24 @@ void _glfwPlatformSetMouseCursorPos(_GLFWwindow* window, int x, int y) SetCursorPos(pos.x, pos.y); } + +//======================================================================== +// Set physical mouse cursor mode +//======================================================================== + +void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode) +{ + switch (mode) + { + case GLFW_CURSOR_NORMAL: + showMouseCursor(window); + break; + case GLFW_CURSOR_HIDDEN: + hideMouseCursor(window); + break; + case GLFW_CURSOR_CAPTURED: + captureMouseCursor(window); + break; + } +} + diff --git a/tests/reopen.c b/tests/reopen.c index 5040697f..2922cb84 100644 --- a/tests/reopen.c +++ b/tests/reopen.c @@ -62,7 +62,7 @@ static void window_size_callback(GLFWwindow window, int width, int height) static int window_close_callback(GLFWwindow window) { printf("Close callback triggered\n"); - window_handle = NULL; + closed = GL_TRUE; return 0; } diff --git a/tests/windows.c b/tests/windows.c index ddb8a224..c7ff32b2 100644 --- a/tests/windows.c +++ b/tests/windows.c @@ -66,7 +66,10 @@ int main(void) glfwSetWindowPos(windows[i], 100 + (i & 1) * 300, 100 + (i >> 1) * 300); - glClearColor((GLclampf) (i & 1), (GLclampf) (i >> 1), 0.0, 0.0); + glClearColor((GLclampf) (i & 1), + (GLclampf) (i >> 1), + i ? 0.0 : 1.0, + 0.0); } while (running)