]> Shamusworld >> Repos - virtualjaguar/blob - src/gui/app.cpp
c0e434d15b692de90912f06d7596a6fcb63f13e8
[virtualjaguar] / src / gui / app.cpp
1 //
2 // app.cpp - Qt-based GUI for Virtual Jaguar
3 //
4 // by James Hammons
5 // (C) 2010 Underground Software
6 //
7 // JLH = James Hammons <jlhamm@acm.org>
8 //
9 // Who  When        What
10 // ---  ----------  -------------------------------------------------------------
11 // JLH  12/23/2009  Created this file
12 // JLH  01/21/2011  Added SDL initialization
13 // JLH  06/26/2011  Added fix to keep SDL from hijacking main() on win32
14 // JLH  05/24/2012  Added option switches
15 // JLH  03/05/2013  Fixed console redireciton on win32 platform  :-P
16 //
17
18 #include "app.h"
19
20 #include <SDL.h>
21 #include <QApplication>
22 #include "gamepad.h"
23 #include "log.h"
24 #include "mainwin.h"
25 #include "profile.h"
26 #include "settings.h"
27 #include "version.h"
28
29
30 // Apparently on win32, SDL is hijacking main from Qt. So let's do this:
31 #ifdef __GCCWIN32__
32 #undef main
33 #include <windows.h>    // Ick, but needed for console redirection on win32 :-O
34 #endif
35
36 // Function prototypes...
37 static bool ParseCommandLine(int argc, char * argv[]);
38 static void ParseOptions(int argc, char * argv[]);
39
40
41 //hm. :-/
42 // This is stuff we pass into the mainWindow...
43 // Also, these are defaults. :-)
44 bool noUntunedTankPlease = false;
45 bool loadAndGo = false;
46 bool useLogfile = false;
47 QString filename;
48
49 // Here's the main application loop--short and simple...
50 int main(int argc, char * argv[])
51 {
52         // Win32 console redirection, because MS and their band of super geniuses
53         // decided that nobody would ever launch an app from the command line. :-P
54         // [Unfortunately, this doesn't seem to work on Vista/7. :-(]
55 #ifdef __GCCWIN32__
56         BOOL (WINAPI * AttachConsole)(DWORD dwProcessId);
57
58         AttachConsole = (BOOL (WINAPI *)(DWORD))
59                 GetProcAddress(LoadLibraryA("kernel32.dll"), "AttachConsole");
60
61         if (AttachConsole != NULL && AttachConsole(((DWORD)-1)))
62         {
63                 if (_fileno(stdout) == -1)
64                         freopen("CONOUT$","wb",stdout);
65                 if (_fileno(stderr) == -1)
66                         freopen("CONOUT$","wb",stderr);
67                 if (_fileno(stdin) == -1)
68                         freopen("CONIN$","rb",stdin);
69
70                 // Fix C++
71                 std::ios::sync_with_stdio();
72         }
73 #endif
74
75         // Normally, this would be read in from the settings module... :-P
76         vjs.hardwareTypeAlpine = false;
77         // This is stuff we pass into the mainWindow...
78 //      noUntunedTankPlease = false;
79
80         // Check for options that must be in place be constructing the App object
81         if (!ParseCommandLine(argc, argv))
82         {
83                 return 0;
84         }
85
86         Q_INIT_RESOURCE(virtualjaguar); // This must the same name as the exe filename
87 //or is it the .qrc filename???
88         // This is so we can pass this stuff using signal/slot mechanism...
89 //this is left here to remind me not to try doing this again :-P
90 //ick   int id = qRegisterMetaType<uint32>();
91
92         int retVal = -1;                                                        // Default is failure
93
94         if (useLogfile)
95         {
96                 bool success = (bool)LogInit("./virtualjaguar.log");    // Init logfile
97
98                 if (!success)
99                         printf("Failed to open virtualjaguar.log for writing!\n");
100         }
101
102         // Set up SDL library
103         if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_AUDIO) < 0)
104         {
105                 WriteLog("VJ: Could not initialize the SDL library: %s\n", SDL_GetError());
106         }
107         else
108         {
109                 WriteLog("VJ: SDL (joystick, audio) successfully initialized.\n");
110                 App app(argc, argv);                                    // Declare an instance of the application
111                 Gamepad::AllocateJoysticks();
112                 AutoConnectProfiles();
113                 retVal = app.exec();                                    // And run it!
114                 Gamepad::DeallocateJoysticks();
115
116                 // Free SDL components last...!
117                 SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_AUDIO);
118                 SDL_Quit();
119         }
120
121 #ifdef __GCCWIN32__
122 #if 0
123         fclose(ctt);
124 #endif
125 #endif
126         LogDone();                                                                      // Close logfile
127         return retVal;
128 }
129
130 //
131 // Main app constructor--we stick globally accessible stuff here... (?)
132 //
133 App::App(int & argc, char * argv[]): QApplication(argc, argv)
134 {
135         bool loadAndGo = !filename.isEmpty();
136
137         mainWindow = new MainWin(loadAndGo);
138         mainWindow->plzDontKillMyComputer = noUntunedTankPlease;
139         ParseOptions(argc, argv);                                       // Override defaults with command line (if any)
140         mainWindow->SyncUI();
141
142         if (loadAndGo)
143                 mainWindow->LoadFile(filename);
144
145         mainWindow->show();
146 }
147
148
149 //
150 // Here we parse out stuff that needs to be looked at *before* we construct the 
151 // App object.
152 //
153 bool ParseCommandLine(int argc, char * argv[])
154 {
155         for(int i=1; i<argc; i++)
156         {
157                 if ((strcmp(argv[i], "--help") == 0) || (strcmp(argv[i], "-h") == 0)
158                         || (strcmp(argv[i], "-?") == 0))
159                 {
160                         printf(
161                                 "Virtual Jaguar " VJ_RELEASE_VERSION " (" VJ_RELEASE_SUBVERSION ")\n"
162                                 "Based upon Virtual Jaguar core v1.0.0 by David Raingeard.\n"
163                                 "Written by James Hammons (Linux/WIN32), Niels Wagenaar (Linux/WIN32),\n"
164                                 "Carwin Jones (BeOS), and Adam Green (MacOS)\n"
165                                 "Contact: http://sdlemu.ngemu.com/ | sdlemu@ngemu.com\n"
166                                 "\n"
167                                 "Usage:\n"
168                                 "   virtualjaguar [<filename>] [switches]\n"
169                                 "\n"
170                                 "   Option            Description\n"
171                                 "   ----------------  -----------------------------------\n"
172                                 "   <filename>        Name of file to autoload\n"
173                                 "   --alpine      -a  Put Virtual Jaguar into Alpine mode\n"
174                                 "   --pal         -p  PAL mode\n"
175                                 "   --ntsc        -n  NTSC mode\n"
176                                 "   --bios        -b  Boot using Jagaur BIOS\n"
177                                 "   --no-bios         Do not use Jaguar BIOS\n"
178                                 "   --gpu         -g  Enable GPU\n"
179                                 "   --no-gpu          Disable GPU\n"
180                                 "   --dsp         -d  Enable DSP\n"
181                                 "   --no-dsp          Disable DSP\n"
182                                 "   --fullscreen  -f  Start in full screen mode\n"
183                                 "   --blur        -B  Enable GL bilinear filter\n"
184                                 "   --no-blur         Disable GL bilinear filtering\n"
185                                 "   --log         -l  Create and use log file\n"
186                                 "   --no-log          Do not use log file\n"
187                                 "   --help        -h  Show this message\n"
188                                 "   --please-dont-kill-my-computer\n"
189                                 "                 -z  Run Virtual Jaguar without \"snow\"\n"
190                                 "\n"
191                                 "Invoking Virtual Jagaur with no filename will cause it to boot up\n"
192                                 "with the VJ GUI. Using Alpine mode will enable log file.\n"
193                                 "\n");
194                         return false;
195                 }
196
197                 if (strcmp(argv[i], "--yarrr") == 0)
198                 {
199                         printf("\n");
200                         printf("Shiver me timbers!\n");
201                         printf("\n");
202                         return false;
203                 }
204
205                 if ((strcmp(argv[i], "--alpine") == 0) || (strcmp(argv[i], "-a") == 0))
206                 {
207                         printf("Alpine Mode enabled.\n");
208                         vjs.hardwareTypeAlpine = true;
209                         // We also enable logging as well :-)
210                         useLogfile = true;
211                 }
212
213                 if ((strcmp(argv[i], "--please-dont-kill-my-computer") == 0) || (strcmp(argv[i], "-z") == 0))
214                 {
215                         noUntunedTankPlease = true;
216                 }
217
218                 if ((strcmp(argv[i], "--log") == 0) || (strcmp(argv[i], "-l") == 0))
219                 {
220                         useLogfile = true;
221                 }
222
223                 if (strcmp(argv[i], "--no-log") == 0)
224                 {
225                         useLogfile = false;
226                 }
227
228                 // Check for filename
229                 if (argv[i][0] != '-')
230                 {
231                         loadAndGo = true;
232                         filename = argv[i];
233                 }
234         }
235
236         return true;
237 }
238
239
240 //
241 // This is to override settings loaded from the config file.
242 // Note that settings set here will become the new defaults!
243 // (Not any more: Settings are only saved if the config dialog was OKed, or
244 // the toolbar buttons were pressed.)
245 //
246 void ParseOptions(int argc, char * argv[])
247 {
248         for(int i=1; i<argc; i++)
249         {
250                 if ((strcmp(argv[i], "--pal") == 0) || (strcmp(argv[i], "-p") == 0))
251                 {
252                         vjs.hardwareTypeNTSC = false;
253                 }
254
255                 if ((strcmp(argv[i], "--ntsc") == 0) || (strcmp(argv[i], "-n") == 0))
256                 {
257                         vjs.hardwareTypeNTSC = true;
258                 }
259
260                 if ((strcmp(argv[i], "--bios") == 0) || (strcmp(argv[i], "-b") == 0))
261                 {
262                         vjs.useJaguarBIOS = true;
263                 }
264
265                 if (strcmp(argv[i], "--no-bios") == 0)
266                 {
267                         vjs.useJaguarBIOS = false;
268                 }
269
270                 if ((strcmp(argv[i], "--gpu") == 0) || (strcmp(argv[i], "-g") == 0))
271                 {
272                         vjs.GPUEnabled = true;
273                 }
274
275                 if (strcmp(argv[i], "--no-gpu") == 0)
276                 {
277                         vjs.GPUEnabled = false;
278                 }
279
280                 if ((strcmp(argv[i], "--dsp") == 0) || (strcmp(argv[i], "-d") == 0))
281                 {
282                         vjs.DSPEnabled = true;
283                         vjs.audioEnabled = true;
284                 }
285
286                 if (strcmp(argv[i], "--no-dsp") == 0)
287                 {
288                         vjs.DSPEnabled = false;
289                         vjs.audioEnabled = false;
290                 }
291
292                 if ((strcmp(argv[i], "--fullscreen") == 0) || (strcmp(argv[i], "-f") == 0))
293                 {
294                         vjs.fullscreen = true;
295                 }
296
297                 if ((strcmp(argv[i], "--blur") == 0) || (strcmp(argv[i], "-B") == 0))
298                 {
299                         vjs.glFilter = 1;
300                 }
301
302                 if (strcmp(argv[i], "--no-blur") == 0)
303                 {
304                         vjs.glFilter = 0;
305                 }
306         }
307 }
308
309 #if 0
310         bool useJoystick;
311         int32 joyport;                                                          // Joystick port
312         bool hardwareTypeNTSC;                                          // Set to false for PAL
313         bool useJaguarBIOS;
314         bool GPUEnabled;
315         bool DSPEnabled;
316         bool usePipelinedDSP;
317         bool fullscreen;
318         bool useOpenGL;
319         uint32 glFilter;
320         bool hardwareTypeAlpine;
321         bool audioEnabled;
322         uint32 frameSkip;
323         uint32 renderType;
324         bool allowWritesToROM;
325
326         // Keybindings in order of U, D, L, R, C, B, A, Op, Pa, 0-9, #, *
327
328         uint32 p1KeyBindings[21];
329         uint32 p2KeyBindings[21];
330
331         // Paths
332
333         char ROMPath[MAX_PATH];
334         char jagBootPath[MAX_PATH];
335         char CDBootPath[MAX_PATH];
336         char EEPROMPath[MAX_PATH];
337         char alpineROMPath[MAX_PATH];
338         char absROMPath[MAX_PATH];
339 #endif