45 lines
1.7 KiB
Objective-C
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;
|
|
}
|
|
}
|