| //======================================================================== |
| // GLFW - An OpenGL framework |
| // Platform: Any |
| // API version: 3.0 |
| // WWW: http://www.glfw.org/ |
| //------------------------------------------------------------------------ |
| // Copyright (c) 2002-2006 Marcus Geelnard |
| // Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> |
| // |
| // This software is provided 'as-is', without any express or implied |
| // warranty. In no event will the authors be held liable for any damages |
| // arising from the use of this software. |
| // |
| // Permission is granted to anyone to use this software for any purpose, |
| // including commercial applications, and to alter it and redistribute it |
| // freely, subject to the following restrictions: |
| // |
| // 1. The origin of this software must not be misrepresented; you must not |
| // claim that you wrote the original software. If you use this software |
| // in a product, an acknowledgment in the product documentation would |
| // be appreciated but is not required. |
| // |
| // 2. Altered source versions must be plainly marked as such, and must not |
| // be misrepresented as being the original software. |
| // |
| // 3. This notice may not be removed or altered from any source |
| // distribution. |
| // |
| //======================================================================== |
| |
| #include "internal.h" |
| |
| |
| ////////////////////////////////////////////////////////////////////////// |
| ////// GLFW public API ////// |
| ////////////////////////////////////////////////////////////////////////// |
| |
| //======================================================================== |
| // Returns the state of the specified key for the specified window |
| //======================================================================== |
| |
| GLFWAPI int glfwGetKey(GLFWwindow handle, int key) |
| { |
| if (!_glfwInitialized) |
| { |
| _glfwSetError(GLFW_NOT_INITIALIZED, NULL); |
| return GLFW_RELEASE; |
| } |
| |
| _GLFWwindow* window = (_GLFWwindow*) handle; |
| |
| // Is it a valid key? |
| if (key < 0 || key > GLFW_KEY_LAST) |
| { |
| // TODO: Decide whether key is a value or enum |
| _glfwSetError(GLFW_INVALID_VALUE, "glfwGetKey: The specified key is invalid"); |
| return GLFW_RELEASE; |
| } |
| |
| if (window->key[key] == GLFW_STICK) |
| { |
| // Sticky mode: release key now |
| window->key[key] = GLFW_RELEASE; |
| return GLFW_PRESS; |
| } |
| |
| return (int) window->key[key]; |
| } |
| |
| |
| //======================================================================== |
| // Returns the state of the specified mouse button for the specified window |
| //======================================================================== |
| |
| GLFWAPI int glfwGetMouseButton(GLFWwindow handle, int button) |
| { |
| if (!_glfwInitialized) |
| { |
| _glfwSetError(GLFW_NOT_INITIALIZED, NULL); |
| return GLFW_RELEASE; |
| } |
| |
| _GLFWwindow* window = (_GLFWwindow*) handle; |
| |
| // Is it a valid mouse button? |
| if (button < 0 || button > GLFW_MOUSE_BUTTON_LAST) |
| { |
| _glfwSetError(GLFW_INVALID_ENUM, "glfwGetMouseButton: The specified mouse button is invalid"); |
| return GLFW_RELEASE; |
| } |
| |
| if (window->mouseButton[button] == GLFW_STICK) |
| { |
| // Sticky mode: release mouse button now |
| window->mouseButton[button] = GLFW_RELEASE; |
| return GLFW_PRESS; |
| } |
| |
| return (int) window->mouseButton[button]; |
| } |
| |
| |
| //======================================================================== |
| // Returns the last reported cursor position for the specified window |
| //======================================================================== |
| |
| GLFWAPI void glfwGetMousePos(GLFWwindow handle, int* xpos, int* ypos) |
| { |
| if (!_glfwInitialized) |
| { |
| _glfwSetError(GLFW_NOT_INITIALIZED, NULL); |
| return; |
| } |
| |
| _GLFWwindow* window = (_GLFWwindow*) handle; |
| |
| // Return mouse position |
| if (xpos != NULL) |
| *xpos = window->mousePosX; |
| |
| if (ypos != NULL) |
| *ypos = window->mousePosY; |
| } |
| |
| |
| //======================================================================== |
| // Sets the cursor position relative to the position of the client area of |
| // the specified window |
| //======================================================================== |
| |
| GLFWAPI void glfwSetMousePos(GLFWwindow handle, int xpos, int ypos) |
| { |
| if (!_glfwInitialized) |
| { |
| _glfwSetError(GLFW_NOT_INITIALIZED, NULL); |
| return; |
| } |
| |
| _GLFWwindow* window = (_GLFWwindow*) handle; |
| |
| // Don't do anything if the mouse position did not change |
| if (xpos == window->mousePosX && ypos == window->mousePosY) |
| return; |
| |
| // Set GLFW mouse position |
| window->mousePosX = xpos; |
| window->mousePosY = ypos; |
| |
| // If we have a locked mouse, do not change cursor position |
| if (_glfwLibrary.cursorLockWindow == window) |
| return; |
| |
| // Update physical cursor position |
| _glfwPlatformSetMouseCursorPos(window, xpos, ypos); |
| } |
| |
| |
| //======================================================================== |
| // Returns the scroll offset for the specified window |
| //======================================================================== |
| |
| GLFWAPI void glfwGetScrollOffset(GLFWwindow handle, int* xoffset, int* yoffset) |
| { |
| if (!_glfwInitialized) |
| { |
| _glfwSetError(GLFW_NOT_INITIALIZED, NULL); |
| return; |
| } |
| |
| _GLFWwindow* window = (_GLFWwindow*) handle; |
| |
| if (xoffset) |
| *xoffset = window->scrollX; |
| |
| if (yoffset) |
| *yoffset = window->scrollY; |
| } |
| |
| |
| //======================================================================== |
| // Set callback function for keyboard input |
| //======================================================================== |
| |
| GLFWAPI void glfwSetKeyCallback(GLFWkeyfun cbfun) |
| { |
| if (!_glfwInitialized) |
| { |
| _glfwSetError(GLFW_NOT_INITIALIZED, NULL); |
| return; |
| } |
| |
| _glfwLibrary.keyCallback = cbfun; |
| } |
| |
| |
| //======================================================================== |
| // Set callback function for character input |
| //======================================================================== |
| |
| GLFWAPI void glfwSetCharCallback(GLFWcharfun cbfun) |
| { |
| if (!_glfwInitialized) |
| { |
| _glfwSetError(GLFW_NOT_INITIALIZED, NULL); |
| return; |
| } |
| |
| _glfwLibrary.charCallback = cbfun; |
| } |
| |
| |
| //======================================================================== |
| // Set callback function for mouse clicks |
| //======================================================================== |
| |
| GLFWAPI void glfwSetMouseButtonCallback(GLFWmousebuttonfun cbfun) |
| { |
| if (!_glfwInitialized) |
| { |
| _glfwSetError(GLFW_NOT_INITIALIZED, NULL); |
| return; |
| } |
| |
| _glfwLibrary.mouseButtonCallback = cbfun; |
| } |
| |
| |
| //======================================================================== |
| // Set callback function for mouse moves |
| //======================================================================== |
| |
| GLFWAPI void glfwSetMousePosCallback(GLFWmouseposfun cbfun) |
| { |
| if (!_glfwInitialized) |
| { |
| _glfwSetError(GLFW_NOT_INITIALIZED, NULL); |
| return; |
| } |
| |
| // Set callback function |
| _glfwLibrary.mousePosCallback = cbfun; |
| |
| // Call the callback function to let the application know the current |
| // mouse position |
| if (cbfun) |
| { |
| _GLFWwindow* window; |
| |
| for (window = _glfwLibrary.windowListHead; window; window = window->next) |
| cbfun(window, window->mousePosX, window->mousePosY); |
| } |
| } |
| |
| |
| //======================================================================== |
| // Set callback function for scroll events |
| //======================================================================== |
| |
| GLFWAPI void glfwSetScrollCallback(GLFWscrollfun cbfun) |
| { |
| if (!_glfwInitialized) |
| { |
| _glfwSetError(GLFW_NOT_INITIALIZED, NULL); |
| return; |
| } |
| |
| // Set callback function |
| _glfwLibrary.scrollCallback = cbfun; |
| } |
| |