- updated Cocoa backend to follow single exit point workflow

This commit is contained in:
alexey.lysiuk 2019-10-12 14:44:13 +03:00
parent bb5ca2ce39
commit 29e3222fb3
4 changed files with 34 additions and 23 deletions

View file

@ -140,25 +140,12 @@ void I_DetectOS()
FArgs* Args; // command line arguments
int OriginalMainTry(int argc, char** argv)
{
Args = new FArgs(argc, argv);
NSString* exePath = [[NSBundle mainBundle] executablePath];
progdir = [[exePath stringByDeletingLastPathComponent] UTF8String];
progdir += "/";
auto ret = D_DoomMain();
FConsoleWindow::DeleteInstance();
return ret;
}
namespace
{
TArray<FString> s_argv;
int OriginalMain(int argc, char** argv)
int DoMain(int argc, char** argv)
{
printf(GAMENAME" %s - %s - Cocoa version\nCompiled on %s\n\n",
GetVersionString(), GetGitTime(), __DATE__);
@ -178,7 +165,15 @@ int OriginalMain(int argc, char** argv)
vid_defheight = static_cast<int>(screenSize.height);
vid_vsync = true;
return OriginalMainTry(argc, argv);
Args = new FArgs(argc, argv);
NSString* exePath = [[NSBundle mainBundle] executablePath];
progdir = [[exePath stringByDeletingLastPathComponent] UTF8String];
progdir += "/";
auto ret = D_DoomMain();
FConsoleWindow::DeleteInstance();
return ret;
}
} // unnamed namespace
@ -203,6 +198,10 @@ int OriginalMain(int argc, char** argv)
- (void)processEvents:(NSTimer*)timer;
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;
- (void)sendExitEvent:(id)sender;
@end
@ -276,7 +275,7 @@ extern bool AppActive;
argv[argc] = nullptr;
exit(OriginalMain(argc, &argv[0]));
exit(DoMain(argc, &argv[0]));
}
@ -341,6 +340,17 @@ extern bool AppActive;
[pool release];
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
[self sendExitEvent:sender];
return NSTerminateLater;
}
- (void)sendExitEvent:(id)sender
{
throw CExitEvent(0);
}
@end
@ -370,7 +380,7 @@ NSMenuItem* CreateApplicationMenu()
keyEquivalent:@""];
[menu addItem:[NSMenuItem separatorItem]];
[menu addItemWithTitle:[@"Quit " stringByAppendingString:@GAMENAME]
action:@selector(terminate:)
action:@selector(sendExitEvent:)
keyEquivalent:@"q"];
NSMenuItem* menuItem = [NSMenuItem new];

View file

@ -64,8 +64,8 @@
- (void)exitAppOnClose
{
NSButton* closeButton = [self standardWindowButton:NSWindowCloseButton];
[closeButton setAction:@selector(terminate:)];
[closeButton setTarget:NSApp];
[closeButton setAction:@selector(sendExitEvent:)];
[closeButton setTarget:NSApp.delegate];
}
@end

View file

@ -172,7 +172,7 @@ void FConsoleWindow::ShowFatalError(const char* const message)
[quitButton setTitle:@"Quit"];
[quitButton setKeyEquivalent:@"\r"];
[quitButton setTarget:NSApp];
[quitButton setAction:@selector(terminate:)];
[quitButton setAction:@selector(stopModal)];
NSView* quitPanel = [[NSView alloc] initWithFrame:NSMakeRect(0.0f, 0.0f, textViewWidth, 32.0f)];
[quitPanel setAutoresizingMask:NSViewWidthSizable];
@ -461,8 +461,8 @@ void FConsoleWindow::NetInit(const char* const message, const int playerCount)
[m_netAbortButton setBezelStyle:NSRoundedBezelStyle];
[m_netAbortButton setTitle:@"Cancel"];
[m_netAbortButton setKeyEquivalent:@"\r"];
[m_netAbortButton setTarget:NSApp];
[m_netAbortButton setAction:@selector(terminate:)];
[m_netAbortButton setTarget:NSApp.delegate];
[m_netAbortButton setAction:@selector(sendExitEvent:)];
// Panel for controls above
m_netView = [[NSView alloc] initWithFrame:NSMakeRect(0.0f, 0.0f, 512.0f, NET_VIEW_HEIGHT)];

View file

@ -40,6 +40,7 @@
#include "m_argv.h"
#include "m_misc.h"
#include "gameconfigfile.h"
#include "doomerrors.h"
#include <Cocoa/Cocoa.h>
#include <wordexp.h>
@ -360,7 +361,7 @@ static NSArray* GetKnownExtensions()
if ( @selector(terminate:) == [menuItem action] )
{
exit(0);
throw CExitEvent(0);
}
}