#region License␊ |
/* FNA - XNA4 Reimplementation for Desktop Platforms␊ |
* Copyright 2009-2016 Ethan Lee and the MonoGame Team␊ |
*␊ |
* Released under the Microsoft Public License.␊ |
* See LICENSE for details.␊ |
*/␊ |
#endregion␊ |
␊ |
#region Using Statements␊ |
using System;␊ |
␊ |
using SDL2;␊ |
#endregion␊ |
␊ |
namespace Microsoft.Xna.Framework.Input␊ |
{␊ |
␉/// <summary>␊ |
␉/// Allows reading position and button click information from mouse.␊ |
␉/// </summary>␊ |
␉public static class Mouse␊ |
␉{␊ |
␉␉#region Public Properties␊ |
␊ |
␉␉public static IntPtr WindowHandle␊ |
␉␉{␊ |
␉␉␉get;␊ |
␉␉␉set;␊ |
␉␉}␊ |
␊ |
␉␉#endregion␊ |
␊ |
␉␉#region Internal Variables␊ |
␊ |
␉␉internal static int INTERNAL_WindowWidth = 800;␊ |
␉␉internal static int INTERNAL_WindowHeight = 600;␊ |
␊ |
␉␉internal static int INTERNAL_MouseWheel = 0;␊ |
␊ |
␉␉internal static bool INTERNAL_IsWarped = false;␊ |
␊ |
␉␉#endregion␊ |
␊ |
␉␉#region Private Variables␊ |
␊ |
␉␉private static MouseState state;␊ |
␊ |
␉␉#endregion␊ |
␊ |
␉␉#region Public Interface␊ |
␊ |
␉␉/// <summary>␊ |
␉␉/// Gets mouse state information that includes position and button␊ |
␉␉/// presses for the provided window␊ |
␉␉/// </summary>␊ |
␉␉/// <returns>Current state of the mouse.</returns>␊ |
␉␉public static MouseState GetState()␊ |
␉␉{␊ |
␉␉␉int x, y;␊ |
␉␉␉uint flags = SDL.SDL_GetMouseState(out x, out y);␊ |
␊ |
␉␉␉// If we warped the mouse, we've already done this in SetPosition.␊ |
␉␉␉if (!INTERNAL_IsWarped)␊ |
␉␉␉{␊ |
␉␉␉␉// Scale the mouse coordinates for the faux-backbuffer␊ |
␉␉␉␉state.X = (int) ((double) x * Game.Instance.GraphicsDevice.GLDevice.Backbuffer.Width / INTERNAL_WindowWidth);␊ |
␉␉␉␉state.Y = (int) ((double) y * Game.Instance.GraphicsDevice.GLDevice.Backbuffer.Height / INTERNAL_WindowHeight);␊ |
␉␉␉}␊ |
␊ |
␉␉␉state.LeftButton =␉(ButtonState) (flags & SDL.SDL_BUTTON_LMASK);␊ |
␉␉␉state.MiddleButton =␉(ButtonState) ((flags & SDL.SDL_BUTTON_MMASK) >> 1);␊ |
␉␉␉state.RightButton =␉(ButtonState) ((flags & SDL.SDL_BUTTON_RMASK) >> 2);␊ |
␉␉␉state.XButton1 =␉(ButtonState) ((flags & SDL.SDL_BUTTON_X1MASK) >> 3);␊ |
␉␉␉state.XButton2 =␉(ButtonState) ((flags & SDL.SDL_BUTTON_X2MASK) >> 4);␊ |
␊ |
␉␉␉state.ScrollWheelValue = INTERNAL_MouseWheel;␊ |
␊ |
␉␉␉return state;␊ |
␉␉}␊ |
␊ |
␉␉/// <summary>␊ |
␉␉/// Sets mouse cursor's relative position to game-window.␊ |
␉␉/// </summary>␊ |
␉␉/// <param name="x">Relative horizontal position of the cursor.</param>␊ |
␉␉/// <param name="y">Relative vertical position of the cursor.</param>␊ |
␉␉public static void SetPosition(int x, int y)␊ |
␉␉{␊ |
␉␉␉// The state should appear to be what they _think_ they're setting first.␊ |
␉␉␉state.X = x;␊ |
␉␉␉state.Y = y;␊ |
␊ |
␉␉␉// Scale the mouse coordinates for the faux-backbuffer␊ |
␉␉␉x = (int) ((double) x * INTERNAL_WindowWidth / Game.Instance.GraphicsDevice.GLDevice.Backbuffer.Width);␊ |
␉␉␉y = (int) ((double) y * INTERNAL_WindowHeight / Game.Instance.GraphicsDevice.GLDevice.Backbuffer.Height);␊ |
␊ |
␉␉␉SDL.SDL_WarpMouseInWindow(WindowHandle, x, y);␊ |
␉␉␉INTERNAL_IsWarped = true;␊ |
␉␉}␊ |
␊ |
␉␉#endregion␊ |
␉}␊ |
}␊ |