From 0e78e0a3f3b54ca4a34ccf89cc453e93f4b79c5d Mon Sep 17 00:00:00 2001 From: UniversePM Date: Wed, 26 Aug 2026 19:44:10 -0500 Subject: [PATCH] fix: ugh --- Minecraft.Client/Common/UI/UIController.cpp | 88 +++++++++++++++++---- 1 file changed, 73 insertions(+), 15 deletions(-) diff --git a/Minecraft.Client/Common/UI/UIController.cpp b/Minecraft.Client/Common/UI/UIController.cpp index 651f0099..2a219df3 100644 --- a/Minecraft.Client/Common/UI/UIController.cpp +++ b/Minecraft.Client/Common/UI/UIController.cpp @@ -987,25 +987,83 @@ void UIController::handleKeyPress(unsigned int iPad, unsigned int key) released = InputManager.ButtonReleased(iPad,key); // Toggle #ifdef _WINDOWS64 - // Keyboard menu input for player 0 if (iPad == 0) { - bool kbDown = false, kbPressed = false, kbReleased = false; - switch(key) + int vk = 0; + switch (key) { - case ACTION_MENU_UP: kbDown = g_KBMInput.IsKeyDown(VK_UP); kbPressed = g_KBMInput.IsKeyPressed(VK_UP); kbReleased = g_KBMInput.IsKeyReleased(VK_UP); break; - case ACTION_MENU_DOWN: kbDown = g_KBMInput.IsKeyDown(VK_DOWN); kbPressed = g_KBMInput.IsKeyPressed(VK_DOWN); kbReleased = g_KBMInput.IsKeyReleased(VK_DOWN); break; - case ACTION_MENU_LEFT: kbDown = g_KBMInput.IsKeyDown(VK_LEFT); kbPressed = g_KBMInput.IsKeyPressed(VK_LEFT); kbReleased = g_KBMInput.IsKeyReleased(VK_LEFT); break; - case ACTION_MENU_RIGHT: kbDown = g_KBMInput.IsKeyDown(VK_RIGHT); kbPressed = g_KBMInput.IsKeyPressed(VK_RIGHT); kbReleased = g_KBMInput.IsKeyReleased(VK_RIGHT); break; - case ACTION_MENU_OK: kbDown = g_KBMInput.IsKeyDown(VK_RETURN); kbPressed = g_KBMInput.IsKeyPressed(VK_RETURN); kbReleased = g_KBMInput.IsKeyReleased(VK_RETURN); break; - case ACTION_MENU_A: kbDown = g_KBMInput.IsKeyDown(VK_RETURN); kbPressed = g_KBMInput.IsKeyPressed(VK_RETURN); kbReleased = g_KBMInput.IsKeyReleased(VK_RETURN); break; - case ACTION_MENU_CANCEL: kbDown = g_KBMInput.IsKeyDown(VK_ESCAPE); kbPressed = g_KBMInput.IsKeyPressed(VK_ESCAPE); kbReleased = g_KBMInput.IsKeyReleased(VK_ESCAPE); break; - case ACTION_MENU_B: kbDown = g_KBMInput.IsKeyDown(VK_ESCAPE); kbPressed = g_KBMInput.IsKeyPressed(VK_ESCAPE); kbReleased = g_KBMInput.IsKeyReleased(VK_ESCAPE); break; - case ACTION_MENU_PAUSEMENU: kbDown = g_KBMInput.IsKeyDown(VK_ESCAPE); kbPressed = g_KBMInput.IsKeyPressed(VK_ESCAPE); kbReleased = g_KBMInput.IsKeyReleased(VK_ESCAPE); break; + case ACTION_MENU_OK: case ACTION_MENU_A: vk = VK_RETURN; break; + case ACTION_MENU_CANCEL: case ACTION_MENU_B: vk = VK_ESCAPE; break; + case ACTION_MENU_UP: vk = VK_UP; break; + case ACTION_MENU_DOWN: vk = VK_DOWN; break; + case ACTION_MENU_LEFT: vk = VK_LEFT; break; + case ACTION_MENU_RIGHT: vk = VK_RIGHT; break; + case ACTION_MENU_X: vk = 'R'; break; + case ACTION_MENU_Y: vk = VK_TAB; break; + case ACTION_MENU_LEFT_SCROLL: vk = 'Q'; break; + case ACTION_MENU_RIGHT_SCROLL: vk = 'E'; break; + case ACTION_MENU_PAGEUP: vk = VK_PRIOR; break; + case ACTION_MENU_PAGEDOWN: vk = VK_NEXT; break; + } + if (vk != 0) + { + if (g_KBMInput.IsKeyPressed(vk)) { pressed = true; down = true; } + if (g_KBMInput.IsKeyReleased(vk)) { released = true; down = false; } + if (!pressed && !released && g_KBMInput.IsKeyDown(vk)) { down = true; } + } + + if ((key == ACTION_MENU_OK || key == ACTION_MENU_A) && !g_KBMInput.IsMouseGrabbed()) + { + if (m_mouseDraggingSliderId < 0 && !m_mouseClickConsumedByScene) + { + if (g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_LEFT)) { pressed = true; down = true; } + if (g_KBMInput.IsMouseButtonReleased(KeyboardMouseInput::MOUSE_LEFT)) { released = true; down = false; } + if (!pressed && !released && g_KBMInput.IsMouseButtonDown(KeyboardMouseInput::MOUSE_LEFT)) { down = true; } + } + } + + // Right click → ACTION_MENU_X (pick up half stack in inventory) + if (key == ACTION_MENU_X && !g_KBMInput.IsMouseGrabbed()) + { + if (g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_RIGHT)) { pressed = true; down = true; } + if (g_KBMInput.IsMouseButtonReleased(KeyboardMouseInput::MOUSE_RIGHT)) { released = true; down = false; } + if (!pressed && !released && g_KBMInput.IsMouseButtonDown(KeyboardMouseInput::MOUSE_RIGHT)) { down = true; } + } + + // Scroll wheel for list scrolling — only consume the wheel value when the + // action key actually matches, so the other direction isn't lost. + if (!g_KBMInput.IsMouseGrabbed() && (key == ACTION_MENU_OTHER_STICK_UP || key == ACTION_MENU_OTHER_STICK_DOWN)) + { + int wheel = g_KBMInput.PeekMouseWheel(); + if (key == ACTION_MENU_OTHER_STICK_UP && wheel > 0) + { + g_KBMInput.ConsumeMouseWheel(); + pressed = true; + down = true; + } + else if (key == ACTION_MENU_OTHER_STICK_DOWN && wheel < 0) + { + g_KBMInput.ConsumeMouseWheel(); + pressed = true; + down = true; + } + + // Remap scroll wheel to navigation actions. Use LEFT/RIGHT when + // hovering a horizontal list (e.g. TexturePackList), UP/DOWN otherwise. + if (pressed && g_KBMInput.IsKBMActive()) + { + UIScene* pTopScene = GetTopScene(0); // using 0 as default pad for KBM + bool isJoinMenu = pTopScene && pTopScene->getSceneType() == eUIScene_JoinMenu; + + if (!isJoinMenu) + { + if (m_bMouseHoverHorizontalList) + key = (key == ACTION_MENU_OTHER_STICK_UP) ? ACTION_MENU_LEFT : ACTION_MENU_RIGHT; + else + key = (key == ACTION_MENU_OTHER_STICK_UP) ? ACTION_MENU_UP : ACTION_MENU_DOWN; + } + } } - pressed = pressed || kbPressed; - released = released || kbReleased; - down = down || kbDown; } #endif