diff --git a/src/OpenTK/OpenTK.csproj b/src/OpenTK/OpenTK.csproj index 63c4345a..b506a6db 100644 --- a/src/OpenTK/OpenTK.csproj +++ b/src/OpenTK/OpenTK.csproj @@ -750,9 +750,6 @@ Code - - Code - Code diff --git a/src/OpenTK/Platform/MacOS/Carbon/CarbonAPI.cs b/src/OpenTK/Platform/MacOS/Carbon/CarbonAPI.cs deleted file mode 100644 index 914b8c3e..00000000 --- a/src/OpenTK/Platform/MacOS/Carbon/CarbonAPI.cs +++ /dev/null @@ -1,78 +0,0 @@ -#region License -// -// The Open Toolkit Library License -// -// Copyright (c) 2006 - 2010 the Open Toolkit library. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights to -// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -// the Software, and to permit persons to whom the Software is furnished to do -// so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -// OTHER DEALINGS IN THE SOFTWARE. -// -#endregion - -// Created by Erik Ylvisaker on 3/17/08. - - -using System; -using System.Runtime.InteropServices; - -namespace OpenTK.Platform.MacOS.Carbon -{ - #region --- Types defined in HIGeometry.h --- - - [StructLayout(LayoutKind.Sequential)] - internal struct HIPoint - { - public float X; - public float Y; - - public HIPoint(float x, float y) - { - X = x; - Y = y; - } - - public HIPoint(double x, double y) - : this((float)x, (float)y) - { } - } - - [StructLayout(LayoutKind.Sequential)] - internal struct HISize - { - public float Width; - public float Height; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct HIRect - { - public HIPoint Origin; - public HISize Size; - - public override string ToString() - { - return string.Format( - "Rect: [{0}, {1}, {2}, {3}]", Origin.X, Origin.Y, Size.Width, Size.Height); - } - } - - #endregion -} - - diff --git a/src/OpenTK/Platform/MacOS/Cocoa/Cocoa.cs b/src/OpenTK/Platform/MacOS/Cocoa/Cocoa.cs index b2b9d285..ac6ae977 100644 --- a/src/OpenTK/Platform/MacOS/Cocoa/Cocoa.cs +++ b/src/OpenTK/Platform/MacOS/Cocoa/Cocoa.cs @@ -160,7 +160,32 @@ namespace OpenTK.Platform.MacOS // Not the _stret version, perhaps because a NSPoint fits in one register? // thefiddler: gcc is indeed using objc_msgSend for NSPoint on i386 [DllImport (LibObjC, EntryPoint="objc_msgSend")] - public extern static NSPoint SendPoint(IntPtr receiver, IntPtr selector); + public extern static NSPointF SendPointF(IntPtr receiver, IntPtr selector); + [DllImport (LibObjC, EntryPoint="objc_msgSend")] + public extern static NSPointD SendPointD(IntPtr receiver, IntPtr selector); + + public static NSPoint SendPoint(IntPtr receiver, IntPtr selector) + { + NSPoint r = new NSPoint(); + + unsafe + { + if (IntPtr.Size == 4) + { + NSPointF pf = SendPointF(receiver, selector); + r.X.Value = *(IntPtr *)&pf.X; + r.Y.Value = *(IntPtr *)&pf.Y; + } + else + { + NSPointD pd = SendPointD(receiver, selector); + r.X.Value = *(IntPtr *)&pd.X; + r.Y.Value = *(IntPtr *)&pd.Y; + } + } + + return r; + } [DllImport (LibObjC, EntryPoint="objc_msgSend_stret")] extern static void SendRect(out NSRect retval, IntPtr receiver, IntPtr selector); diff --git a/src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs b/src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs index 09c7fa39..b6f90f70 100644 --- a/src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs +++ b/src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs @@ -45,6 +45,18 @@ namespace OpenTK.Platform.MacOS { IntPtr value; + public IntPtr Value + { + get + { + return value; + } + set + { + this.value = value; + } + } + public static implicit operator NSFloat(float v) { NSFloat f; @@ -106,7 +118,7 @@ namespace OpenTK.Platform.MacOS } else { - return *(float*)&f.value; + return *(double*)&f.value; } } } @@ -179,5 +191,21 @@ namespace OpenTK.Platform.MacOS return new RectangleF(s.Location, s.Size); } } -} + // Using IntPtr in NSFloat cause that if imported function + // return struct that consist of them you will get wrong data + // This types are used for such function. + [StructLayout(LayoutKind.Sequential)] + struct NSPointF + { + public float X; + public float Y; + } + + [StructLayout(LayoutKind.Sequential)] + struct NSPointD + { + public double X; + public double Y; + } +} diff --git a/src/OpenTK/Platform/MacOS/HIDInput.cs b/src/OpenTK/Platform/MacOS/HIDInput.cs index ca6eecdc..87d06aef 100644 --- a/src/OpenTK/Platform/MacOS/HIDInput.cs +++ b/src/OpenTK/Platform/MacOS/HIDInput.cs @@ -273,7 +273,7 @@ namespace OpenTK.Platform.MacOS case CGEventType.RightMouseDragged: case CGEventType.OtherMouseDragged: { - Carbon.HIPoint p = CG.EventGetLocation(@event); + NSPoint p = CG.EventGetLocation(@event); CursorState.X = (int)Math.Round(p.X); CursorState.Y = (int)Math.Round(p.Y); } @@ -1045,7 +1045,15 @@ namespace OpenTK.Platform.MacOS void IMouseDriver2.SetPosition(double x, double y) { CG.SetLocalEventsSuppressionInterval(0.0); - CG.WarpMouseCursorPosition(new Carbon.HIPoint(x, y)); + + NSPoint p = new NSPoint(); + unsafe + { + p.X.Value = *(IntPtr *)&x; + p.Y.Value = *(IntPtr *)&y; + } + + CG.WarpMouseCursorPosition(p); } #endregion diff --git a/src/OpenTK/Platform/MacOS/Quartz/DisplayServices.cs b/src/OpenTK/Platform/MacOS/Quartz/DisplayServices.cs index 9a1b3d10..710f5e7f 100644 --- a/src/OpenTK/Platform/MacOS/Quartz/DisplayServices.cs +++ b/src/OpenTK/Platform/MacOS/Quartz/DisplayServices.cs @@ -60,9 +60,9 @@ namespace OpenTK.Platform.MacOS { const string lib = "/System/Library/Frameworks/ApplicationServices.framework/Versions/Current/ApplicationServices"; - // CGPoint -> HIPoint - // CGSize -> HISize - // CGRect -> HIRect + // CGPoint -> NSPoint + // CGSize -> NSSize + // CGRect -> NSRect [DllImport(lib,EntryPoint="CGGetActiveDisplayList")] internal unsafe static extern CGDisplayErr GetActiveDisplayList(int maxDisplays, IntPtr* activeDspys, out int dspyCnt); @@ -75,15 +75,15 @@ namespace OpenTK.Platform.MacOS // first parameter slot. This is normally handled automatically // by gcc/clang, but here we have to do it ourselves. // See "Listing 4" on https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/LowLevelABI/130-IA-32_Function_Calling_Conventions/IA32.html#//apple_ref/doc/uid/TP40002492-SW3 - internal unsafe static HIRect DisplayBounds(IntPtr display) + internal unsafe static NSRect DisplayBounds(IntPtr display) { - HIRect rect; + NSRect rect; DisplayBounds(out rect, display); return rect; } [DllImport(lib, EntryPoint = "CGDisplayBounds")] - unsafe static extern void DisplayBounds(out HIRect rect, IntPtr display); + unsafe static extern void DisplayBounds(out NSRect rect, IntPtr display); [DllImport(lib,EntryPoint="CGDisplayPixelsWide")] internal static extern int DisplayPixelsWide(IntPtr display); @@ -116,7 +116,7 @@ namespace OpenTK.Platform.MacOS internal static extern IntPtr DisplaySwitchToMode(IntPtr display, IntPtr displayMode); [DllImport(lib, EntryPoint = "CGWarpMouseCursorPosition")] - internal static extern CGError WarpMouseCursorPosition(HIPoint newCursorPosition); + internal static extern CGError WarpMouseCursorPosition(NSPoint newCursorPosition); [DllImport(lib, EntryPoint = "CGCursorIsVisible")] internal static extern bool CursorIsVisible(); diff --git a/src/OpenTK/Platform/MacOS/Quartz/EventServices.cs b/src/OpenTK/Platform/MacOS/Quartz/EventServices.cs index 7e61bdd2..3a806cf7 100644 --- a/src/OpenTK/Platform/MacOS/Quartz/EventServices.cs +++ b/src/OpenTK/Platform/MacOS/Quartz/EventServices.cs @@ -66,7 +66,32 @@ namespace OpenTK.Platform.MacOS CGEventField field); [DllImport(lib, EntryPoint = "CGEventGetLocation")] - internal static extern Carbon.HIPoint EventGetLocation(CGEventRef @event); + internal static extern NSPointF EventGetLocationF(CGEventRef @event); + [DllImport(lib, EntryPoint = "CGEventGetLocation")] + internal static extern NSPointD EventGetLocationD(CGEventRef @event); + + internal static NSPoint EventGetLocation(CGEventRef @event) + { + NSPoint r = new NSPoint(); + + unsafe { + if (IntPtr.Size == 4) + { + NSPointF pf = EventGetLocationF(@event); + r.X.Value = *(IntPtr *)&pf.X; + r.Y.Value = *(IntPtr *)&pf.Y; + } + else + { + NSPointD pd = EventGetLocationD(@event); + r.X.Value = *(IntPtr *)&pd.X; + r.Y.Value = *(IntPtr *)&pd.Y; + } + } + + return r; + } + } enum CGEventTapLocation diff --git a/src/OpenTK/Platform/MacOS/QuartzDisplayDeviceDriver.cs b/src/OpenTK/Platform/MacOS/QuartzDisplayDeviceDriver.cs index 79703cc2..c4d87cb2 100644 --- a/src/OpenTK/Platform/MacOS/QuartzDisplayDeviceDriver.cs +++ b/src/OpenTK/Platform/MacOS/QuartzDisplayDeviceDriver.cs @@ -109,8 +109,8 @@ namespace OpenTK.Platform.MacOS } - HIRect bounds = CG.DisplayBounds(currentDisplay); - Rectangle newRect = new Rectangle((int)bounds.Origin.X, (int)bounds.Origin.Y, (int)bounds.Size.Width, (int)bounds.Size.Height); + NSRect bounds = CG.DisplayBounds(currentDisplay); + Rectangle newRect = new Rectangle((int)bounds.Location.X, (int)bounds.Location.Y, (int)bounds.Size.Width, (int)bounds.Size.Height); Debug.Print("Display {0} bounds: {1}", i, newRect);