Files
MyGoNavi/internal/nativewindow/activation_policy_darwin.go
Syngnat 62a045b39d 🐛 fix(native-window): 修复 Intel macOS 构建类型转换错误
将 Cocoa BOOL 桥接结果统一转换为整数值。

兼容 darwin/amd64 与 darwin/arm64 的 cgo 类型映射。
2026-07-21 19:45:33 +08:00

102 lines
3.2 KiB
Go

//go:build darwin && cgo
package nativewindow
/*
#cgo CFLAGS: -x objective-c
#cgo LDFLAGS: -framework Cocoa
#import <Cocoa/Cocoa.h>
#import <dispatch/dispatch.h>
#import <objc/runtime.h>
static IMP detachedOriginalSetActivationPolicy = NULL;
static BOOL detachedAccessoryActivationPolicyGuardActive = NO;
// Wails v2 requests Regular during applicationWillFinishLaunching. Intercept
// the setter so the detached child never enters a Dock-visible policy. The
// child owns this process, so the guard intentionally remains for its lifetime.
static BOOL setDetachedGuardedActivationPolicy(
NSApplication *application,
SEL selector,
NSApplicationActivationPolicy requestedPolicy
) {
(void)requestedPolicy;
if (detachedOriginalSetActivationPolicy == NULL) {
return NO;
}
BOOL (*originalImplementation)(id, SEL, NSApplicationActivationPolicy) =
(BOOL (*)(id, SEL, NSApplicationActivationPolicy))detachedOriginalSetActivationPolicy;
return originalImplementation(
application,
selector,
NSApplicationActivationPolicyAccessory
);
}
static void installDetachedAccessoryActivationPolicyGuard(void) {
@synchronized ([NSApplication class]) {
if (detachedAccessoryActivationPolicyGuardActive) {
return;
}
Method setter = class_getInstanceMethod(
[NSApplication class],
@selector(setActivationPolicy:)
);
if (setter == NULL) {
return;
}
detachedOriginalSetActivationPolicy = method_setImplementation(
setter,
(IMP)setDetachedGuardedActivationPolicy
);
detachedAccessoryActivationPolicyGuardActive =
detachedOriginalSetActivationPolicy != NULL;
}
}
static void prepareDetachedAccessoryActivationPolicy(void) {
installDetachedAccessoryActivationPolicyGuard();
if ([NSThread isMainThread]) {
[[NSApplication sharedApplication]
setActivationPolicy:NSApplicationActivationPolicyAccessory];
}
}
// Cocoa BOOL maps to different cgo types on Intel and Apple Silicon. Normalise
// the bridge result to int so the Go side remains portable across both targets.
static int isDetachedAccessoryActivationPolicyGuardInstalled(void) {
@synchronized ([NSApplication class]) {
return detachedAccessoryActivationPolicyGuardActive ? 1 : 0;
}
}
static void applyDetachedAccessoryActivationPolicy(void *unused) {
(void)unused;
NSApplication *application = [NSApplication sharedApplication];
[application setActivationPolicy:NSApplicationActivationPolicyAccessory];
[application activateIgnoringOtherApps:YES];
}
static void setDetachedAccessoryActivationPolicy(void) {
if ([NSThread isMainThread]) {
applyDetachedAccessoryActivationPolicy(NULL);
return;
}
dispatch_sync_f(dispatch_get_main_queue(), NULL, applyDetachedAccessoryActivationPolicy);
}
*/
import "C"
func prepareDetachedAccessoryActivationPolicy() {
C.prepareDetachedAccessoryActivationPolicy()
}
func detachedAccessoryActivationPolicyGuardInstalled() bool {
return C.isDetachedAccessoryActivationPolicyGuardInstalled() != 0
}
func setDetachedAccessoryActivationPolicy() {
C.setDetachedAccessoryActivationPolicy()
}