2021-01-22 08:20:07 +00:00
|
|
|
|
using SDL2;
|
|
|
|
|
|
|
|
|
|
namespace MoonWorks.Input
|
|
|
|
|
{
|
|
|
|
|
public class Mouse
|
|
|
|
|
{
|
|
|
|
|
public ButtonState LeftButton { get; private set; }
|
|
|
|
|
public ButtonState MiddleButton { get; private set; }
|
|
|
|
|
public ButtonState RightButton { get; private set; }
|
|
|
|
|
|
|
|
|
|
public int X { get; private set; }
|
|
|
|
|
public int Y { get; private set; }
|
|
|
|
|
public int DeltaX { get; private set; }
|
|
|
|
|
public int DeltaY { get; private set; }
|
|
|
|
|
|
|
|
|
|
private bool relativeMode;
|
|
|
|
|
public bool RelativeMode
|
|
|
|
|
{
|
|
|
|
|
get => relativeMode;
|
|
|
|
|
set
|
|
|
|
|
{
|
|
|
|
|
relativeMode = value;
|
|
|
|
|
SDL.SDL_SetRelativeMouseMode(
|
|
|
|
|
relativeMode ?
|
|
|
|
|
SDL.SDL_bool.SDL_TRUE :
|
|
|
|
|
SDL.SDL_bool.SDL_FALSE
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal void Update()
|
|
|
|
|
{
|
|
|
|
|
var buttons = SDL.SDL_GetMouseState(out var x, out var y);
|
|
|
|
|
var _ = SDL.SDL_GetRelativeMouseState(out var deltaX, out var deltaY);
|
|
|
|
|
|
|
|
|
|
X = x;
|
|
|
|
|
Y = y;
|
|
|
|
|
DeltaX = deltaX;
|
|
|
|
|
DeltaY = deltaY;
|
|
|
|
|
|
2021-01-22 20:48:56 +00:00
|
|
|
|
LeftButton = UpdateState(LeftButton, buttons, SDL.SDL_BUTTON_LMASK);
|
|
|
|
|
MiddleButton = UpdateState(MiddleButton, buttons, SDL.SDL_BUTTON_MMASK);
|
|
|
|
|
RightButton = UpdateState(RightButton, buttons, SDL.SDL_BUTTON_RMASK);
|
2021-01-22 08:20:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private ButtonState UpdateState(ButtonState state, uint buttonMask, uint buttonFlag)
|
|
|
|
|
{
|
|
|
|
|
var isPressed = buttonMask & buttonFlag;
|
|
|
|
|
|
|
|
|
|
if (isPressed != 0)
|
|
|
|
|
{
|
|
|
|
|
if (state == ButtonState.Pressed)
|
|
|
|
|
{
|
|
|
|
|
return ButtonState.Held;
|
|
|
|
|
}
|
|
|
|
|
else if (state == ButtonState.Released)
|
|
|
|
|
{
|
|
|
|
|
return ButtonState.Pressed;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ButtonState.Released;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|