From c7b5459fa1a22e769ef30cb33ae999ad1801a818 Mon Sep 17 00:00:00 2001 From: Sergio Martin Date: Sat, 29 Mar 2025 20:32:55 +0100 Subject: [PATCH] Fixing mouse buttons getting stuck and aligning mouse speed minmaxes to what dosbox expects --- .../Computers/DOS/DOSBox.Controllers.cs | 4 ++-- .../Computers/DOS/DOSBox.cs | 22 +++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/BizHawk.Emulation.Cores/Computers/DOS/DOSBox.Controllers.cs b/src/BizHawk.Emulation.Cores/Computers/DOS/DOSBox.Controllers.cs index 76f8f87e0e..714dd0ccf4 100644 --- a/src/BizHawk.Emulation.Cores/Computers/DOS/DOSBox.Controllers.cs +++ b/src/BizHawk.Emulation.Cores/Computers/DOS/DOSBox.Controllers.cs @@ -62,8 +62,8 @@ namespace BizHawk.Emulation.Cores.Computers.DOS controller.BoolButtons.Add(Inputs.Mouse + " " + MouseInputs.RightButton); controller.AddAxis(Inputs.Mouse + " " + MouseInputs.PosX, (0).RangeTo(LibDOSBox.SVGA_MAX_WIDTH), LibDOSBox.SVGA_MAX_WIDTH / 2); controller.AddAxis(Inputs.Mouse + " " + MouseInputs.PosY, (0).RangeTo(LibDOSBox.SVGA_MAX_HEIGHT), LibDOSBox.SVGA_MAX_HEIGHT / 2); - controller.AddAxis(Inputs.Mouse + " " + MouseInputs.SpeedX, (-LibDOSBox.SVGA_MAX_WIDTH / 2).RangeTo(LibDOSBox.SVGA_MAX_WIDTH / 2), 0); - controller.AddAxis(Inputs.Mouse + " " + MouseInputs.SpeedY, (-LibDOSBox.SVGA_MAX_HEIGHT / 2).RangeTo(LibDOSBox.SVGA_MAX_HEIGHT / 2), 0); + controller.AddAxis(Inputs.Mouse + " " + MouseInputs.SpeedX, (-32769).RangeTo(32768), 0); // This is + controller.AddAxis(Inputs.Mouse + " " + MouseInputs.SpeedY, (-32769).RangeTo(32768), 0); } // Adding drive management buttons diff --git a/src/BizHawk.Emulation.Cores/Computers/DOS/DOSBox.cs b/src/BizHawk.Emulation.Cores/Computers/DOS/DOSBox.cs index 3f1a0c3e77..d10de2035f 100644 --- a/src/BizHawk.Emulation.Cores/Computers/DOS/DOSBox.cs +++ b/src/BizHawk.Emulation.Cores/Computers/DOS/DOSBox.cs @@ -375,25 +375,29 @@ namespace BizHawk.Emulation.Cores.Computers.DOS fi.mouse.dY = deltaY != 0 ? deltaY : fi.mouse.posY - _mouseState.posY; // Button pressed criteria: + bool isMouseLeftButtonPressed = controller.IsPressed($"{Inputs.Mouse} {MouseInputs.LeftButton}"); + bool isMouseMiddleButtonPressed = controller.IsPressed($"{Inputs.Mouse} {MouseInputs.MiddleButton}"); + bool isMouseRightButtonPressed = controller.IsPressed($"{Inputs.Mouse} {MouseInputs.RightButton}"); + // If the input is made in this frame and the button is not held from before - fi.mouse.leftButtonPressed = controller.IsPressed($"{Inputs.Mouse} {MouseInputs.LeftButton}") && !_mouseState.leftButtonHeld ? 1 : 0; - fi.mouse.middleButtonPressed = controller.IsPressed($"{Inputs.Mouse} {MouseInputs.MiddleButton}") && !_mouseState.middleButtonHeld ? 1 : 0; - fi.mouse.rightButtonPressed = controller.IsPressed($"{Inputs.Mouse} {MouseInputs.RightButton}") && !_mouseState.rightButtonHeld ? 1 : 0; + fi.mouse.leftButtonPressed = isMouseLeftButtonPressed && !_mouseState.leftButtonHeld ? 1 : 0; + fi.mouse.middleButtonPressed = isMouseMiddleButtonPressed && !_mouseState.middleButtonHeld ? 1 : 0; + fi.mouse.rightButtonPressed = isMouseRightButtonPressed && !_mouseState.rightButtonHeld ? 1 : 0; // Button released criteria: // If the input is not pressed in this frame and the button is held from before - fi.mouse.leftButtonReleased = !controller.IsPressed($"{Inputs.Mouse} {MouseInputs.LeftButton}") && _mouseState.leftButtonHeld ? 1 : 0; - fi.mouse.middleButtonReleased = !controller.IsPressed($"{Inputs.Mouse} {MouseInputs.MiddleButton}") && _mouseState.middleButtonHeld ? 1 : 0; - fi.mouse.rightButtonReleased = !controller.IsPressed($"{Inputs.Mouse} {MouseInputs.RightButton}") && _mouseState.rightButtonHeld ? 1 : 0; + fi.mouse.leftButtonReleased = !isMouseLeftButtonPressed && _mouseState.leftButtonHeld ? 1 : 0; + fi.mouse.middleButtonReleased = !isMouseMiddleButtonPressed && _mouseState.middleButtonHeld ? 1 : 0; + fi.mouse.rightButtonReleased = !isMouseRightButtonPressed && _mouseState.rightButtonHeld ? 1 : 0; fi.mouse.sensitivity = _syncSettings.MouseSensitivity; // Getting new mouse state values var nextState = new DOSBox.MouseState(); nextState.posX = fi.mouse.posX; nextState.posY = fi.mouse.posY; - if (fi.mouse.leftButtonPressed > 0) nextState.leftButtonHeld = true; - if (fi.mouse.middleButtonPressed > 0) nextState.middleButtonHeld = true; - if (fi.mouse.rightButtonPressed > 0) nextState.rightButtonHeld = true; + nextState.leftButtonHeld = isMouseLeftButtonPressed; + nextState.middleButtonHeld = isMouseMiddleButtonPressed; + nextState.rightButtonHeld = isMouseRightButtonPressed; // Updating mouse state _mouseState = nextState;