mirror of
https://github.com/Ryujinx/Opentk.git
synced 2025-06-01 02:30:20 +00:00
[Mac] Inherit from NativeWindowBase
This reduces code duplication significantly.
This commit is contained in:
parent
5ba1bf89f1
commit
f2eca2924f
|
@ -1,4 +1,4 @@
|
||||||
#region License
|
#region License
|
||||||
//
|
//
|
||||||
// CocoaNativeWindow.cs
|
// CocoaNativeWindow.cs
|
||||||
//
|
//
|
||||||
|
@ -38,27 +38,10 @@ using OpenTK.Input;
|
||||||
|
|
||||||
namespace OpenTK.Platform.MacOS
|
namespace OpenTK.Platform.MacOS
|
||||||
{
|
{
|
||||||
class CocoaNativeWindow : INativeWindow
|
class CocoaNativeWindow : NativeWindowBase
|
||||||
{
|
{
|
||||||
static int UniqueId;
|
static int UniqueId;
|
||||||
|
|
||||||
public event EventHandler<EventArgs> Move = delegate { };
|
|
||||||
public event EventHandler<EventArgs> Resize = delegate { };
|
|
||||||
public event EventHandler<System.ComponentModel.CancelEventArgs> Closing = delegate { };
|
|
||||||
public event EventHandler<EventArgs> Closed = delegate { };
|
|
||||||
public event EventHandler<EventArgs> Disposed = delegate { };
|
|
||||||
public event EventHandler<EventArgs> IconChanged = delegate { };
|
|
||||||
public event EventHandler<EventArgs> TitleChanged = delegate { };
|
|
||||||
public event EventHandler<EventArgs> VisibleChanged = delegate { };
|
|
||||||
public event EventHandler<EventArgs> FocusedChanged = delegate { };
|
|
||||||
public event EventHandler<EventArgs> WindowBorderChanged = delegate { };
|
|
||||||
public event EventHandler<EventArgs> WindowStateChanged = delegate { };
|
|
||||||
public event EventHandler<OpenTK.Input.KeyboardKeyEventArgs> KeyDown = delegate { };
|
|
||||||
public event EventHandler<KeyPressEventArgs> KeyPress = delegate { };
|
|
||||||
public event EventHandler<OpenTK.Input.KeyboardKeyEventArgs> KeyUp = delegate { };
|
|
||||||
public event EventHandler<EventArgs> MouseLeave = delegate { };
|
|
||||||
public event EventHandler<EventArgs> MouseEnter = delegate { };
|
|
||||||
|
|
||||||
static readonly IntPtr selNextEventMatchingMask = Selector.Get("nextEventMatchingMask:untilDate:inMode:dequeue:");
|
static readonly IntPtr selNextEventMatchingMask = Selector.Get("nextEventMatchingMask:untilDate:inMode:dequeue:");
|
||||||
static readonly IntPtr selSendEvent = Selector.Get("sendEvent:");
|
static readonly IntPtr selSendEvent = Selector.Get("sendEvent:");
|
||||||
//static readonly IntPtr selUpdateWindows = Selector.Get("updateWindows");
|
//static readonly IntPtr selUpdateWindows = Selector.Get("updateWindows");
|
||||||
|
@ -95,6 +78,8 @@ namespace OpenTK.Platform.MacOS
|
||||||
static readonly IntPtr selHide = Selector.Get("hide");
|
static readonly IntPtr selHide = Selector.Get("hide");
|
||||||
static readonly IntPtr selUnhide = Selector.Get("unhide");
|
static readonly IntPtr selUnhide = Selector.Get("unhide");
|
||||||
static readonly IntPtr selScrollingDeltaY = Selector.Get("scrollingDeltaY");
|
static readonly IntPtr selScrollingDeltaY = Selector.Get("scrollingDeltaY");
|
||||||
|
static readonly IntPtr selDeltaX = Selector.Get("deltaX");
|
||||||
|
static readonly IntPtr selDeltaY = Selector.Get("deltaY");
|
||||||
static readonly IntPtr selButtonNumber = Selector.Get("buttonNumber");
|
static readonly IntPtr selButtonNumber = Selector.Get("buttonNumber");
|
||||||
static readonly IntPtr selSetStyleMask = Selector.Get("setStyleMask:");
|
static readonly IntPtr selSetStyleMask = Selector.Get("setStyleMask:");
|
||||||
static readonly IntPtr selStyleMask = Selector.Get("styleMask");
|
static readonly IntPtr selStyleMask = Selector.Get("styleMask");
|
||||||
|
@ -145,7 +130,6 @@ namespace OpenTK.Platform.MacOS
|
||||||
private bool exists;
|
private bool exists;
|
||||||
private bool cursorVisible = true;
|
private bool cursorVisible = true;
|
||||||
private System.Drawing.Icon icon;
|
private System.Drawing.Icon icon;
|
||||||
private LegacyInputDriver inputDriver = new LegacyInputDriver();
|
|
||||||
private WindowBorder windowBorder = WindowBorder.Resizable;
|
private WindowBorder windowBorder = WindowBorder.Resizable;
|
||||||
private Nullable<WindowBorder> deferredWindowBorder;
|
private Nullable<WindowBorder> deferredWindowBorder;
|
||||||
private Nullable<WindowBorder> previousWindowBorder;
|
private Nullable<WindowBorder> previousWindowBorder;
|
||||||
|
@ -377,7 +361,7 @@ namespace OpenTK.Platform.MacOS
|
||||||
Cocoa.SendVoid(owner, selAddTrackingArea, trackingArea);
|
Cocoa.SendVoid(owner, selAddTrackingArea, trackingArea);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
public override void Close()
|
||||||
{
|
{
|
||||||
shouldClose = true;
|
shouldClose = true;
|
||||||
}
|
}
|
||||||
|
@ -409,7 +393,7 @@ namespace OpenTK.Platform.MacOS
|
||||||
return (MouseButton)cocoaButtonIndex;
|
return (MouseButton)cocoaButtonIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ProcessEvents()
|
public override void ProcessEvents()
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
@ -500,16 +484,32 @@ namespace OpenTK.Platform.MacOS
|
||||||
case NSEventType.OtherMouseDragged:
|
case NSEventType.OtherMouseDragged:
|
||||||
case NSEventType.MouseMoved:
|
case NSEventType.MouseMoved:
|
||||||
{
|
{
|
||||||
var pf = Cocoa.SendPoint(e, selLocationInWindowOwner);
|
Point p = InputDriver.Mouse[0].Position;
|
||||||
|
if (CursorVisible)
|
||||||
|
{
|
||||||
|
// Use absolute coordinates
|
||||||
|
var pf = Cocoa.SendPoint(e, selLocationInWindowOwner);
|
||||||
|
|
||||||
// Convert from points to pixel coordinates
|
// Convert from points to pixel coordinates
|
||||||
var rf = Cocoa.SendRect(windowInfo.Handle, selConvertRectToBacking,
|
var rf = Cocoa.SendRect(windowInfo.Handle, selConvertRectToBacking,
|
||||||
new RectangleF(pf.X, pf.Y, 0, 0));
|
new RectangleF(pf.X, pf.Y, 0, 0));
|
||||||
|
|
||||||
// See CocoaDrawingGuide under "Converting from Window to View Coordinates"
|
// See CocoaDrawingGuide under "Converting from Window to View Coordinates"
|
||||||
var p = new Point(
|
p = new Point(
|
||||||
MathHelper.Clamp((int)Math.Round(rf.X), 0, Width),
|
MathHelper.Clamp((int)Math.Round(rf.X), 0, Width),
|
||||||
MathHelper.Clamp((int)Math.Round(Height - rf.Y), 0, Height));
|
MathHelper.Clamp((int)Math.Round(Height - rf.Y), 0, Height));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Mouse has been disassociated,
|
||||||
|
// use relative coordinates
|
||||||
|
var dx = Cocoa.SendFloat(e, selDeltaX);
|
||||||
|
var dy = Cocoa.SendFloat(e, selDeltaY);
|
||||||
|
|
||||||
|
p = new Point(
|
||||||
|
MathHelper.Clamp((int)Math.Round(p.X + dx)),
|
||||||
|
MathHelper.Clamp((int)Math.Round(p.Y - dy)));
|
||||||
|
}
|
||||||
|
|
||||||
InputDriver.Mouse[0].Position = p;
|
InputDriver.Mouse[0].Position = p;
|
||||||
}
|
}
|
||||||
|
@ -575,19 +575,19 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public System.Drawing.Point PointToClient(System.Drawing.Point point)
|
public override System.Drawing.Point PointToClient(System.Drawing.Point point)
|
||||||
{
|
{
|
||||||
var r = Cocoa.SendRect(windowInfo.Handle, selConvertRectFromScreen, new RectangleF(point.X, point.Y, 0, 0));
|
var r = Cocoa.SendRect(windowInfo.Handle, selConvertRectFromScreen, new RectangleF(point.X, point.Y, 0, 0));
|
||||||
return new Point((int)r.X, (int)(GetContentViewFrame().Height - GetCurrentScreenFrame().Height - r.Y));
|
return new Point((int)r.X, (int)(GetContentViewFrame().Height - GetCurrentScreenFrame().Height - r.Y));
|
||||||
}
|
}
|
||||||
|
|
||||||
public System.Drawing.Point PointToScreen(System.Drawing.Point point)
|
public override System.Drawing.Point PointToScreen(System.Drawing.Point point)
|
||||||
{
|
{
|
||||||
var r = Cocoa.SendRect(windowInfo.Handle, selConvertRectToScreen, new RectangleF(point.X, point.Y, 0, 0));
|
var r = Cocoa.SendRect(windowInfo.Handle, selConvertRectToScreen, new RectangleF(point.X, point.Y, 0, 0));
|
||||||
return new Point((int)r.X, (int)(-GetContentViewFrame().Height + GetCurrentScreenFrame().Height - r.Y));
|
return new Point((int)r.X, (int)(-GetContentViewFrame().Height + GetCurrentScreenFrame().Height - r.Y));
|
||||||
}
|
}
|
||||||
|
|
||||||
public System.Drawing.Icon Icon
|
public override System.Drawing.Icon Icon
|
||||||
{
|
{
|
||||||
get { return icon; }
|
get { return icon; }
|
||||||
set
|
set
|
||||||
|
@ -602,7 +602,7 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Title
|
public override string Title
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -614,7 +614,7 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Focused
|
public override bool Focused
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -622,7 +622,7 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Visible
|
public override bool Visible
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -635,7 +635,7 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Exists
|
public override bool Exists
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -643,7 +643,7 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IWindowInfo WindowInfo
|
public override IWindowInfo WindowInfo
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -702,7 +702,7 @@ namespace OpenTK.Platform.MacOS
|
||||||
previousWindowBorder = null;
|
previousWindowBorder = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WindowState WindowState
|
public override WindowState WindowState
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -754,7 +754,7 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public WindowBorder WindowBorder
|
public override WindowBorder WindowBorder
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -795,7 +795,7 @@ namespace OpenTK.Platform.MacOS
|
||||||
return (NSWindowStyle)0;
|
return (NSWindowStyle)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public System.Drawing.Rectangle Bounds
|
public override System.Drawing.Rectangle Bounds
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -820,105 +820,13 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public System.Drawing.Point Location
|
public override System.Drawing.Size ClientSize
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
|
||||||
return Bounds.Location;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
var b = Bounds;
|
|
||||||
b.Location = value;
|
|
||||||
Bounds = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public System.Drawing.Size Size
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return Bounds.Size;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
var b = Bounds;
|
|
||||||
b.Y -= Bounds.Height;
|
|
||||||
b.Y += value.Height;
|
|
||||||
b.Size = value;
|
|
||||||
Bounds = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int X
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return Bounds.X;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
var b = Bounds;
|
|
||||||
b.X = value;
|
|
||||||
Bounds = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Y
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return Bounds.Y;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
var b = Bounds;
|
|
||||||
b.Y = value;
|
|
||||||
Bounds = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Width
|
|
||||||
{
|
|
||||||
get { return ClientRectangle.Width; }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
var s = ClientSize;
|
|
||||||
s.Width = value;
|
|
||||||
ClientSize = s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Height
|
|
||||||
{
|
|
||||||
get { return ClientRectangle.Height; }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
var s = ClientSize;
|
|
||||||
s.Height = value;
|
|
||||||
ClientSize = s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public System.Drawing.Rectangle ClientRectangle
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
{
|
||||||
var contentViewBounds = Cocoa.SendRect(windowInfo.ViewHandle, selBounds);
|
var contentViewBounds = Cocoa.SendRect(windowInfo.ViewHandle, selBounds);
|
||||||
var bounds = Cocoa.SendRect(windowInfo.Handle, selConvertRectToBacking, contentViewBounds);
|
var bounds = Cocoa.SendRect(windowInfo.Handle, selConvertRectToBacking, contentViewBounds);
|
||||||
return new Rectangle((int)bounds.X, (int)bounds.Y, (int)bounds.Width, (int)bounds.Height);
|
return new Size(0, 0, (int)bounds.Width, (int)bounds.Height);
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
ClientSize = value.Size; // Just set size, to be consistent with WinGLNative.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public System.Drawing.Size ClientSize
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return ClientRectangle.Size;
|
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
|
@ -928,14 +836,6 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public OpenTK.Input.IInputDriver InputDriver
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return inputDriver;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public MouseCursor Cursor
|
public MouseCursor Cursor
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
|
@ -1075,13 +975,7 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
protected override void Dispose(bool disposing)
|
||||||
{
|
|
||||||
Dispose(true);
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void Dispose(bool disposing)
|
|
||||||
{
|
{
|
||||||
if (disposed)
|
if (disposed)
|
||||||
return;
|
return;
|
||||||
|
@ -1108,9 +1002,9 @@ namespace OpenTK.Platform.MacOS
|
||||||
Disposed(this, EventArgs.Empty);
|
Disposed(this, EventArgs.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
~CocoaNativeWindow()
|
public static IntPtr GetView(IntPtr windowHandle)
|
||||||
{
|
{
|
||||||
Dispose(false);
|
return Cocoa.SendIntPtr(windowHandle, selContentView);
|
||||||
}
|
}
|
||||||
|
|
||||||
private RectangleF GetContentViewFrame()
|
private RectangleF GetContentViewFrame()
|
||||||
|
|
Loading…
Reference in a new issue