This commit is contained in:
PUFF_MON 2026-05-04 22:22:45 +00:00 committed by GitHub
commit 41b912afed
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 49 additions and 2 deletions

View file

@ -5,6 +5,7 @@
#include "UIScene.h" #include "UIScene.h"
#include "UIControl_Slider.h" #include "UIControl_Slider.h"
#include "UIControl_TexturePackList.h" #include "UIControl_TexturePackList.h"
#include "UIControl_CheckBox.h"
#include "../../../Minecraft.World/StringHelpers.h" #include "../../../Minecraft.World/StringHelpers.h"
#include "../../LocalPlayer.h" #include "../../LocalPlayer.h"
#include "../../DLCTexturePack.h" #include "../../DLCTexturePack.h"
@ -791,6 +792,7 @@ void UIController::tickInput()
{ {
#ifdef _WINDOWS64 #ifdef _WINDOWS64
m_mouseClickConsumedByScene = false; m_mouseClickConsumedByScene = false;
UIControl* currHitCtrl = NULL;
if (!g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive()) if (!g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive())
{ {
UIScene *pScene = nullptr; UIScene *pScene = nullptr;
@ -955,7 +957,7 @@ void UIController::tickInput()
static_cast<S32>(sceneMouseX), static_cast<S32>(sceneMouseY), false); static_cast<S32>(sceneMouseX), static_cast<S32>(sceneMouseY), false);
hitControlId = -1; hitControlId = -1;
hitArea = INT_MAX; hitArea = INT_MAX;
hitCtrl = NULL; hitCtrl = ctrl;
break; // ButtonList takes priority break; // ButtonList takes priority
} }
if (type == UIControl::eTexturePackList) if (type == UIControl::eTexturePackList)
@ -968,7 +970,7 @@ void UIController::tickInput()
m_bMouseHoverHorizontalList = true; m_bMouseHoverHorizontalList = true;
hitControlId = -1; hitControlId = -1;
hitArea = INT_MAX; hitArea = INT_MAX;
hitCtrl = NULL; hitCtrl = ctrl;
break; break;
} }
S32 area = cw * ch; S32 area = cw * ch;
@ -1004,6 +1006,9 @@ void UIController::tickInput()
} }
} }
} }
currHitCtrl = hitCtrl;
UpdateCursorIcon(currHitCtrl);
} }
} }
@ -1127,6 +1132,27 @@ void UIController::tickInput()
} }
} }
void UIController::UpdateCursorIcon(UIControl *hitCtrl)
{
// Set cursor icon based on hovered UI element (WinUser.h)
if (hitCtrl && (hitCtrl->getControlType() == UIControl::eButton || hitCtrl->getControlType() == UIControl::eButtonList))
g_KBMInput.SetCursorIcon(MAKEINTRESOURCEW(IDC_HAND));
else if (hitCtrl && (hitCtrl->getControlType() == UIControl::eSlider || hitCtrl->getControlType() == UIControl::eTexturePackList))
g_KBMInput.SetCursorIcon(MAKEINTRESOURCEW(IDC_SIZEWE));
else if (hitCtrl && hitCtrl->getControlType() == UIControl::eTextInput)
g_KBMInput.SetCursorIcon(MAKEINTRESOURCEW(IDC_IBEAM));
else if (hitCtrl && hitCtrl->getControlType() == UIControl::eCheckBox) // Show the cross sign shaped cursor only when the checkbox is disabled/grayed out
{
UIControl_CheckBox *pCheck = static_cast<UIControl_CheckBox *>(hitCtrl);
if (pCheck && !pCheck->IsEnabled())
g_KBMInput.SetCursorIcon(MAKEINTRESOURCEW(IDC_NO));
else
g_KBMInput.SetCursorIcon(MAKEINTRESOURCEW(IDC_HAND));
}
else
g_KBMInput.SetCursorIcon(MAKEINTRESOURCEW(IDC_ARROW));
}
void UIController::handleInput() void UIController::handleInput()
{ {
// For each user, loop over each key type and send messages based on the state // For each user, loop over each key type and send messages based on the state
@ -1995,6 +2021,7 @@ bool UIController::NavigateToScene(int iPad, EUIScene scene, void *initData, EUI
SetMenuDisplayed(menuDisplayedPad,true); SetMenuDisplayed(menuDisplayedPad,true);
bool success = m_groups[static_cast<int>(group)]->NavigateToScene(iPad, scene, initData, layer); bool success = m_groups[static_cast<int>(group)]->NavigateToScene(iPad, scene, initData, layer);
if(success && group == eUIGroup_Fullscreen) setFullscreenMenuDisplayed(true); if(success && group == eUIGroup_Fullscreen) setFullscreenMenuDisplayed(true);
UpdateCursorIcon(nullptr);
LeaveCriticalSection(&m_navigationLock); LeaveCriticalSection(&m_navigationLock);
timer.PrintElapsedTime(L"Navigate to scene"); timer.PrintElapsedTime(L"Navigate to scene");
@ -2035,6 +2062,8 @@ bool UIController::NavigateBack(int iPad, bool forceUsePad, EUIScene eScene, EUI
if(!m_groups[static_cast<int>(eUIGroup_Fullscreen)]->GetMenuDisplayed()) SetMenuDisplayed(XUSER_INDEX_ANY,false); if(!m_groups[static_cast<int>(eUIGroup_Fullscreen)]->GetMenuDisplayed()) SetMenuDisplayed(XUSER_INDEX_ANY,false);
} }
return navComplete; return navComplete;
UpdateCursorIcon(nullptr);
} }
void UIController::NavigateToHomeMenu() void UIController::NavigateToHomeMenu()

View file

@ -245,6 +245,7 @@ public:
// INPUT // INPUT
private: private:
void tickInput(); void tickInput();
void UpdateCursorIcon(UIControl *hitCtrl);
void handleInput(); void handleInput();
void handleKeyPress(unsigned int iPad, unsigned int key); void handleKeyPress(unsigned int iPad, unsigned int key);

View file

@ -390,6 +390,21 @@ float KeyboardMouseInput::GetLookY(float sensitivity) const
return static_cast<float>(-m_mouseDeltaY) * sensitivity; return static_cast<float>(-m_mouseDeltaY) * sensitivity;
} }
void KeyboardMouseInput::SetCursorIcon(LPCWSTR cursorName)
{
HCURSOR hCursor = LoadCursorW(nullptr, cursorName);
if (hCursor)
{
SetCursor(hCursor);
if (g_hWnd)
{
// Update the cursor icon to keep the current one
SetClassLongPtrW(g_hWnd, GCLP_HCURSOR, (LONG_PTR)hCursor);
}
}
}
void KeyboardMouseInput::OnChar(wchar_t c) void KeyboardMouseInput::OnChar(wchar_t c)
{ {
int next = (m_charBufferHead + 1) % CHAR_BUFFER_SIZE; int next = (m_charBufferHead + 1) % CHAR_BUFFER_SIZE;

View file

@ -103,6 +103,8 @@ public:
float GetLookX(float sensitivity) const; float GetLookX(float sensitivity) const;
float GetLookY(float sensitivity) const; float GetLookY(float sensitivity) const;
void SetCursorIcon(LPCWSTR cursorName);
private: private:
bool m_keyDown[MAX_KEYS]; bool m_keyDown[MAX_KEYS];
bool m_keyDownPrev[MAX_KEYS]; bool m_keyDownPrev[MAX_KEYS];