mirror of
https://github.com/Ryujinx/Opentk.git
synced 2025-02-24 04:06:49 +00:00
Setup listening for window events.
This commit is contained in:
parent
5e1b7c82ab
commit
6c6beae4fc
|
@ -5,9 +5,21 @@ namespace OpenTK.Platform.MacOS
|
||||||
{
|
{
|
||||||
static class Class
|
static class Class
|
||||||
{
|
{
|
||||||
|
[DllImport (Cocoa.LibObjC)]
|
||||||
|
extern static IntPtr class_getName(IntPtr handle);
|
||||||
|
|
||||||
|
[DllImport (Cocoa.LibObjC)]
|
||||||
|
extern static bool class_addMethod(IntPtr classHandle, IntPtr selector, IntPtr method, string types);
|
||||||
|
|
||||||
[DllImport (Cocoa.LibObjC)]
|
[DllImport (Cocoa.LibObjC)]
|
||||||
extern static IntPtr objc_getClass(string name);
|
extern static IntPtr objc_getClass(string name);
|
||||||
|
|
||||||
|
[DllImport (Cocoa.LibObjC)]
|
||||||
|
extern static IntPtr objc_allocateClassPair(IntPtr parentClass, string name, int extraBytes);
|
||||||
|
|
||||||
|
[DllImport (Cocoa.LibObjC)]
|
||||||
|
extern static void objc_registerClassPair(IntPtr classToRegister);
|
||||||
|
|
||||||
public static IntPtr Get(string name)
|
public static IntPtr Get(string name)
|
||||||
{
|
{
|
||||||
var id = objc_getClass(name);
|
var id = objc_getClass(name);
|
||||||
|
@ -17,5 +29,29 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IntPtr AllocateClass(string className, string parentClass)
|
||||||
|
{
|
||||||
|
return objc_allocateClassPair(Get(parentClass), className, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RegisterClass(IntPtr handle)
|
||||||
|
{
|
||||||
|
objc_registerClassPair(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RegisterMethod(IntPtr handle, Delegate d, string selector, string typeString)
|
||||||
|
{
|
||||||
|
// TypeString info:
|
||||||
|
// https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html
|
||||||
|
|
||||||
|
IntPtr p = Marshal.GetFunctionPointerForDelegate(d);
|
||||||
|
bool r = class_addMethod(handle, Selector.Get(selector), p, typeString);
|
||||||
|
|
||||||
|
if (!r)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Could not register method " + d + " in class + " + class_getName(handle));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using OpenTK.Graphics;
|
using OpenTK.Graphics;
|
||||||
|
using System.Drawing;
|
||||||
|
|
||||||
namespace OpenTK.Platform.MacOS
|
namespace OpenTK.Platform.MacOS
|
||||||
{
|
{
|
||||||
|
@ -22,8 +23,6 @@ namespace OpenTK.Platform.MacOS
|
||||||
public event System.EventHandler<System.EventArgs> MouseLeave;
|
public event System.EventHandler<System.EventArgs> MouseLeave;
|
||||||
public event System.EventHandler<System.EventArgs> MouseEnter;
|
public event System.EventHandler<System.EventArgs> MouseEnter;
|
||||||
|
|
||||||
private CocoaWindowInfo windowInfo;
|
|
||||||
|
|
||||||
static readonly IntPtr nextEventMatchingMask = Selector.Get("nextEventMatchingMask:untilDate:inMode:dequeue:");
|
static readonly IntPtr nextEventMatchingMask = Selector.Get("nextEventMatchingMask:untilDate:inMode:dequeue:");
|
||||||
static readonly IntPtr sendEvent = Selector.Get("sendEvent:");
|
static readonly IntPtr sendEvent = Selector.Get("sendEvent:");
|
||||||
static readonly IntPtr updateWindows = Selector.Get("updateWindows");
|
static readonly IntPtr updateWindows = Selector.Get("updateWindows");
|
||||||
|
@ -36,17 +35,28 @@ namespace OpenTK.Platform.MacOS
|
||||||
NSDefaultRunLoopMode = Cocoa.GetStringConstant(Cocoa.FoundationLibrary, "NSDefaultRunLoopMode");
|
NSDefaultRunLoopMode = Cocoa.GetStringConstant(Cocoa.FoundationLibrary, "NSDefaultRunLoopMode");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private CocoaWindowInfo windowInfo;
|
||||||
|
private IntPtr windowClass;
|
||||||
|
|
||||||
public CocoaNativeWindow(int x, int y, int width, int height, string title, GraphicsMode mode, GameWindowFlags options, DisplayDevice device)
|
public CocoaNativeWindow(int x, int y, int width, int height, string title, GraphicsMode mode, GameWindowFlags options, DisplayDevice device)
|
||||||
{
|
{
|
||||||
|
// Create the window class
|
||||||
|
windowClass = Class.AllocateClass("OpenTKWindow", "NSWindow");
|
||||||
|
Class.RegisterMethod(windowClass, new WindowDidResizeDelegate(WindowDidResize), "windowDidResize:", "v@:@");
|
||||||
|
Class.RegisterClass(windowClass);
|
||||||
|
|
||||||
|
// Create window instance
|
||||||
var contentRect = new System.Drawing.RectangleF(x, y, width, height);
|
var contentRect = new System.Drawing.RectangleF(x, y, width, height);
|
||||||
var style = NSWindowStyle.Titled | NSWindowStyle.Resizable;
|
var style = NSWindowStyle.Titled | NSWindowStyle.Resizable;
|
||||||
var bufferingType = NSBackingStore.Buffered;
|
var bufferingType = NSBackingStore.Buffered;
|
||||||
|
|
||||||
IntPtr windowPtr;
|
IntPtr windowPtr;
|
||||||
windowPtr = Cocoa.SendIntPtr(Class.Get("NSWindow"), Selector.Alloc);
|
windowPtr = Cocoa.SendIntPtr(windowClass, Selector.Alloc);
|
||||||
windowPtr = Cocoa.SendIntPtr(windowPtr, Selector.Get("initWithContentRect:styleMask:backing:defer:"), contentRect, (int)style, (int)bufferingType, false);
|
windowPtr = Cocoa.SendIntPtr(windowPtr, Selector.Get("initWithContentRect:styleMask:backing:defer:"), contentRect, (int)style, (int)bufferingType, false);
|
||||||
windowPtr = Cocoa.SendIntPtr(windowPtr, Selector.Autorelease);
|
windowPtr = Cocoa.SendIntPtr(windowPtr, Selector.Autorelease);
|
||||||
|
|
||||||
|
// Set up behavior
|
||||||
|
Cocoa.SendIntPtr(windowPtr, Selector.Get("setDelegate:"), windowPtr); // The window class acts as its own delegate
|
||||||
Cocoa.SendVoid(windowPtr, Selector.Get("cascadeTopLeftFromPoint:"), new System.Drawing.PointF(20, 20));
|
Cocoa.SendVoid(windowPtr, Selector.Get("cascadeTopLeftFromPoint:"), new System.Drawing.PointF(20, 20));
|
||||||
Cocoa.SendVoid(windowPtr, Selector.Get("setTitle:"), Cocoa.ToNative(title));
|
Cocoa.SendVoid(windowPtr, Selector.Get("setTitle:"), Cocoa.ToNative(title));
|
||||||
Cocoa.SendVoid(windowPtr, Selector.Get("makeKeyAndOrderFront:"), IntPtr.Zero);
|
Cocoa.SendVoid(windowPtr, Selector.Get("makeKeyAndOrderFront:"), IntPtr.Zero);
|
||||||
|
@ -54,6 +64,13 @@ namespace OpenTK.Platform.MacOS
|
||||||
windowInfo = new CocoaWindowInfo(windowPtr);
|
windowInfo = new CocoaWindowInfo(windowPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delegate void WindowDidResizeDelegate(IntPtr self, IntPtr cmd, IntPtr notification);
|
||||||
|
|
||||||
|
void WindowDidResize(IntPtr self, IntPtr cmd, IntPtr notification)
|
||||||
|
{
|
||||||
|
GraphicsContext.CurrentContext.Update(windowInfo);
|
||||||
|
}
|
||||||
|
|
||||||
public static IntPtr GetView(IntPtr windowHandle)
|
public static IntPtr GetView(IntPtr windowHandle)
|
||||||
{
|
{
|
||||||
return Cocoa.SendIntPtr(windowHandle, contentView);
|
return Cocoa.SendIntPtr(windowHandle, contentView);
|
||||||
|
|
Loading…
Reference in a new issue