Skip to content

Commit

Permalink
Fixed GameWindow.{Bounds, Location, Size, X, Y} setters on OpenTK/Carbon
Browse files Browse the repository at this point in the history
  • Loading branch information
thefiddler committed Dec 23, 2013
1 parent c6a21a2 commit c13d80d
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 24 deletions.
8 changes: 8 additions & 0 deletions Source/OpenTK/Platform/MacOS/CarbonBindings/CarbonAPI.cs
Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down
47 changes: 23 additions & 24 deletions Source/OpenTK/Platform/MacOS/CarbonGLNative.cs
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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); }
}

Expand Down

0 comments on commit c13d80d

Please sign in to comment.