input: fix bugged ShowCursor when redundant call occur with same value

This commit is contained in:
RadWolfie 2021-03-17 11:50:51 -05:00
parent 5c4e6945dc
commit 23681729a5
1 changed files with 30 additions and 2 deletions

View File

@ -761,6 +761,27 @@ void CxbxReleaseCursor()
ClipCursor(nullptr); ClipCursor(nullptr);
} }
static void CxbxUpdateCursor(bool forceShow = false) {
// Getting cursor info is a requirement in order to prevent a bug occur with ShowCursor redundant calls.
CURSORINFO cursorInfo;
cursorInfo.cbSize = sizeof(cursorInfo);
if (!GetCursorInfo(&cursorInfo)) {
// If cursor info is not available, then ignore the cursor update.
return;
}
if (imGuiShown || forceShow) {
if (cursorInfo.flags == 0) {
ShowCursor(TRUE);
}
}
else {
if ((cursorInfo.flags & CURSOR_SHOWING) != 0) {
ShowCursor(FALSE);
}
}
}
inline DWORD GetXboxCommonResourceType(const xbox::dword_xt XboxResource_Common) inline DWORD GetXboxCommonResourceType(const xbox::dword_xt XboxResource_Common)
{ {
DWORD dwCommonType = XboxResource_Common & X_D3DCOMMON_TYPE_MASK; DWORD dwCommonType = XboxResource_Common & X_D3DCOMMON_TYPE_MASK;
@ -1868,6 +1889,12 @@ static LRESULT WINAPI EmuMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar
switch(msg) switch(msg)
{ {
case WM_CREATE:
{
CxbxUpdateCursor();
}
break;
case WM_DESTROY: case WM_DESTROY:
{ {
CxbxReleaseCursor(); CxbxReleaseCursor();
@ -1958,6 +1985,7 @@ static LRESULT WINAPI EmuMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar
else if (wParam == VK_F1) else if (wParam == VK_F1)
{ {
imGuiShown = !imGuiShown; imGuiShown = !imGuiShown;
CxbxUpdateCursor();
} }
else if (wParam == VK_F2) else if (wParam == VK_F2)
{ {
@ -2066,7 +2094,7 @@ static LRESULT WINAPI EmuMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar
DInput::mo_leave_wnd = true; DInput::mo_leave_wnd = true;
g_bIsTrackingMoLeave = false; g_bIsTrackingMoLeave = false;
g_bIsTrackingMoMove = true; g_bIsTrackingMoMove = true;
ShowCursor(TRUE); CxbxUpdateCursor(true);
} }
break; break;
@ -2083,7 +2111,7 @@ static LRESULT WINAPI EmuMsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar
tme.dwFlags = TME_LEAVE; tme.dwFlags = TME_LEAVE;
TrackMouseEvent(&tme); TrackMouseEvent(&tme);
g_bIsTrackingMoLeave = true; g_bIsTrackingMoLeave = true;
ShowCursor(FALSE); CxbxUpdateCursor();
if (g_bIsTrackingMoMove) { if (g_bIsTrackingMoMove) {
DInput::mo_leave_wnd = false; DInput::mo_leave_wnd = false;