mirror of
				https://github.com/glfw/glfw.git
				synced 2025-11-04 06:15:07 +00:00 
			
		
		
		
	Refactor cursor mode paths
This is the refactoring part of adding GLFW_CURSOR_CAPTURED, separated out to help keep 3.3-stable similar to the main branch. Related to #58.
This commit is contained in:
		
							parent
							
								
									03af6b3d4c
								
							
						
					
					
						commit
						a46f829de8
					
				@ -452,6 +452,8 @@ typedef struct _GLFWlibraryWin32
 | 
				
			|||||||
    double              restoreCursorPosX, restoreCursorPosY;
 | 
					    double              restoreCursorPosX, restoreCursorPosY;
 | 
				
			||||||
    // The window whose disabled cursor mode is active
 | 
					    // The window whose disabled cursor mode is active
 | 
				
			||||||
    _GLFWwindow*        disabledCursorWindow;
 | 
					    _GLFWwindow*        disabledCursorWindow;
 | 
				
			||||||
 | 
					    // The window the cursor is captured in
 | 
				
			||||||
 | 
					    _GLFWwindow*        capturedCursorWindow;
 | 
				
			||||||
    RAWINPUT*           rawInput;
 | 
					    RAWINPUT*           rawInput;
 | 
				
			||||||
    int                 rawInputSize;
 | 
					    int                 rawInputSize;
 | 
				
			||||||
    UINT                mouseTrailSize;
 | 
					    UINT                mouseTrailSize;
 | 
				
			||||||
 | 
				
			|||||||
