mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-06 18:05:35 +00:00
app/internal/window: [macOS] retain NSWindow instance
Updates (maybe fixes) #130 Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user