Browse Source

Merge pull request #1841 from hasenj/hack-objc-window-init

HACK work around for creating a cocoa window
gingerBill 3 years ago
parent
commit
108558ddfc
2 changed files with 22 additions and 6 deletions
  1. 6 1
      vendor/darwin/Foundation/NSTypes.odin
  2. 16 5
      vendor/darwin/Foundation/NSWindow.odin

+ 6 - 1
vendor/darwin/Foundation/NSTypes.odin

@@ -36,7 +36,12 @@ NotFound :: IntegerMax
 
 Float :: distinct (f32 when size_of(uint) == 4 else f64)
 
+Point :: struct {
+	x: Float,
+	y: Float,
+}
+
 Size :: struct {
 	width:  Float,
 	height: Float,
-}
+}

+ 16 - 5
vendor/darwin/Foundation/NSWindow.odin

@@ -3,8 +3,8 @@ package objc_Foundation
 import NS "vendor:darwin/Foundation"
 
 Rect :: struct {
-	x, y: f64,
-	width, height: f64,
+	using origin: Point,
+	using size: Size,
 }
 
 WindowStyleFlag :: enum NS.UInteger {
@@ -102,8 +102,19 @@ Window_alloc :: proc() -> ^Window {
 }
 
 @(objc_type=Window, objc_name="initWithContentRect")
-Window_initWithContentRect :: proc(self: ^Window, contentRect: Rect, styleMask: WindowStyleMask, backing: BackingStoreType, doDefer: bool) -> ^Window {
-	return msgSend(^Window, self, "initWithContentRect:styleMask:backing:defer:", contentRect, styleMask, backing, doDefer)
+Window_initWithContentRect :: proc (self: ^Window, contentRect: Rect, styleMask: WindowStyleMask, backing: BackingStoreType, doDefer: bool) -> ^Window {
+	self := self
+	// HACK: due to a compiler bug, the generated calling code does not
+	// currently work for this message. Has to do with passing a struct along
+	// with other parameters, so we don't send the rect here.
+	// Omiting the rect argument here actually works, because of how the C
+	// calling conventions are defined.
+	self = msgSend(^Window, self, "initWithContentRect:styleMask:backing:defer:", styleMask, backing, doDefer)
+
+	// apply the contentRect now, since we did not pass it to the init call
+	msgSend(nil, self, "setContentSize:", contentRect.size)
+	msgSend(nil, self, "setFrameOrigin:", contentRect.origin)
+	return self
 }
 @(objc_type=Window, objc_name="contentView")
 Window_contentView :: proc(self: ^Window) -> ^View {
@@ -148,4 +159,4 @@ Window_setTitle :: proc(self: ^Window, title: ^NS.String) {
 @(objc_type=Window, objc_name="close")
 Window_close :: proc(self: ^Window) {
 	msgSend(nil, self, "close")
-}
+}