@ -249,20 +249,24 @@ static void updateCursorImage(_GLFWwindow* window)
 | 
				
			|||||||
        SetCursor(NULL);
 | 
					        SetCursor(NULL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Updates the cursor clip rect
 | 
					// Sets the cursor clip rect to the window content area
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
static void updateClipRect(_GLFWwindow* window)
 | 
					static void captureCursor(_GLFWwindow* window)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (window)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
    RECT clipRect;
 | 
					    RECT clipRect;
 | 
				
			||||||
    GetClientRect(window->win32.handle, &clipRect);
 | 
					    GetClientRect(window->win32.handle, &clipRect);
 | 
				
			||||||
    ClientToScreen(window->win32.handle, (POINT*) &clipRect.left);
 | 
					    ClientToScreen(window->win32.handle, (POINT*) &clipRect.left);
 | 
				
			||||||
    ClientToScreen(window->win32.handle, (POINT*) &clipRect.right);
 | 
					    ClientToScreen(window->win32.handle, (POINT*) &clipRect.right);
 | 
				
			||||||
    ClipCursor(&clipRect);
 | 
					    ClipCursor(&clipRect);
 | 
				
			||||||
    }
 | 
					    _glfw.win32.capturedCursorWindow = window;
 | 
				
			||||||
    else
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Disabled clip cursor
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					static void releaseCursor(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    ClipCursor(NULL);
 | 
					    ClipCursor(NULL);
 | 
				
			||||||
 | 
					    _glfw.win32.capturedCursorWindow = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Enables WM_INPUT messages for the mouse for the specified window
 | 
					// Enables WM_INPUT messages for the mouse for the specified window
 | 
				
			||||||
@ -301,7 +305,7 @@ static void disableCursor(_GLFWwindow* window)
 | 
				
			|||||||
                           &_glfw.win32.restoreCursorPosY);
 | 
					                           &_glfw.win32.restoreCursorPosY);
 | 
				
			||||||
    updateCursorImage(window);
 | 
					    updateCursorImage(window);
 | 
				
			||||||
    _glfwCenterCursorInContentArea(window);
 | 
					    _glfwCenterCursorInContentArea(window);
 | 
				
			||||||
    updateClipRect(window);
 | 
					    captureCursor(window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (window->rawMouseMotion)
 | 
					    if (window->rawMouseMotion)
 | 
				
			||||||
        enableRawMouseMotion(window);
 | 
					        enableRawMouseMotion(window);
 | 
				
			||||||
@ -315,7 +319,7 @@ static void enableCursor(_GLFWwindow* window)
 | 
				
			|||||||
        disableRawMouseMotion(window);
 | 
					        disableRawMouseMotion(window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _glfw.win32.disabledCursorWindow = NULL;
 | 
					    _glfw.win32.disabledCursorWindow = NULL;
 | 
				
			||||||
    updateClipRect(NULL);
 | 
					    releaseCursor();
 | 
				
			||||||
    _glfwSetCursorPosWin32(window,
 | 
					    _glfwSetCursorPosWin32(window,
 | 
				
			||||||
                           _glfw.win32.restoreCursorPosX,
 | 
					                           _glfw.win32.restoreCursorPosX,
 | 
				
			||||||
                           _glfw.win32.restoreCursorPosY);
 | 
					                           _glfw.win32.restoreCursorPosY);
 | 
				
			||||||
@ -1004,8 +1008,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
 | 
				
			|||||||
                                       (window->win32.maximized &&
 | 
					                                       (window->win32.maximized &&
 | 
				
			||||||
                                        wParam != SIZE_RESTORED);
 | 
					                                        wParam != SIZE_RESTORED);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (_glfw.win32.disabledCursorWindow == window)
 | 
					            if (_glfw.win32.capturedCursorWindow == window)
 | 
				
			||||||
                updateClipRect(window);
 | 
					                captureCursor(window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (window->win32.iconified != iconified)
 | 
					            if (window->win32.iconified != iconified)
 | 
				
			||||||
                _glfwInputWindowIconify(window, iconified);
 | 
					                _glfwInputWindowIconify(window, iconified);
 | 
				
			||||||
@ -1040,8 +1044,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        case WM_MOVE:
 | 
					        case WM_MOVE:
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (_glfw.win32.disabledCursorWindow == window)
 | 
					            if (_glfw.win32.capturedCursorWindow == window)
 | 
				
			||||||
                updateClipRect(window);
 | 
					                captureCursor(window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // NOTE: This cannot use LOWORD/HIWORD recommended by MSDN, as
 | 
					            // NOTE: This cannot use LOWORD/HIWORD recommended by MSDN, as
 | 
				
			||||||
            // those macros do not handle negative window positions correctly
 | 
					            // those macros do not handle negative window positions correctly
 | 
				
			||||||
@ -1495,7 +1499,10 @@ void _glfwDestroyWindowWin32(_GLFWwindow* window)
 | 
				
			|||||||
        window->context.destroy(window);
 | 
					        window->context.destroy(window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (_glfw.win32.disabledCursorWindow == window)
 | 
					    if (_glfw.win32.disabledCursorWindow == window)
 | 
				
			||||||
        _glfw.win32.disabledCursorWindow = NULL;
 | 
					        enableCursor(window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (_glfw.win32.capturedCursorWindow == window)
 | 
				
			||||||
 | 
					        releaseCursor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (window->win32.handle)
 | 
					    if (window->win32.handle)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -2142,14 +2149,40 @@ void _glfwSetCursorPosWin32(_GLFWwindow* window, double xpos, double ypos)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void _glfwSetCursorModeWin32(_GLFWwindow* window, int mode)
 | 
					void _glfwSetCursorModeWin32(_GLFWwindow* window, int mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if (_glfwWindowFocusedWin32(window))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        if (mode == GLFW_CURSOR_DISABLED)
 | 
					        if (mode == GLFW_CURSOR_DISABLED)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
        if (_glfwWindowFocusedWin32(window))
 | 
					            _glfwGetCursorPosWin32(window,
 | 
				
			||||||
            disableCursor(window);
 | 
					                                   &_glfw.win32.restoreCursorPosX,
 | 
				
			||||||
 | 
					                                   &_glfw.win32.restoreCursorPosY);
 | 
				
			||||||
 | 
					            _glfwCenterCursorInContentArea(window);
 | 
				
			||||||
 | 
					            if (window->rawMouseMotion)
 | 
				
			||||||
 | 
					                enableRawMouseMotion(window);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else if (_glfw.win32.disabledCursorWindow == window)
 | 
					        else if (_glfw.win32.disabledCursorWindow == window)
 | 
				
			||||||
        enableCursor(window);
 | 
					        {
 | 
				
			||||||
    else if (cursorInContentArea(window))
 | 
					            if (window->rawMouseMotion)
 | 
				
			||||||
 | 
					                disableRawMouseMotion(window);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (mode == GLFW_CURSOR_DISABLED)
 | 
				
			||||||
 | 
					            captureCursor(window);
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            releaseCursor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (mode == GLFW_CURSOR_DISABLED)
 | 
				
			||||||
 | 
					            _glfw.win32.disabledCursorWindow = window;
 | 
				
			||||||
 | 
					        else if (_glfw.win32.disabledCursorWindow == window)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _glfw.win32.disabledCursorWindow = NULL;
 | 
				
			||||||
 | 
					            _glfwSetCursorPosWin32(window,
 | 
				
			||||||
 | 
					                                   _glfw.win32.restoreCursorPosX,
 | 
				
			||||||
 | 
					                                   _glfw.win32.restoreCursorPosY);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (cursorInContentArea(window))
 | 
				
			||||||
        updateCursorImage(window);
 | 
					        updateCursorImage(window);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -2556,7 +2556,8 @@ void _glfwSetCursorWayland(_GLFWwindow* window, _GLFWcursor* cursor)
 | 
				
			|||||||
        if (!window->wl.lockedPointer)
 | 
					        if (!window->wl.lockedPointer)
 | 
				
			||||||
            lockPointer(window);
 | 
					            lockPointer(window);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else if (window->cursorMode == GLFW_CURSOR_NORMAL ||
 | 
				
			||||||
 | 
					             window->cursorMode == GLFW_CURSOR_HIDDEN)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (window->wl.lockedPointer)
 | 
					        if (window->wl.lockedPointer)
 | 
				
			||||||
            unlockPointer(window);
 | 
					            unlockPointer(window);
 | 
				
			||||||
@ -2597,8 +2598,11 @@ void _glfwSetCursorWayland(_GLFWwindow* window, _GLFWcursor* cursor)
 | 
				
			|||||||
            setCursorImage(window, &cursorWayland);
 | 
					            setCursorImage(window, &cursorWayland);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else
 | 
					    else if (window->cursorMode == GLFW_CURSOR_HIDDEN ||
 | 
				
			||||||
 | 
					             window->cursorMode == GLFW_CURSOR_DISABLED)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerEnterSerial, NULL, 0, 0);
 | 
					        wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerEnterSerial, NULL, 0, 0);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void dataSourceHandleTarget(void* userData,
 | 
					static void dataSourceHandleTarget(void* userData,
 | 
				
			||||||
 | 
				
			|||||||
@ -470,6 +470,25 @@ static void updateCursorImage(_GLFWwindow* window)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Grabs the cursor and confines it to the window
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					static void captureCursor(_GLFWwindow* window)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    XGrabPointer(_glfw.x11.display, window->x11.handle, True,
 | 
				
			||||||
 | 
					                 ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
 | 
				
			||||||
 | 
					                 GrabModeAsync, GrabModeAsync,
 | 
				
			||||||
 | 
					                 window->x11.handle,
 | 
				
			||||||
 | 
					                 None,
 | 
				
			||||||
 | 
					                 CurrentTime);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Ungrabs the cursor
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					static void releaseCursor(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    XUngrabPointer(_glfw.x11.display, CurrentTime);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Enable XI2 raw mouse motion events
 | 
					// Enable XI2 raw mouse motion events
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
static void enableRawMouseMotion(_GLFWwindow* window)
 | 
					static void enableRawMouseMotion(_GLFWwindow* window)
 | 
				
			||||||
@ -512,12 +531,7 @@ static void disableCursor(_GLFWwindow* window)
 | 
				
			|||||||
                         &_glfw.x11.restoreCursorPosY);
 | 
					                         &_glfw.x11.restoreCursorPosY);
 | 
				
			||||||
    updateCursorImage(window);
 | 
					    updateCursorImage(window);
 | 
				
			||||||
    _glfwCenterCursorInContentArea(window);
 | 
					    _glfwCenterCursorInContentArea(window);
 | 
				
			||||||
    XGrabPointer(_glfw.x11.display, window->x11.handle, True,
 | 
					    captureCursor(window);
 | 
				
			||||||
                 ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
 | 
					 | 
				
			||||||
                 GrabModeAsync, GrabModeAsync,
 | 
					 | 
				
			||||||
                 window->x11.handle,
 | 
					 | 
				
			||||||
                 _glfw.x11.hiddenCursorHandle,
 | 
					 | 
				
			||||||
                 CurrentTime);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Exit disabled cursor mode for the specified window
 | 
					// Exit disabled cursor mode for the specified window
 | 
				
			||||||
@ -528,7 +542,7 @@ static void enableCursor(_GLFWwindow* window)
 | 
				
			|||||||
        disableRawMouseMotion(window);
 | 
					        disableRawMouseMotion(window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _glfw.x11.disabledCursorWindow = NULL;
 | 
					    _glfw.x11.disabledCursorWindow = NULL;
 | 
				
			||||||
    XUngrabPointer(_glfw.x11.display, CurrentTime);
 | 
					    releaseCursor();
 | 
				
			||||||
    _glfwSetCursorPosX11(window,
 | 
					    _glfwSetCursorPosX11(window,
 | 
				
			||||||
                         _glfw.x11.restoreCursorPosX,
 | 
					                         _glfw.x11.restoreCursorPosX,
 | 
				
			||||||
                         _glfw.x11.restoreCursorPosY);
 | 
					                         _glfw.x11.restoreCursorPosY);
 | 
				
			||||||
@ -1986,7 +2000,7 @@ GLFWbool _glfwCreateWindowX11(_GLFWwindow* window,
 | 
				
			|||||||
void _glfwDestroyWindowX11(_GLFWwindow* window)
 | 
					void _glfwDestroyWindowX11(_GLFWwindow* window)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (_glfw.x11.disabledCursorWindow == window)
 | 
					    if (_glfw.x11.disabledCursorWindow == window)
 | 
				
			||||||
        _glfw.x11.disabledCursorWindow = NULL;
 | 
					        enableCursor(window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (window->monitor)
 | 
					    if (window->monitor)
 | 
				
			||||||
        releaseMonitor(window);
 | 
					        releaseMonitor(window);
 | 
				
			||||||
@ -2800,16 +2814,40 @@ void _glfwSetCursorPosX11(_GLFWwindow* window, double x, double y)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void _glfwSetCursorModeX11(_GLFWwindow* window, int mode)
 | 
					void _glfwSetCursorModeX11(_GLFWwindow* window, int mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    if (_glfwWindowFocusedX11(window))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
        if (mode == GLFW_CURSOR_DISABLED)
 | 
					        if (mode == GLFW_CURSOR_DISABLED)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
        if (_glfwWindowFocusedX11(window))
 | 
					            _glfwGetCursorPosX11(window,
 | 
				
			||||||
            disableCursor(window);
 | 
					                                 &_glfw.x11.restoreCursorPosX,
 | 
				
			||||||
 | 
					                                 &_glfw.x11.restoreCursorPosY);
 | 
				
			||||||
 | 
					            _glfwCenterCursorInContentArea(window);
 | 
				
			||||||
 | 
					            if (window->rawMouseMotion)
 | 
				
			||||||
 | 
					                enableRawMouseMotion(window);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else if (_glfw.x11.disabledCursorWindow == window)
 | 
					        else if (_glfw.x11.disabledCursorWindow == window)
 | 
				
			||||||
        enableCursor(window);
 | 
					        {
 | 
				
			||||||
    else
 | 
					            if (window->rawMouseMotion)
 | 
				
			||||||
        updateCursorImage(window);
 | 
					                disableRawMouseMotion(window);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (mode == GLFW_CURSOR_DISABLED)
 | 
				
			||||||
 | 
					            captureCursor(window);
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            releaseCursor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (mode == GLFW_CURSOR_DISABLED)
 | 
				
			||||||
 | 
					            _glfw.x11.disabledCursorWindow = window;
 | 
				
			||||||
 | 
					        else if (_glfw.x11.disabledCursorWindow == window)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _glfw.x11.disabledCursorWindow = NULL;
 | 
				
			||||||
 | 
					            _glfwSetCursorPosX11(window,
 | 
				
			||||||
 | 
					                                 _glfw.x11.restoreCursorPosX,
 | 
				
			||||||
 | 
					                                 _glfw.x11.restoreCursorPosY);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    updateCursorImage(window);
 | 
				
			||||||
    XFlush(_glfw.x11.display);
 | 
					    XFlush(_glfw.x11.display);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user