Scaling mouse coordinate to match Retina scaling
authormrhelmut <mister.helmut@gmail.com>
Tue, 9 Feb 2016 12:52:37 +0000 (13:52 +0100)
committerThomas Altenburger <mister.helmut@gmail.com>
Mon, 29 Feb 2016 16:22:31 +0000 (17:22 +0100)
Source/OpenTK/Platform/SDL2/Sdl2Mouse.cs
Source/OpenTK/Platform/SDL2/Sdl2NativeWindow.cs

index cbccd7e..ebca5fb 100644 (file)
@@ -83,6 +83,8 @@ namespace OpenTK.Platform.SDL2
             }
         }
 
+        internal static float Scale = 1.0f;
+
         #endregion
 
         #region Public Members
@@ -110,13 +112,19 @@ namespace OpenTK.Platform.SDL2
 
         public MouseState GetState()
         {
-            return state;
+            MouseState scaledState = state;
+            if (Configuration.RunningOnMacOS)
+            {
+                scaledState.X = (int)Math.Round(scaledState.X * Scale);
+                scaledState.Y = (int)Math.Round(scaledState.Y * Scale);
+            }
+            return scaledState;
         }
 
         public MouseState GetState(int index)
         {
             if (index == 0)
-                return state;
+                return GetState();
             else
                 return new MouseState();
         }
@@ -126,6 +134,12 @@ namespace OpenTK.Platform.SDL2
             int x, y;
             var buttons = SDL.GetMouseState(out x, out y);
 
+            if (Configuration.RunningOnMacOS)
+            {
+                x = (int)Math.Round(x * Scale);
+                y = (int)Math.Round(y * Scale);
+            }
+
             var c = new MouseState();
             c.SetIsConnected(true);
             c.X = x;
@@ -137,7 +151,7 @@ namespace OpenTK.Platform.SDL2
             c[MouseButton.Button1] = (buttons & ButtonFlags.X1) != 0;
             c[MouseButton.Button2] = (buttons & ButtonFlags.X2) != 0;
 
-            return state;
+            return c;
         }
 
         public void SetPosition(double x, double y)
index 653a983..f438283 100644 (file)
@@ -285,6 +285,7 @@ namespace OpenTK.Platform.SDL2
             window.OnMouseMove(
                 (int)Math.Round(ev.X * scale),
                 (int)Math.Round(ev.Y * scale));
+            Sdl2Mouse.Scale = scale;
         }
 
         static void ProcessMouseWheelEvent(Sdl2NativeWindow window, MouseWheelEvent ev)