fix: better cursor handling

This commit is contained in:
NOTPIES 2026-03-02 00:56:17 -03:00
parent 3fc220a10b
commit ee31d72f91
3 changed files with 40 additions and 18 deletions

View file

@ -45,7 +45,7 @@ void UIScene_AbstractContainerMenu::handleDestroy()
g_savedInventoryCursorPos.y = m_pointerPos.y;
g_savedInventoryCursorPos.hasSavedPos = true;
while (ShowCursor(TRUE) < 0);
g_KBMInput.SetCursorHiddenForUI(false);
#endif
Minecraft *pMinecraft = Minecraft::GetInstance();
@ -82,7 +82,7 @@ void UIScene_AbstractContainerMenu::InitDataAssociations(int iPad, AbstractConta
void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex)
{
#ifdef _WINDOWS64
while (ShowCursor(FALSE) >= 0);
g_KBMInput.SetCursorHiddenForUI(true);
#endif
m_labelInventory.init( app.GetString(IDS_INVENTORY) );
@ -179,15 +179,6 @@ void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex)
if (m_pointerPos.y < m_fPointerMinY) m_pointerPos.y = m_fPointerMinY;
if (m_pointerPos.y > m_fPointerMaxY) m_pointerPos.y = m_fPointerMaxY;
}
extern HWND g_hWnd;
RECT rc;
GetClientRect(g_hWnd, &rc);
POINT center;
center.x = (rc.right - rc.left) / 2;
center.y = (rc.bottom - rc.top) / 2;
ClientToScreen(g_hWnd, &center);
SetCursorPos(center.x, center.y);
#endif
IggyEvent mouseEvent;
@ -212,10 +203,6 @@ void UIScene_AbstractContainerMenu::tick()
{
UIScene::tick();
#ifdef _WINDOWS64
SetCursor(NULL);
#endif
onMouseTick();
IggyEvent mouseEvent;

View file

@ -33,6 +33,7 @@ void KeyboardMouseInput::Init()
m_mouseWheel = 0;
m_mouseWheelAccum = 0;
m_mouseGrabbed = false;
m_cursorHiddenForUI = false;
m_windowFocused = true;
m_hasInput = false;
@ -106,7 +107,7 @@ void KeyboardMouseInput::Tick()
}
}
if (m_mouseGrabbed && g_hWnd)
if ((m_mouseGrabbed || m_cursorHiddenForUI) && g_hWnd)
{
RECT rc;
GetClientRect(g_hWnd, &rc);
@ -239,7 +240,36 @@ void KeyboardMouseInput::SetMouseGrabbed(bool grabbed)
m_mouseDeltaAccumX = 0;
m_mouseDeltaAccumY = 0;
}
else if (!grabbed && g_hWnd)
else if (!grabbed && !m_cursorHiddenForUI && g_hWnd)
{
while (ShowCursor(TRUE) < 0) {}
ClipCursor(NULL);
}
}
void KeyboardMouseInput::SetCursorHiddenForUI(bool hidden)
{
if (m_cursorHiddenForUI == hidden)
return;
m_cursorHiddenForUI = hidden;
if (hidden && g_hWnd)
{
while (ShowCursor(FALSE) >= 0) {}
ClipCursorToWindow(g_hWnd);
RECT rc;
GetClientRect(g_hWnd, &rc);
POINT center;
center.x = (rc.right - rc.left) / 2;
center.y = (rc.bottom - rc.top) / 2;
ClientToScreen(g_hWnd, &center);
SetCursorPos(center.x, center.y);
m_mouseDeltaAccumX = 0;
m_mouseDeltaAccumY = 0;
}
else if (!hidden && !m_mouseGrabbed && g_hWnd)
{
while (ShowCursor(TRUE) < 0) {}
ClipCursor(NULL);
@ -264,7 +294,7 @@ void KeyboardMouseInput::SetWindowFocused(bool focused)
m_windowFocused = focused;
if (focused)
{
if (m_mouseGrabbed)
if (m_mouseGrabbed || m_cursorHiddenForUI)
{
while (ShowCursor(FALSE) >= 0) {}
ClipCursorToWindow(g_hWnd);

View file

@ -58,6 +58,9 @@ public:
void SetMouseGrabbed(bool grabbed);
bool IsMouseGrabbed() const { return m_mouseGrabbed; }
void SetCursorHiddenForUI(bool hidden);
bool IsCursorHiddenForUI() const { return m_cursorHiddenForUI; }
void SetWindowFocused(bool focused);
bool IsWindowFocused() const { return m_windowFocused; }
@ -99,6 +102,8 @@ private:
bool m_mouseGrabbed;
bool m_cursorHiddenForUI;
bool m_windowFocused;
bool m_hasInput;