app: [macOS] add missing autoreleasepools

Their absense didn't make a practical difference so far, but we're about
to refactor the macOS event processing loop where the pools do matter.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2023-12-13 12:55:25 -06:00
parent fe1df00d02
commit 390242f214
2 changed files with 133 additions and 73 deletions
+57 -1
View File
@@ -62,142 +62,197 @@ static CFTypeRef readClipboard(void) {
} }
static CGFloat viewHeight(CFTypeRef viewRef) { static CGFloat viewHeight(CFTypeRef viewRef) {
@autoreleasepool {
NSView *view = (__bridge NSView *)viewRef; NSView *view = (__bridge NSView *)viewRef;
return [view bounds].size.height; return [view bounds].size.height;
} }
}
static CGFloat viewWidth(CFTypeRef viewRef) { static CGFloat viewWidth(CFTypeRef viewRef) {
@autoreleasepool {
NSView *view = (__bridge NSView *)viewRef; NSView *view = (__bridge NSView *)viewRef;
return [view bounds].size.width; return [view bounds].size.width;
} }
}
static CGFloat getScreenBackingScale(void) { static CGFloat getScreenBackingScale(void) {
@autoreleasepool {
return [NSScreen.mainScreen backingScaleFactor]; return [NSScreen.mainScreen backingScaleFactor];
} }
}
static CGFloat getViewBackingScale(CFTypeRef viewRef) { static CGFloat getViewBackingScale(CFTypeRef viewRef) {
@autoreleasepool {
NSView *view = (__bridge NSView *)viewRef; NSView *view = (__bridge NSView *)viewRef;
return [view.window backingScaleFactor]; return [view.window backingScaleFactor];
} }
}
static void setNeedsDisplay(CFTypeRef viewRef) { static void setNeedsDisplay(CFTypeRef viewRef) {
@autoreleasepool {
NSView *view = (__bridge NSView *)viewRef; NSView *view = (__bridge NSView *)viewRef;
[view setNeedsDisplay:YES]; [view setNeedsDisplay:YES];
} }
}
static NSPoint cascadeTopLeftFromPoint(CFTypeRef windowRef, NSPoint topLeft) { static NSPoint cascadeTopLeftFromPoint(CFTypeRef windowRef, NSPoint topLeft) {
@autoreleasepool {
NSWindow *window = (__bridge NSWindow *)windowRef; NSWindow *window = (__bridge NSWindow *)windowRef;
return [window cascadeTopLeftFromPoint:topLeft]; return [window cascadeTopLeftFromPoint:topLeft];
} }
}
static void makeKeyAndOrderFront(CFTypeRef windowRef) { static void makeKeyAndOrderFront(CFTypeRef windowRef) {
@autoreleasepool {
NSWindow *window = (__bridge NSWindow *)windowRef; NSWindow *window = (__bridge NSWindow *)windowRef;
[window makeKeyAndOrderFront:nil]; [window makeKeyAndOrderFront:nil];
} }
}
static void toggleFullScreen(CFTypeRef windowRef) { static void toggleFullScreen(CFTypeRef windowRef) {
@autoreleasepool {
NSWindow *window = (__bridge NSWindow *)windowRef; NSWindow *window = (__bridge NSWindow *)windowRef;
[window toggleFullScreen:nil]; [window toggleFullScreen:nil];
} }
}
static NSWindowStyleMask getWindowStyleMask(CFTypeRef windowRef) { static NSWindowStyleMask getWindowStyleMask(CFTypeRef windowRef) {
@autoreleasepool {
NSWindow *window = (__bridge NSWindow *)windowRef; NSWindow *window = (__bridge NSWindow *)windowRef;
return [window styleMask]; return [window styleMask];
} }
}
static void setWindowStyleMask(CFTypeRef windowRef, NSWindowStyleMask mask) { static void setWindowStyleMask(CFTypeRef windowRef, NSWindowStyleMask mask) {
@autoreleasepool {
NSWindow *window = (__bridge NSWindow *)windowRef; NSWindow *window = (__bridge NSWindow *)windowRef;
window.styleMask = mask; window.styleMask = mask;
} }
}
static void setWindowTitleVisibility(CFTypeRef windowRef, NSWindowTitleVisibility state) { static void setWindowTitleVisibility(CFTypeRef windowRef, NSWindowTitleVisibility state) {
@autoreleasepool {
NSWindow *window = (__bridge NSWindow *)windowRef; NSWindow *window = (__bridge NSWindow *)windowRef;
window.titleVisibility = state; window.titleVisibility = state;
} }
}
static void setWindowTitlebarAppearsTransparent(CFTypeRef windowRef, int transparent) { static void setWindowTitlebarAppearsTransparent(CFTypeRef windowRef, int transparent) {
@autoreleasepool {
NSWindow *window = (__bridge NSWindow *)windowRef; NSWindow *window = (__bridge NSWindow *)windowRef;
window.titlebarAppearsTransparent = (BOOL)transparent; window.titlebarAppearsTransparent = (BOOL)transparent;
} }
}
static void setWindowStandardButtonHidden(CFTypeRef windowRef, NSWindowButton btn, int hide) { static void setWindowStandardButtonHidden(CFTypeRef windowRef, NSWindowButton btn, int hide) {
@autoreleasepool {
NSWindow *window = (__bridge NSWindow *)windowRef; NSWindow *window = (__bridge NSWindow *)windowRef;
[window standardWindowButton:btn].hidden = (BOOL)hide; [window standardWindowButton:btn].hidden = (BOOL)hide;
} }
}
static void performWindowDragWithEvent(CFTypeRef windowRef, CFTypeRef evt) { static void performWindowDragWithEvent(CFTypeRef windowRef, CFTypeRef evt) {
@autoreleasepool {
NSWindow *window = (__bridge NSWindow *)windowRef; NSWindow *window = (__bridge NSWindow *)windowRef;
[window performWindowDragWithEvent:(__bridge NSEvent*)evt]; [window performWindowDragWithEvent:(__bridge NSEvent*)evt];
} }
}
static void closeWindow(CFTypeRef windowRef) { static void closeWindow(CFTypeRef windowRef) {
@autoreleasepool {
NSWindow* window = (__bridge NSWindow *)windowRef; NSWindow* window = (__bridge NSWindow *)windowRef;
[window performClose:nil]; [window performClose:nil];
} }
}
static void setSize(CFTypeRef windowRef, CGFloat width, CGFloat height) { static void setSize(CFTypeRef windowRef, CGFloat width, CGFloat height) {
@autoreleasepool {
NSWindow* window = (__bridge NSWindow *)windowRef; NSWindow* window = (__bridge NSWindow *)windowRef;
NSSize size = NSMakeSize(width, height); NSSize size = NSMakeSize(width, height);
[window setContentSize:size]; [window setContentSize:size];
} }
}
static void setMinSize(CFTypeRef windowRef, CGFloat width, CGFloat height) { static void setMinSize(CFTypeRef windowRef, CGFloat width, CGFloat height) {
@autoreleasepool {
NSWindow* window = (__bridge NSWindow *)windowRef; NSWindow* window = (__bridge NSWindow *)windowRef;
window.contentMinSize = NSMakeSize(width, height); window.contentMinSize = NSMakeSize(width, height);
} }
}
static void setMaxSize(CFTypeRef windowRef, CGFloat width, CGFloat height) { static void setMaxSize(CFTypeRef windowRef, CGFloat width, CGFloat height) {
@autoreleasepool {
NSWindow* window = (__bridge NSWindow *)windowRef; NSWindow* window = (__bridge NSWindow *)windowRef;
window.contentMaxSize = NSMakeSize(width, height); window.contentMaxSize = NSMakeSize(width, height);
} }
}
static void setScreenFrame(CFTypeRef windowRef, CGFloat x, CGFloat y, CGFloat w, CGFloat h) { static void setScreenFrame(CFTypeRef windowRef, CGFloat x, CGFloat y, CGFloat w, CGFloat h) {
@autoreleasepool {
NSWindow* window = (__bridge NSWindow *)windowRef; NSWindow* window = (__bridge NSWindow *)windowRef;
NSRect r = NSMakeRect(x, y, w, h); NSRect r = NSMakeRect(x, y, w, h);
[window setFrame:r display:YES]; [window setFrame:r display:YES];
} }
}
static void hideWindow(CFTypeRef windowRef) { static void hideWindow(CFTypeRef windowRef) {
@autoreleasepool {
NSWindow* window = (__bridge NSWindow *)windowRef; NSWindow* window = (__bridge NSWindow *)windowRef;
[window miniaturize:window]; [window miniaturize:window];
} }
}
static void unhideWindow(CFTypeRef windowRef) { static void unhideWindow(CFTypeRef windowRef) {
@autoreleasepool {
NSWindow* window = (__bridge NSWindow *)windowRef; NSWindow* window = (__bridge NSWindow *)windowRef;
[window deminiaturize:window]; [window deminiaturize:window];
} }
}
static NSRect getScreenFrame(CFTypeRef windowRef) { static NSRect getScreenFrame(CFTypeRef windowRef) {
@autoreleasepool {
NSWindow* window = (__bridge NSWindow *)windowRef; NSWindow* window = (__bridge NSWindow *)windowRef;
return [[window screen] frame]; return [[window screen] frame];
} }
}
static void setTitle(CFTypeRef windowRef, CFTypeRef titleRef) { static void setTitle(CFTypeRef windowRef, CFTypeRef titleRef) {
@autoreleasepool {
NSWindow *window = (__bridge NSWindow *)windowRef; NSWindow *window = (__bridge NSWindow *)windowRef;
window.title = (__bridge NSString *)titleRef; window.title = (__bridge NSString *)titleRef;
} }
}
static int isWindowZoomed(CFTypeRef windowRef) { static int isWindowZoomed(CFTypeRef windowRef) {
@autoreleasepool {
NSWindow *window = (__bridge NSWindow *)windowRef; NSWindow *window = (__bridge NSWindow *)windowRef;
return window.zoomed ? 1 : 0; return window.zoomed ? 1 : 0;
} }
}
static void zoomWindow(CFTypeRef windowRef) { static void zoomWindow(CFTypeRef windowRef) {
@autoreleasepool {
NSWindow *window = (__bridge NSWindow *)windowRef; NSWindow *window = (__bridge NSWindow *)windowRef;
[window zoom:nil]; [window zoom:nil];
} }
}
static CFTypeRef layerForView(CFTypeRef viewRef) { static CFTypeRef layerForView(CFTypeRef viewRef) {
@autoreleasepool {
NSView *view = (__bridge NSView *)viewRef; NSView *view = (__bridge NSView *)viewRef;
return (__bridge CFTypeRef)view.layer; return (__bridge CFTypeRef)view.layer;
} }
}
static CFTypeRef windowForView(CFTypeRef viewRef) { static CFTypeRef windowForView(CFTypeRef viewRef) {
@autoreleasepool {
NSView *view = (__bridge NSView *)viewRef; NSView *view = (__bridge NSView *)viewRef;
return (__bridge CFTypeRef)view.window; return (__bridge CFTypeRef)view.window;
} }
}
static void raiseWindow(CFTypeRef windowRef) { static void raiseWindow(CFTypeRef windowRef) {
@autoreleasepool {
NSRunningApplication *currentApp = [NSRunningApplication currentApplication]; NSRunningApplication *currentApp = [NSRunningApplication currentApplication];
if (![currentApp isActive]) { if (![currentApp isActive]) {
[currentApp activateWithOptions:(NSApplicationActivateAllWindows | NSApplicationActivateIgnoringOtherApps)]; [currentApp activateWithOptions:(NSApplicationActivateAllWindows | NSApplicationActivateIgnoringOtherApps)];
@@ -205,6 +260,7 @@ static void raiseWindow(CFTypeRef windowRef) {
NSWindow* window = (__bridge NSWindow *)windowRef; NSWindow* window = (__bridge NSWindow *)windowRef;
[window makeKeyAndOrderFront:nil]; [window makeKeyAndOrderFront:nil];
} }
}
static CFTypeRef createInputContext(CFTypeRef clientRef) { static CFTypeRef createInputContext(CFTypeRef clientRef) {
@autoreleasepool { @autoreleasepool {
@@ -241,7 +297,7 @@ func init() {
runtime.LockOSThread() runtime.LockOSThread()
} }
// ViewEvent notified the client of changes to the window AppKit handles. // ViewEvent notifies the client of changes to the window AppKit handles.
// The handles are retained until another ViewEvent is sent. // The handles are retained until another ViewEvent is sent.
type ViewEvent struct { type ViewEvent struct {
// View is a CFTypeRef for the NSView for the window. // View is a CFTypeRef for the NSView for the window.
+4
View File
@@ -254,6 +254,7 @@ void gio_showCursor() {
// some cursors are not public, this tries to use a private cursor // some cursors are not public, this tries to use a private cursor
// and uses fallback when the use of private cursor fails. // and uses fallback when the use of private cursor fails.
void gio_trySetPrivateCursor(SEL cursorName, NSCursor* fallback) { void gio_trySetPrivateCursor(SEL cursorName, NSCursor* fallback) {
@autoreleasepool {
if ([NSCursor respondsToSelector:cursorName]) { if ([NSCursor respondsToSelector:cursorName]) {
id object = [NSCursor performSelector:cursorName]; id object = [NSCursor performSelector:cursorName];
if ([object isKindOfClass:[NSCursor class]]) { if ([object isKindOfClass:[NSCursor class]]) {
@@ -263,6 +264,7 @@ void gio_trySetPrivateCursor(SEL cursorName, NSCursor* fallback) {
} }
[fallback set]; [fallback set];
} }
}
void gio_setCursor(NSUInteger curID) { void gio_setCursor(NSUInteger curID) {
@autoreleasepool { @autoreleasepool {
@@ -401,9 +403,11 @@ CFTypeRef gio_createView(void) {
} }
void gio_viewSetHandle(CFTypeRef viewRef, uintptr_t handle) { void gio_viewSetHandle(CFTypeRef viewRef, uintptr_t handle) {
@autoreleasepool {
GioView *v = (__bridge GioView *)viewRef; GioView *v = (__bridge GioView *)viewRef;
v.handle = handle; v.handle = handle;
} }
}
@implementation GioAppDelegate @implementation GioAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {