From 85541f644999e35abbee9a746fdb1c502cd6d58d Mon Sep 17 00:00:00 2001 From: Vperus Date: Wed, 7 Jun 2017 00:05:06 +0300 Subject: [PATCH 1/5] Fix macos x64 wrong mouse input --- src/OpenTK/Platform/MacOS/Cocoa/Cocoa.cs | 27 +++++++++++++++++++++- src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs | 26 ++++++++++++++++++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/OpenTK/Platform/MacOS/Cocoa/Cocoa.cs b/src/OpenTK/Platform/MacOS/Cocoa/Cocoa.cs index b2b9d285..03c494d0 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..899ecc32 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; @@ -179,5 +191,17 @@ 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. + public struct NSPointF + { + public float x, y; + } + + public struct NSPointD + { + public double x, y; + } +} From 72320ad181652fe0505869e3c14057a22650d8f4 Mon Sep 17 00:00:00 2001 From: VPeruS Date: Wed, 7 Jun 2017 07:14:54 +0300 Subject: [PATCH 2/5] Fix incorect type cast --- src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs b/src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs index 899ecc32..39b55d36 100644 --- a/src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs +++ b/src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs @@ -118,7 +118,7 @@ namespace OpenTK.Platform.MacOS } else { - return *(float*)&f.value; + return *(double*)&f.value; } } } From d13451d181569b7acbc99a17b971285c4814c876 Mon Sep 17 00:00:00 2001 From: VPeruS Date: Thu, 8 Jun 2017 22:25:59 +0300 Subject: [PATCH 3/5] Change HIPoint to NSPoint, hipoint wasn't arch independent --- src/OpenTK/Platform/MacOS/HIDInput.cs | 12 +++++++-- .../Platform/MacOS/Quartz/DisplayServices.cs | 4 +-- .../Platform/MacOS/Quartz/EventServices.cs | 27 ++++++++++++++++++- 3 files changed, 38 insertions(+), 5 deletions(-) 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..853d32da 100644 --- a/src/OpenTK/Platform/MacOS/Quartz/DisplayServices.cs +++ b/src/OpenTK/Platform/MacOS/Quartz/DisplayServices.cs @@ -60,7 +60,7 @@ namespace OpenTK.Platform.MacOS { const string lib = "/System/Library/Frameworks/ApplicationServices.framework/Versions/Current/ApplicationServices"; - // CGPoint -> HIPoint + // CGPoint -> NSPoint // CGSize -> HISize // CGRect -> HIRect @@ -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..73067be7 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 From a68581118eed98d7617d1422cd33f37cc7807a5b Mon Sep 17 00:00:00 2001 From: VPeruS Date: Thu, 8 Jun 2017 23:30:51 +0300 Subject: [PATCH 4/5] HIRect to NSRect. HISize to NSSize --- src/OpenTK/OpenTK.csproj | 3 - src/OpenTK/Platform/MacOS/Carbon/CarbonAPI.cs | 78 ------------------- .../Platform/MacOS/Quartz/DisplayServices.cs | 10 +-- .../MacOS/QuartzDisplayDeviceDriver.cs | 4 +- 4 files changed, 7 insertions(+), 88 deletions(-) delete mode 100644 src/OpenTK/Platform/MacOS/Carbon/CarbonAPI.cs 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/Quartz/DisplayServices.cs b/src/OpenTK/Platform/MacOS/Quartz/DisplayServices.cs index 853d32da..710f5e7f 100644 --- a/src/OpenTK/Platform/MacOS/Quartz/DisplayServices.cs +++ b/src/OpenTK/Platform/MacOS/Quartz/DisplayServices.cs @@ -61,8 +61,8 @@ namespace OpenTK.Platform.MacOS const string lib = "/System/Library/Frameworks/ApplicationServices.framework/Versions/Current/ApplicationServices"; // CGPoint -> NSPoint - // CGSize -> HISize - // CGRect -> HIRect + // 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); 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); From 52206ec13b170a058e522ec3ccbcb4a90f2f491d Mon Sep 17 00:00:00 2001 From: VPeruS Date: Wed, 14 Jun 2017 00:56:42 +0300 Subject: [PATCH 5/5] Add requsted changes --- src/OpenTK/Platform/MacOS/Cocoa/Cocoa.cs | 8 ++++---- src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs | 12 ++++++++---- src/OpenTK/Platform/MacOS/Quartz/EventServices.cs | 8 ++++---- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/OpenTK/Platform/MacOS/Cocoa/Cocoa.cs b/src/OpenTK/Platform/MacOS/Cocoa/Cocoa.cs index 03c494d0..ac6ae977 100644 --- a/src/OpenTK/Platform/MacOS/Cocoa/Cocoa.cs +++ b/src/OpenTK/Platform/MacOS/Cocoa/Cocoa.cs @@ -173,14 +173,14 @@ namespace OpenTK.Platform.MacOS if (IntPtr.Size == 4) { NSPointF pf = SendPointF(receiver, selector); - r.X.Value = *(IntPtr *)&pf.x; - r.Y.Value = *(IntPtr *)&pf.y; + 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; + r.X.Value = *(IntPtr *)&pd.X; + r.Y.Value = *(IntPtr *)&pd.Y; } } diff --git a/src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs b/src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs index 39b55d36..b6f90f70 100644 --- a/src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs +++ b/src/OpenTK/Platform/MacOS/Cocoa/NSFloat.cs @@ -195,13 +195,17 @@ namespace OpenTK.Platform.MacOS // 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. - public struct NSPointF + [StructLayout(LayoutKind.Sequential)] + struct NSPointF { - public float x, y; + public float X; + public float Y; } - public struct NSPointD + [StructLayout(LayoutKind.Sequential)] + struct NSPointD { - public double x, y; + public double X; + public double Y; } } diff --git a/src/OpenTK/Platform/MacOS/Quartz/EventServices.cs b/src/OpenTK/Platform/MacOS/Quartz/EventServices.cs index 73067be7..3a806cf7 100644 --- a/src/OpenTK/Platform/MacOS/Quartz/EventServices.cs +++ b/src/OpenTK/Platform/MacOS/Quartz/EventServices.cs @@ -78,14 +78,14 @@ namespace OpenTK.Platform.MacOS if (IntPtr.Size == 4) { NSPointF pf = EventGetLocationF(@event); - r.X.Value = *(IntPtr *)&pf.x; - r.Y.Value = *(IntPtr *)&pf.y; + 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; + r.X.Value = *(IntPtr *)&pd.X; + r.Y.Value = *(IntPtr *)&pd.Y; } }