Fixing mouse buttons getting stuck and aligning mouse speed minmaxes to what dosbox expects

This commit is contained in:
Sergio Martin 2025-03-29 20:32:55 +01:00
parent 88d2a58e44
commit c7b5459fa1
2 changed files with 15 additions and 11 deletions

View File

@ -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

View File

@ -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;