]> Shamusworld >> Repos - virtualjaguar/blob - src/gui/app.cpp
Fixed updated joystick handling, first major stab at gamepad profiles.
[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.\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                 }
210
211                 if ((strcmp(argv[i], "--please-dont-kill-my-computer") == 0) || (strcmp(argv[i], "-z") == 0))
212                 {
213                         noUntunedTankPlease = true;
214                 }
215
216                 if ((strcmp(argv[i], "--log") == 0) || (strcmp(argv[i], "-l") == 0))
217                 {
218                         useLogfile = true;
219                 }
220
221                 if (strcmp(argv[i], "--no-log") == 0)
222                 {
223                         useLogfile = false;
224                 }
225
226                 // Check for filename
227                 if (argv[i][0] != '-')
228                 {
229                         loadAndGo = true;
230                         filename = argv[i];
231                 }
232         }
233
234         return true;
235 }
236
237
238 //
239 // This is to override settings loaded from the config file.
240 // Note that settings set here will become the new defaults!
241 // (Not any more: Settings are only saved if the config dialog was OKed, or
242 // the toolbar buttons were pressed.)
243 //
244 void ParseOptions(int argc, char * argv[])
245 {
246         for(int i=1; i<argc; i++)
247         {
248                 if ((strcmp(argv[i], "--pal") == 0) || (strcmp(argv[i], "-p") == 0))
249                 {
250                         vjs.hardwareTypeNTSC = false;
251                 }
252
253                 if ((strcmp(argv[i], "--ntsc") == 0) || (strcmp(argv[i], "-n") == 0))
254                 {
255                         vjs.hardwareTypeNTSC = true;
256                 }
257
258                 if ((strcmp(argv[i], "--bios") == 0) || (strcmp(argv[i], "-b") == 0))
259                 {
260                         vjs.useJaguarBIOS = true;
261                 }
262
263                 if (strcmp(argv[i], "--no-bios") == 0)
264                 {
265                         vjs.useJaguarBIOS = false;
266                 }
267
268                 if ((strcmp(argv[i], "--gpu") == 0) || (strcmp(argv[i], "-g") == 0))
269                 {
270                         vjs.GPUEnabled = true;
271                 }
272
273                 if (strcmp(argv[i], "--no-gpu") == 0)
274                 {
275                         vjs.GPUEnabled = false;
276                 }
277
278                 if ((strcmp(argv[i], "--dsp") == 0) || (strcmp(argv[i], "-d") == 0))
279                 {
280                         vjs.DSPEnabled = true;
281                         vjs.audioEnabled = true;
282                 }
283
284                 if (strcmp(argv[i], "--no-dsp") == 0)
285                 {
286                         vjs.DSPEnabled = false;
287                         vjs.audioEnabled = false;
288                 }
289
290                 if ((strcmp(argv[i], "--fullscreen") == 0) || (strcmp(argv[i], "-f") == 0))
291                 {
292                         vjs.fullscreen = true;
293                 }
294
295                 if ((strcmp(argv[i], "--blur") == 0) || (strcmp(argv[i], "-B") == 0))
296                 {
297                         vjs.glFilter = 1;
298                 }
299
300                 if (strcmp(argv[i], "--no-blur") == 0)
301                 {
302                         vjs.glFilter = 0;
303                 }
304         }
305 }
306
307 #if 0
308         bool useJoystick;
309         int32 joyport;                                                          // Joystick port
310         bool hardwareTypeNTSC;                                          // Set to false for PAL
311         bool useJaguarBIOS;
312         bool GPUEnabled;
313         bool DSPEnabled;
314         bool usePipelinedDSP;
315         bool fullscreen;
316         bool useOpenGL;
317         uint32 glFilter;
318         bool hardwareTypeAlpine;
319         bool audioEnabled;
320         uint32 frameSkip;
321         uint32 renderType;
322         bool allowWritesToROM;
323
324         // Keybindings in order of U, D, L, R, C, B, A, Op, Pa, 0-9, #, *
325
326         uint32 p1KeyBindings[21];
327         uint32 p2KeyBindings[21];
328
329         // Paths
330
331         char ROMPath[MAX_PATH];
332         char jagBootPath[MAX_PATH];
333         char CDBootPath[MAX_PATH];
334         char EEPROMPath[MAX_PATH];
335         char alpineROMPath[MAX_PATH];
336         char absROMPath[MAX_PATH];
337 #endif