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; LeftButton = UpdateState(LeftButton, buttons, SDL.SDL_BUTTON_LMASK); MiddleButton = UpdateState(MiddleButton, buttons, SDL.SDL_BUTTON_MMASK); RightButton = UpdateState(RightButton, buttons, SDL.SDL_BUTTON_RMASK); } 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; } } }