Files
2026-07-13 13:00:08 +08:00

45 lines
1.7 KiB
Objective-C

//go:build darwin
#import <Cocoa/Cocoa.h>
#import <objc/runtime.h>
extern void ReasonixMarkSystemQuit(void);
static NSApplicationTerminateReply (*originalApplicationShouldTerminate)(id, SEL, NSApplication *);
static void (*originalWailsContextQuit)(id, SEL);
static NSApplicationTerminateReply reasonixApplicationShouldTerminate(id self, SEL _cmd, NSApplication *sender) {
ReasonixMarkSystemQuit();
if (originalApplicationShouldTerminate != NULL) {
return originalApplicationShouldTerminate(self, _cmd, sender);
}
return NSTerminateNow;
}
static void reasonixWailsContextQuit(id self, SEL _cmd) {
ReasonixMarkSystemQuit();
if (originalWailsContextQuit != NULL) {
originalWailsContextQuit(self, _cmd);
}
}
void installReasonixSystemQuitHook(void) {
Class appDelegate = NSClassFromString(@"AppDelegate");
SEL selector = @selector(applicationShouldTerminate:);
Method method = appDelegate == Nil ? NULL : class_getInstanceMethod(appDelegate, selector);
if (method != NULL) {
IMP replacement = (IMP)reasonixApplicationShouldTerminate;
IMP previous = method_setImplementation(method, replacement);
originalApplicationShouldTerminate = (NSApplicationTerminateReply (*)(id, SEL, NSApplication *))previous;
}
Class wailsContext = NSClassFromString(@"WailsContext");
SEL quitSelector = @selector(Quit);
Method quitMethod = wailsContext == Nil ? NULL : class_getInstanceMethod(wailsContext, quitSelector);
if (quitMethod != NULL) {
IMP replacement = (IMP)reasonixWailsContextQuit;
IMP previous = method_setImplementation(quitMethod, replacement);
originalWailsContextQuit = (void (*)(id, SEL))previous;
}
}