#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; #endregion namespace Microsoft.Xna.Framework.Input { /// /// Allows reading position and button click information from mouse. /// public static class Mouse { #region Public Properties public static IntPtr WindowHandle { get; set; } #endregion #region Internal Variables internal static int INTERNAL_WindowWidth = GraphicsDeviceManager.DefaultBackBufferWidth; internal static int INTERNAL_WindowHeight = GraphicsDeviceManager.DefaultBackBufferHeight; internal static int INTERNAL_BackBufferWidth = GraphicsDeviceManager.DefaultBackBufferWidth; internal static int INTERNAL_BackBufferHeight = GraphicsDeviceManager.DefaultBackBufferHeight; internal static int INTERNAL_MouseWheel = 0; // FIXME: Remove when global mouse state is accessible! -flibit internal static bool INTERNAL_IsWarped = false; internal static int INTERNAL_warpX = 0; internal static int INTERNAL_warpY = 0; #endregion #region Public Interface /// /// Gets mouse state information that includes position and button /// presses for the provided window /// /// Current state of the mouse. public static MouseState GetState() { int x, y; ButtonState left, middle, right, x1, x2; FNAPlatform.GetMouseState( out x, out y, out left, out middle, out right, out x1, out x2 ); // If we warped the mouse, we've already done this in SetPosition. if (INTERNAL_IsWarped) { x = INTERNAL_warpX; y = INTERNAL_warpY; } else { // Scale the mouse coordinates for the faux-backbuffer x = (int) ((double) x * INTERNAL_BackBufferWidth / INTERNAL_WindowWidth); y = (int) ((double) y * INTERNAL_BackBufferHeight / INTERNAL_WindowHeight); } return new MouseState( x, y, INTERNAL_MouseWheel, left, middle, right, x1, x2 ); } /// /// Sets mouse cursor's relative position to game-window. /// /// Relative horizontal position of the cursor. /// Relative vertical position of the cursor. public static void SetPosition(int x, int y) { // The state should appear to be what they _think_ they're setting first. INTERNAL_warpX = x; INTERNAL_warpY = y; // Scale the mouse coordinates for the faux-backbuffer x = (int) ((double) x * INTERNAL_WindowWidth / INTERNAL_BackBufferWidth); y = (int) ((double) y * INTERNAL_WindowHeight / INTERNAL_BackBufferHeight); FNAPlatform.SetMousePosition(WindowHandle, x, y); INTERNAL_IsWarped = true; } #endregion } }