The Battle for Wesnoth  1.15.2+dev
SDLMain.mm
Go to the documentation of this file.
1 /* SDLMain.m - main entry point for our Cocoa-ized SDL app
2  Initial Version: Darrell Walisser <dwaliss1@purdue.edu>
3  Non-NIB-Code & other changes: Max Horn <max@quendi.de>
4  Edited a lot for Wesnoth by Ben Anderman <ben@happyspork.com>
5 */
6 
7 #import "SDL.h"
8 #import "SDLMain.h"
9 #include <vector>
10 
11 extern "C" int wesnoth_main(int argc, char **argv);
12 static std::vector<char*> gArgs;
13 
14 @interface WesnothSDLApplication : NSApplication
15 @end
16 
17 @implementation WesnothSDLApplication
18 /* Invoked from the Quit menu item */
19 - (void)terminate:(id)sender
20 {
21  (void) sender;
22  /* Post a SDL_QUIT event */
23  SDL_Event event;
24  event.type = SDL_QUIT;
25  SDL_PushEvent(&event);
26 }
27 
28 - (BOOL)_handleKeyEquivalent:(NSEvent *)theEvent
29 {
30  [[super mainMenu] performKeyEquivalent:theEvent];
31  return YES;
32 }
33 
34 - (void) sendEvent:(NSEvent *)event
35 {
36  if(NSEventTypeKeyDown == [event type] || NSEventTypeKeyUp == [event type])
37  {
38  if([event modifierFlags] & NSEventModifierFlagCommand)
39  {
40  [super sendEvent: event];
41  }
42  } else {
43  [super sendEvent: event];
44  }
45 }
46 @end
47 
48 /* The main class of the application, the application's delegate */
49 @implementation SDLMain
50 
51 - (IBAction) openHomepage:(id)sender
52 {
53  (void) sender;
54  [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://www.wesnoth.org/"]];
55 }
56 
57 /* Called when the internal event loop has just started running */
58 - (void) applicationDidFinishLaunching: (NSNotification *) note
59 {
60  (void) note;
61  /* This makes SDL give events to Cocoa, so it can handle things like command+h to hide, etc. */
62  setenv ("SDL_ENABLEAPPEVENTS", "1", 1);
63  setenv ("SDL_VIDEO_ALLOW_SCREENSAVER", "1", 1);
64 
65  /* Set config files for pango and fontconfig, so the data they need can be found */
66  setenv ("PANGO_RC_FILE", "./pangorc", 1);
67  setenv ("PANGO_SYSCONFDIR", ".", 1);
68  setenv ("PANGO_LIBDIR", ".", 1);
69  setenv ("FONTCONFIG_PATH", "./fonts/", 1);
70  setenv ("FONTCONFIG_FILE", "fonts.conf", 1);
71 
72  int status;
73 
74  /* Set the working directory to the .app's Resources directory */
75  chdir([[[NSBundle mainBundle] resourcePath] fileSystemRepresentation]);
76 
77  /* Hand off to main application code */
78  status = wesnoth_main(gArgs.size() - 1, gArgs.data());
79 
80  /* We're done, thank you for playing */
81  exit(status);
82 }
83 @end
84 
85 template<int sz>
86 bool str_eq(const char* str, const char(& cstr)[sz]) {
87  return strncmp(str, cstr, sz) == 0;
88 }
89 
90 #ifdef main
91 # undef main
92 #endif
93 
94 /* Main entry point to executable - should *not* be SDL_main! */
95 int main (int argc, char **argv)
96 {
97  gArgs.push_back(argv[0]); // Program name
98  for (int i = 1; i < argc; i++) {
99  // Filter out debug arguments that XCode might pass
100  if (str_eq(argv[i], "-ApplePersistenceIgnoreState")) {
101  i++; // Skip the argument
102  continue;
103  }
104  if (str_eq(argv[i], "-NSDocumentRevisionsDebugMode")) {
105  i++; // Skip the argument
106  continue;
107  }
108  // This is passed if launched by double-clicking
109  if (strncmp(argv[i], "-psn", 4) == 0) {
110  continue;
111  }
112  gArgs.push_back(argv[i]);
113  }
114  gArgs.push_back(nullptr);
115 
116  [WesnothSDLApplication sharedApplication];
117 
118  [[NSBundle mainBundle] loadNibNamed:@"SDLMain" owner:NSApp topLevelObjects:nil];
119 
120  [NSApp run];
121  return 0;
122 }
static std::vector< char * > gArgs
Definition: SDLMain.mm:12
int main(int argc, char **argv)
Definition: SDLMain.mm:95
std::size_t i
Definition: function.cpp:933
bool str_eq(const char *str, const char(&cstr)[sz])
Definition: SDLMain.mm:86
int wesnoth_main(int argc, char **argv)