aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Windows64/Windows64_Minecraft.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-04 21:19:40 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-05 01:12:48 +0800
commit1dc8a005ed111463c22c17b487e5ec8a3e2d30f3 (patch)
tree8f1825364bf14178f720ee124b01de78afa16d40 /Minecraft.Client/Windows64/Windows64_Minecraft.cpp
parentac03b88a907bb49f5159f08de07398f3fce32991 (diff)
refactor: refactor KBM input code
Diffstat (limited to 'Minecraft.Client/Windows64/Windows64_Minecraft.cpp')
-rw-r--r--Minecraft.Client/Windows64/Windows64_Minecraft.cpp184
1 files changed, 112 insertions, 72 deletions
diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp
index ec89feb1..0f83fae5 100644
--- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp
+++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp
@@ -501,82 +501,90 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
PostQuitMessage(0);
break;
- // Keyboard/Mouse input handling
- case WM_KEYDOWN:
- if (!(lParam & 0x40000000)) // ignore auto-repeat
- KMInput.OnKeyDown(wParam);
+ case WM_KILLFOCUS:
+ g_KBMInput.ClearAllState();
+ g_KBMInput.SetWindowFocused(false);
+ if (g_KBMInput.IsMouseGrabbed())
+ g_KBMInput.SetMouseGrabbed(false);
break;
- case WM_KEYUP:
- KMInput.OnKeyUp(wParam);
+
+ case WM_SETFOCUS:
+ g_KBMInput.SetWindowFocused(true);
break;
+
+ case WM_KEYDOWN:
case WM_SYSKEYDOWN:
- if (wParam == VK_MENU) // Alt key
- {
- if (!(lParam & 0x40000000))
- KMInput.OnKeyDown(wParam);
- return 0; // prevent default Alt behavior
- }
- return DefWindowProc(hWnd, message, wParam, lParam);
+ {
+ int vk = (int)wParam;
+ if (lParam & 0x40000000) break; // ignore auto-repeat
+ if (vk == VK_SHIFT)
+ vk = (MapVirtualKey((lParam >> 16) & 0xFF, MAPVK_VSC_TO_VK_EX) == VK_RSHIFT) ? VK_RSHIFT : VK_LSHIFT;
+ else if (vk == VK_CONTROL)
+ vk = (lParam & (1 << 24)) ? VK_RCONTROL : VK_LCONTROL;
+ else if (vk == VK_MENU)
+ vk = (lParam & (1 << 24)) ? VK_RMENU : VK_LMENU;
+ g_KBMInput.OnKeyDown(vk);
+ break;
+ }
+ case WM_KEYUP:
case WM_SYSKEYUP:
- if (wParam == VK_MENU)
- {
- KMInput.OnKeyUp(wParam);
- return 0;
- }
- return DefWindowProc(hWnd, message, wParam, lParam);
- case WM_INPUT:
- KMInput.OnRawMouseInput(lParam);
+ {
+ int vk = (int)wParam;
+ if (vk == VK_SHIFT)
+ vk = (MapVirtualKey((lParam >> 16) & 0xFF, MAPVK_VSC_TO_VK_EX) == VK_RSHIFT) ? VK_RSHIFT : VK_LSHIFT;
+ else if (vk == VK_CONTROL)
+ vk = (lParam & (1 << 24)) ? VK_RCONTROL : VK_LCONTROL;
+ else if (vk == VK_MENU)
+ vk = (lParam & (1 << 24)) ? VK_RMENU : VK_LMENU;
+ g_KBMInput.OnKeyUp(vk);
break;
+ }
+
case WM_LBUTTONDOWN:
- KMInput.OnMouseButton(0, true);
+ g_KBMInput.OnMouseButtonDown(KeyboardMouseInput::MOUSE_LEFT);
break;
case WM_LBUTTONUP:
- KMInput.OnMouseButton(0, false);
+ g_KBMInput.OnMouseButtonUp(KeyboardMouseInput::MOUSE_LEFT);
break;
case WM_RBUTTONDOWN:
- KMInput.OnMouseButton(1, true);
+ g_KBMInput.OnMouseButtonDown(KeyboardMouseInput::MOUSE_RIGHT);
break;
case WM_RBUTTONUP:
- KMInput.OnMouseButton(1, false);
+ g_KBMInput.OnMouseButtonUp(KeyboardMouseInput::MOUSE_RIGHT);
break;
case WM_MBUTTONDOWN:
- KMInput.OnMouseButton(2, true);
+ g_KBMInput.OnMouseButtonDown(KeyboardMouseInput::MOUSE_MIDDLE);
break;
case WM_MBUTTONUP:
- KMInput.OnMouseButton(2, false);
- break;
- case WM_MOUSEWHEEL:
- KMInput.OnMouseWheel(GET_WHEEL_DELTA_WPARAM(wParam));
+ g_KBMInput.OnMouseButtonUp(KeyboardMouseInput::MOUSE_MIDDLE);
break;
+
case WM_MOUSEMOVE:
- KMInput.OnMouseMove(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
- break;
- case WM_ACTIVATE:
- if (LOWORD(wParam) == WA_INACTIVE)
- KMInput.SetCapture(false);
- break;
- case WM_SETFOCUS:
- {
- // Re-capture when window receives focus (e.g., after clicking on it)
- Minecraft *pMinecraft = Minecraft::GetInstance();
- bool shouldCapture = pMinecraft && app.GetGameStarted() && !ui.GetMenuDisplayed(0) && pMinecraft->screen == NULL;
- if (shouldCapture)
- KMInput.SetCapture(true);
- }
+ g_KBMInput.OnMouseMove(LOWORD(lParam), HIWORD(lParam));
break;
- case WM_KILLFOCUS:
- KMInput.SetCapture(false);
- KMInput.ClearAllState();
+
+ case WM_MOUSEWHEEL:
+ g_KBMInput.OnMouseWheel(GET_WHEEL_DELTA_WPARAM(wParam));
break;
- case WM_SETCURSOR:
- // Hide the OS cursor when an Iggy/Flash menu is displayed (it has its own Flash cursor)
- if (LOWORD(lParam) == HTCLIENT && !KMInput.IsCaptured() && ui.GetMenuDisplayed(0))
+ case WM_INPUT:
{
- SetCursor(NULL);
- return TRUE;
+ UINT dwSize = 0;
+ GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
+ if (dwSize > 0 && dwSize <= 256)
+ {
+ BYTE rawBuffer[256];
+ if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, rawBuffer, &dwSize, sizeof(RAWINPUTHEADER)) == dwSize)
+ {
+ RAWINPUT* raw = (RAWINPUT*)rawBuffer;
+ if (raw->header.dwType == RIM_TYPEMOUSE)
+ {
+ g_KBMInput.OnRawMouseDelta(raw->data.mouse.lLastX, raw->data.mouse.lLastY);
+ }
+ }
+ }
}
- return DefWindowProc(hWnd, message, wParam, lParam);
+ break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
@@ -852,6 +860,9 @@ void ToggleFullscreen()
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
}
g_isFullscreen = !g_isFullscreen;
+
+ if (g_KBMInput.IsWindowFocused())
+ g_KBMInput.SetWindowFocused(true);
}
//--------------------------------------------------------------------------------------
@@ -877,7 +888,7 @@ static Minecraft* InitialiseMinecraftRuntime()
ui.init(g_pd3dDevice, g_pImmediateContext, g_pRenderTargetView, g_pDepthStencilView, g_iScreenWidth, g_iScreenHeight);
InputManager.Initialise(1, 3, MINECRAFT_ACTION_MAX, ACTION_MAX_MENU);
- KMInput.Init(g_hWnd);
+ g_KBMInput.Init();
DefineActions();
InputManager.SetJoypadMapVal(0, 0);
InputManager.SetKeyRepeatRate(0.3f, 0.2f);
@@ -1263,12 +1274,16 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
MSG msg = {0};
while( WM_QUIT != msg.message && !app.m_bShutdown)
{
- if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
+ g_KBMInput.Tick();
+
+ while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
- continue;
+ if (msg.message == WM_QUIT) break;
}
+ if (msg.message == WM_QUIT) break;
+
RenderManager.StartFrame();
#if 0
if(pMinecraft->soundEngine->isStreamingWavebankReady() &&
@@ -1290,7 +1305,34 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
app.UpdateTime();
PIXBeginNamedEvent(0,"Input manager tick");
InputManager.Tick();
- KMInput.Tick();
+
+ // Detect KBM vs controller input mode
+ if (InputManager.IsPadConnected(0))
+ {
+ bool controllerUsed = InputManager.ButtonPressed(0) ||
+ InputManager.GetJoypadStick_LX(0, false) != 0.0f ||
+ InputManager.GetJoypadStick_LY(0, false) != 0.0f ||
+ InputManager.GetJoypadStick_RX(0, false) != 0.0f ||
+ InputManager.GetJoypadStick_RY(0, false) != 0.0f;
+
+ if (controllerUsed)
+ g_KBMInput.SetKBMActive(false);
+ else if (g_KBMInput.HasAnyInput())
+ g_KBMInput.SetKBMActive(true);
+ }
+ else
+ {
+ g_KBMInput.SetKBMActive(true);
+ }
+
+ if (!g_KBMInput.IsMouseGrabbed())
+ {
+ if (!g_KBMInput.IsKBMActive())
+ g_KBMInput.SetCursorHiddenForUI(true);
+ else if (!g_KBMInput.IsScreenCursorHidden())
+ g_KBMInput.SetCursorHiddenForUI(false);
+ }
+
PIXEndNamedEvent();
PIXBeginNamedEvent(0,"Profile manager tick");
// ProfileManager.Tick();
@@ -1420,29 +1462,29 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
ui.CheckMenuDisplayed();
- // Update mouse capture: capture when in-game and no menu is open
+ // Update mouse grab: grab when in-game and no menu is open
{
static bool altToggleSuppressCapture = false;
bool shouldCapture = app.GetGameStarted() && !ui.GetMenuDisplayed(0) && pMinecraft->screen == NULL;
// Left Alt key toggles capture on/off for debugging
- if (KMInput.IsKeyPressed(VK_MENU))
+ if (g_KBMInput.IsKeyPressed(VK_LMENU) || g_KBMInput.IsKeyPressed(VK_RMENU))
{
- if (KMInput.IsCaptured()) { KMInput.SetCapture(false); altToggleSuppressCapture = true; }
- else if (shouldCapture) { KMInput.SetCapture(true); altToggleSuppressCapture = false; }
+ if (g_KBMInput.IsMouseGrabbed()) { g_KBMInput.SetMouseGrabbed(false); altToggleSuppressCapture = true; }
+ else if (shouldCapture) { g_KBMInput.SetMouseGrabbed(true); altToggleSuppressCapture = false; }
}
else if (!shouldCapture)
{
- if (KMInput.IsCaptured()) KMInput.SetCapture(false);
+ if (g_KBMInput.IsMouseGrabbed()) g_KBMInput.SetMouseGrabbed(false);
altToggleSuppressCapture = false;
}
- else if (shouldCapture && !KMInput.IsCaptured() && GetFocus() == g_hWnd && !altToggleSuppressCapture)
+ else if (shouldCapture && !g_KBMInput.IsMouseGrabbed() && GetFocus() == g_hWnd && !altToggleSuppressCapture)
{
- KMInput.SetCapture(true);
+ g_KBMInput.SetMouseGrabbed(true);
}
}
// F1 toggles the HUD
- if (KMInput.IsKeyPressed(VK_F1))
+ if (g_KBMInput.IsKeyPressed(VK_F1))
{
int primaryPad = ProfileManager.GetPrimaryPad();
unsigned char displayHud = app.GetGameSettings(primaryPad, eGameSetting_DisplayHUD);
@@ -1451,7 +1493,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
}
// F3 toggles onscreen debug info
- if (KMInput.IsKeyPressed(VK_F3))
+ if (g_KBMInput.IsKeyPressed(VK_F3))
{
if (Minecraft* pMinecraft = Minecraft::GetInstance())
{
@@ -1464,7 +1506,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
#ifdef _DEBUG_MENUS_ENABLED
// F4 Open debug overlay
- if (KMInput.IsKeyPressed(VK_F4))
+ if (g_KBMInput.IsKeyPressed(VK_F4))
{
if (Minecraft *pMinecraft = Minecraft::GetInstance())
{
@@ -1477,7 +1519,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
}
// F6 Open debug console
- if (KMInput.IsKeyPressed(VK_F6))
+ if (g_KBMInput.IsKeyPressed(VK_F6))
{
static bool s_debugConsole = false;
s_debugConsole = !s_debugConsole;
@@ -1486,13 +1528,13 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
#endif
// F11 Toggle fullscreen
- if (KMInput.IsKeyPressed(VK_F11))
+ if (g_KBMInput.IsKeyPressed(VK_F11))
{
ToggleFullscreen();
}
// TAB opens game info menu. - Vvis :3 - Updated by detectiveren
- if (KMInput.IsKeyPressed(VK_TAB) && !ui.GetMenuDisplayed(0))
+ if (g_KBMInput.IsKeyPressed(VK_TAB) && !ui.GetMenuDisplayed(0))
{
if (Minecraft* pMinecraft = Minecraft::GetInstance())
{
@@ -1593,8 +1635,6 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
// Fix for #7318 - Title crashes after short soak in the leaderboards menu
// A memory leak was caused because the icon renderer kept creating new Vec3's because the pool wasn't reset
Vec3::resetPool();
-
- KMInput.EndFrame();
}
// Free resources, unregister custom classes, and exit.