00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023
00024
00025
00026 #include <PalmOS.h>
00027 #include "../Rsc/StarterRsc.h"
00028
00029 #include "Device.h"
00030 #include "Presentation.h"
00031 #include "Customization.h"
00032 00033 00034 00035 00036 00037 00038
00039
00040
00041
00042
00043
00044 static Presentation *presentation;
00045
00046
00047
00048
00049 00050 00051 00052 00053 00054 00055 00056
00057 static Boolean MainFormDoCommand(UInt16 command)
00058 {
00059 Boolean handled = false;
00060
00061 switch (command)
00062 {
00063 case MainOptionsAboutRazor:
00064 presentation->pause();
00065
00066 MenuEraseStatus(0);
00067 FormType* frmP = FrmInitForm(AboutForm);
00068 FrmDoDialog (frmP);
00069 FrmDeleteForm (frmP);
00070 handled = true;
00071
00072 presentation->resume();
00073 break;
00074 }
00075
00076 return handled;
00077 }
00078
00079 00080 00081 00082 00083 00084 00085 00086
00087 static Boolean MainFormHandleEvent(EventType* eventP)
00088 {
00089 Boolean handled = false;
00090
00091 switch (eventP->eType)
00092 {
00093 case menuEvent:
00094 return MainFormDoCommand(eventP->data.menu.itemID);
00095
00096 case frmOpenEvent:
00097 {
00098 FormType* frmP = FrmGetActiveForm();
00099 FrmDrawForm (frmP);
00100 }
00101
00102 presentation->begin();
00103
00104 handled = true;
00105 break;
00106
00107 default:
00108 break;
00109 }
00110
00111 return handled;
00112 }
00113
00114
00115
00116 00117 00118 00119 00120 00121 00122 00123
00124 static Boolean AppHandleEvent(EventType* eventP)
00125 {
00126 if (eventP->eType == frmLoadEvent)
00127 {
00128
00129 UInt16 formId = eventP->data.frmLoad.formID;
00130 FormType* frmP = FrmInitForm(formId);
00131 FrmSetActiveForm(frmP);
00132
00133
00134
00135
00136 switch (formId)
00137 {
00138 case MainForm:
00139 FrmSetEventHandler(frmP, MainFormHandleEvent);
00140 break;
00141
00142 default:
00143 ErrNonFatalDisplay("Invalid Form Load Event");
00144 break;
00145
00146 }
00147 return true;
00148 }
00149
00150 return false;
00151 }
00152
00153 00154 00155 00156
00157 static void AppEventLoop()
00158 {
00159 UInt16 error;
00160 EventType event;
00161 Boolean redrawWhenReturningToGameWindow;
00162
00163
00164
00165
00166 do
00167 {
00168 EvtGetEvent (&event, evtWaitForever);
00169 if (! SysHandleEvent (&event))
00170 if (! MenuHandleEvent (NULL, &event, &error))
00171 if (! AppHandleEvent (&event))
00172 FrmDispatchEvent (&event);
00173
00174 } while ((event.eType != appStopEvent) && (!(presentation->hasBegun())));
00175
00176
00177 do
00178 {
00179
00180 EvtGetEvent (&event, presentation->getTimeUntilNextPeriod());
00181
00182
00183
00184
00185
00186
00187 if (event.eType == winExitEvent)
00188 {
00189 if (event.data.winExit.exitWindow == (WinHandle) FrmGetFormPtr(MainForm))
00190 {
00191 presentation->pause();
00192 }
00193 }
00194
00195
00196 else if (event.eType == winEnterEvent)
00197 {
00198
00199
00200 if (event.data.winEnter.enterWindow == (WinHandle) FrmGetFormPtr(MainForm) &&
00201 event.data.winEnter.enterWindow == (WinHandle) FrmGetFirstForm ())
00202 {
00203
00204
00205
00206
00207 presentation->resume();
00208
00209
00210
00211
00212
00213
00214 if (redrawWhenReturningToGameWindow)
00215 {
00216 presentation->redraw();
00217 redrawWhenReturningToGameWindow = false;
00218 }
00219 }
00220 }
00221 else
00222 {
00223 presentation->receiveEvent(&event);
00224
00225
00226 if (presentation->getTimeUntilNextPeriod() == 0)
00227 {
00228 presentation->nextPeriod();
00229 }
00230 }
00231
00232
00233 if (event.eType == nilEvent)
00234 continue;
00235
00236
00237
00238 if (event.eType == keyDownEvent)
00239 {
00240
00241 if (event.data.keyDown.chr >= hard1Chr &&
00242 event.data.keyDown.chr <= hard4Chr &&
00243 !(event.data.keyDown.modifiers & poweredOnKeyMask))
00244 {
00245 continue;
00246 }
00247
00248
00249 else if (event.data.keyDown.chr >= launchChr)
00250 {
00251 UInt32 freeBytes;
00252 UInt32 maxChunk;
00253 const UInt32 saveBitsThreshold = 4000;
00254
00255 MemHeapFreeBytes (0, &freeBytes, &maxChunk);
00256 if (freeBytes <= saveBitsThreshold)
00257 {
00258 redrawWhenReturningToGameWindow = true;
00259 }
00260 }
00261
00262 }
00263
00264
00265
00266 if (! SysHandleEvent(&event))
00267 if (! MenuHandleEvent(0, &event, &error))
00268 if (! AppHandleEvent(&event))
00269 FrmDispatchEvent(&event);
00270
00271 } while (event.eType != appStopEvent);
00272 }
00273
00274 00275 00276 00277
00278 static Err AppStart(UInt16 launchFlags)
00279 {
00280 Device::init();
00281
00282 Err error = Device::romVersionCompatible(appMinRomVersion, launchFlags);
00283 if (error != errNone)
00284 return error;
00285
00286
00287 presentation = new Presentation();
00288
00289 return errNone;
00290 }
00291
00292 00293 00294 00295
00296 static void AppStop()
00297 {
00298
00299 FrmCloseAllForms ();
00300
00301 delete presentation;
00302 }
00303
00304 00305 00306 00307 00308 00309 00310 00311 00312 00313
00314 static UInt32 StarterPalmMain(UInt16 cmd, void* , UInt16 launchFlags)
00315 {
00316 if (cmd == sysAppLaunchCmdNormalLaunch)
00317 {
00318 Err error = AppStart(launchFlags);
00319 if (error != errNone)
00320 return error;
00321
00322 FrmGotoForm(MainForm);
00323 AppEventLoop();
00324 AppStop();
00325
00326 return errNone;
00327 }
00328 else
00329 {
00330 return errNone;
00331 }
00332 }
00333
00334 00335 00336 00337 00338 00339 00340 00341 00342 00343
00344 UInt32 PilotMain( UInt16 cmd, void* cmdPBP, UInt16 launchFlags)
00345 {
00346 return StarterPalmMain(cmd, cmdPBP, launchFlags);
00347 }
00348