From c13d80d6d8b7f31f61281a70b4f8b56b09d7b1b7 Mon Sep 17 00:00:00 2001 From: thefiddler Date: Mon, 23 Dec 2013 20:21:02 +0100 Subject: [PATCH] Fixed GameWindow.{Bounds, Location, Size, X, Y} setters on OpenTK/Carbon --- .../MacOS/CarbonBindings/CarbonAPI.cs | 8 ++++ .../OpenTK/Platform/MacOS/CarbonGLNative.cs | 47 +++++++++---------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/Source/OpenTK/Platform/MacOS/CarbonBindings/CarbonAPI.cs b/Source/OpenTK/Platform/MacOS/CarbonBindings/CarbonAPI.cs index 83c41a43b4..407563f480 100644 --- a/Source/OpenTK/Platform/MacOS/CarbonBindings/CarbonAPI.cs +++ b/Source/OpenTK/Platform/MacOS/CarbonBindings/CarbonAPI.cs @@ -64,6 +64,11 @@ internal struct Rect short bottom; short right; + internal Rect(int left, int top, int width, int height) + : this((short)left, (short)top, (short)width, (short)height) + { + } + internal Rect(short _left, short _top, short _width, short _height) { top = _top; @@ -530,6 +535,9 @@ internal static Rect GetWindowBounds(IntPtr window, WindowRegionCode regionCode) return retval; } + [DllImport(carbon)] + internal static extern OSStatus SetWindowBounds(IntPtr Windows, WindowRegionCode WindowRegionCode, ref Rect globalBounds); + //[DllImport(carbon)] //internal static extern void MoveWindow(IntPtr window, short hGlobal, short vGlobal, bool front); diff --git a/Source/OpenTK/Platform/MacOS/CarbonGLNative.cs b/Source/OpenTK/Platform/MacOS/CarbonGLNative.cs index 0a8324f087..a9cf8f8137 100644 --- a/Source/OpenTK/Platform/MacOS/CarbonGLNative.cs +++ b/Source/OpenTK/Platform/MacOS/CarbonGLNative.cs @@ -660,52 +660,51 @@ private void ProcessModifierKey(IntPtr inEvent) } - Rect GetRegion() + Rect GetClientSize() { Rect retval = API.GetWindowBounds(window.Handle, WindowRegionCode.ContentRegion); - return retval; } - void SetLocation(short x, short y) + void SetClientSize(short width, short height) { - if (windowState == WindowState.Fullscreen) + if (WindowState == WindowState.Fullscreen) return; - - API.MoveWindow(window.Handle, x, y, false); + + Rect new_bounds = new Rect(Bounds.X, Bounds.Y, width, height); + API.SetWindowBounds(window.Handle, WindowRegionCode.ContentRegion, ref new_bounds); + LoadSize(); } - void SetSize(short width, short height) + void SetLocation(short x, short y) { - if (WindowState == WindowState.Fullscreen) + if (windowState == WindowState.Fullscreen) return; - - // The bounds of the window should be the size specified, but - // API.SizeWindow sets the content region size. So - // we reduce the size to get the correct bounds. - width -= (short)(bounds.Width - clientRectangle.Width); - height -= (short)(bounds.Height - clientRectangle.Height); - - API.SizeWindow(window.Handle, width, height, true); + + Rect new_bounds = new Rect(x, y, Bounds.Width, Bounds.Height); + API.SetWindowBounds(window.Handle, WindowRegionCode.StructureRegion, ref new_bounds); + LoadSize(); } - void SetClientSize(short width, short height) + void SetSize(short width, short height) { if (WindowState == WindowState.Fullscreen) return; - - API.SizeWindow(window.Handle, width, height, true); + + Rect new_bounds = new Rect(Bounds.X, Bounds.Y, width, height); + API.SetWindowBounds(window.Handle, WindowRegionCode.StructureRegion, ref new_bounds); + LoadSize(); } private void LoadSize() { if (WindowState == WindowState.Fullscreen) return; - + Rect r = API.GetWindowBounds(window.Handle, WindowRegionCode.StructureRegion); bounds = new Rectangle(r.X, r.Y, r.Width, r.Height); - - r = API.GetWindowBounds(window.Handle, WindowRegionCode.GlobalPortRegion); + + r = API.GetWindowBounds(window.Handle, WindowRegionCode.ContentRegion); clientRectangle = new Rectangle(0, 0, r.Width, r.Height); } @@ -891,13 +890,13 @@ public int Height public int X { - get { return ClientRectangle.X; } + get { return Bounds.X; } set { Location = new Point(value, Y); } } public int Y { - get { return ClientRectangle.Y; } + get { return Bounds.Y; } set { Location = new Point(X, value); } }