From d0de9fff86c9e44e9c10b181028d759ebf770f29 Mon Sep 17 00:00:00 2001 From: Chris Apers Date: Tue, 23 Sep 2003 15:58:51 +0000 Subject: [PATCH] Split palmstart.cpp into mutiple files svn-id: r10375 --- backends/PalmOS/Src/palmstart.cpp | 3602 --------------------------- backends/PalmOS/Src/scumm_globals.h | 74 +- backends/PalmOS/Src/skin.h | 50 +- 3 files changed, 94 insertions(+), 3632 deletions(-) delete mode 100644 backends/PalmOS/Src/palmstart.cpp diff --git a/backends/PalmOS/Src/palmstart.cpp b/backends/PalmOS/Src/palmstart.cpp deleted file mode 100644 index 8d3a021d883..00000000000 --- a/backends/PalmOS/Src/palmstart.cpp +++ /dev/null @@ -1,3602 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2001 Ludvig Strigeus - * Copyright (C) 2001-2003 The ScummVM project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * $Header$ - * - */ - -#include -#include -#include - -#include "StarterRsc.h" -#include "skin.h" -#include "globals.h" -#include "pa1lib.h" -#include "scumm_globals.h" -#include "extend.h" // for disable state -#include "stdio.h" // used in checkPath -#include "engine.h" // scumm version strings - -#include "mathlib.h" -#include "vibrate.h" - -/*********************************************************************** - * - * Internal Structures - * - ***********************************************************************/ -typedef struct { - Char nameP[32]; - UInt16 cardNo; - LocalID dbID; -} SkinInfoType; - -typedef struct { - UInt32 version; - UInt16 icnID; // icon to display on the list - Boolean selected; - - Char nameP[50]; // game name to display in list - Char pathP[150]; // path to the game files - Char gameP[10]; // scumm name of the game - UInt16 gfxMode; - - Boolean autoLoad; - UInt16 loadSlot; - Boolean autoRoom; - UInt16 roomNum; - Boolean amiga; - Boolean subtitles; - Boolean talkSpeed; - UInt16 talkValue; - UInt8 language; - -} GameInfoType; - -typedef struct { - - //skin params - SkinInfoType skin; // card where is located the skin - Boolean soundClick; - // - Boolean vibrator; - Boolean autoOff; - - UInt16 listPosition; - - struct { - UInt16 volRefNum; - Boolean moveDB; - Boolean deleteDB; - Boolean confirmMoveDB; - } card; - - Boolean debug; - UInt16 debugLevel; - Boolean saveConfig; - Boolean stdPalette; - Boolean autoReset; - Boolean demoMode; - Boolean fullscreen; - - struct { - UInt16 speaker; - UInt16 headphone; - - UInt16 master; - UInt16 music; - UInt16 sfx; - } volume; - - struct { - // midi - Boolean multiMidi; - Boolean music; - UInt8 driver; - UInt8 tempo; - // CD audio - Boolean MP3; - Boolean setDefaultTrackLength; - UInt16 defaultTrackLength; - UInt16 firstTrack; - // sound FX - Boolean sfx; - } sound; - -} GlobalsPreferenceType, *GlobalsPreferencePtr; - -typedef struct { - UInt16 volRefNum; - Char nameP[expCardInfoStringMaxLen+1]; - -} CardInfoType; - -/*********************************************************************** - * - * Global variables - * - ***********************************************************************/ -static GlobalsPreferencePtr gPrefs; -static DmOpenRef _dbP = NULL; -static UInt16 _lstIndex = 0; // last index -static UInt8 __editMode__; -static UInt16 sknLastOn = skinButtonNone; -static Boolean bStartScumm = false; - -GlobalsDataPtr gVars; - -// form list draw -#define ITEM_TYPE_UNKNOWN 'U' -#define ITEM_TYPE_CARD 'C' -#define ITEM_TYPE_SKIN 'S' - -#define frmRedrawUpdateMS (frmRedrawUpdateCode+1) -#define frmRedrawUpdateMSImport (frmRedrawUpdateCode+2) - -static Char **itemsText = NULL; -static void *itemsList = NULL; -static Char itemsType = ITEM_TYPE_UNKNOWN; -/*********************************************************************** - * - * Internal Constants - * - ***********************************************************************/ -#define appVersionNum 0x01 -#define appPrefID 0x00 -#define appPrefVersionNum 0x01 - -// Define the minimum OS version we support (3.5 for now). -#define kOurMinVersion sysMakeROMVersion(3,5,0,sysROMStageRelease,0) -#define kPalmOS10Version sysMakeROMVersion(1,0,0,sysROMStageRelease,0) -#define kOS5Version sysMakeROMVersion(5,0,0,sysROMStageRelease,0) - -// edit game mode -#define edtModeAdd 0 -#define edtModeEdit 1 -#define edtModeParams 2 - -// skin -#define sknInfoState 0 -#define sknInfoPosX 1 -#define sknInfoPosY 2 - -#define sknInfoMaxWOrH 3 -#define sknInfoDrawMode 4 -#define sknInfoKeepXOrY1 5 -#define sknInfoKeepXOrY2 7 - -#define sknInfoListWidth sknInfoMaxWOrH -#define sknInfoListHeight sknInfoDrawMode -#define sknInfoListSize sknInfoListHeight -#define sknInfoListItemSize 12 - -#define sknPosRsc 'sPos' -#define sknColorsRsc 'sCol' - -#define sknStateNormal 0 -#define sknStateSelected 10 -#define sknStateDisabled 20 - -#define sknSelectedState(bmp) (bmp + sknStateSelected) -#define sknDisabledState(bmp) (bmp + sknStateDisabled) -/*********************************************************************** - * - * Internal Functions - * - ***********************************************************************/ -static void GBInitAll() { -#ifndef DISABLE_SCUMM - CALL_INIT(IMuseDigital) - CALL_INIT(NewGui) - CALL_INIT(Akos) - CALL_INIT(Bundle) - CALL_INIT(Codec47) - CALL_INIT(Gfx) - CALL_INIT(Dialogs) - CALL_INIT(Charset) - CALL_INIT(Costume) -#endif -} - -static void GBReleaseAll() { -#ifndef DISABLE_SCUMM - CALL_RELEASE(IMuseDigital) - CALL_RELEASE(NewGui) - CALL_RELEASE(Akos) - CALL_RELEASE(Bundle) - CALL_RELEASE(Codec47) - CALL_RELEASE(Gfx) - CALL_RELEASE(Dialogs) - CALL_RELEASE(Charset) - CALL_RELEASE(Costume) -#endif -} - -static void FrmReturnToMain(UInt16 updateCode = frmRedrawUpdateMS) { - // if there is a form loaded, prevent crash on OS5 - if (FrmGetFirstForm()) { - FrmUpdateForm(MainForm, updateCode); - FrmReturnToForm(MainForm); - } -} - -//TODO : use Boolean instead of void to check err -static DmOpenRef GBOpenInternal(const Char *nameP) { - LocalID dbID = DmFindDatabase(0, nameP); - if (dbID) { - UInt32 dbType, dbCreator; - Err e = DmDatabaseInfo(0, dbID, 0, 0, 0, 0, 0, 0, 0, 0, 0, &dbType, &dbCreator); - - if (!e && dbType == 'GLBS' && dbCreator == appFileCreator) - return DmOpenDatabase(0, dbID, dmModeReadOnly); - } - return NULL; -} - -static void GBOpen() { - gVars->globals[GBVARS_SCUMM] = GBOpenInternal("Scumm-Globals"); - gVars->globals[GBVARS_SIMON] = GBOpenInternal("Simon-Globals"); - gVars->globals[GBVARS_SKY] = GBOpenInternal("Sky-Globals"); -} - -static void GBClose() { - if (gVars->globals[GBVARS_SCUMM]) - DmCloseDatabase(gVars->globals[GBVARS_SCUMM]); - if (gVars->globals[GBVARS_SIMON]) - DmCloseDatabase(gVars->globals[GBVARS_SIMON]); - if (gVars->globals[GBVARS_SKY]) - DmCloseDatabase(gVars->globals[GBVARS_SKY]); -} - -void *GBGetRecord(UInt16 index, UInt16 id) { - if (gVars->globals[id]) { - MemHandle recordH = DmQueryRecord(gVars->globals[id], index); - if (recordH) - return MemHandleLock(recordH); - } - return NULL; -} - -void GBReleaseRecord(UInt16 index, UInt16 id) { - if (gVars->globals[id]) { - MemHandle recordH = DmQueryRecord(gVars->globals[id], index); - if (recordH) - MemHandleUnlock(recordH); - } -} - ///////////////////////////////////////////////////////////////////////// -static DmOpenRef SknOpenSkin() { - return DmOpenDatabase(gPrefs->skin.cardNo, gPrefs->skin.dbID, dmModeReadOnly); -} - -static void SknCloseSkin(DmOpenRef skinDBP) { - if (skinDBP) - DmCloseDatabase(skinDBP); -} -/* -static void SknSetPalette() { - - UInt16 palIndex; - ColorTableType *palTemp; - MemHandle palH; - - DmOpenRef skinDBP = SknOpenSkin(); - - if (skinDBP) { - palIndex = DmFindResource (skinDBP, colorTableRsc, skinPalette, NULL); - - if (palIndex != 0xFFFF) { - palH = DmGetResourceIndex(skinDBP, palIndex); - - if (palH) { - palTemp = (ColorTableType *)MemHandleLock(palH); - WinPalette(winPaletteSet, 0, 256, ColorTableEntries(palTemp)); - MemPtrUnlock(palTemp); - DmReleaseResource(palH); - } - } - } - - SknCloseSkin(skinDBP); - -} -*/ -static void SknGetListColors(DmOpenRef skinDBP, DmResID resID, UInt8 *text, UInt8 *selected, UInt8 *background) { - UInt16 colIndex; - MemHandle colH; - UInt8 *colTemp; - - // default - *text = UIColorGetTableEntryIndex (UIMenuForeground); - *selected = UIColorGetTableEntryIndex (UIMenuSelectedForeground); - *background = UIColorGetTableEntryIndex (UIMenuSelectedFill); - - if (skinDBP) { - colIndex = DmFindResource (skinDBP, sknColorsRsc, resID, NULL); - - if (colIndex != (UInt16)-1) { - colH = DmGetResourceIndex(skinDBP, colIndex); - - if (colH) { - colTemp = (UInt8 *)MemHandleLock(colH); - - *text = colTemp[0]; - *selected = colTemp[1]; - *background = colTemp[2]; - - MemPtrUnlock(colTemp); - DmReleaseResource(colH); - } - } - } -} - -static void SknGetObjectBounds(DmOpenRef skinDBP, DmResID resID, RectangleType *rP) { - - UInt16 bmpIndex, strIndex; - MemHandle hBmp, hStr; - BitmapType *bmpTemp; - UInt8 *strTemp; - - RctSetRectangle(rP, 0, 0, 0, 0); - - if (skinDBP) { - bmpIndex = DmFindResource (skinDBP, bitmapRsc, resID, NULL); - - if (bmpIndex != (UInt16)-1) { // if bmp exists - strIndex = DmFindResource (skinDBP, sknPosRsc, resID, NULL); - - if (strIndex != (UInt16)-1) { // if params exist - hBmp = DmGetResourceIndex(skinDBP,bmpIndex); - - if (hBmp) { - hStr = DmGetResourceIndex(skinDBP,strIndex); - - if (hStr) { - // buttons : state|x|y|w/h slider|draw mode|x1/y1 keep|x2/y2 keep slider - // list (160mode) : state|x|y|w|h| - bmpTemp = (BitmapType *)MemHandleLock(hBmp); - strTemp = (UInt8 *)MemHandleLock(hStr); - - BmpGlueGetDimensions(bmpTemp, &(rP->extent.x), &(rP->extent.y), 0); - rP->topLeft.x = strTemp[sknInfoPosX] * 2; - rP->topLeft.y = strTemp[sknInfoPosY] * 2; - - MemPtrUnlock(strTemp); - DmReleaseResource(hStr); - } - - MemPtrUnlock(bmpTemp); - DmReleaseResource(hBmp); - } - } - } - } -} - -static UInt8 SknGetState(DmOpenRef skinDBP, DmResID resID) { - - UInt16 index; - MemHandle hStr; - UInt8 *strTemp; - UInt8 oldState = sknStateDisabled; - - if (skinDBP) { - index = DmFindResource (skinDBP, sknPosRsc, resID, NULL); - - if (index != (UInt16)-1) { - hStr = DmGetResourceIndex(skinDBP, index); - - if (hStr) { - strTemp = (UInt8 *)MemHandleLock(hStr); - oldState = strTemp[sknInfoState]; - MemPtrUnlock(strTemp); - DmReleaseResource(hStr); - } - } - } - - return oldState; -} - -static UInt8 SknSetState(DmOpenRef skinDBP, DmResID resID, UInt8 newState) { - - UInt16 index; - MemHandle hStr; - UInt8 *strTemp; - UInt8 oldState = 0; - - if (skinDBP) { - index = DmFindResource (skinDBP, sknPosRsc, resID, NULL); - - if (index != (UInt16)-1) { - hStr = DmGetResourceIndex(skinDBP, index); - - if (hStr) { - strTemp = (UInt8 *)MemHandleLock(hStr); - oldState = strTemp[sknInfoState]; - - if (oldState != newState) { - DmWrite(strTemp, 0, &newState, 1); - } - - MemPtrUnlock(strTemp); - DmReleaseResource(hStr); - } - } - } - - return oldState; -} - -static void SknCopyBits(DmOpenRef skinDBP, DmResID bitmapID, const RectangleType *srcRect, Coord destX, Coord destY, Boolean standard) { - MemHandle hTemp; - BitmapPtr bmpTemp; - UInt16 index; - UInt8 *bmpData; -// Err e; - - Coord cx, cy, cw, ch, bw, bh; - UInt8 *dst, *src; - - if (skinDBP) { - // find the bitmap - index = DmFindResource (skinDBP, bitmapRsc, bitmapID, NULL); - - if (index != (UInt16)-1) { - hTemp = DmGetResourceIndex(skinDBP,index); - - if (hTemp) { - bmpTemp = (BitmapType *)MemHandleLock(hTemp); - BmpGlueGetDimensions(bmpTemp, &bw, &bh, 0); - - if (!srcRect) - { - cx = 0; - cy = 0; - cw = bw; - ch = bh; - } - else - { - cx = srcRect->topLeft.x; - cy = srcRect->topLeft.y; - cw = srcRect->extent.x; - ch = srcRect->extent.y; - } - - if (ch) { - Coord picth = gVars->screenFullWidth; - dst = (UInt8 *)BmpGetBits(WinGetBitmap(WinGetDisplayWindow())); - - dst+= destX + destY * picth; - bmpData = (UInt8 *)BmpGetBits(bmpTemp); - src = bmpData + cx + cy * bw; - - do { - MemMove(dst, src, cw); - dst += picth; - src += bw; - } while (--ch); - } - - MemPtrUnlock(bmpTemp); - DmReleaseResource(hTemp); - } - } - } -} - -static void SknShowObject(DmOpenRef skinDBP, DmResID resID) { - - RectangleType r; - UInt8 state = SknGetState(skinDBP, resID); - SknGetObjectBounds(skinDBP, resID, &r); - SknCopyBits(skinDBP, resID + state, NULL, r.topLeft.x, r.topLeft.y, 0); -} - -static UInt16 SknCheckClick(DmOpenRef skinDBP, Coord mx, Coord my) -{ - UInt16 resID; - RectangleType r; - - mx *= 2; - my *= 2; - - if (skinDBP) { - for (resID = 1100; resID <= 7000; resID += 100) { - if (SknGetState(skinDBP, resID) != sknStateDisabled) { - SknGetObjectBounds(skinDBP, resID, &r); - if (RctPtInRectangle(mx, my, &r)) { - return resID; - } - } - } - - } - - return 0; -} - - -// Callback for ExgDBWrite to send data with Exchange Manager -static Err WriteDBData(const void* dataP, UInt32* sizeP, void* userDataP) -{ - Err err; - *sizeP = ExgSend((ExgSocketPtr)userDataP, (void*)dataP, *sizeP, &err); - return err; -} - -static Err SendDatabase (UInt16 cardNo, LocalID dbID, Char *nameP, Char *descriptionP) -{ - ExgSocketType exgSocket; - Err err; - - // Create exgSocket structure - MemSet(&exgSocket, sizeof(exgSocket), 0); - exgSocket.description = descriptionP; - exgSocket.name = nameP; - - // Start an exchange put operation - err = ExgPut(&exgSocket); - if (!err) { - err = ExgDBWrite(WriteDBData, &exgSocket, NULL, dbID, cardNo); - err = ExgDisconnect(&exgSocket, err); - } - - return err; -} - -static Err BeamMe() { - - UInt16 cardNo; - LocalID dbID; - Err err; - - err = SysCurAppDatabase(&cardNo, &dbID); - if (dbID) - err = SendDatabase(0, dbID, "ScummVM.prc", "\nPlay your favorite LucasArts games"); - else - err = DmGetLastErr(); - - return err; -} - -/*********************************************************************** - * - * FUNCTION: RomVersionCompatible - * - * DESCRIPTION: This routine checks that a ROM version is meet your - * minimum requirement. - * - * PARAMETERS: requiredVersion - minimum rom version required - * (see sysFtrNumROMVersion in SystemMgr.h - * for format) - * launchFlags - flags that indicate if the application - * UI is initialized. - * - * RETURNED: error code or zero if rom is compatible - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static Err RomVersionCompatible(UInt32 requiredVersion, UInt16 launchFlags) -{ - UInt32 romVersion; - - // See if we're on in minimum required version of the ROM or later. - FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion); - if (romVersion < requiredVersion) - { - if ((launchFlags & (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp)) == - (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp)) - { - FrmAlert (RomIncompatibleAlert); - - // Palm OS 1.0 will continuously relaunch this app unless we switch to - // another safe one. - if (romVersion <= kPalmOS10Version) - { - AppLaunchWithCommand(sysFileCDefaultApp, sysAppLaunchCmdNormalLaunch, NULL); - } - } - return sysErrRomIncompatible; - } - - return errNone; -} - - -/*********************************************************************** - * - * FUNCTION: GetObjectPtr - * - * DESCRIPTION: This routine returns a pointer to an object in the current - * form. - * - * PARAMETERS: formId - id of the form to display - * - * RETURNED: void * - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static void * GetObjectPtr(UInt16 objectID) -{ - FormPtr frmP; - - frmP = FrmGetActiveForm(); - return FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, objectID)); -} - -static void FrmList(EventPtr eventP, UInt16 objectID) -{ - ListType *listP; - UInt16 listItem; - - listP = (ListType *)GetObjectPtr(objectID); - listItem = LstPopupList(listP); - CtlSetLabel(eventP->data.ctlSelect.pControl, LstGetSelectionText(listP, LstGetSelection(listP))); -} - -//############################################################################# -//############################################################################# - -enum { - IcnNone = 255, - IcnInfo = 0, - IcnEdit = 1, - IcnDelt = 2, - IcnVibr = 3, - IcnAOff = 4, - IcnPlay = 5 -}; - -enum { - ArwNone = 255, - ArwUp = 0, - ArwFUp = 1, - ArwFDwn = 2, - ArwDown = 3 -}; - -//############################################################################# -//############################################################################# -static Err GamOpenDatabase() { - Err err = errNone; - - _dbP = DmOpenDatabaseByTypeCreator( 'DATA', appFileCreator, dmModeReadWrite); - - if (!_dbP) { - err = DmCreateDatabase(0, "ScummVM-Data", appFileCreator, 'DATA', false); - if (!err) { - _dbP = DmOpenDatabaseByTypeCreator( 'DATA', appFileCreator, dmModeReadWrite); - - if (!_dbP) - err = DmGetLastErr(); - } - } - - if (err) - FrmCustomAlert(FrmErrorAlert,"Cannot open/create games list DB !",0,0); - return err; -} - -static void GamCloseDatabase(Boolean ignoreCardParams) { - if (_dbP) { - LocalID dbID; - UInt16 cardNo; - - DmOpenDatabaseInfo(_dbP, &dbID, 0, 0, &cardNo, 0); - DmCloseDatabase(_dbP); - - if (!ignoreCardParams) { - if (gPrefs->card.moveDB && gPrefs->card.volRefNum != sysInvalidRefNum) { - VFSFileRename(gPrefs->card.volRefNum, "/Palm/Programs/ScummVM/listdata.pdb", "listdata-old.pdb"); - Err e = VFSExportDatabaseToFile(gPrefs->card.volRefNum, "/Palm/Programs/ScummVM/listdata.pdb", cardNo, dbID); - if (!e) { - VFSFileDelete(gPrefs->card.volRefNum, "/Palm/Programs/ScummVM/listdata-old.pdb"); - if (gPrefs->card.deleteDB) - DmDeleteDatabase(cardNo, dbID); - } else { - VFSFileRename(gPrefs->card.volRefNum, "/Palm/Programs/ScummVM/listdata-old.pdb", "listdata.pdb"); - } - } - } - } - _dbP = NULL; -} - -static Int16 GamCompare(GameInfoType *a, GameInfoType *b, SortRecordInfoPtr, SortRecordInfoPtr, MemHandle) { - return StrCompare(a->nameP, b->nameP); -} -static Err GamSortList() { - return DmQuickSort (_dbP, (DmComparF *)GamCompare, 0); -} - - -static UInt16 GamGetSelected() -{ - MemHandle record; - GameInfoType *game; - Boolean selected; - UInt16 index = DmNumRecords(_dbP)-1; - - while (index != (UInt16)-1) { - record = DmQueryRecord(_dbP, index); - game = (GameInfoType *)MemHandleLock(record); - selected = game->selected; - MemHandleUnlock(record); - - if (selected) - return index; - - index--; - } - - return dmMaxRecordIndex; -} -static void GamUnselect() { - GameInfoType modGame; - GameInfoType *game; - - MemHandle recordH; - UInt16 index; - - index = GamGetSelected(); - - if (index != dmMaxRecordIndex) { - recordH = DmGetRecord(_dbP, index); - game = (GameInfoType *)MemHandleLock(recordH); - - MemMove(&modGame, game, sizeof(GameInfoType)); - modGame.selected = !modGame.selected; - DmWrite(game, 0, &modGame, sizeof(GameInfoType)); - - MemHandleUnlock(recordH); - DmReleaseRecord (_dbP, index, 0); - } -} - -static void IcnRedrawTools(DmOpenRef skinDBP) -{ - if (GamGetSelected() == dmMaxRecordIndex) { - if (SknGetState(skinDBP, skinButtonGameDelete) == sknStateNormal) { - SknSetState(skinDBP, skinButtonGameDelete,sknStateDisabled); - SknShowObject(skinDBP, skinButtonGameDelete); - } - if (SknGetState(skinDBP, skinButtonGameEdit) == sknStateNormal) { - SknSetState(skinDBP, skinButtonGameEdit,sknStateDisabled); - SknShowObject(skinDBP, skinButtonGameEdit); - } - - } else { - if (SknGetState(skinDBP, skinButtonGameDelete) == sknStateDisabled) { - SknSetState(skinDBP, skinButtonGameDelete,sknStateNormal); - SknShowObject(skinDBP, skinButtonGameDelete); - } - if (SknGetState(skinDBP, skinButtonGameEdit) == sknStateDisabled) { - SknSetState(skinDBP, skinButtonGameEdit,sknStateNormal); - SknShowObject(skinDBP, skinButtonGameEdit); - } - } -} - -static void ArwRedrawSlider(DmOpenRef skinDBP, UInt16 index, UInt16 maxIndex, UInt16 perPage) -{ - if (maxIndex <= perPage) { - if (SknGetState(skinDBP,skinSliderUpArrow) != sknStateDisabled) { - SknSetState(skinDBP,skinSliderUpArrow,sknStateDisabled); - SknShowObject(skinDBP,skinSliderUpArrow); - } - if (SknGetState(skinDBP,skinSliderDownArrow) != sknStateDisabled) { - SknSetState(skinDBP,skinSliderDownArrow,sknStateDisabled); - SknShowObject(skinDBP,skinSliderDownArrow); - } - - } else { - if (SknGetState(skinDBP,skinSliderUpArrow) == sknStateDisabled) { - SknSetState(skinDBP,skinSliderUpArrow,sknStateNormal); - SknShowObject(skinDBP,skinSliderUpArrow); - } - if (SknGetState(skinDBP,skinSliderDownArrow) == sknStateDisabled) { - SknSetState(skinDBP,skinSliderDownArrow,sknStateNormal); - SknShowObject(skinDBP,skinSliderDownArrow); - } - } -} - -static void GamGetListBounds(RectangleType *rAreaP, RectangleType *rArea2xP) { - DmOpenRef skinDBP; - UInt16 strIndex; - MemHandle hStr; - UInt8 *strTemp; - UInt16 x,y,w,h; - - skinDBP = DmOpenDatabase(gPrefs->skin.cardNo, gPrefs->skin.dbID, dmModeReadOnly); - if (skinDBP) { - strIndex = DmFindResource (skinDBP, sknPosRsc, skinList, NULL); - - if (strIndex != (UInt16)-1) { // if params exist - hStr = DmGetResourceIndex(skinDBP,strIndex); - if (hStr) { - strTemp = (UInt8 *)MemHandleLock(hStr); - - x = strTemp[sknInfoPosX]; - y = strTemp[sknInfoPosY]; - w = strTemp[sknInfoListWidth]; - h = strTemp[sknInfoListSize] * sknInfoListItemSize; - - if (rAreaP) - RctSetRectangle(rAreaP ,x, y, w, h); - if (rArea2xP) - RctSetRectangle(rArea2xP, x+x, y+y, w+w, h+h); - - MemHandleUnlock(hStr); - DmReleaseResource(hStr); - - } - } - - DmCloseDatabase(skinDBP); - } -} - -static void GamUpdateList() { - MemHandle record; - UInt16 index, maxIndex, maxView; - GameInfoType *game; - RectangleType rArea, rField, rCopy, rArea2x; - DmOpenRef skinDBP; - - UInt8 txtColor, norColor, selColor, bkgColor; - UInt16 x,y; - - WinScreenLock(winLockCopy); - GamGetListBounds(&rArea, &rArea2x); - skinDBP = SknOpenSkin(); - // set default bg - WinSetForeColor(UIColorGetTableEntryIndex (UIFormFill)); - WinDrawRectangle(&rArea,0); - // copy top bg - SknGetObjectBounds(skinDBP, skinBackgroundImageTop, &rField); - RctGetIntersection(&rArea2x, &rField, &rCopy); - x = rCopy.topLeft.x; - y = rCopy.topLeft.y; - rCopy.topLeft.x -= rField.topLeft.x; - rCopy.topLeft.y -= rField.topLeft.y; - SknCopyBits(skinDBP, skinBackgroundImageTop, &rCopy, x, y, 0); - // copy bottom bg - SknGetObjectBounds(skinDBP, skinBackgroundImageBottom, &rField); - RctGetIntersection(&rArea2x, &rField, &rCopy); - x = rCopy.topLeft.x; - y = rCopy.topLeft.y; - rCopy.topLeft.x -= rField.topLeft.x; - rCopy.topLeft.y -= rField.topLeft.y; - SknCopyBits(skinDBP, skinBackgroundImageBottom, &rCopy, x, y, 0); - - FntSetFont(stdFont); - - index = gPrefs->listPosition; - maxIndex = DmNumRecords(_dbP); - maxView = rArea.extent.y / sknInfoListItemSize; - - if (index > 0 && (index+maxView) > maxIndex) { - index -= (index+maxView) - maxIndex; - gPrefs->listPosition = index; - } - ArwRedrawSlider(skinDBP, index, maxIndex, maxView); - IcnRedrawTools(skinDBP); - SknGetListColors(skinDBP, skinColors, &norColor, &selColor, &bkgColor); - - SknCloseSkin(skinDBP); - - while (index < (gPrefs->listPosition + maxView) && index < maxIndex) { - record = DmQueryRecord(_dbP, index); - game = (GameInfoType *)MemHandleLock(record); - - // text box - RctSetRectangle(&rField, rArea.topLeft.x, (rArea.topLeft.y + sknInfoListItemSize * (index - gPrefs->listPosition)), rArea.extent.x, sknInfoListItemSize); - WinSetClip(&rField); - - if (game->selected) { - WinSetDrawMode(winPaint); - WinSetForeColor(bkgColor); - WinDrawRectangle(&rField,0); - txtColor = selColor; - } - else - txtColor = norColor; - - // clipping - rField.topLeft.x += 2; - rField.extent.x -= 4; - WinSetClip(&rField); - // draw text mask - WinSetTextColor(255); - WinSetDrawMode(winMask); - WinPaintChars(game->nameP, StrLen(game->nameP), rField.topLeft.x, rField.topLeft.y); - // draw text - if (txtColor) { - WinSetTextColor(txtColor); - WinSetDrawMode(winOverlay); - WinPaintChars(game->nameP, StrLen(game->nameP), rField.topLeft.x, rField.topLeft.y); - } - MemHandleUnlock(record); - index++; - } - - RctSetRectangle(&rArea,0,0,160,160); - WinSetClip(&rArea); - WinScreenUnlock(); -} - -static void GamImportDatabase(Boolean updateList) { - if (gPrefs->card.volRefNum != sysInvalidRefNum && gPrefs->card.moveDB) { - FileRef file; - Err e; - - e = VFSFileOpen(gPrefs->card.volRefNum, "/Palm/Programs/ScummVM/listdata.pdb", vfsModeRead, &file); - if (!e) { - UInt16 oCardNo, nCardNo; - LocalID oDbID, nDbID; - UInt32 type = 'ODAT'; // change the type to avoid the old db to be loaded in case of crash - - VFSFileClose(file); - if (gPrefs->card.confirmMoveDB) - if (FrmCustomAlert(FrmConfirmAlert, "Do you want to import games database from memory card ?", 0, 0) == FrmConfirmNo) { - // prevent to replace the file on memory card - gPrefs->card.moveDB = false; - return; - } - - // get current db info and rename it - DmOpenDatabaseInfo(_dbP, &oDbID, 0, 0, &oCardNo, 0); - GamCloseDatabase(true); - DmSetDatabaseInfo(oCardNo, oDbID, "ScummVM-Data-old.pdb", 0, 0, 0, 0, 0, 0, 0, 0, &type, 0); - - e = VFSImportDatabaseFromFile(gPrefs->card.volRefNum, "/Palm/Programs/ScummVM/listdata.pdb", &nCardNo, &nDbID); - if (e) { - type = 'DATA'; - FrmCustomAlert(FrmErrorAlert, "Failed to import games database from memory card.", 0, 0); - DmSetDatabaseInfo(oCardNo, oDbID, "ScummVM-Data.pdb", 0, 0, 0, 0, 0, 0, 0, 0, &type, 0); - } else { - // in OS5 the localID may change ... ? (cause Free Handle error) - oDbID = DmFindDatabase (oCardNo, "ScummVM-Data-old.pdb"); - DmDeleteDatabase(oCardNo, oDbID); - } - GamOpenDatabase(); - if (updateList) - GamUpdateList(); - } - } -} - -static Boolean ArwProcessAction(UInt16 button) -{ - Boolean handled = false; - - switch (button) { - case skinSliderUpArrow: - if (gPrefs->listPosition > 0) { - gPrefs->listPosition--; - GamUpdateList(); - } - handled = true; - break; - - case skinSliderDownArrow: - RectangleType rArea; - UInt16 maxView; - - GamGetListBounds(&rArea, 0); - maxView = rArea.extent.y / sknInfoListItemSize; - - if (gPrefs->listPosition < DmNumRecords(_dbP)-maxView) { - gPrefs->listPosition++; - GamUpdateList(); - } - handled = true; - break; - } - - return handled; -} - -static void GamSelect(Coord x, Coord y) { - RectangleType rArea; - UInt16 x1,y1,x2,y2; - - GamGetListBounds(&rArea,0); - x1 = rArea.topLeft.x; - x2 = rArea.topLeft.x + rArea.extent.x - 1; - y1 = rArea.topLeft.y; - y2 = rArea.topLeft.y + rArea.extent.y - 1; - - if (y >= y1 && y <= y2 && x >= x1 && x <= x2) { - UInt16 index; - MemHandle record; - GameInfoType *game; - UInt16 oldIndex; - - index = (y - y1) / sknInfoListItemSize + gPrefs->listPosition; - - if (index == _lstIndex) - return; - - if (index < DmNumRecords(_dbP)) - { - GameInfoType modGame; - - oldIndex = GamGetSelected(); - record = DmGetRecord(_dbP, index); - game = (GameInfoType *)MemHandleLock(record); - - MemMove(&modGame, game, sizeof(GameInfoType)); - modGame.selected = !modGame.selected; - DmWrite(game, 0, &modGame, sizeof(GameInfoType)); - - MemHandleUnlock(record); - DmReleaseRecord (_dbP, index, 0); - - if (oldIndex != index && oldIndex != dmMaxRecordIndex) { - record = DmGetRecord(_dbP, oldIndex); - game = (GameInfoType *)MemHandleLock(record); - - MemMove(&modGame, game, sizeof(GameInfoType)); - modGame.selected = false; - DmWrite(game, 0, &modGame, sizeof(GameInfoType)); - - MemHandleUnlock(record); - DmReleaseRecord (_dbP, oldIndex, 0); - } - - _lstIndex = index; - GamUpdateList(); - } - } -} - -static void EditGameFormDelete(Boolean direct) { - UInt16 index = GamGetSelected(); - - if (index == dmMaxRecordIndex) { - FrmCustomAlert(FrmWarnAlert, "Select an entry first.",0,0); - return; - - } else if (FrmCustomAlert(FrmConfirmAlert, "Do you really want to delete this entry ?", 0, 0) == FrmConfirmYes) { - DmRemoveRecord(_dbP, index); - if (!direct) - FrmReturnToMain(); - GamSortList(); - GamUpdateList(); - } -} - -static void FldTrimText(FieldType * fldP) { - MemHandle tmpH; - Char *tmpP; - - tmpH = FldGetTextHandle(fldP); - FldSetTextHandle(fldP, NULL); - tmpP = (Char *)MemHandleLock(tmpH); - TxtGlueStripSpaces(tmpP, true, true); - MemHandleUnlock(tmpH); - FldSetTextHandle(fldP, tmpH); -} - - -/*********************************************************************** - * - * FUNCTION: EditGameFormSave - * FUNCTION: EditGameFormInit - * FUNCTION: EditGameFormHandleEvent - * - * DESCRIPTION: - * - * REVISION HISTORY: - * - * - ***********************************************************************/ - -static void EditGameFormSave(UInt16 index) { - - FieldType *fld1P, *fld2P, *fld3P, *fld4P, *fld5P, *fld6P; // need to change this with good names - ControlType *cck1P, *cck2P, *cck3P, *cck4P, *cck5P; - ListType *list1P, *list2P; - FormPtr frmP; - - MemHandle recordH; - GameInfoType *gameInfo, newGameInfo; -// UInt16 index; - - list1P = (ListType *)GetObjectPtr(EditGameGfxListList); - list2P = (ListType *)GetObjectPtr(EditGameLanguageList); - fld1P = (FieldType *)GetObjectPtr(EditGameEntryNameField); - fld2P = (FieldType *)GetObjectPtr(EditGamePathField); - fld3P = (FieldType *)GetObjectPtr(EditGameGameField); - fld4P = (FieldType *)GetObjectPtr(EditGameLoadSlotField); - fld5P = (FieldType *)GetObjectPtr(EditGameStartRoomField); - fld6P = (FieldType *)GetObjectPtr(EditGameTalkSpeedField); - - cck1P = (ControlType *)GetObjectPtr(EditGameLoadSlotCheckbox); - cck2P = (ControlType *)GetObjectPtr(EditGameStartRoomCheckbox); - cck3P = (ControlType *)GetObjectPtr(EditGameAmigaCheckbox); - cck4P = (ControlType *)GetObjectPtr(EditGameSubtitlesCheckbox); - cck5P = (ControlType *)GetObjectPtr(EditGameTalkSpeedCheckbox); - - frmP = FrmGetActiveForm(); - - FldTrimText(fld1P); - FldTrimText(fld2P); - FldTrimText(fld3P); - - if (FldGetTextLength(fld1P) == 0) { - FrmCustomAlert(FrmWarnAlert,"You must specified an entry name.",0,0); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, EditGameEntryNameField)); - return; - } else if (FldGetTextLength(fld2P) == 0) { - FrmCustomAlert(FrmWarnAlert,"You must specified a path.",0,0); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, EditGamePathField)); - return; - } else if (FldGetTextLength(fld3P) == 0) { - FrmCustomAlert(FrmWarnAlert,"You must specified a game.",0,0); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, EditGameGameField)); - return; - } else if (FldGetTextLength(fld5P) == 0 && CtlGetValue(cck2P) == 1) { - FrmCustomAlert(FrmWarnAlert,"You must specified a room number.",0,0); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, EditGameStartRoomField)); - return; - } else if (FldGetTextLength(fld6P) == 0 && CtlGetValue(cck5P) == 1) { - FrmCustomAlert(FrmWarnAlert,"You must specified a talk speed.",0,0); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, EditGameTalkSpeedField)); - return; - } - - if (FldGetTextPtr(fld2P)[FldGetTextLength(fld2P)-1] != '/') { - FldGetTextPtr(fld2P)[FldGetTextLength(fld2P)+0] = '/'; - FldGetTextPtr(fld2P)[FldGetTextLength(fld2P)+1] = 0; - } - -// index = GamGetSelected(); - - if (index != dmMaxRecordIndex) { - recordH = DmGetRecord(_dbP, index); - } else { - index = dmMaxRecordIndex; - GamUnselect(); - recordH = DmNewRecord(_dbP, &index, sizeof(GameInfoType)); - } - - gameInfo = (GameInfoType *)MemHandleLock(recordH); - - StrCopy(newGameInfo.nameP, FldGetTextPtr(fld1P)); - StrCopy(newGameInfo.pathP, FldGetTextPtr(fld2P)); - StrCopy(newGameInfo.gameP, FldGetTextPtr(fld3P)); - newGameInfo.gfxMode = LstGetSelection(list1P); - newGameInfo.language = LstGetSelection(list2P); - newGameInfo.selected = true; - newGameInfo.autoLoad = CtlGetValue(cck1P); - newGameInfo.loadSlot = StrAToI(FldGetTextPtr(fld4P)); - newGameInfo.autoRoom = CtlGetValue(cck2P); - newGameInfo.roomNum = StrAToI(FldGetTextPtr(fld5P)); - newGameInfo.amiga = CtlGetValue(cck3P); - newGameInfo.subtitles = !(CtlGetValue(cck4P)); - newGameInfo.talkValue = StrAToI(FldGetTextPtr(fld6P)); - newGameInfo.talkSpeed = CtlGetValue(cck5P); - - DmWrite(gameInfo, 0, &newGameInfo, sizeof(GameInfoType)); - - MemHandleUnlock(recordH); - DmReleaseRecord (_dbP, index, 0); - GamSortList(); - // update list position - { - RectangleType rArea; - UInt16 posIndex, maxIndex, maxView; - - // get the sorted index - index = GamGetSelected(); - // if new item is out of the list bounds, change current list pos - GamGetListBounds(&rArea, NULL); - maxView = rArea.extent.y / sknInfoListItemSize; - posIndex = gPrefs->listPosition; - maxIndex = DmNumRecords(_dbP); - - if (index == 0 && posIndex > 0) { - gPrefs->listPosition = 0; - } else if ((maxView + posIndex) <= index) { - posIndex = index - (maxView - posIndex) + 1; - gPrefs->listPosition = posIndex; - } - } - - FrmReturnToMain(); - GamUpdateList(); -} - -static void EditGameFormInit(UInt16 index) { - - FieldType *fld1P, *fld2P, *fld3P, *fld4P, *fld5P, *fld6P; - FormPtr frmP; - ListType *list1P, *list2P; - - Char *nameP, *pathP, *gameP, *loadP, *roomP, *talkP; - MemHandle nameH, pathH, gameH, loadH, roomH, talkH; - - MemHandle recordH = NULL; - GameInfoType *game; - - list1P = (ListType *)GetObjectPtr(EditGameGfxListList); - list2P = (ListType *)GetObjectPtr(EditGameLanguageList); - fld1P = (FieldType *)GetObjectPtr(EditGameEntryNameField); - fld2P = (FieldType *)GetObjectPtr(EditGamePathField); - fld3P = (FieldType *)GetObjectPtr(EditGameGameField); - fld4P = (FieldType *)GetObjectPtr(EditGameLoadSlotField); - fld5P = (FieldType *)GetObjectPtr(EditGameStartRoomField); - fld6P = (FieldType *)GetObjectPtr(EditGameTalkSpeedField); - - nameH = MemHandleNew(FldGetMaxChars(fld1P)); - pathH = MemHandleNew(FldGetMaxChars(fld2P)); - gameH = MemHandleNew(FldGetMaxChars(fld3P)); - loadH = MemHandleNew(FldGetMaxChars(fld4P)); - roomH = MemHandleNew(FldGetMaxChars(fld5P)); - talkH = MemHandleNew(FldGetMaxChars(fld6P)); - - nameP = (Char *)MemHandleLock(nameH); - pathP = (Char *)MemHandleLock(pathH); - gameP = (Char *)MemHandleLock(gameH); - loadP = (Char *)MemHandleLock(loadH); - roomP = (Char *)MemHandleLock(roomH); - talkP = (Char *)MemHandleLock(talkH); - -// index = GamGetSelected(); - - if (index != dmMaxRecordIndex) { - recordH = DmQueryRecord(_dbP, index); - game = (GameInfoType *)MemHandleLock(recordH); - StrCopy(nameP, game->nameP); - StrCopy(pathP, game->pathP); - StrCopy(gameP, game->gameP); - - LstSetSelection(list1P, game->gfxMode); - LstSetSelection(list2P, game->language); - - StrIToA(loadP, game->loadSlot); - StrIToA(roomP, game->roomNum); - StrIToA(talkP, game->talkValue); - - CtlSetValue((ControlType *)GetObjectPtr(EditGameLoadSlotCheckbox), game->autoLoad); - CtlSetValue((ControlType *)GetObjectPtr(EditGameStartRoomCheckbox), game->autoRoom); - CtlSetValue((ControlType *)GetObjectPtr(EditGameAmigaCheckbox), game->amiga); - CtlSetValue((ControlType *)GetObjectPtr(EditGameSubtitlesCheckbox), !game->subtitles); - CtlSetValue((ControlType *)GetObjectPtr(EditGameTalkSpeedCheckbox), game->talkSpeed); - - MemHandleUnlock(recordH); - CtlSetUsable((ControlType *)GetObjectPtr(EditGameDeleteButton),true); - } - else { - MemSet(nameP,MemHandleSize(nameH),0); - MemSet(pathP,MemHandleSize(pathH),0); - MemSet(gameP,MemHandleSize(gameH),0); - - StrIToA(loadP, 0); - StrIToA(roomP, 0); - StrIToA(talkP, 60); - - CtlSetValue((ControlType *)GetObjectPtr(EditGameLoadSlotCheckbox), 0); - CtlSetValue((ControlType *)GetObjectPtr(EditGameStartRoomCheckbox), 0); - CtlSetValue((ControlType *)GetObjectPtr(EditGameAmigaCheckbox), 0); - CtlSetValue((ControlType *)GetObjectPtr(EditGameSubtitlesCheckbox), 0); - CtlSetValue((ControlType *)GetObjectPtr(EditGameTalkSpeedCheckbox), 0); - - LstSetSelection(list1P, 1); - LstSetSelection(list2P, 0); - CtlSetUsable((ControlType *)GetObjectPtr(EditGameDeleteButton),false); - } - - MemHandleUnlock(nameH); - MemHandleUnlock(pathH); - MemHandleUnlock(gameH); - MemHandleUnlock(loadH); - MemHandleUnlock(roomH); - MemHandleUnlock(talkH); - - FldSetTextHandle(fld1P, nameH); - FldSetTextHandle(fld2P, pathH); - FldSetTextHandle(fld3P, gameH); - FldSetTextHandle(fld4P, loadH); - FldSetTextHandle(fld5P, roomH); - FldSetTextHandle(fld6P, talkH); - - CtlSetLabel((ControlType *)GetObjectPtr(EditGameGfxPopupPopTrigger), LstGetSelectionText(list1P, LstGetSelection(list1P))); - CtlSetLabel((ControlType *)GetObjectPtr(EditGameLanguagePopTrigger), LstGetSelectionText(list2P, LstGetSelection(list2P))); - - frmP = FrmGetActiveForm(); - FrmDrawForm(frmP); -} - -static Boolean EditGameFormHandleEvent(EventPtr eventP) -{ - Boolean handled = false; - - switch (eventP->eType) { - case frmOpenEvent: - switch (__editMode__) { - case edtModeAdd: - EditGameFormInit(dmMaxRecordIndex); - break; - case edtModeEdit: - case edtModeParams: - default : - EditGameFormInit(GamGetSelected()); - break; - } - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case EditGameOKButton: - switch (__editMode__) { - case edtModeAdd: - EditGameFormSave(dmMaxRecordIndex); - break; - case edtModeEdit: - case edtModeParams: - default : - EditGameFormSave(GamGetSelected()); - break; - } - break; - - case EditGameCancelButton: - FrmReturnToMain(); - break; - - case EditGameDeleteButton: - EditGameFormDelete(false); - break; - - case EditGameGfxPopupPopTrigger: - FrmList(eventP, EditGameGfxListList); - break; - - case EditGameLanguagePopTrigger: - FrmList(eventP, EditGameLanguageList); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} - -/*********************************************************************** - * - * FUNCTION: SystemInfoFormInit - * FUNCTION: SystemInfoFormHandleEvent - * - * DESCRIPTION: - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static void GetMemory(UInt32* storageMemoryP, UInt32* dynamicMemoryP, UInt32 *storageFreeP, UInt32 *dynamicFreeP) { - UInt32 free, max; - - Int16 i; - Int16 nCards; - UInt16 cardNo; - UInt16 heapID; - - UInt32 storageMemory = 0; - UInt32 dynamicMemory = 0; - UInt32 storageFree = 0; - UInt32 dynamicFree = 0; - - // Iterate through each card to support devices with multiple cards. - nCards = MemNumCards(); - - for (cardNo = 0; cardNo < nCards; cardNo++) { - // Iterate through the RAM heaps on a card (excludes ROM). - for (i=0; i< MemNumRAMHeaps(cardNo); i++) { - // Obtain the ID of the heap. - heapID = MemHeapID(cardNo, i); - // Calculate the total memory and free memory of the heap. - MemHeapFreeBytes(heapID, &free, &max); - - // If the heap is dynamic, increment the dynamic memory total. - if (MemHeapDynamic(heapID)) { - dynamicMemory += MemHeapSize(heapID); - dynamicFree += free; - - // The heap is nondynamic (storage ?). - } else { - storageMemory += MemHeapSize(heapID); - storageFree += free; - } - } - } - // Reduce the stats to KB. Round the results. - dynamicMemory = dynamicMemory / 1024L; - storageMemory = storageMemory / 1024L; - - dynamicFree = dynamicFree / 1024L; - storageFree = storageFree / 1024L; - - if (dynamicMemoryP) *dynamicMemoryP = dynamicMemory; - if (storageMemoryP) *storageMemoryP = storageMemory; - if (dynamicFreeP) *dynamicFreeP = dynamicFree; - if (storageFreeP) *storageFreeP = storageFree; -} - -static void SystemInfoFormInit() { - FormPtr frmP; - Coord x; - UInt32 dm, sm, df, sf; - Char num[10]; - - GetMemory(&sm, &dm, &sf, &df); - frmP = FrmGetActiveForm(); - FrmDrawForm(frmP); - - WinSetTextColor(255); - FntSetFont(stdFont); - - StrIToA(num, dm); - x = 149 - FntCharsWidth(num, StrLen(num)); - WinDrawChars(num, StrLen(num), x, 30); - - StrIToA(num, sm); - x = 149 - FntCharsWidth(num, StrLen(num)); - WinDrawChars(num, StrLen(num), x, 42); - - StrIToA(num, df); - x = 109 - FntCharsWidth(num, StrLen(num)); - WinDrawChars(num, StrLen(num), x, 30); - - StrIToA(num, sf); - x = 109 - FntCharsWidth(num, StrLen(num)); - WinDrawChars(num, StrLen(num), x, 42); -} - -static Boolean SystemInfoFormHandleEvent(EventPtr eventP) { - Boolean handled = false; - - switch (eventP->eType) { - case frmOpenEvent: - SystemInfoFormInit(); - handled = true; - break; - - case ctlSelectEvent: - // OK button only - FrmReturnToMain(); - handled = true; - break; - - default: - break; - } - - return handled; -} -/*********************************************************************** - * - * FUNCTION: VolumeFormSave - * FUNCTION: VolumeFormInit - * FUNCTION: VolumeFormHandleEvent - * - * DESCRIPTION: - * - * REVISION HISTORY: - * - * - ***********************************************************************/ - -static void VolumeFormSave() { - SliderControlType *slid1P, *slid2P, *slid3P, *slid4P, *slid5P; - - slid1P = (SliderControlType *)GetObjectPtr(VolumeSpeakerSliderControl); - slid2P = (SliderControlType *)GetObjectPtr(VolumeHeadphoneSliderControl); - - slid3P = (SliderControlType *)GetObjectPtr(VolumeMasterSliderControl); - slid4P = (SliderControlType *)GetObjectPtr(VolumeMusicSliderControl); - slid5P = (SliderControlType *)GetObjectPtr(VolumeSfxSliderControl); - - CtlGetSliderValues ((ControlType *)slid1P, 0, 0, 0, &gPrefs->volume.speaker) ; - CtlGetSliderValues ((ControlType *)slid2P, 0, 0, 0, &gPrefs->volume.headphone) ; - - CtlGetSliderValues ((ControlType *)slid3P, 0, 0, 0, &gPrefs->volume.master); - CtlGetSliderValues ((ControlType *)slid4P, 0, 0, 0, &gPrefs->volume.music); - CtlGetSliderValues ((ControlType *)slid5P, 0, 0, 0, &gPrefs->volume.sfx); - - FrmReturnToMain(); -} - -static void VolumeFormInit() { - SliderControlType *slid1P, *slid2P, *slid3P, *slid4P, *slid5P; - FormPtr frmP; - UInt16 value; - - slid1P = (SliderControlType *)GetObjectPtr(VolumeSpeakerSliderControl); - slid2P = (SliderControlType *)GetObjectPtr(VolumeHeadphoneSliderControl); - - slid3P = (SliderControlType *)GetObjectPtr(VolumeMasterSliderControl); - slid4P = (SliderControlType *)GetObjectPtr(VolumeMusicSliderControl); - slid5P = (SliderControlType *)GetObjectPtr(VolumeSfxSliderControl); - - value = gPrefs->volume.speaker; - CtlSetSliderValues ((ControlType *)slid1P, 0, 0, 0, &value); - value = gPrefs->volume.headphone; - CtlSetSliderValues ((ControlType *)slid2P, 0, 0, 0, &value); - - value = gPrefs->volume.master; - CtlSetSliderValues ((ControlType *)slid3P, 0, 0, 0, &value); - value = gPrefs->volume.music; - CtlSetSliderValues ((ControlType *)slid4P, 0, 0, 0, &value); - value = gPrefs->volume.sfx; - CtlSetSliderValues ((ControlType *)slid5P, 0, 0, 0, &value); - - frmP = FrmGetActiveForm(); - FrmDrawForm(frmP); -} - -static Boolean VolumeFormHandleEvent(EventPtr eventP) { - Boolean handled = false; - - switch (eventP->eType) { - case frmOpenEvent: - VolumeFormInit(); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case VolumeOKButton: - VolumeFormSave(); - break; - - case VolumeCancelButton: - FrmReturnToMain(); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} - -static void SoundFormSave() { - ControlType *cck1P, *cck2P, *cck3P, *cck4P; - ListType *list1P; - FieldType *fld1P, *fld2P, *fld3P; - UInt8 tempo; - UInt16 firstTrack; - - cck1P = (ControlType *)GetObjectPtr(SoundMusicCheckbox); - cck2P = (ControlType *)GetObjectPtr(SoundMultiMidiCheckbox); - cck3P = (ControlType *)GetObjectPtr(SoundMP3Checkbox); - cck4P = (ControlType *)GetObjectPtr(SoundTrackLengthCheckbox); - list1P = (ListType *)GetObjectPtr(SoundDriverList); - fld1P = (FieldType *)GetObjectPtr(SoundTempoField); - fld2P = (FieldType *)GetObjectPtr(SoundLengthSecsField); - fld3P = (FieldType *)GetObjectPtr(SoundFirstTrackField); - - tempo = StrAToI(FldGetTextPtr(fld1P)); - if (tempo < 50 || tempo > 200) { - FrmCustomAlert(FrmErrorAlert, "Invalid tempo value (50...200)", 0, 0); - return; - } - - firstTrack = StrAToI(FldGetTextPtr(fld3P)); - if (firstTrack < 1 || firstTrack > 999) { - FrmCustomAlert(FrmErrorAlert, "Invalid track value (1...999)", 0, 0); - return; - } - - gPrefs->sound.music = CtlGetValue(cck1P); - gPrefs->sound.multiMidi = CtlGetValue(cck2P); - gPrefs->sound.MP3 = CtlGetValue(cck3P); - gPrefs->sound.setDefaultTrackLength = CtlGetValue(cck4P); - - gPrefs->sound.driver = LstGetSelection(list1P); - gPrefs->sound.tempo = tempo; - gPrefs->sound.defaultTrackLength = StrAToI(FldGetTextPtr(fld2P)); - gPrefs->sound.firstTrack = firstTrack; - FrmReturnToMain(); -} - -static void SoundFormInit() { - ControlType *cck1P, *cck2P, *cck3P, *cck4P; - ListType *list1P; - FieldType *fld1P, *fld2P, *fld3P; - FormPtr frmP; - MemHandle tempoH, lengthH, firstTrackH; - Char *tempoP, *lengthP, *firstTrackP; - - cck1P = (ControlType *)GetObjectPtr(SoundMusicCheckbox); - cck2P = (ControlType *)GetObjectPtr(SoundMultiMidiCheckbox); - cck3P = (ControlType *)GetObjectPtr(SoundMP3Checkbox); - cck4P = (ControlType *)GetObjectPtr(SoundTrackLengthCheckbox); - list1P = (ListType *)GetObjectPtr(SoundDriverList); - fld1P = (FieldType *)GetObjectPtr(SoundTempoField); - fld2P = (FieldType *)GetObjectPtr(SoundLengthSecsField); - fld3P = (FieldType *)GetObjectPtr(SoundFirstTrackField); - - CtlSetValue(cck1P, gPrefs->sound.music); - CtlSetValue(cck2P, gPrefs->sound.multiMidi); - CtlSetValue(cck3P, gPrefs->sound.MP3); - CtlSetValue(cck4P, gPrefs->sound.setDefaultTrackLength); - - LstSetSelection(list1P, gPrefs->sound.driver); - CtlSetLabel((ControlType *)GetObjectPtr(SoundDriverPopTrigger), LstGetSelectionText(list1P, LstGetSelection(list1P))); - - tempoH = MemHandleNew(FldGetMaxChars(fld1P)); - tempoP = (Char *)MemHandleLock(tempoH); - StrIToA(tempoP, gPrefs->sound.tempo); - MemHandleUnlock(tempoH); - FldSetTextHandle(fld1P, tempoH); - - lengthH = MemHandleNew(FldGetMaxChars(fld2P)); - lengthP = (Char *)MemHandleLock(lengthH); - StrIToA(lengthP, gPrefs->sound.defaultTrackLength); - MemHandleUnlock(lengthH); - FldSetTextHandle(fld2P, lengthH); - - firstTrackH = MemHandleNew(FldGetMaxChars(fld3P)); - firstTrackP = (Char *)MemHandleLock(firstTrackH); - StrIToA(firstTrackP, gPrefs->sound.firstTrack); - MemHandleUnlock(firstTrackH); - FldSetTextHandle(fld3P, firstTrackH); - - frmP = FrmGetActiveForm(); - FrmDrawForm(frmP); -} - -static Boolean SoundFormHandleEvent(EventPtr eventP) { - Boolean handled = false; - - switch (eventP->eType) { - case frmOpenEvent: - SoundFormInit(); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case SoundOKButton: - SoundFormSave(); - break; - - case SoundCancelButton: - FrmReturnToMain(); - break; - - case SoundDriverPopTrigger: - FrmList(eventP, SoundDriverList); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} -/*********************************************************************** - * - * FUNCTION: MiscOptionsFormSave - * FUNCTION: MiscOptionsFormInit - * FUNCTION: MiscOptionsFormHandleEvent - * - * DESCRIPTION: Misc. Options form functions - * - * REVISION HISTORY: - * - * - ***********************************************************************/ - -static void MiscOptionsFormSave() { - - FieldType *fld1P; - ControlType *cck1P, *cck2P, *cck3P, *cck4P, *cck5P, *cck6P, *cck7P, *cck8P; - FormPtr frmP; - - fld1P = (FieldType *)GetObjectPtr(MiscOptionsDebugLevelField); - - cck1P = (ControlType *)GetObjectPtr(MiscOptionsVibratorCheckbox); - cck2P = (ControlType *)GetObjectPtr(MiscOptionsNoAutoOffCheckbox); - cck3P = (ControlType *)GetObjectPtr(MiscOptionsStdPaletteCheckbox); - cck4P = (ControlType *)GetObjectPtr(MiscOptionsDebugCheckbox); - cck5P = (ControlType *)GetObjectPtr(MiscOptionsWriteIniCheckbox); - cck6P = (ControlType *)GetObjectPtr(MiscOptionsAutoResetCheckbox); - cck7P = (ControlType *)GetObjectPtr(MiscOptionsDemoCheckbox); - cck8P = (ControlType *)GetObjectPtr(MiscOptionsFullscreenCheckbox); - - frmP = FrmGetActiveForm(); - - if (FldGetTextLength(fld1P) == 0 && CtlGetValue(cck4P) == 1) { - FrmCustomAlert(FrmWarnAlert,"You must specified a debug level.",0,0); - FrmSetFocus(frmP, FrmGetObjectIndex(frmP, MiscOptionsDebugLevelField)); - return; - } - - gPrefs->vibrator = CtlGetValue(cck1P); - gPrefs->autoOff = !CtlGetValue(cck2P); - gPrefs->stdPalette = CtlGetValue(cck3P); - gPrefs->debug = CtlGetValue(cck4P); - gPrefs->saveConfig = CtlGetValue(cck5P); - gPrefs->autoReset = CtlGetValue(cck6P); - gPrefs->demoMode = CtlGetValue(cck7P); - gPrefs->fullscreen = CtlGetValue(cck8P); - - gPrefs->debugLevel = StrAToI(FldGetTextPtr(fld1P)); - - FrmReturnToMain(); -} - -static void MiscOptionsFormInit() { - - FieldType *fld1P; - FormPtr frmP; - - Char *levelP; - MemHandle levelH; - - CtlSetValue((ControlType *)GetObjectPtr(MiscOptionsVibratorCheckbox), gPrefs->vibrator); - CtlSetValue((ControlType *)GetObjectPtr(MiscOptionsNoAutoOffCheckbox), !gPrefs->autoOff); - CtlSetValue((ControlType *)GetObjectPtr(MiscOptionsStdPaletteCheckbox), gPrefs->stdPalette); - CtlSetValue((ControlType *)GetObjectPtr(MiscOptionsAutoResetCheckbox), gPrefs->autoReset); - CtlSetValue((ControlType *)GetObjectPtr(MiscOptionsDebugCheckbox), gPrefs->debug); - CtlSetValue((ControlType *)GetObjectPtr(MiscOptionsWriteIniCheckbox), gPrefs->saveConfig); - CtlSetValue((ControlType *)GetObjectPtr(MiscOptionsDemoCheckbox), gPrefs->demoMode); - CtlSetValue((ControlType *)GetObjectPtr(MiscOptionsFullscreenCheckbox), gPrefs->fullscreen); - - fld1P = (FieldType *)GetObjectPtr(MiscOptionsDebugLevelField); - - levelH = MemHandleNew(FldGetMaxChars(fld1P)); - levelP = (Char *)MemHandleLock(levelH); - StrIToA(levelP, gPrefs->debugLevel); - MemHandleUnlock(levelH); - - FldSetTextHandle(fld1P, levelH); - frmP = FrmGetActiveForm(); - FrmDrawForm(frmP); -} - -static Boolean MiscOptionsFormHandleEvent(EventPtr eventP) { - Boolean handled = false; - - switch (eventP->eType) { - case frmOpenEvent: - MiscOptionsFormInit(); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case MiscOptionsOKButton: - MiscOptionsFormSave(); - break; - - case MiscOptionsCancelButton: - FrmReturnToMain(); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} -/////////////////////////////////////////////////////////////////////// -static void CardSlotCreateDirs() { - if (gPrefs->card.volRefNum != sysInvalidRefNum) { - VFSDirCreate(gPrefs->card.volRefNum, "/PALM"); - VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs"); - VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM"); - VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Games"); - VFSDirCreate(gPrefs->card.volRefNum, "/PALM/Programs/ScummVM/Saved"); - } -} - -static void CardSlotFromShowHideOptions() { - ControlType *cck1P; - FormPtr frmP = FrmGetActiveForm(); - - cck1P = (ControlType *)GetObjectPtr(CardSlotMoveCheckbox); - - if (CtlGetValue(cck1P)) { - FrmShowObject(frmP, FrmGetObjectIndex (frmP, CardSlotDeleteCheckbox)); - FrmShowObject(frmP, FrmGetObjectIndex (frmP, CardSlotConfirmCheckbox)); - } else { - FrmHideObject(frmP, FrmGetObjectIndex (frmP, CardSlotDeleteCheckbox)); - FrmHideObject(frmP, FrmGetObjectIndex (frmP, CardSlotConfirmCheckbox)); - } -} - -static UInt16 CardSlotFormInit(Boolean display, Boolean bDraw) { - Err err; - UInt16 volRefNum; - UInt32 volIterator = vfsIteratorStart; - UInt8 counter = 0; - UInt32 other = 1; - - MemHandle cards = NULL; - CardInfoType *cardsInfo; - - while (volIterator != vfsIteratorStop) { - err = VFSVolumeEnumerate(&volRefNum, &volIterator); - - if (!err) { - Char labelP[expCardInfoStringMaxLen+1]; - err = VFSVolumeGetLabel(volRefNum, labelP, expCardInfoStringMaxLen+1); - - if (err || StrLen(labelP) == 0) { // if no label try to retreive card type - VolumeInfoType volInfo; - err = VFSVolumeInfo(volRefNum, &volInfo); - - if (!err) { - ExpCardInfoType info; - err = ExpCardInfo(volInfo.slotRefNum, &info); - StrCopy(labelP, info.deviceClassStr); - } - - if (err) // if err default name - StrPrintF(labelP,"Other Card %ld", other++); - } - - if (!cards) - cards = MemHandleNew(sizeof(CardInfoType)); - else - MemHandleResize(cards, MemHandleSize(cards) + sizeof(CardInfoType)); - - cardsInfo = (CardInfoType *)MemHandleLock(cards); - cardsInfo[counter].volRefNum = volRefNum; - StrCopy(cardsInfo[counter].nameP, labelP); - MemHandleUnlock(cards); - counter++; - } - } - - if (display) { - FormPtr frmP; - ListPtr listP; - ControlType *cck1P, *cck2P, *cck3P; - UInt16 index; - Int16 selected = -1; - - CardInfoType *cardsInfo; - MemHandle items = NULL; - - listP = (ListType *)GetObjectPtr(CardSlotSlotList); - cck1P = (ControlType *)GetObjectPtr(CardSlotMoveCheckbox); - cck2P = (ControlType *)GetObjectPtr(CardSlotDeleteCheckbox); - cck3P = (ControlType *)GetObjectPtr(CardSlotConfirmCheckbox); - - if (counter > 0) { - cardsInfo = (CardInfoType *)MemHandleLock(cards); - - for (index = 0; index < counter; index++) { - if (!items) - items = MemHandleNew(sizeof(Char *)); - else - MemHandleResize(items, MemHandleSize(items) + sizeof(Char *)); - - itemsText = (Char **)MemHandleLock(items); - itemsText[index] = cardsInfo[index].nameP; - MemHandleUnlock(items); - - if (cardsInfo[index].volRefNum == gPrefs->card.volRefNum) - selected = index; - } - - itemsText = (Char **)MemHandleLock(items); - LstSetListChoices (listP, itemsText, counter); - LstSetSelection(listP, selected); - // save globals and set list - itemsText = (Char **)MemHandleLock(items); - itemsList = (void *)cardsInfo; - itemsType = ITEM_TYPE_CARD; - - } else { - LstSetListChoices(listP, NULL, 0); - // save globals and set list - itemsText = NULL; - itemsList = NULL; - itemsType = ITEM_TYPE_CARD; - } - - // bDraw = true -> draw whole from - // bDraw = false -> redraw list - if (bDraw) { - CtlSetValue(cck1P, gPrefs->card.moveDB); - CtlSetValue(cck2P, gPrefs->card.deleteDB); - CtlSetValue(cck3P, gPrefs->card.confirmMoveDB); - CardSlotFromShowHideOptions(); - frmP = FrmGetActiveForm(); - FrmDrawForm(frmP); - - } else { - WinScreenLock(winLockCopy); - LstDrawList(listP); - WinScreenUnlock(); - } - } else { // if !display, we just want to retreive an avaliable card - if (counter > 0) { - UInt16 volRefNum; - cardsInfo = (CardInfoType *)MemHandleLock(cards); - volRefNum = cardsInfo[0].volRefNum; // return the first volref - MemHandleUnlock(cards); - MemHandleFree(cards); - return volRefNum; - } - } - - return sysInvalidRefNum; // default -} - -static void CardSlotFormExit(Boolean bSave) { - MemHandle cards; - MemHandle items; - CardInfoType *cardsInfo; - UInt16 updateCode = frmRedrawUpdateMS; - - if (itemsText && itemsList) { - cardsInfo = (CardInfoType *)itemsList; - cards = MemPtrRecoverHandle(cardsInfo); - items = MemPtrRecoverHandle(itemsText); - - itemsText = NULL; - itemsList = NULL; - } else { - cards = NULL; - items = NULL; - } - itemsType = ITEM_TYPE_UNKNOWN; - - if (bSave) { - ListType *listP; - ControlType *cck1P, *cck2P, *cck3P; - Int16 selected; - - listP = (ListType *)GetObjectPtr(CardSlotSlotList); - cck1P = (ControlType *)GetObjectPtr(CardSlotMoveCheckbox); - cck2P = (ControlType *)GetObjectPtr(CardSlotDeleteCheckbox); - cck3P = (ControlType *)GetObjectPtr(CardSlotConfirmCheckbox); - selected = LstGetSelection(listP); - - if (selected == -1) { - gPrefs->card.volRefNum = sysInvalidRefNum; - } else if (gPrefs->card.volRefNum != cardsInfo[selected].volRefNum) { - updateCode = frmRedrawUpdateMSImport; - gPrefs->card.volRefNum = cardsInfo[selected].volRefNum; - } - - gPrefs->card.moveDB = CtlGetValue(cck1P); - gPrefs->card.deleteDB = CtlGetValue(cck2P); - gPrefs->card.confirmMoveDB = CtlGetValue(cck3P); - CardSlotCreateDirs(); - } - - FrmReturnToMain(updateCode); - - if (items && cards) { - MemHandleUnlock(items); - MemHandleUnlock(cards); - MemHandleFree(items); - MemHandleFree(cards); - } -} - -static void CardSlotFormUpdate() { - if (itemsType == ITEM_TYPE_CARD) { - if (itemsText && itemsList) { - MemHandle cards; - MemHandle items; - ListType *listP; - - listP = (ListType *)GetObjectPtr(CardSlotSlotList); - cards = MemPtrRecoverHandle(itemsList); - items = MemPtrRecoverHandle(itemsText); - - itemsText = NULL; - itemsList = NULL; - itemsType = ITEM_TYPE_UNKNOWN; - - MemHandleUnlock(items); - MemHandleUnlock(cards); - MemHandleFree(items); - MemHandleFree(cards); - } - CardSlotFormInit(true, false); - } -} - -static Boolean CardSlotFormHandleEvent(EventPtr eventP) { - Boolean handled = false; - - switch (eventP->eType) { - - case frmOpenEvent: - CardSlotFormInit(true, true); - handled = true; - break; - - case frmCloseEvent: - CardSlotFormExit(false); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case CardSlotOkButton: - CardSlotFormExit(true); - break; - - case CardSlotCancelButton: - CardSlotFormExit(false); - break; - - case CardSlotMoveCheckbox: - CardSlotFromShowHideOptions(); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} - -static UInt16 parseCards() { - UInt16 volRefNum = CardSlotFormInit(false, false); - CardSlotFormExit(false); - - return volRefNum; -} - -//############################################################################# -//############################################################################# -// Skin manager -//############################################################################# - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -static void SknApplySkin() -{ - DmOpenRef skinDBP; - RectangleType r; - FormPtr frmP = FrmGetActiveForm(); - - WinScreenLock(winLockErase); - //SknSetPalette(); - FrmDrawForm(frmP); - - if (gPrefs->card.volRefNum != sysInvalidRefNum) - FrmShowObject(frmP, FrmGetObjectIndex (frmP, MainMSBitMap)); - else - FrmShowObject(frmP, FrmGetObjectIndex (frmP, MainMSNoneBitMap)); - - WinSetForeColor(255); - WinSetDrawMode(winPaint); - WinDrawLine (0, 14, 159, 14); - WinDrawLine (0, 13, 159, 13); - - skinDBP = SknOpenSkin(); - SknGetObjectBounds(skinDBP, skinBackgroundImageTop, &r); - SknCopyBits(skinDBP, skinBackgroundImageTop, 0, r.topLeft.x, r.topLeft.y, 0); - SknGetObjectBounds(skinDBP, skinBackgroundImageBottom, &r); - SknCopyBits(skinDBP, skinBackgroundImageBottom, 0, r.topLeft.x, r.topLeft.y, 0); - - for (UInt16 resID = 1100; resID <= 7000; resID += 100) { - SknSetState(skinDBP, resID, sknStateNormal); - SknShowObject(skinDBP, resID); - } - - SknCloseSkin(skinDBP); - WinScreenUnlock(); - GamUpdateList(); -} - -//############################################################################# -//############################################################################# - -/*********************************************************************** - * - * FUNCTION: MainFormInit - * - * DESCRIPTION: This routine initializes the MainForm form. - * - * PARAMETERS: frm - pointer to the MainForm form. - * - * RETURNED: nothing - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static void MainFormInit() -{ - SknApplySkin(); -} - -/*********************************************************************** - * - * FUNCTION: MainFormDoCommand - * - * DESCRIPTION: This routine performs the menu command specified. - * - * PARAMETERS: command - menu item id - * - * RETURNED: nothing - * - * REVISION HISTORY: - * - * - ***********************************************************************/ - - -static Int16 SkinsFormCompare(SkinInfoType *a, SkinInfoType *b, SortRecordInfoPtr, SortRecordInfoPtr, MemHandle) { - return StrCompare(a->nameP, b->nameP); -} - -static void SkinsFormInit(Boolean bDraw) { - MemHandle skins = NULL; - SkinInfoType *skinsInfo; - UInt16 numSkins = 0; - - FormPtr frmP; - ListType *listP; - MemHandle items = NULL; - ControlType *cck1P; - DmSearchStateType stateInfo; - UInt16 cardNo; - LocalID dbID; - - Err errInfo; - Char nameP[32]; - - itemsText = NULL; - - // parse and save skins - Err err = DmGetNextDatabaseByTypeCreator(true, &stateInfo, 'skin', appFileCreator, false, &cardNo, &dbID); - while (!err && dbID) { - errInfo = DmDatabaseInfo (cardNo, dbID, nameP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - if (!errInfo) - { - if (!skins) - skins = MemHandleNew(sizeof(SkinInfoType)); - else - MemHandleResize(skins, MemHandleSize(skins) + sizeof(SkinInfoType)); - - skinsInfo = (SkinInfoType *)MemHandleLock(skins); - StrCopy(skinsInfo[numSkins].nameP, nameP); - skinsInfo[numSkins].cardNo = cardNo; - skinsInfo[numSkins].dbID = dbID; - MemHandleUnlock(skins); - numSkins++; - } - err = DmGetNextDatabaseByTypeCreator(false, &stateInfo, 'skin', appFileCreator, false, &cardNo, &dbID); - } - - Int16 selected = -1; - - cck1P = (ControlType *)GetObjectPtr(SkinsSoundClickCheckbox); - CtlSetValue(cck1P, gPrefs->soundClick); - - listP = (ListType *)GetObjectPtr(SkinsSkinList); - skinsInfo = (SkinInfoType *)MemHandleLock(skins); - SysQSort(skinsInfo, numSkins, sizeof(SkinInfoType), (CmpFuncPtr)SkinsFormCompare, 0); - - // create itemsText (TODO: create a custom draw function) - for (UInt16 index=0; index < numSkins; index++) - { - if (!items) - items = MemHandleNew(sizeof(Char *)); - else - MemHandleResize(items, MemHandleSize(items) + sizeof(Char *)); - - itemsText = (Char **)MemHandleLock(items); - itemsText[index] = skinsInfo[index].nameP; - MemHandleUnlock(items); - - if ( gPrefs->skin.cardNo == skinsInfo[index].cardNo && - gPrefs->skin.dbID == skinsInfo[index].dbID && - StrCompare(gPrefs->skin.nameP, skinsInfo[index].nameP) == 0) - selected = index; - } - // save globals and set list - itemsText = (Char **)MemHandleLock(items); - itemsList = (void *)skinsInfo; - itemsType = ITEM_TYPE_SKIN; - - LstSetListChoices (listP, itemsText, numSkins); - LstSetSelection(listP, selected); - - // bDraw = true -> draw whole from - // bDraw = false -> redraw list - if (bDraw) { - frmP = FrmGetActiveForm(); - FrmDrawForm(frmP); - } else { - WinScreenLock(winLockCopy); - LstDrawList(listP); - WinScreenUnlock(); -// LstSetSelection(listP, 0); - } -} - -static void SkinsFormExit(Boolean bSave) { - MemHandle skins; - MemHandle items; - SkinInfoType *skinsInfo; - - ListType *listP; - Int16 selected; - - listP = (ListType *)GetObjectPtr(SkinsSkinList); - selected = LstGetSelection(listP); - - if (bSave && selected == -1) { // may never occured... - FrmCustomAlert(FrmWarnAlert, "You didn't select a skin.", 0, 0); - return; - } - - skinsInfo = (SkinInfoType *)itemsList; - skins = MemPtrRecoverHandle(skinsInfo); - items = MemPtrRecoverHandle(itemsText); - - itemsText = NULL; - itemsList = NULL; - itemsType = ITEM_TYPE_UNKNOWN; - - if (bSave) { - ControlType *cck1P; - - StrCopy(gPrefs->skin.nameP, skinsInfo[selected].nameP); - gPrefs->skin.cardNo = skinsInfo[selected].cardNo; - gPrefs->skin.dbID = skinsInfo[selected].dbID; - - cck1P = (ControlType *)GetObjectPtr(SkinsSoundClickCheckbox); - gPrefs->soundClick = CtlGetValue(cck1P); - } - - FrmReturnToMain(); - - MemHandleUnlock(items); - MemHandleUnlock(skins); - MemHandleFree(items); - MemHandleFree(skins); - - if (bSave) - SknApplySkin(); -} - -static void SkinsFormBeam() { - SkinInfoType *skinsInfo; - - ListType *listP; - Int16 selected; - Err err; - - listP = (ListType *)GetObjectPtr(SkinsSkinList); - selected = LstGetSelection(listP); - - if (selected == -1) { // may never occured... - FrmCustomAlert(FrmWarnAlert, "You didn't select a skin.", 0, 0); - return; - } - - skinsInfo = (SkinInfoType *)itemsList; - err = SendDatabase(0, skinsInfo[selected].dbID, "skin.pdb", "\nScummVM Skin"); - -// if (err) -// FrmCustomAlert(FrmErrorAlert, "Unable to beam this skin.",0,0); -} - -static void SkinsFormDelete() { - MemHandle skins; - MemHandle items; - SkinInfoType *skinsInfo; - - ListType *listP; - Int16 selected; - - listP = (ListType *)GetObjectPtr(SkinsSkinList); - selected = LstGetSelection(listP); - - if (selected == -1) { // may never occured... - FrmCustomAlert(FrmInfoAlert, "You didn't select a skin.", 0, 0); - return; - } - - skinsInfo = (SkinInfoType *)itemsList; - skins = MemPtrRecoverHandle(skinsInfo); - items = MemPtrRecoverHandle(itemsText); - - if ( gPrefs->skin.cardNo == skinsInfo[selected].cardNo && - gPrefs->skin.dbID == skinsInfo[selected].dbID && - StrCompare(gPrefs->skin.nameP, skinsInfo[selected].nameP) == 0) { - FrmCustomAlert(FrmInfoAlert, "You cannot delete the active skin.",0,0); - return; - - } else { - Err err = DmDeleteDatabase(0, skinsInfo[selected].dbID); - if (!err) { - - itemsText = NULL; - itemsList = NULL; - itemsType = ITEM_TYPE_UNKNOWN; - - MemHandleUnlock(items); - MemHandleUnlock(skins); - MemHandleFree(items); - MemHandleFree(skins); - - SkinsFormInit(false); - } else { - FrmCustomAlert(FrmErrorAlert, "Skin deletion failed.",0,0); - } - } - -} -static Boolean SkinsFormHandleEvent(EventPtr eventP) { - Boolean handled = false; - - switch (eventP->eType) { - - case frmOpenEvent: - SkinsFormInit(true); - handled = true; - break; - - case frmCloseEvent: - SkinsFormExit(false); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case SkinsOKButton: - SkinsFormExit(true); - break; - - case SkinsCancelButton: - SkinsFormExit(false); - break; - - case SkinsBeamButton: - SkinsFormBeam(); - break; - - case SkinsDeleteButton: - SkinsFormDelete(); - break; - } - handled = true; - break; - - default: - break; - } - - return handled; -} - - -static void MainFormAbout() { - FormPtr frmP; - FormLabelType *versionP; - - frmP = FrmInitForm(AboutForm); - versionP = FrmNewLabel(&frmP, 1111, gScummVMVersion, 4, 142, stdFont); - FrmDoDialog (frmP); // Display the About Box. - FrmDeleteForm (frmP); -} - -static Boolean MainFormDoCommand(UInt16 command) -{ - Boolean handled = false; - - switch (command) { - case MainGamesCard: - FrmPopupForm(CardSlotForm); - handled = true; - break; - - case MainGamesMemory: - FrmPopupForm(SystemInfoForm); - handled = true; - break; - - case MainGamesNewEdit: - __editMode__ = edtModeParams; - FrmPopupForm(EditGameForm); - handled = true; - break; - - case MainGamesBeamScummVM: - BeamMe(); - //if (BeamMe()) - //FrmCustomAlert(FrmErrorAlert,"Unable to beam ScummVM for PalmOS.",0,0); - handled = true; - break; - - case MainOptionsAbout: - MainFormAbout(); - handled = true; - break; - - case MainOptionsVolumeControl: - FrmPopupForm(VolumeForm); - handled = true; - break; - - case MainOptionsMusic: - FrmPopupForm(SoundForm); - handled = true; - break; - - case MainOptionsSkins: - FrmPopupForm(SkinsForm); - handled = true; - break; - - case MainOptionsMisc: - FrmPopupForm(MiscOptionsForm); - handled = true; - break; - } - - MenuEraseStatus(0); - return handled; -} - - -static void SavePrefs() { - if (gPrefs) { - PrefSetAppPreferences(appFileCreator, appPrefID, appPrefVersionNum, gPrefs, sizeof (GlobalsPreferenceType), true); - MemPtrFree(gPrefs); - gPrefs = NULL; - } -} - -static Boolean CheckVibratorExists() { - UInt32 romVersion; - Err err; - Boolean exists = false; - - err = FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion); - if (!err) { - if (romVersion >= sysMakeROMVersion(4,0,0,sysROMStageRelease,0)) { - Boolean active = false; - err = HwrVibrateAttributes(0, kHwrVibrateActive, &active); - exists = (!err) ? true : exists; - } - } - - return exists; -} - -static void AddArg(Char **argvP, const Char *argP, const Char *parmP, UInt8 *countArgP) -{ - if (argP) - { - UInt16 len2 = 0; - UInt16 len1 = StrLen(argP); - - if (len1 > 0) - { - if (parmP) - len2 = StrLen(parmP); - - (*countArgP)++; - *argvP = (Char *)MemPtrNew(len1 + len2 + 1); - StrCopy(*argvP, argP); - - if (parmP) - StrCat(*argvP, parmP); - } - } -} - -// need to move this on a .h file -#define sonySysFileCSystem 'SsYs' /* Sony overall System */ -#define sonySysFtrCreatorSystem sonySysFileCSystem - -#define sonySysFtrNumSystemBase 10000 -#define sonySysFtrNumSystemAOutSndStateOnHandlerP (sonySysFtrNumSystemBase + 4) -#define sonySysFtrNumSystemAOutSndStateOffHandlerP (sonySysFtrNumSystemBase + 5) - -typedef void (*sndStateOnType)(UInt8 /* kind */, UInt8 /* L volume 0-31 */, UInt8 /* R volume 0-31 */); -typedef void (*sndStateOffType)(UInt8 /* kind */); - -/* kind */ -#define aOutSndKindSp (0) /* Speaker volume */ -#define aOutSndKindHp (2) /* HeadPhone volume */ -//////////////////////////////////////////////////////////// -#define MAX_ARG 25 - -static Boolean checkPath(const Char *pathP) { - FileRef *tmpRef; - - if (!(tmpRef = fopen(pathP, "r"))) { - return false; - } else { - fclose(tmpRef); - return true; - } -} - -static void StartScummVM() { - Char *argvP[MAX_ARG]; - UInt8 argc = 0; - UInt8 count; - - Boolean autoOff; - UInt16 autoOffDelay; - Boolean debug; - UInt16 musicDriver = sysInvalidRefNum; // for launch call - - bStartScumm = false; // - UInt16 index = GamGetSelected(); - - for(count = 0; count < MAX_ARG; count++) - argvP[count] = NULL; - - if (index != dmMaxRecordIndex) { - Char pathP[256]; - Char num[4]; - MemHandle recordH; - GameInfoType *gameInfoP; - - recordH = DmQueryRecord(_dbP,index); - gameInfoP = (GameInfoType *)MemHandleLock(recordH); - - // build path - StrCopy(pathP,"/Palm/Programs/ScummVM/Games/"); - if (gameInfoP->pathP[0] == '/') - StrCopy(pathP,gameInfoP->pathP); - else - StrCat(pathP,gameInfoP->pathP); - - // path exists ? - if (!checkPath(pathP)) { - MemHandleUnlock(recordH); - FrmCustomAlert(FrmErrorAlert,"The specified path was not found !",0,0); - return; - } - - AddArg(&argvP[argc], "ScummVM", NULL, &argc); - - // save scummvm.ini ? - if (gPrefs->saveConfig) - AddArg(&argvP[argc], "-w", NULL, &argc); - - // path - AddArg(&argvP[argc], "-p", pathP, &argc); - - // language - if (gameInfoP->language > 0) { - const Char *lang = "en\0de\0fr\0it\0p\0es\0jp\0z\0kr\0hb\0"; - AddArg(&argvP[argc], "-q", (lang + (gameInfoP->language - 1) * 3), &argc); - } - - // fullscreen ? - if (gPrefs->fullscreen) { - AddArg(&argvP[argc], "-f", NULL, &argc); - } - - // gfx mode - switch (gameInfoP->gfxMode) - { - case 1: - AddArg(&argvP[argc], "-g", "flipping", &argc); - break; - case 2: - AddArg(&argvP[argc], "-g", "dbuffer", &argc); - break; - case 3: - AddArg(&argvP[argc], "-g", "wide", &argc); - break; - default: - AddArg(&argvP[argc], "-g", "normal", &argc); - break; - } - - // load state - if (gameInfoP->autoLoad) { - StrIToA(num, gameInfoP->loadSlot); - AddArg(&argvP[argc], "-x", num, &argc); - } - // start in room - if (gameInfoP->autoRoom) { - StrIToA(num, gameInfoP->roomNum); - AddArg(&argvP[argc], "-b", num, &argc); - } - // amiga version - if (gameInfoP->amiga) { - AddArg(&argvP[argc], "-a", NULL, &argc); - } - // subtitles - if (!gameInfoP->subtitles) { - AddArg(&argvP[argc], "-n", NULL, &argc); - } - // talk speed - if (gameInfoP->talkSpeed) { - StrIToA(num, gameInfoP->talkValue); - AddArg(&argvP[argc], "-y", num, &argc); - } - // debug level - debug = gPrefs->debug; - if (gPrefs->debug) { - StrIToA(num, gPrefs->debugLevel); - AddArg(&argvP[argc], "-d", num, &argc); - } - // demo mode ? - if (gPrefs->demoMode) - AddArg(&argvP[argc], "--demo-mode", NULL, &argc); - - // multi midi ? - if (gPrefs->sound.multiMidi) - AddArg(&argvP[argc], "--multi-midi", NULL, &argc); - - // music driver - musicDriver = gPrefs->sound.music; - if (musicDriver) { - switch (gPrefs->sound.driver) { - case 0: // NULL - AddArg(&argvP[argc], "-e", "null", &argc); - break; - case 1: // yamaha Pa1 - AddArg(&argvP[argc], "-e", "ypa1", &argc); - break; - } - } - else // NULL as default - AddArg(&argvP[argc], "-e", "null", &argc); - - // music tempo - StrIToA(num, gPrefs->sound.tempo); - AddArg(&argvP[argc], "-t", num, &argc); - - // volume control - StrIToA(num, gPrefs->volume.master); - AddArg(&argvP[argc], "-o", num, &argc); - StrIToA(num, gPrefs->volume.sfx); - AddArg(&argvP[argc], "-s", num, &argc); - StrIToA(num, gPrefs->volume.music); - AddArg(&argvP[argc], "-m", num, &argc); - - // game name - AddArg(&argvP[argc], gameInfoP->gameP, NULL, &argc); - - MemHandleUnlock(recordH); - } - - GamCloseDatabase(false); - FrmCloseAllForms(); - - autoOff = gPrefs->autoOff; - if (!autoOff) { - autoOffDelay = SysSetAutoOffTime(0); - EvtResetAutoOffTimer(); - } - - // gVars values - //gVars->HRrefNum defined in checkHRmode on Clié OS4 - //gVars->logFile defined bellow, must be defined only if debug option is checked - gVars->screenLocked = false; - gVars->volRefNum = gPrefs->card.volRefNum; - gVars->vibrator = gPrefs->vibrator; - gVars->stdPalette = gPrefs->stdPalette; - gVars->autoReset = gPrefs->autoReset; - gVars->music.MP3 = gPrefs->sound.MP3; - gVars->music.setDefaultTrackLength = gPrefs->sound.setDefaultTrackLength; - gVars->music.defaultTrackLength = gPrefs->sound.defaultTrackLength; - gVars->music.firstTrack = gPrefs->sound.firstTrack; - - if (gVars->vibrator) - { - if (CheckVibratorExists()) { - UInt16 cycle = (SysTicksPerSecond())/2; - UInt32 pattern = 0xFF000000; - UInt16 delay = 1; - UInt16 repeat = 1; - - HwrVibrateAttributes(1, kHwrVibrateRate, &cycle); - HwrVibrateAttributes(1, kHwrVibratePattern, &pattern); - HwrVibrateAttributes(1, kHwrVibrateDelay, &delay); - HwrVibrateAttributes(1, kHwrVibrateRepeatCount, &repeat); - - } else { - gVars->vibrator = false; - } - } - - if (debug) { - VFSFileDelete(gVars->volRefNum,"PALM/Programs/ScummVM/scumm.log"); - VFSFileCreate(gVars->volRefNum,"PALM/Programs/ScummVM/scumm.log"); - VFSFileOpen(gVars->volRefNum,"PALM/Programs/ScummVM/scumm.log",vfsModeWrite, &gVars->logFile); - } - - void *sndStateOnFuncP = NULL, - *sndStateOffFuncP = NULL; - - if (musicDriver == 1 || musicDriver == sysInvalidRefNum) { - - Pa1Lib_Open(); - - FtrGet(sonySysFtrCreatorSystem, sonySysFtrNumSystemAOutSndStateOnHandlerP, (UInt32*) &sndStateOnFuncP); - FtrGet(sonySysFtrCreatorSystem, sonySysFtrNumSystemAOutSndStateOffHandlerP, (UInt32*) &sndStateOffFuncP); - - Pa1Lib_devHpVolume(gPrefs->volume.headphone, gPrefs->volume.headphone); - Pa1Lib_devSpVolume(gPrefs->volume.speaker); - - if (sndStateOnFuncP && sndStateOffFuncP) { - ((sndStateOnType)(sndStateOnFuncP))(aOutSndKindSp, gPrefs->volume.headphone, gPrefs->volume.headphone); - ((sndStateOnType)(sndStateOnFuncP))(aOutSndKindHp, gPrefs->volume.speaker, gPrefs->volume.speaker); - - } - } - - SavePrefs(); // free globals pref memory - GBOpen(); - GBInitAll(); - main(argc, argvP); - GBReleaseAll(); - GBClose(); - - if (musicDriver == 1 || musicDriver == sysInvalidRefNum) { - Pa1Lib_Close(); - - if (sndStateOnFuncP && sndStateOffFuncP) { - ((sndStateOffType)(sndStateOffFuncP))(aOutSndKindSp); - ((sndStateOffType)(sndStateOffFuncP))(aOutSndKindHp); - } - } - - if (debug) - VFSFileClose(gVars->logFile); - - for(count = 0; count < MAX_ARG; count++) - if (argvP[count]) - MemPtrFree(argvP[count]); - - if (gVars->vibrator) { - Boolean active = false; - HwrVibrateAttributes(1, kHwrVibrateActive, &active); - } - - if (!autoOff) { - SysSetAutoOffTime(autoOffDelay);SystemPreferencesChoice - EvtResetAutoOffTimer(); - } -} - -void PalmFatalError(const Char *err) -{ - WinPalette(winPaletteSetToDefault,0,0,0); - - if (gVars->screenLocked) - WinScreenUnlock(); - -// MemExtCleanup(); - WinEraseWindow(); - FrmCustomAlert(FrmFatalErrorAlert, err, 0,0); - SysReset(); -} - -/*********************************************************************** - * - * FUNCTION: MainFormHandleEvent - * - * DESCRIPTION: This routine is the event handler for the - * "MainForm" of this application. - * - * PARAMETERS: eventP - a pointer to an EventType structure - * - * RETURNED: true if the event has handle and should not be passed - * to a higher level handler. - * - * REVISION HISTORY: - * - * - ***********************************************************************/ - -static Boolean penDownRepeat() { - Coord x,y; - Boolean penDown, handled = false; - EvtGetPen(&x, &y, &penDown); - - if (penDown && sknLastOn) { - RectangleType r; - DmOpenRef skinDBP; - - skinDBP = SknOpenSkin(); - SknGetObjectBounds(skinDBP, sknLastOn, &r); - - if (RctPtInRectangle(x*2, y*2, &r)) { - if (SknGetState(skinDBP, sknLastOn) != sknStateSelected) { - SknSetState(skinDBP, sknLastOn, sknStateSelected); - SknShowObject(skinDBP, sknLastOn); - } - - switch (sknLastOn) { - case skinSliderUpArrow: - case skinSliderDownArrow: - handled = ArwProcessAction(sknLastOn); - break; - } - - } else { - if (SknGetState(skinDBP, sknLastOn) != sknStateNormal) { - SknSetState(skinDBP, sknLastOn, sknStateNormal); - SknShowObject(skinDBP, sknLastOn); - } - } - - SknCloseSkin(skinDBP); - } - - return handled; -} - - -static Boolean MainFormHandleEvent(EventPtr eventP) -{ - Boolean handled = false; - FormPtr frmP; - Coord x,y; - DmOpenRef skinDBP; - - switch (eventP->eType) { - case frmUpdateEvent: - frmP = FrmGetFormPtr(MainForm); - if (gPrefs->card.volRefNum != sysInvalidRefNum) - FrmShowObject(frmP, FrmGetObjectIndex (frmP, MainMSBitMap)); - else - FrmShowObject(frmP, FrmGetObjectIndex (frmP, MainMSNoneBitMap)); - if (eventP->data.frmUpdate.updateCode == frmRedrawUpdateMSImport) - GamImportDatabase(true); - handled = true; - break; - - case menuEvent: - handled = MainFormDoCommand(eventP->data.menu.itemID); - break; - - case frmOpenEvent: - MainFormInit(); - handled = true; - break; - - case ctlSelectEvent: - switch (eventP->data.ctlSelect.controlID) - { - case MainCardsButton: - //gPrefs->card.volRefNum = parseCards(true); - FrmPopupForm(CardSlotForm); - break; - - case MainAboutButton: - MainFormAbout(); - break; - -// case MainListTypeSelTrigger: -// FrmList(eventP, MainListTypeList); -// break; - } - handled = true; - break; - - case penUpEvent: - x = eventP->screenX; - y = eventP->screenY; - - _lstIndex = dmMaxRecordIndex; - - if (sknLastOn != skinButtonNone) { - RectangleType r; - skinDBP = SknOpenSkin(); - SknGetObjectBounds(skinDBP, sknLastOn, &r); - SknSetState(skinDBP, sknLastOn, sknStateNormal); - SknShowObject(skinDBP, sknLastOn); - SknCloseSkin(skinDBP); - - if (RctPtInRectangle(x*2, y*2, &r)) { - switch (sknLastOn) { - case skinButtonGameAdd: - __editMode__ = edtModeAdd; - FrmPopupForm(EditGameForm); - handled = true; - break; - - case skinButtonGameEdit: - case skinButtonGameParams: - __editMode__ = edtModeParams; - FrmPopupForm(EditGameForm); - handled = true; - break; - - case skinButtonGameStart: - if (gPrefs->card.volRefNum == sysInvalidRefNum) - FrmCustomAlert(FrmWarnAlert,"Please select/insert a memory card.", 0, 0); - else - bStartScumm = true; - handled = true; - break; - - case skinButtonGameDelete: - EditGameFormDelete(true); - break; - } - } - sknLastOn = skinButtonNone; - } - break; - - case penDownEvent: - case penMoveEvent: - if (sknLastOn == skinButtonNone) { - x = eventP->screenX; - y = eventP->screenY; - skinDBP = SknOpenSkin(); - - switch (sknLastOn = SknCheckClick(skinDBP, x,y)) { - case skinButtonNone: - break; - case skinSliderUpArrow: - case skinSliderDownArrow: - case skinButtonGameAdd: - case skinButtonGameEdit: - case skinButtonGameParams: - case skinButtonGameStart: - case skinButtonGameDelete: - SknSetState(skinDBP, sknLastOn, sknStateSelected); - SknShowObject(skinDBP, sknLastOn); - if (gPrefs->soundClick) - SndPlaySystemSound(sndClick); - handled = true; - break; - default: - FrmCustomAlert(FrmWarnAlert,"Unknown button !",0,0); - } - SknCloseSkin(skinDBP); - GamSelect(x, y); - } - break; - - default: - handled = penDownRepeat(); - } - - return handled; -} - -/*********************************************************************** - * - * FUNCTION: AppHandleEvent - * - * DESCRIPTION: This routine loads form resources and set the event - * handler for the form loaded. - * - * PARAMETERS: event - a pointer to an EventType structure - * - * RETURNED: true if the event has handle and should not be passed - * to a higher level handler. - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static Boolean AppHandleEvent(EventPtr eventP) -{ - UInt16 formId; - FormPtr frmP; - - if (eventP->eType == frmLoadEvent) - { - // Load the form resource. - formId = eventP->data.frmLoad.formID; - frmP = FrmInitForm(formId); - FrmSetActiveForm(frmP); - - // Set the event handler for the form. The handler of the currently - // active form is called by FrmHandleEvent each time is receives an - // event. - switch (formId) - { - case MainForm: - FrmSetEventHandler(frmP, MainFormHandleEvent); - break; - - case SkinsForm: - FrmSetEventHandler(frmP, SkinsFormHandleEvent); - break; - - case EditGameForm: - FrmSetEventHandler(frmP, EditGameFormHandleEvent); - break; - - case MiscOptionsForm: - FrmSetEventHandler(frmP, MiscOptionsFormHandleEvent); - break; - - case VolumeForm: - FrmSetEventHandler(frmP, VolumeFormHandleEvent); - break; - - case SoundForm: - FrmSetEventHandler(frmP, SoundFormHandleEvent); - break; - - case SystemInfoForm: - FrmSetEventHandler(frmP, SystemInfoFormHandleEvent); - break; - - case CardSlotForm: - FrmSetEventHandler(frmP,CardSlotFormHandleEvent); - break; - - default: -// ErrFatalDisplay("Invalid Form Load Event"); - break; - - } - return true; - } - - return false; -} - - -/*********************************************************************** - * - * FUNCTION: AppEventLoop - * - * DESCRIPTION: This routine is the event loop for the application. - * - * PARAMETERS: nothing - * - * RETURNED: nothing - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static void AppEventLoop(void) -{ - UInt16 error; - EventType event; - - do { - EvtGetEvent(&event, evtNoWait); - - if(bStartScumm) - StartScummVM(); - - if (! SysHandleEvent(&event)) - if (! MenuHandleEvent(0, &event, &error)) - if (! AppHandleEvent(&event)) - FrmDispatchEvent(&event); - - } while (event.eType != appStopEvent); -} - - -/*********************************************************************** - * - * FUNCTION: AppStart - * - * DESCRIPTION: Get the current application's preferences. - * - * PARAMETERS: nothing - * - * RETURNED: Err value 0 if nothing went wrong - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static Err AppStartCheckHRmode() -{ - SonySysFtrSysInfoP sonySysFtrSysInfoP; - UInt32 version; - Err error = errNone; - - // test if sonyHR is present - if (!(error = FtrGet(sonySysFtrCreator, sonySysFtrNumSysInfoP, (UInt32*)&sonySysFtrSysInfoP))) - { - if (sonySysFtrSysInfoP->libr & sonySysFtrSysInfoLibrHR) { /* HR available */ - - if ((error = SysLibFind(sonySysLibNameHR, &gVars->HRrefNum))) { - if (error == sysErrLibNotFound) /* couldn't find lib */ - error = SysLibLoad( 'libr', sonySysFileCHRLib, &gVars->HRrefNum ); - } - - if (!error ) - { /* Now we can use HR lib. Executes Open library. */ - error = HROpen(gVars->HRrefNum); - } - } - } - // if not Hi-Density ? - if (error && !(error = FtrGet(sysFtrCreator, sysFtrNumWinVersion, &version))) - { - gVars->HRrefNum = sysInvalidRefNum; // Not sony HR - if (version<4) - error = 1; - } - - if (!error) { /* Not error processing */ - UInt32 width, height, depth; - Boolean color; - - width = hrWidth; - height= hrHeight; - depth = 8; - color = true; - - if (gVars->HRrefNum != sysInvalidRefNum) - error = HRWinScreenMode ( gVars->HRrefNum, winScreenModeSet, &width, &height, &depth, &color ); - else - error = WinScreenMode ( winScreenModeSet, &width, &height, &depth, &color ); - - /* high-resolution mode entered from here if no error */ - if (error != errNone) - FrmCustomAlert(FrmErrorAlert,"Your device doesn't seems to support 256 colors mode.",0,0); - } - else - FrmCustomAlert(FrmErrorAlert,"This device doesn't seems to support\nHi-Res mode.",0,0); - - return error; -} - -static void AppStopHRMode() { - if (gVars->HRrefNum != sysInvalidRefNum) { - HRClose(gVars->HRrefNum); - //SysLibRemove(gVars->HRrefNum); // never call this !! - } -} - -static Err AppStartCheckNotify() { - UInt32 romVersion; - Err err; - - err = FtrGet(sysFtrCreator, sysFtrNumNotifyMgrVersion, &romVersion); - if (!err) { - UInt16 cardNo; - LocalID dbID; - - err = SysCurAppDatabase(&cardNo, &dbID); - if (!err) { - SysNotifyRegister(cardNo, dbID, sysNotifyVolumeMountedEvent, NULL, sysNotifyNormalPriority, NULL); - SysNotifyRegister(cardNo, dbID, sysNotifyVolumeUnmountedEvent, NULL, sysNotifyNormalPriority, NULL); - SysNotifyRegister(cardNo, dbID, sonySysNotifyMsaEnforceOpenEvent, NULL, sysNotifyNormalPriority, NULL); - } - } - - return err; -} - -static Err AppStartLoadSkin() { - Err err = errNone; - - // if skin defined, check if the db still exists - if (gPrefs->skin.dbID) { - UInt32 type, creator; - - // remember to check version for next revision of the skin - err = DmDatabaseInfo (gPrefs->skin.cardNo, gPrefs->skin.dbID, gPrefs->skin.nameP, 0, 0, 0, 0, 0, 0, 0,0, &type, &creator); - if (!err) - if (type != 'skin' || creator != appFileCreator) - err = dmErrInvalidParam; - - if (err) - MemSet(&(gPrefs->skin),sizeof(SkinInfoType),0); - } - - // No skin ? try to get the first one - if (!gPrefs->skin.dbID) { - DmSearchStateType stateInfo; - - err = DmGetNextDatabaseByTypeCreator(true, &stateInfo, 'skin', appFileCreator, false, &gPrefs->skin.cardNo, &gPrefs->skin.dbID); - if (!err) - err = DmDatabaseInfo (gPrefs->skin.cardNo, gPrefs->skin.dbID, gPrefs->skin.nameP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - } - - if (err) - FrmCustomAlert(FrmErrorAlert,"No skin found.\nPlease install a skin and restart ScummVM.",0,0); - - return err; -} - -static Err AppStartCheckMathLib() -{ - Err error = errNone; - - if ((error = SysLibFind(MathLibName, &MathLibRef))) - if (error == sysErrLibNotFound) // couldn't find lib - error = SysLibLoad( LibType, MathLibCreator, &MathLibRef); - - if (!error) {// Now we can use lib. Executes Open library. - error = MathLibOpen(MathLibRef, MathLibVersion); - if (error) - FrmCustomAlert(FrmErrorAlert,"Can't open MathLib !",0,0); - - } else { - FrmCustomAlert(FrmErrorAlert,"Can't find MathLib.\nPlease install it first.",0,0); - } - - return error; -} - -static void AppStopMathLib() { - UInt16 useCount; - - if (MathLibRef != sysInvalidRefNum) { - MathLibClose(MathLibRef, &useCount); - - if (!useCount) - SysLibRemove(MathLibRef); - } -} - -static Err AppStartCheckScreenSize() { - SonySysFtrSysInfoP sonySysFtrSysInfoP; - Err error = errNone; - -// WinGetDisplayExtent(&gVars->screenWidth, &gVars->screenHeight); - -// gVars->screenWidth <<= 1; -// gVars->screenHeight <<= 1; - gVars->screenWidth = 320; - gVars->screenHeight = 320; - - gVars->screenFullWidth = gVars->screenWidth; - gVars->screenFullHeight = gVars->screenHeight; - - if (!(error = FtrGet(sonySysFtrCreator, sonySysFtrNumSysInfoP, (UInt32*)&sonySysFtrSysInfoP))) { - if (sonySysFtrSysInfoP->libr & sonySysFtrSysInfoLibrSilk) { - - if ((error = SysLibFind(sonySysLibNameSilk, &gVars->slkRefNum))) - if (error == sysErrLibNotFound) - error = SysLibLoad( sonySysFileTSilkLib, sonySysFileCSilkLib, &gVars->slkRefNum); - - if (!error) { - error = FtrGet(sonySysFtrCreator, sonySysFtrNumVskVersion, &gVars->slkVersion); - // Get screen size - if (error) { - // v1 = NR - error = SilkLibOpen(gVars->slkRefNum); - if(!error) { - gVars->slkVersion = vskVersionNum1; - SilkLibEnableResize(gVars->slkRefNum); - SilkLibResizeDispWin(gVars->slkRefNum, silkResizeMax); - HRWinGetWindowExtent(gVars->HRrefNum, &gVars->screenFullWidth, &gVars->screenFullHeight); - SilkLibResizeDispWin(gVars->slkRefNum, silkResizeNormal); - SilkLibDisableResize(gVars->slkRefNum); - } - } else { - // v2 = NX/NZ - // v3 = UX - error = VskOpen(gVars->slkRefNum); - if(!error) { - VskSetState(gVars->slkRefNum, vskStateEnable, (gVars->slkVersion == vskVersionNum2 ? vskResizeVertically : vskResizeHorizontally)); - VskSetState(gVars->slkRefNum, vskStateResize, vskResizeNone); - HRWinGetWindowExtent(gVars->HRrefNum, &gVars->screenFullWidth, &gVars->screenFullHeight); - VskSetState(gVars->slkRefNum, vskStateResize, vskResizeMax); - VskSetState(gVars->slkRefNum, vskStateEnable, vskResizeDisable); - } - } - } - } - } - - if (error) - gVars->slkRefNum = sysInvalidRefNum; - - return error; -} - -static void AppStopSilk() { - if (gVars->slkRefNum != sysInvalidRefNum) - SilkLibClose(gVars->slkRefNum); -} - -static Err AppStart(void) { - UInt16 dataSize, checkSize = 0; - Err error; - - // allocate global variables space - dataSize = sizeof(GlobalsDataType); - gVars = (GlobalsDataType *)MemPtrNew(dataSize); - MemSet(gVars, dataSize, 0); - - gVars->indicator.on = 255; - gVars->indicator.off = 0; - gVars->HRrefNum = sysInvalidRefNum; - gVars->volRefNum = sysInvalidRefNum; - gVars->slkRefNum = sysInvalidRefNum; - - // allocate prefs space - dataSize = sizeof(GlobalsPreferenceType); - gPrefs = (GlobalsPreferenceType *)MemPtrNew(dataSize); - MemSet(gPrefs, dataSize, 0); - - // Read the saved preferences / saved-state information. - if (PrefGetAppPreferences(appFileCreator, appPrefID, NULL, &checkSize, true) == noPreferenceFound || checkSize != dataSize) { - UInt32 romVersion; - // reset all elements - MemSet(gPrefs, dataSize, 0); - - gPrefs->card.volRefNum = sysInvalidRefNum; - - gPrefs->autoOff = true; - gPrefs->vibrator = CheckVibratorExists(); - gPrefs->debug = false; - - FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion); - gPrefs->stdPalette = (romVersion >= kOS5Version); - - gPrefs->volume.speaker = 16; - gPrefs->volume.headphone = 16; - - gPrefs->volume.master = 192; - gPrefs->volume.music = 192; - gPrefs->volume.sfx = 192; - - gPrefs->sound.tempo = 100; - gPrefs->sound.defaultTrackLength = 10; - gPrefs->sound.firstTrack = 1; - - } else { - PrefGetAppPreferences(appFileCreator, appPrefID, gPrefs, &dataSize, true); - } - - error = AppStartCheckMathLib(); - if (error) return (error); - - error = AppStartCheckHRmode(); - if (error) return (error); - - error = AppStartLoadSkin(); - if (error) return (error); - - if (gPrefs->card.volRefNum != sysInvalidRefNum) { // if volref previously defined, check if it's a valid one - VolumeInfoType volInfo; - Err err = VFSVolumeInfo(gPrefs->card.volRefNum, &volInfo); - if (err) - gPrefs->card.volRefNum = sysInvalidRefNum; - } - else - gPrefs->card.volRefNum = parseCards(); //parseCards(0); // get first volref - - error = GamOpenDatabase(); - if (error) return (error); - GamImportDatabase(false); - - AppStartCheckNotify(); // not fatal error if not avalaible - AppStartCheckScreenSize(); - - return error; -} - -/*********************************************************************** - * - * FUNCTION: AppStop - * - * DESCRIPTION: Save the current state of the application. - * - * PARAMETERS: nothing - * - * RETURNED: nothing - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static Err AppStopCheckNotify() -{ - UInt32 romVersion; - Err err; - - err = FtrGet(sysFtrCreator, sysFtrNumNotifyMgrVersion, &romVersion); - if (!err) { - UInt16 cardNo; - LocalID dbID; - - err = SysCurAppDatabase(&cardNo, &dbID); - if (!err) { - SysNotifyUnregister(cardNo, dbID, sysNotifyVolumeUnmountedEvent, sysNotifyNormalPriority); - SysNotifyUnregister(cardNo, dbID, sysNotifyVolumeMountedEvent, sysNotifyNormalPriority); - // sonySysNotifyMsaEnforceOpenEvent - } - } - - return err; -} - -static void AppStop(void) { - // Close all the open forms. - FrmCloseAllForms(); - WinEraseWindow(); - WinPalette(winPaletteSetToDefault, 0, 256, NULL); - - // Close and move Game list database - GamCloseDatabase(false); - - // Write the saved preferences / saved-state information. This data - // will saved during a HotSync backup. - SavePrefs(); - - // stop all - AppStopSilk(); - AppStopCheckNotify(); - AppStopMathLib(); - AppStopHRMode(); - - // reset if needed - if (gVars) { - Boolean autoReset = gVars->autoReset; - MemPtrFree(gVars); - if (autoReset) - SysReset(); - } -} - - -/*********************************************************************** - * - * FUNCTION: ScummVMPalmMain - * - * DESCRIPTION: This is the main entry point for the application. - * - * PARAMETERS: cmd - word value specifying the launch code. - * cmdPB - pointer to a structure that is associated with the launch code. - * launchFlags - word value providing extra information about the launch. - * - * RETURNED: Result of launch - * - * REVISION HISTORY: - * - * - ***********************************************************************/ -static void AppLaunchCmdNotify(UInt16 LaunchFlags, SysNotifyParamType * pData) -{ - switch (pData->notifyType) - { - case sysNotifyVolumeMountedEvent: - pData->handled = true; // don't switch - - if (gPrefs) { // gPrefs exists ? so we are in the palm selector - CardSlotFormUpdate(); // redraw card list if needed - - if (gPrefs->card.volRefNum == sysInvalidRefNum) { - VFSAnyMountParamType *notifyDetailsP = (VFSAnyMountParamType *)pData->notifyDetailsP; - gPrefs->card.volRefNum = notifyDetailsP->volRefNum; - - if (FrmGetFormPtr(MainForm) == FrmGetActiveForm()) - if (gPrefs->card.volRefNum != sysInvalidRefNum) { - CardSlotCreateDirs(); - FrmUpdateForm(MainForm, frmRedrawUpdateMSImport); - } - } - } - break; - - case sysNotifyVolumeUnmountedEvent: - if (gPrefs) { - CardSlotFormUpdate(); - - if (gPrefs->card.volRefNum == (UInt16)pData->notifyDetailsP) { - gPrefs->card.volRefNum = sysInvalidRefNum; - - if (FrmGetFormPtr(MainForm) == FrmGetActiveForm()) - FrmUpdateForm(MainForm, frmRedrawUpdateMS); - } - } - break; - - case sonySysNotifyMsaEnforceOpenEvent: - // what am i supposed to do here ??? - break; - } -} - -static UInt32 ScummVMPalmMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags) -{ - Err error; - - error = RomVersionCompatible (kOurMinVersion, launchFlags); - if (error) return (error); - - switch (cmd) - { - case sysAppLaunchCmdNotify: - AppLaunchCmdNotify(launchFlags, (SysNotifyParamType *) cmdPBP); - break; - - case sysAppLaunchCmdNormalLaunch: - error = AppStart(); - if (error) - goto end; - - FrmGotoForm(MainForm); - AppEventLoop(); -end: - AppStop(); - break; - - default: - break; - - } - - return error; -} -/*********************************************************************** - * - * FUNCTION: PilotMain - * - * DESCRIPTION: This is the main entry point for the application. - * - * PARAMETERS: cmd - word value specifying the launch code. - * cmdPB - pointer to a structure that is associated with the launch code. - * launchFlags - word value providing extra information about the launch. - * RETURNED: Result of launch - * - * REVISION HISTORY: - * - * - ***********************************************************************/ - -UInt32 PilotMain( UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags) -{ - return ScummVMPalmMain(cmd, cmdPBP, launchFlags); -} \ No newline at end of file diff --git a/backends/PalmOS/Src/scumm_globals.h b/backends/PalmOS/Src/scumm_globals.h index 3dd5f08715a..e19eea60770 100644 --- a/backends/PalmOS/Src/scumm_globals.h +++ b/backends/PalmOS/Src/scumm_globals.h @@ -19,28 +19,46 @@ * $Header$ * */ - -#define GBVARS_DIGSTATEMUSICMAP_INDEX 0 -#define GBVARS_DIGSTATEMUSICTABLE_INDEX 1 -#define GBVARS_COMISTATEMUSICTABLE_INDEX 2 -#define GBVARS_COMISEQMUSICTABLE_INDEX 3 -#define GBVARS_DIGSEQMUSICTABLE_INDEX 4 -#define GBVARS_FTSTATEMUSICTABLE_INDEX 5 -#define GBVARS_FTSEQMUSICTABLE_INDEX 6 -#define GBVARS_GUIFONT_INDEX 7 -#define GBVARS_DEFAULTSCALETABLE_INDEX 8 -#define GBVARS_IMCTABLE_INDEX 9 -#define GBVARS_CODEC47TABLE_INDEX 10 -#define GBVARS_TRANSITIONEFFECTS_INDEX 11 -#define GBVARS_STRINGMAPTABLEV7_INDEX 12 -#define GBVARS_STRINGMAPTABLEV6_INDEX 13 -#define GBVARS_STRINGMAPTABLEV5_INDEX 14 -#define GBVARS_GERMANCHARSETDATAV2_INDEX 15 -#define GBVARS_FRENCHCHARSETDATAV2_INDEX 16 -#define GBVARS_ENGLISHCHARSETDATAV2_INDEX 17 -#define GBVARS_ITALIANCHARSETDATAV2_INDEX 18 -#define GBVARS_SPANISHCHARSETDATAV2_INDEX 19 -#define GBVARS_COSTSCALETABLE_INDEX 20 + +#ifndef __SCUMM_GLOBALS_H__ +#define __SCUMM_GLOBALS_H__ + +enum { + GBVARS_DIGSTATEMUSICMAP_INDEX = 0, + GBVARS_DIGSTATEMUSICTABLE_INDEX, + GBVARS_COMISTATEMUSICTABLE_INDEX, + GBVARS_COMISEQMUSICTABLE_INDEX, + GBVARS_DIGSEQMUSICTABLE_INDEX, + GBVARS_FTSTATEMUSICTABLE_INDEX, + GBVARS_FTSEQMUSICTABLE_INDEX, + GBVARS_GUIFONT_INDEX, + GBVARS_DEFAULTSCALETABLE_INDEX, + GBVARS_IMCTABLE_INDEX, + GBVARS_CODEC47TABLE_INDEX, + GBVARS_TRANSITIONEFFECTS_INDEX, + GBVARS_STRINGMAPTABLEV7_INDEX, + GBVARS_STRINGMAPTABLEV6_INDEX, + GBVARS_STRINGMAPTABLEV5_INDEX, + GBVARS_GERMANCHARSETDATAV2_INDEX, + GBVARS_FRENCHCHARSETDATAV2_INDEX, + GBVARS_ENGLISHCHARSETDATAV2_INDEX, + GBVARS_ITALIANCHARSETDATAV2_INDEX, + GBVARS_SPANISHCHARSETDATAV2_INDEX, + GBVARS_COSTSCALETABLE_INDEX, + GBVARS_NOTELENGTHS_INDEX, + GBVARS_HULLOFFSETS_INDEX, + GBVARS_HULLS_INDEX, + GBVARS_FREQMODLENGTHS_INDEX, + GBVARS_FREQMODOFFSETS_INDEX, + GBVARS_FREQMODTABLE_INDEX, + GBVARS_SPKFREQTABLE_INDEX, + GBVARS_PCJRFREQTABLE_INDEX +}; + +void *GlbGetRecord(UInt16 index, UInt16 id); +void GlbReleaseRecord(UInt16 index, UInt16 id); +void GlbOpen(); +void GlbClose(); #define GBVARS_SCUMM 0 #define GBVARS_SIMON 1 @@ -54,11 +72,8 @@ #define CALL_INIT(x) initGlobals_##x(); #define CALL_RELEASE(x) releaseGlobals_##x(); -#define _GSETPTR(var,index,format,id) var = (format *)GBGetRecord(index,id); -#define _GRELEASEPTR(index,id) GBReleaseRecord(index,id); - -void *GBGetRecord(UInt16 index, UInt16 id); -void GBReleaseRecord(UInt16 index, UInt16 id); +#define _GSETPTR(var,index,format,id) var = (format *)GlbGetRecord(index,id); +#define _GRELEASEPTR(index,id) GlbReleaseRecord(index,id); #define PROTO_GLOBALS(x) void CALL_INIT(x);\ void CALL_RELEASE(x); @@ -72,5 +87,8 @@ PROTO_GLOBALS(Gfx) PROTO_GLOBALS(Dialogs) PROTO_GLOBALS(Charset) PROTO_GLOBALS(Costume) +PROTO_GLOBALS(PlayerV2) -#undef PROTO_GLOBALS \ No newline at end of file +#undef PROTO_GLOBALS + +#endif \ No newline at end of file diff --git a/backends/PalmOS/Src/skin.h b/backends/PalmOS/Src/skin.h index e6ff5e62eed..56a8378e3a1 100644 --- a/backends/PalmOS/Src/skin.h +++ b/backends/PalmOS/Src/skin.h @@ -19,10 +19,38 @@ * $Header$ * */ +#ifndef __SKIN_H__ +#define __SKIN_H__ +// skin +#define sknInfoState 0 +#define sknInfoPosX 1 +#define sknInfoPosY 2 + +#define sknInfoMaxWOrH 3 +#define sknInfoDrawMode 4 +#define sknInfoKeepXOrY1 5 +#define sknInfoKeepXOrY2 7 + +#define sknInfoListWidth sknInfoMaxWOrH +#define sknInfoListHeight sknInfoDrawMode +#define sknInfoListSize sknInfoListHeight +#define sknInfoListItemSize 12 + +#define sknPosRsc 'sPos' +#define sknColorsRsc 'sCol' + +#define sknStateNormal 0 +#define sknStateSelected 10 +#define sknStateDisabled 20 + +#define sknSelectedState(bmp) (bmp + sknStateSelected) +#define sknDisabledState(bmp) (bmp + sknStateDisabled) + +// skin elements #define skinList 500 #define skinColors 600 -//#define skinPalette 510 +#define skinPalette 610 #define skinButtonNone 0 #define skinSliderUpArrow 2000 @@ -74,4 +102,22 @@ #define skinButtonPlayNormal 7000 #define skinButtonPlayOver 7010 -#define skinButtonPlayDisabled 7040 \ No newline at end of file +#define skinButtonPlayDisabled 7040 + +// protos +void SknApplySkin(); +void SknGetObjectBounds(DmOpenRef skinDBP, DmResID resID, RectangleType *rP); +DmOpenRef SknOpenSkin(); +void SknCloseSkin(DmOpenRef skinDBP); +UInt8 SknSetState(DmOpenRef skinDBP, DmResID resID, UInt8 newState); +void SknShowObject(DmOpenRef skinDBP, DmResID resID); +UInt8 SknGetState(DmOpenRef skinDBP, DmResID resID); +void SknUpdateList(); +void SknGetListBounds(RectangleType *rAreaP, RectangleType *rArea2xP); +UInt16 SknCheckClick(DmOpenRef skinDBP, Coord mx, Coord my); +void SknSelect(Coord x, Coord y); +Boolean SknProcessArrowAction(UInt16 button); + +extern UInt16 lastIndex; + +#endif \ No newline at end of file