HACK work around for creating a cocoa window

See #1825 for more details.

This does not fix the underlying issue; it's merely a work around for
this specific manifestation of the bug.
This commit is contained in:
Hasen Judy
2022-06-10 17:08:31 +09:00
parent bfcb527b42
commit 4be92c7eb8
2 changed files with 22 additions and 6 deletions
+6 -1
View File
@@ -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
View File
@@ -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")
}
}