app/internal/window: [macOS] retain NSWindow instance

Updates (maybe fixes) #130

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-06-08 17:54:06 +02:00
parent ab9b6383a4
commit 6f15275e22
2 changed files with 27 additions and 12 deletions
+15 -3
View File
@@ -40,7 +40,9 @@ __attribute__ ((visibility ("hidden"))) CFTypeRef gio_readClipboard(void);
__attribute__ ((visibility ("hidden"))) void gio_writeClipboard(unichar *chars, NSUInteger length); __attribute__ ((visibility ("hidden"))) void gio_writeClipboard(unichar *chars, NSUInteger length);
__attribute__ ((visibility ("hidden"))) void gio_setNeedsDisplay(CFTypeRef viewRef); __attribute__ ((visibility ("hidden"))) void gio_setNeedsDisplay(CFTypeRef viewRef);
__attribute__ ((visibility ("hidden"))) void gio_appTerminate(void); __attribute__ ((visibility ("hidden"))) void gio_appTerminate(void);
__attribute__ ((visibility ("hidden"))) NSPoint gio_createWindow(CFTypeRef viewRef, const char *title, CGFloat width, CGFloat height, NSPoint topLeft); __attribute__ ((visibility ("hidden"))) CFTypeRef gio_createWindow(CFTypeRef viewRef, const char *title, CGFloat width, CGFloat height);
__attribute__ ((visibility ("hidden"))) void gio_makeKeyAndOrderFront(CFTypeRef windowRef);
__attribute__ ((visibility ("hidden"))) NSPoint gio_cascadeTopLeftFromPoint(CFTypeRef windowRef, NSPoint topLeft);
*/ */
import "C" import "C"
@@ -51,6 +53,7 @@ func init() {
type window struct { type window struct {
view C.CFTypeRef view C.CFTypeRef
window C.CFTypeRef
w Callbacks w Callbacks
stage system.Stage stage system.Stage
displayLink *displayLink displayLink *displayLink
@@ -252,8 +255,10 @@ func gio_onClose(view C.CFTypeRef) {
w.displayLink.Close() w.displayLink.Close()
deleteView(view) deleteView(view)
w.w.Event(system.DestroyEvent{}) w.w.Event(system.DestroyEvent{})
C.CFRelease(w.view)
w.view = 0 w.view = 0
C.CFRelease(view) C.CFRelease(w.window)
w.window = 0
if len(viewMap) == 0 { if len(viewMap) == 0 {
C.gio_appTerminate() C.gio_appTerminate()
} }
@@ -311,7 +316,14 @@ func NewWindow(win Callbacks, opts *Options) error {
errch <- nil errch <- nil
win.SetDriver(w) win.SetDriver(w)
w.w = win w.w = win
nextTopLeft = C.gio_createWindow(w.view, title, C.CGFloat(width), C.CGFloat(height), nextTopLeft) w.window = C.gio_createWindow(w.view, title, C.CGFloat(width), C.CGFloat(height))
if nextTopLeft.x == 0 && nextTopLeft.y == 0 {
// cascadeTopLeftFromPoint treats (0, 0) as a no-op,
// and just returns the offset we need for the first window.
nextTopLeft = C.gio_cascadeTopLeftFromPoint(w.window, nextTopLeft)
}
nextTopLeft = C.gio_cascadeTopLeftFromPoint(w.window, nextTopLeft)
C.gio_makeKeyAndOrderFront(w.window)
}) })
return <-errch return <-errch
} }
+12 -9
View File
@@ -114,7 +114,17 @@ void gio_setDisplayLinkDisplay(CFTypeRef dl, uint64_t did) {
CVDisplayLinkSetCurrentCGDisplay((CVDisplayLinkRef)dl, (CGDirectDisplayID)did); CVDisplayLinkSetCurrentCGDisplay((CVDisplayLinkRef)dl, (CGDirectDisplayID)did);
} }
NSPoint gio_createWindow(CFTypeRef viewRef, const char *title, CGFloat width, CGFloat height, NSPoint topLeft) { NSPoint gio_cascadeTopLeftFromPoint(CFTypeRef windowRef, NSPoint topLeft) {
NSWindow *window = (__bridge NSWindow *)windowRef;
return [window cascadeTopLeftFromPoint:topLeft];
}
void gio_makeKeyAndOrderFront(CFTypeRef windowRef) {
NSWindow *window = (__bridge NSWindow *)windowRef;
[window makeKeyAndOrderFront:nil];
}
CFTypeRef gio_createWindow(CFTypeRef viewRef, const char *title, CGFloat width, CGFloat height) {
@autoreleasepool { @autoreleasepool {
NSRect rect = NSMakeRect(0, 0, width, height); NSRect rect = NSMakeRect(0, 0, width, height);
NSUInteger styleMask = NSTitledWindowMask | NSUInteger styleMask = NSTitledWindowMask |
@@ -131,16 +141,9 @@ NSPoint gio_createWindow(CFTypeRef viewRef, const char *title, CGFloat width, CG
NSView *view = (__bridge NSView *)viewRef; NSView *view = (__bridge NSView *)viewRef;
[window setContentView:view]; [window setContentView:view];
[window makeFirstResponder:view]; [window makeFirstResponder:view];
if (topLeft.x == 0 && topLeft.y == 0) {
// cascadeTopLeftFromPoint treats (0, 0) as a no-op,
// and just returns the offset we need for the first window.
topLeft = [window cascadeTopLeftFromPoint:topLeft];
}
topLeft = [window cascadeTopLeftFromPoint:topLeft];
window.releasedWhenClosed = NO; window.releasedWhenClosed = NO;
window.delegate = globalWindowDel; window.delegate = globalWindowDel;
[window makeKeyAndOrderFront:nil]; return (__bridge_retained CFTypeRef)window;
return topLeft;
} }
} }