diff --git a/GpApp/About.cpp b/GpApp/About.cpp index c063b14..3760eb3 100644 --- a/GpApp/About.cpp +++ b/GpApp/About.cpp @@ -4,7 +4,7 @@ //---------------------------------------------------------------------------- //============================================================================ - +#include "PLKeyEncoding.h" #include "PLNumberFormatting.h" #include "PLResources.h" #include "PLSound.h" @@ -184,10 +184,10 @@ static Boolean AboutFilter (DialogPtr theDial, EventRecord *theEvent, short *hit switch (theEvent->what) { case keyDown: - switch ((theEvent->message) & charCodeMask) + switch (theEvent->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): HiLiteOkayButton(); Delay(8, &dummyLong); UnHiLiteOkayButton(); diff --git a/GpApp/Events.cpp b/GpApp/Events.cpp index 833aa18..22c412d 100644 --- a/GpApp/Events.cpp +++ b/GpApp/Events.cpp @@ -7,6 +7,7 @@ #include "PLAppleEvents.h" +#include "PLKeyEncoding.h" #include "PLToolUtils.h" #include "PLQuickdraw.h" #include "Externs.h" @@ -162,54 +163,51 @@ void HandleMouseEvent (EventRecord *theEvent) void HandleKeyEvent (EventRecord *theEvent) { - char theChar; + intptr_t theChar; Boolean shiftDown, commandDown, optionDown; - theChar = theEvent->message & charCodeMask; + theChar = theEvent->message; shiftDown = ((theEvent->modifiers & shiftKey) != 0); commandDown = ((theEvent->modifiers & cmdKey) != 0); optionDown = ((theEvent->modifiers & optionKey) != 0); if ((commandDown) && (!optionDown)) - DoMenuChoice(MenuKey(theChar)); + DoMenuChoice(MenuKey(static_cast(theChar))); else { switch (theChar) { - case kHelpKeyASCII: - break; - - case kPageUpKeyASCII: + case PL_KEY_SPECIAL(kPageUp): if (houseUnlocked) PrevToolMode(); break; - case kPageDownKeyASCII: + case PL_KEY_SPECIAL(kPageDown): if (houseUnlocked) NextToolMode(); break; #if BUILD_ARCADE_VERSION - case kLeftArrowKeyASCII: + case PL_KEY_SPECIAL(kLeftArrow): DoOptionsMenu(iHighScores); break; - case kRightArrowKeyASCII: + case PL_KEY_SPECIAL(kRightArrow): DoOptionsMenu(iHelp); break; - case kUpArrowKeyASCII: + case PL_KEY_SPECIAL(kUpArrow): DoGameMenu(iNewGame); break; - case kDownArrowKeyASCII: + case PL_KEY_SPECIAL(kDownArrow): DoGameMenu(iNewGame); break; #else - case kLeftArrowKeyASCII: + case PL_KEY_SPECIAL(kLeftArrow): if (houseUnlocked) { if (objActive == kNoObjectSelected) @@ -219,7 +217,7 @@ void HandleKeyEvent (EventRecord *theEvent) } break; - case kRightArrowKeyASCII: + case PL_KEY_SPECIAL(kRightArrow): if (houseUnlocked) { if (objActive == kNoObjectSelected) @@ -229,7 +227,7 @@ void HandleKeyEvent (EventRecord *theEvent) } break; - case kUpArrowKeyASCII: + case PL_KEY_SPECIAL(kUpArrow): if (houseUnlocked) { if (objActive == kNoObjectSelected) @@ -239,7 +237,7 @@ void HandleKeyEvent (EventRecord *theEvent) } break; - case kDownArrowKeyASCII: + case PL_KEY_SPECIAL(kDownArrow): if (houseUnlocked) { if (objActive == kNoObjectSelected) @@ -251,7 +249,7 @@ void HandleKeyEvent (EventRecord *theEvent) #endif - case kDeleteKeyASCII: + case PL_KEY_SPECIAL(kDelete): if (houseUnlocked) { if (objActive == kNoObjectSelected) @@ -261,7 +259,7 @@ void HandleKeyEvent (EventRecord *theEvent) } break; - case kTabKeyASCII: + case PL_KEY_SPECIAL(kTab): if ((theMode == kEditMode) && (houseUnlocked)) { if (shiftDown) @@ -271,61 +269,52 @@ void HandleKeyEvent (EventRecord *theEvent) } break; - case kEscapeKeyASCII: + case PL_KEY_SPECIAL(kEscape): if ((theMode == kEditMode) && (houseUnlocked)) DeselectObject(); break; - case kAKeyASCII: - case kCapAKeyASCII: + case PL_KEY_ASCII('A'): if ((theMode == kEditMode) && (houseUnlocked)) SetSpecificToolMode(kApplianceMode); break; - case kBKeyASCII: - case kCapBKeyASCII: + case PL_KEY_ASCII('B'): if ((theMode == kEditMode) && (houseUnlocked)) SetSpecificToolMode(kBlowerMode); break; - case kCKeyASCII: - case kCapCKeyASCII: + case PL_KEY_ASCII('C'): if ((theMode == kEditMode) && (houseUnlocked)) SetSpecificToolMode(kClutterMode); break; - case kEKeyASCII: - case kCapEKeyASCII: + case PL_KEY_ASCII('E'): if ((theMode == kEditMode) && (houseUnlocked)) SetSpecificToolMode(kEnemyMode); break; - case kFKeyASCII: - case kCapFKeyASCII: + case PL_KEY_ASCII('F'): if ((theMode == kEditMode) && (houseUnlocked)) SetSpecificToolMode(kFurnitureMode); break; - case kLKeyASCII: - case kCapLKeyASCII: + case PL_KEY_ASCII('L'): if ((theMode == kEditMode) && (houseUnlocked)) SetSpecificToolMode(kLightMode); break; - case kPKeyASCII: - case kCapPKeyASCII: + case PL_KEY_ASCII('P'): if ((theMode == kEditMode) && (houseUnlocked)) SetSpecificToolMode(kBonusMode); break; - case kSKeyASCII: - case kCapSKeyASCII: + case PL_KEY_ASCII('S'): if ((theMode == kEditMode) && (houseUnlocked)) SetSpecificToolMode(kSwitchMode); break; - case kTKeyASCII: - case kCapTKeyASCII: + case PL_KEY_ASCII('T'): if ((theMode == kEditMode) && (houseUnlocked)) SetSpecificToolMode(kTransportMode); break; @@ -485,12 +474,12 @@ void HandleEvent (void) Boolean itHappened = true; GetKeys(eventKeys); - if ((BitTst(&eventKeys, kCommandKeyMap)) && - (BitTst(&eventKeys, kOptionKeyMap))) + if ((BitTst(eventKeys, PL_KEY_EITHER_SPECIAL(kControl))) && + (BitTst(eventKeys, PL_KEY_EITHER_SPECIAL(kAlt)))) { HiliteAllObjects(); } - else if ((BitTst(&eventKeys, kOptionKeyMap)) && (theMode == kEditMode) && + else if ((BitTst(eventKeys, PL_KEY_EITHER_SPECIAL(kAlt))) && (theMode == kEditMode) && (houseUnlocked)) { EraseSelectedTool(); diff --git a/GpApp/Externs.h b/GpApp/Externs.h index a558609..9d470a4 100644 --- a/GpApp/Externs.h +++ b/GpApp/Externs.h @@ -11,7 +11,6 @@ #include "PLMenus.h" - #define kPreferredDepth 8 @@ -26,160 +25,6 @@ #define kAsynch TRUE #define kSynch FALSE -#define kHomeKeyASCII 0x01 -#define kEnterKeyASCII 0x03 -#define kEndKeyASCII 0x04 -#define kHelpKeyASCII 0x05 -#define kDeleteKeyASCII 0x08 -#define kTabKeyASCII 0x09 -#define kPageUpKeyASCII 0x0B -#define kPageDownKeyASCII 0x0C -#define kReturnKeyASCII 0x0D -#define kFunctionKeyASCII 0x10 -#define kClearKeyASCII 0x1A -#define kEscapeKeyASCII 0x1B -#define kLeftArrowKeyASCII 0x1C -#define kRightArrowKeyASCII 0x1D -#define kUpArrowKeyASCII 0x1E -#define kDownArrowKeyASCII 0x1F -#define kSpaceBarASCII 0x20 -#define kExclamationASCII 0x21 -#define kPlusKeyASCII 0x2B -#define kMinusKeyASCII 0x2D -#define k0KeyASCII 0x30 -#define k1KeyASCII 0x31 -#define k2KeyASCII 0x32 -#define k3KeyASCII 0x33 -#define k4KeyASCII 0x34 -#define k5KeyASCII 0x35 -#define k6KeyASCII 0x36 -#define k7KeyASCII 0x37 -#define k8KeyASCII 0x38 -#define k9KeyASCII 0x39 - -#define kCapAKeyASCII 0x41 -#define kCapBKeyASCII 0x42 -#define kCapCKeyASCII 0x43 -#define kCapDKeyASCII 0x44 -#define kCapEKeyASCII 0x45 -#define kCapFKeyASCII 0x46 -#define kCapGKeyASCII 0x47 -#define kCapHKeyASCII 0x48 -#define kCapIKeyASCII 0x49 -#define kCapJKeyASCII 0x4A -#define kCapKKeyASCII 0x4B -#define kCapLKeyASCII 0x4C -#define kCapMKeyASCII 0x4D -#define kCapNKeyASCII 0x4E -#define kCapOKeyASCII 0x4F -#define kCapPKeyASCII 0x50 -#define kCapQKeyASCII 0x51 -#define kCapRKeyASCII 0x52 -#define kCapSKeyASCII 0x53 -#define kCapTKeyASCII 0x54 -#define kCapUKeyASCII 0x55 -#define kCapVKeyASCII 0x56 -#define kCapWKeyASCII 0x57 -#define kCapXKeyASCII 0x58 -#define kCapYKeyASCII 0x59 -#define kCapZKeyASCII 0x5A - -#define kAKeyASCII 0x61 -#define kBKeyASCII 0x62 -#define kCKeyASCII 0x63 -#define kDKeyASCII 0x64 -#define kEKeyASCII 0x65 -#define kFKeyASCII 0x66 -#define kGKeyASCII 0x67 -#define kHKeyASCII 0x68 -#define kIKeyASCII 0x69 -#define kJKeyASCII 0x6A -#define kKKeyASCII 0x6B -#define kLKeyASCII 0x6C -#define kMKeyASCII 0x6D -#define kNKeyASCII 0x6E -#define kOKeyASCII 0x6F -#define kPKeyASCII 0x70 -#define kQKeyASCII 0x71 -#define kRKeyASCII 0x72 -#define kSKeyASCII 0x73 -#define kTKeyASCII 0x74 -#define kUKeyASCII 0x75 -#define kVKeyASCII 0x76 -#define kWKeyASCII 0x77 -#define kXKeyASCII 0x78 -#define kYKeyASCII 0x79 -#define kZKeyASCII 0x7A -#define kForwardDeleteASCII 0x7F - -#define kPlusKeypadMap 66 // key map offset for + on keypad -#define kMinusKeypadMap 73 // key map offset for - on keypad -#define kTimesKeypadMap 68 // key map offset for * on keypad -#define k0KeypadMap 85 // key map offset for 0 on keypad -#define k1KeypadMap 84 // key map offset for 1 on keypad -#define k2KeypadMap 83 // key map offset for 2 on keypad -#define k3KeypadMap 82 // key map offset for 3 on keypad -#define k4KeypadMap 81 // key map offset for 4 on keypad -#define k5KeypadMap 80 // key map offset for 5 on keypad -#define k6KeypadMap 95 // key map offset for 6 on keypad -#define k7KeypadMap 94 // key map offset for 7 on keypad -#define k8KeypadMap 92 // key map offset for 8 on keypad -#define k9KeypadMap 91 // key map offset for 9 on keypad - -#define kUpArrowKeyMap 121 // key map offset for up arrow -#define kDownArrowKeyMap 122 // key map offset for down arrow -#define kRightArrowKeyMap 123 // key map offset for right arrow -#define kLeftArrowKeyMap 124 // key map offset for left arrow - -#define kAKeyMap 7 -#define kBKeyMap 12 -#define kCKeyMap 15 -#define kDKeyMap 5 -#define kEKeyMap 9 -#define kFKeyMap 4 -#define kGKeyMap 2 -#define kHKeyMap 3 -#define kMKeyMap 41 -#define kNKeyMap 42 -#define kOKeyMap 24 -#define kPKeyMap 36 -#define kQKeyMap 11 -#define kRKeyMap 8 -#define kSKeyMap 6 -#define kTKeyMap 22 -#define kVKeyMap 14 -#define kWKeyMap 10 -#define kXKeyMap 0 -#define kZKeyMap 1 -#define kPeriodKeyMap 40 -#define kCommandKeyMap 48 -#define kEscKeyMap 50 -#define kDeleteKeyMap 52 -#define kSpaceBarMap 54 -#define kTabKeyMap 55 -#define kControlKeyMap 60 -#define kOptionKeyMap 61 -#define kCapsLockKeyMap 62 -#define kShiftKeyMap 63 - -#define kTabRawKey 0x30 // key map offset for Tab key -#define kClearRawKey 0x47 // key map offset for Clear key -#define kF5RawKey 0x60 // key map offset for F5 -#define kF6RawKey 0x61 // key map offset for F6 -#define kF7RawKey 0x62 // key map offset for F7 -#define kF3RawKey 0x63 // key map offset for F3 -#define kF8RawKey 0x64 // key map offset for F8 -#define kF9RawKey 0x65 // key map offset for F9 -#define kF11RawKey 0x67 // key map offset for F11 -#define kF13RawKey 0x69 // key map offset for F13 -#define kF14RawKey 0x6B // key map offset for F14 -#define kF10RawKey 0x6D // key map offset for F10 -#define kF12RawKey 0x6F // key map offset for F12 -#define kF15RawKey 0x71 // key map offset for F15 -#define kF4RawKey 0x76 // key map offset for F4 -#define kF2RawKey 0x78 // key map offset for F2 -#define kF1RawKey 0x7A // key map offset for F1 - #define kErrUnnaccounted 1 #define kErrNoMemory 2 #define kErrDialogDidntLoad 3 @@ -357,7 +202,6 @@ long LongSquareRoot (long); //void ShowMenuBarOld (void); Boolean WaitForInputEvent (short); void WaitCommandQReleased (void); -char GetKeyMapFromMessage (intptr_t); void GetKeyName (intptr_t, StringPtr); Boolean OptionKeyDown (void); long ExtractCTSeed (CGrafPtr); diff --git a/GpApp/GameOver.cpp b/GpApp/GameOver.cpp index db67bd8..0afa12c 100644 --- a/GpApp/GameOver.cpp +++ b/GpApp/GameOver.cpp @@ -7,6 +7,7 @@ #include "PLToolUtils.h" #include "PLPasStr.h" +#include "PLKeyEncoding.h" #include "Externs.h" #include "Environ.h" #include "MainWindow.h" @@ -210,12 +211,13 @@ void DoGameOverStarAnimation (void) do { GetKeys(theKeys); - if ((BitTst(&theKeys, kCommandKeyMap)) || (BitTst(&theKeys, kOptionKeyMap)) || - (BitTst(&theKeys, kShiftKeyMap)) || (BitTst(&theKeys, kControlKeyMap))) + if ((BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kControl))) || (BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kAlt))) || (BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kShift)))) noInteruption = false; if (GetNextEvent(everyEvent, &theEvent)) if ((theEvent.what == mouseDown) || (theEvent.what == keyDown)) noInteruption = false; + + Delay(1, nullptr); } while (TickCount() < nextLoop); nextLoop = TickCount() + 2; @@ -462,8 +464,7 @@ void DoDiedGameOver (void) do { GetKeys(theKeys); - if ((BitTst(&theKeys, kCommandKeyMap)) || (BitTst(&theKeys, kOptionKeyMap)) || - (BitTst(&theKeys, kShiftKeyMap)) || (BitTst(&theKeys, kControlKeyMap))) + if ((BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kAlt))) || (BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kControl))) || (BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kShift)))) { pagesStuck = 8; userAborted = true; diff --git a/GpApp/HighScores.cpp b/GpApp/HighScores.cpp index d59df57..4436e50 100644 --- a/GpApp/HighScores.cpp +++ b/GpApp/HighScores.cpp @@ -7,6 +7,7 @@ #include "PLFolders.h" +#include "PLKeyEncoding.h" #include "PLNumberFormatting.h" #include "PLScript.h" #include "PLSound.h" @@ -457,17 +458,17 @@ Boolean NameFilter (DialogPtr dial, EventRecord *event, short *item) { case keyDown: keyStroke = true; - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): PlayPrioritySound(kCarriageSound, kCarriagePriority); FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - case kTabKeyASCII: + case PL_KEY_SPECIAL(kTab): SelectDialogItemText(dial, kHighNameItem, 0, 1024); return(false); break; @@ -565,17 +566,17 @@ Boolean BannerFilter (DialogPtr dial, EventRecord *event, short *item) case keyDown: keyStroke = true; - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): PlayPrioritySound(kCarriageSound, kCarriagePriority); FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - - case kTabKeyASCII: + + case PL_KEY_SPECIAL(kTab): SelectDialogItemText(dial, kHighBannerItem, 0, 1024); return(false); break; diff --git a/GpApp/House.cpp b/GpApp/House.cpp index ec0abbe..6ae7420 100644 --- a/GpApp/House.cpp +++ b/GpApp/House.cpp @@ -5,6 +5,7 @@ //============================================================================ #include "PLAppleEvents.h" +#include "PLKeyEncoding.h" #include "PLNavigation.h" #include "PLNumberFormatting.h" #include "PLPasStr.h" @@ -631,10 +632,10 @@ Boolean GoToFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); diff --git a/GpApp/HouseInfo.cpp b/GpApp/HouseInfo.cpp index 07f3594..49c7d0b 100644 --- a/GpApp/HouseInfo.cpp +++ b/GpApp/HouseInfo.cpp @@ -7,6 +7,7 @@ #include "PLNumberFormatting.h" +#include "PLKeyEncoding.h" #include "PLPasStr.h" #include "Externs.h" #include "DialogUtils.h" @@ -139,15 +140,16 @@ Boolean HouseFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - - case kEscapeKeyASCII: + + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); diff --git a/GpApp/Input.cpp b/GpApp/Input.cpp index 76ce835..b744de9 100644 --- a/GpApp/Input.cpp +++ b/GpApp/Input.cpp @@ -7,6 +7,7 @@ #include "PLToolUtils.h" #include "PLDialogs.h" +#include "PLKeyEncoding.h" #include "Externs.h" #include "MainWindow.h" #include "RectUtils.h" @@ -53,7 +54,7 @@ void LogDemoKey (char keyIs) void DoCommandKey (void) { - if (BitTst(&theKeys, kQKeyMap)) + if (BitTst(theKeys, PL_KEY_ASCII('Q'))) { playing = false; paused = false; @@ -63,7 +64,7 @@ void DoCommandKey (void) SaveGame2(); // New save game. } } - else if ((BitTst(&theKeys, kSKeyMap)) && (!twoPlayerGame)) + else if ((BitTst(theKeys, PL_KEY_ASCII('S'))) && (!twoPlayerGame)) { RefreshScoreboard(kSavingTitleMode); SaveGame2(); // New save game. @@ -91,17 +92,17 @@ void DoPause (void) { GetKeys(theKeys); } - while ((isEscPauseKey && BitTst(&theKeys, kEscKeyMap)) || - (!isEscPauseKey && BitTst(&theKeys, kTabKeyMap))); + while ((isEscPauseKey && BitTst(theKeys, PL_KEY_SPECIAL(kEscape))) || + (!isEscPauseKey && BitTst(theKeys, PL_KEY_SPECIAL(kTab)))); paused = true; while (paused) { GetKeys(theKeys); - if ((isEscPauseKey && BitTst(&theKeys, kEscKeyMap)) || - (!isEscPauseKey && BitTst(&theKeys, kTabKeyMap))) + if ((isEscPauseKey && BitTst(theKeys, PL_KEY_SPECIAL(kEscape))) || + (!isEscPauseKey && BitTst(theKeys, PL_KEY_SPECIAL(kTab)))) paused = false; - else if (BitTst(&theKeys, kCommandKeyMap)) + else if (BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kControl))) DoCommandKey(); } @@ -113,8 +114,8 @@ void DoPause (void) { GetKeys(theKeys); } - while ((isEscPauseKey && BitTst(&theKeys, kEscKeyMap)) || - (!isEscPauseKey && BitTst(&theKeys, kTabKeyMap))); + while ((isEscPauseKey && BitTst(theKeys, PL_KEY_SPECIAL(kEscape))) || + (!isEscPauseKey && BitTst(theKeys, PL_KEY_SPECIAL(kTab)))); } //-------------------------------------------------------------- DoBatteryEngaged @@ -192,10 +193,10 @@ void DoHeliumEngaged (gliderPtr thisGlider) #if BUILD_ARCADE_VERSION - if ((BitTst(&theKeys, thisGlider->leftKey)) || - (BitTst(&theKeys, thisGlider->rightKey)) || - (BitTst(&theKeys, thisGlider->battKey)) || - (BitTst(&theKeys, thisGlider->bandKey))) + if ((BitTst(theKeys, thisGlider->leftKey)) || + (BitTst(theKeys, thisGlider->rightKey)) || + (BitTst(theKeys, thisGlider->battKey)) || + (BitTst(theKeys, thisGlider->bandKey))) { playing = false; paused = false; @@ -269,8 +270,8 @@ void DoHeliumEngaged (gliderPtr thisGlider) else thisGlider->fireHeld = false; - if ((isEscPauseKey && BitTst(&theKeys, kEscKeyMap)) || - (!isEscPauseKey && BitTst(&theKeys, kTabKeyMap))) + if ((isEscPauseKey && BitTst(theKeys, PL_KEY_SPECIAL(kEscape))) || + (!isEscPauseKey && BitTst(theKeys, PL_KEY_SPECIAL(kTab)))) { DoPause(); } @@ -284,7 +285,7 @@ void GetInput (gliderPtr thisGlider) if (thisGlider->which == kPlayer1) { GetKeys(theKeys); - if (BitTst(&theKeys, kCommandKeyMap)) + if (BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kControl))) DoCommandKey(); } @@ -299,12 +300,12 @@ void GetInput (gliderPtr thisGlider) { thisGlider->heldLeft = false; thisGlider->heldRight = false; - if (BitTst(&theKeys, thisGlider->rightKey)) // right key + if (BitTst(theKeys, thisGlider->rightKey)) // right key { #ifdef CREATEDEMODATA LogDemoKey(0); #endif - if (BitTst(&theKeys, thisGlider->leftKey)) + if (BitTst(theKeys, thisGlider->leftKey)) { ToggleGliderFacing(thisGlider); thisGlider->heldLeft = true; @@ -316,7 +317,7 @@ void GetInput (gliderPtr thisGlider) thisGlider->heldRight = true; } } - else if (BitTst(&theKeys, thisGlider->leftKey)) // left key + else if (BitTst(theKeys, thisGlider->leftKey)) // left key { #ifdef CREATEDEMODATA LogDemoKey(1); @@ -328,7 +329,7 @@ void GetInput (gliderPtr thisGlider) else thisGlider->tipped = false; - if ((BitTst(&theKeys, thisGlider->battKey)) && (batteryTotal != 0) && + if ((BitTst(theKeys, thisGlider->battKey)) && (batteryTotal != 0) && (thisGlider->mode == kGliderNormal)) { #ifdef CREATEDEMODATA @@ -342,7 +343,7 @@ void GetInput (gliderPtr thisGlider) else batteryWasEngaged = false; - if ((BitTst(&theKeys, thisGlider->bandKey)) && (bandsTotal > 0) && + if ((BitTst(theKeys, thisGlider->bandKey)) && (bandsTotal > 0) && (thisGlider->mode == kGliderNormal)) { #ifdef CREATEDEMODATA @@ -365,14 +366,14 @@ void GetInput (gliderPtr thisGlider) thisGlider->fireHeld = false; if ((otherPlayerEscaped != kNoOneEscaped) && - (BitTst(&theKeys, kDeleteKeyMap)) && + (BitTst(theKeys, PL_KEY_SPECIAL(kDelete))) && (thisGlider->which) && (!onePlayerLeft)) { ForceKillGlider(); } - if ((isEscPauseKey && BitTst(&theKeys, kEscKeyMap)) || - (!isEscPauseKey && BitTst(&theKeys, kTabKeyMap))) + if ((isEscPauseKey && BitTst(theKeys, PL_KEY_SPECIAL(kEscape))) || + (!isEscPauseKey && BitTst(theKeys, PL_KEY_SPECIAL(kTab)))) { DoPause(); } diff --git a/GpApp/InterfaceInit.cpp b/GpApp/InterfaceInit.cpp index a5f146e..26c1bae 100644 --- a/GpApp/InterfaceInit.cpp +++ b/GpApp/InterfaceInit.cpp @@ -9,6 +9,7 @@ #include "Externs.h" #include "Environ.h" #include "Map.h" +#include "PLKeyEncoding.h" #include "RectUtils.h" #include "Tools.h" @@ -139,10 +140,10 @@ void VariableInit (void) #endif theGlider.which = kPlayer1; - theGlider2.leftKey = kControlKeyMap; - theGlider2.rightKey = kCommandKeyMap; - theGlider2.battKey = kOptionKeyMap; - theGlider2.bandKey = kShiftKeyMap; + theGlider2.leftKey = PL_KEY_ASCII('A'); + theGlider2.rightKey = PL_KEY_ASCII('D'); + theGlider2.battKey = PL_KEY_ASCII('S'); + theGlider2.bandKey = PL_KEY_ASCII('W'); theGlider2.which = kPlayer2; theMode = kSplashMode; diff --git a/GpApp/Main.cpp b/GpApp/Main.cpp index 2abae42..220ea2c 100644 --- a/GpApp/Main.cpp +++ b/GpApp/Main.cpp @@ -7,6 +7,7 @@ #include "PLApplication.h" +#include "PLKeyEncoding.h" #include "Externs.h" #include "Environ.h" #include "House.h" @@ -131,10 +132,10 @@ void ReadInPrefs (void) PasStringCopy(PSTR("up arrow"), bandName); PasStringCopy(PSTR("Your Name"), highName); PasStringCopy(PSTR("Your Message Here"), highBanner); - theGlider.leftKey = kLeftArrowKeyMap; - theGlider.rightKey = kRightArrowKeyMap; - theGlider.battKey = kDownArrowKeyMap; - theGlider.bandKey = kUpArrowKeyMap; + theGlider.leftKey = PL_KEY_SPECIAL(kLeftArrow); + theGlider.rightKey = PL_KEY_SPECIAL(kRightArrow); + theGlider.battKey = PL_KEY_SPECIAL(kDownArrow); + theGlider.bandKey = PL_KEY_SPECIAL(kUpArrow); UnivGetSoundVolume(&isVolume, thisMac.hasSM3); if (isVolume < 1) diff --git a/GpApp/MainWindow.cpp b/GpApp/MainWindow.cpp index 4a8612e..2ed50d0 100644 --- a/GpApp/MainWindow.cpp +++ b/GpApp/MainWindow.cpp @@ -12,6 +12,7 @@ #include "Environ.h" #include "House.h" #include "RectUtils.h" +#include "PLKeyEncoding.h" #define kMainWindowID 128 @@ -353,7 +354,7 @@ void HandleMainClick (Point wherePt, Boolean isDoubleClick) DoNewObjectClick(wherePt); GetKeys(theseKeys); - if (!BitTst(&theseKeys, kShiftKeyMap)) + if (!BitTst(theseKeys, PL_KEY_EITHER_SPECIAL(kShift))) { EraseSelectedTool(); SelectTool(kSelectTool); diff --git a/GpApp/Menu.cpp b/GpApp/Menu.cpp index da07779..22914b1 100644 --- a/GpApp/Menu.cpp +++ b/GpApp/Menu.cpp @@ -8,6 +8,7 @@ //#include #include "PLNumberFormatting.h" +#include "PLKeyEncoding.h" #include "PLPasStr.h" #include "PLToolUtils.h" #include "DialogUtils.h" @@ -671,10 +672,10 @@ Boolean ResumeFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); diff --git a/GpApp/Music.cpp b/GpApp/Music.cpp index d622c19..45ac85e 100644 --- a/GpApp/Music.cpp +++ b/GpApp/Music.cpp @@ -354,6 +354,8 @@ void InitMusic (void) musicCursor = 0; musicSoundID = musicScore[musicCursor]; musicMode = kPlayWholeScoreMode; + + PL_NotYetImplemented_TODO("MusicSync"); if (isPlayMusicIdle) { diff --git a/GpApp/ObjectAdd.cpp b/GpApp/ObjectAdd.cpp index 4008c61..08294ff 100644 --- a/GpApp/ObjectAdd.cpp +++ b/GpApp/ObjectAdd.cpp @@ -7,6 +7,7 @@ #include "PLToolUtils.h" +#include "PLKeyEncoding.h" #include "Externs.h" #include "ObjectEdit.h" #include "RectUtils.h" @@ -738,7 +739,7 @@ Boolean AddNewObject (Point where, short what, Boolean showItNow) case kFlower: GetKeys(theseKeys); - if (!BitTst(&theseKeys, kShiftKeyMap)) + if (!BitTst(theseKeys, PL_KEY_EITHER_SPECIAL(kShift))) wasFlower = RandomInt(kNumFlowers); newRect = flowerSrc[wasFlower]; CenterRectOnPoint(&newRect, where); diff --git a/GpApp/ObjectEdit.cpp b/GpApp/ObjectEdit.cpp index 5a8ca5a..c7f59f9 100644 --- a/GpApp/ObjectEdit.cpp +++ b/GpApp/ObjectEdit.cpp @@ -4,7 +4,7 @@ //---------------------------------------------------------------------------- //============================================================================ - +#include "PLKeyEncoding.h" #include "PLSound.h" #include "PLToolUtils.h" #include "PLPasStr.h" @@ -2754,8 +2754,8 @@ void HiliteAllObjects (void) { GetKeys(theseKeys); } - while ((BitTst(&theseKeys, kCommandKeyMap)) && - (BitTst(&theseKeys, kOptionKeyMap))); + while ((BitTst(theseKeys, PL_KEY_EITHER_SPECIAL(kControl))) && + (BitTst(theseKeys, PL_KEY_EITHER_SPECIAL(kAlt)))); for (i = 0; i < kMaxRoomObs; i++) FrameRect(&roomObjectRects[i]); diff --git a/GpApp/ObjectInfo.cpp b/GpApp/ObjectInfo.cpp index cfe09b4..ff1ed15 100644 --- a/GpApp/ObjectInfo.cpp +++ b/GpApp/ObjectInfo.cpp @@ -5,7 +5,7 @@ //---------------------------------------------------------------------------- //============================================================================ - +#include "PLKeyEncoding.h" #include "PLNumberFormatting.h" #include "PLSound.h" #include "PLTextUtils.h" @@ -341,22 +341,22 @@ Boolean BlowerFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - case kEscapeKeyASCII: + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); break; - case kTabKeyASCII: + case PL_KEY_SPECIAL(kTab): // SelectDialogItemText(dial, kRoomNameItem, 0, 1024); return(true); break; @@ -396,10 +396,10 @@ Boolean FurnitureFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); @@ -432,10 +432,10 @@ Boolean CustPictFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); @@ -468,16 +468,16 @@ Boolean SwitchFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - case kEscapeKeyASCII: + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); @@ -510,22 +510,22 @@ Boolean TriggerFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - case kEscapeKeyASCII: + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); break; - case kTabKeyASCII: + case PL_KEY_SPECIAL(kTab): SelectDialogItemText(dial, kDelay3Item, 0, 1024); return(true); break; @@ -557,16 +557,16 @@ Boolean LightFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - - case kEscapeKeyASCII: + + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); @@ -607,22 +607,22 @@ Boolean ApplianceFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - - case kEscapeKeyASCII: + + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); break; - - case kTabKeyASCII: + + case PL_KEY_SPECIAL(kTab): SelectDialogItemText(dial, kDelayItem, 0, 1024); return(true); break; @@ -662,16 +662,16 @@ Boolean MicrowaveFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - - case kEscapeKeyASCII: + + case PL_KEY_SPECIAL(kTab): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); @@ -712,16 +712,16 @@ Boolean GreaseFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - - case kEscapeKeyASCII: + + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); @@ -754,10 +754,10 @@ Boolean InvisBonusFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); @@ -790,16 +790,16 @@ Boolean TransFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - - case kEscapeKeyASCII: + + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); @@ -832,22 +832,22 @@ Boolean EnemyFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - - case kEscapeKeyASCII: + + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); break; - - case kTabKeyASCII: + + case PL_KEY_SPECIAL(kTab): SelectDialogItemText(dial, kDelay2Item, 0, 1024); return(true); break; @@ -887,16 +887,16 @@ Boolean FlowerFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - case kEscapeKeyASCII: + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); diff --git a/GpApp/Room.cpp b/GpApp/Room.cpp index 2c36a91..e5f342d 100644 --- a/GpApp/Room.cpp +++ b/GpApp/Room.cpp @@ -4,7 +4,7 @@ //---------------------------------------------------------------------------- //============================================================================ - +#include "PLKeyEncoding.h" #include "PLResources.h" #include "PLToolUtils.h" #include "PLPasStr.h" @@ -231,7 +231,7 @@ Boolean CreateNewRoom (short h, short v) UpdateMenus(false); GetKeys(theKeys); - if (BitTst(&theKeys, kShiftKeyMap)) + if (BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kShift))) newRoomNow = false; else newRoomNow = autoRoomEdit; // Flag to bring up RoomInfo diff --git a/GpApp/RoomInfo.cpp b/GpApp/RoomInfo.cpp index db6d9b8..2cf2129 100644 --- a/GpApp/RoomInfo.cpp +++ b/GpApp/RoomInfo.cpp @@ -5,7 +5,7 @@ //---------------------------------------------------------------------------- //============================================================================ - +#include "PLKeyEncoding.h" #include "PLNumberFormatting.h" #include "PLResources.h" #include "PLSound.h" @@ -305,22 +305,22 @@ Boolean RoomFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - - case kEscapeKeyASCII: + + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); break; - - case kTabKeyASCII: + + case PL_KEY_SPECIAL(kTab): SelectDialogItemText(dial, kRoomNameItem, 0, 1024); return(true); break; @@ -634,22 +634,22 @@ Boolean OriginalArtFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - - case kEscapeKeyASCII: + + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); break; - - case kTabKeyASCII: + + case PL_KEY_SPECIAL(kTab): SelectDialogItemText(dial, kPICTIDItem, 0, 1024); return(true); break; diff --git a/GpApp/SelectHouse.cpp b/GpApp/SelectHouse.cpp index 741114d..71f8b00 100644 --- a/GpApp/SelectHouse.cpp +++ b/GpApp/SelectHouse.cpp @@ -7,6 +7,7 @@ #include "PLAliases.h" +#include "PLKeyEncoding.h" #include "PLResources.h" #include "PLSound.h" #include "PLStringCompare.h" @@ -199,38 +200,36 @@ void PageDownHouses (DialogPtr theDial) Boolean LoadFilter (DialogPtr dial, EventRecord *event, short *item) { short screenCount, i, wasIndex; - char theChar; switch (event->what) { case keyDown: - theChar = (event->message) & charCodeMask; - switch (theChar) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - - case kEscapeKeyASCII: + + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); break; - - case kPageUpKeyASCII: + + case PL_KEY_SPECIAL(kPageUp): *item = kScrollUpItem; return (true); break; - - case kPageDownKeyASCII: + + case PL_KEY_SPECIAL(kPageDown): *item = kScrollDownItem; return (true); break; - - case kUpArrowKeyASCII: + + case PL_KEY_SPECIAL(kUpArrow): InvalWindowRect(GetDialogWindow(dial), &loadHouseRects[thisHouseIndex]); thisHouseIndex -= 4; if (thisHouseIndex < 0) @@ -248,8 +247,8 @@ Boolean LoadFilter (DialogPtr dial, EventRecord *event, short *item) InvalWindowRect(GetDialogWindow(dial), &loadHouseRects[thisHouseIndex]); return(true); break; - - case kDownArrowKeyASCII: + + case PL_KEY_SPECIAL(kDownArrow): InvalWindowRect(GetDialogWindow(dial), &loadHouseRects[thisHouseIndex]); thisHouseIndex += 4; screenCount = housesFound - housePage; @@ -260,8 +259,8 @@ Boolean LoadFilter (DialogPtr dial, EventRecord *event, short *item) InvalWindowRect(GetDialogWindow(dial), &loadHouseRects[thisHouseIndex]); return(true); break; - - case kLeftArrowKeyASCII: + + case PL_KEY_SPECIAL(kLeftArrow): InvalWindowRect(GetDialogWindow(dial), &loadHouseRects[thisHouseIndex]); thisHouseIndex--; if (thisHouseIndex < 0) @@ -274,9 +273,9 @@ Boolean LoadFilter (DialogPtr dial, EventRecord *event, short *item) InvalWindowRect(GetDialogWindow(dial), &loadHouseRects[thisHouseIndex]); return(true); break; - - case kTabKeyASCII: - case kRightArrowKeyASCII: + + case PL_KEY_SPECIAL(kTab): + case PL_KEY_SPECIAL(kRightArrow): InvalWindowRect(GetDialogWindow(dial), &loadHouseRects[thisHouseIndex]); thisHouseIndex++; screenCount = housesFound - housePage; @@ -289,32 +288,34 @@ Boolean LoadFilter (DialogPtr dial, EventRecord *event, short *item) break; default: - if (((theChar > 0x40) && (theChar <= 0x5A)) || - ((theChar > 0x60) && (theChar <= 0x7A))) + if (PL_KEY_GET_EVENT_TYPE(event->message) == KeyEventType_ASCII) { - if ((theChar > 0x60) && (theChar <= 0x7A)) - theChar -= 0x20; - wasIndex = thisHouseIndex; - thisHouseIndex = -1; - i = 0; - do + char theChar = static_cast(PL_KEY_GET_VALUE(event->message)); + + if (theChar >= 'A' && theChar <= 'Z') { - if ((fileFirstChar[i] >= theChar) && (fileFirstChar[i] != 0x7F)) - thisHouseIndex = i; - i++; - } - while ((thisHouseIndex == -1) && (i < 12)); - if (thisHouseIndex == -1) - { - screenCount = housesFound - housePage; - if (screenCount > kDispFiles) - screenCount = kDispFiles; - thisHouseIndex = screenCount - 1; - } - if (wasIndex != thisHouseIndex) - { - InvalWindowRect(GetDialogWindow(dial), &loadHouseRects[wasIndex]); - InvalWindowRect(GetDialogWindow(dial), &loadHouseRects[thisHouseIndex]); + wasIndex = thisHouseIndex; + thisHouseIndex = -1; + i = 0; + do + { + if ((fileFirstChar[i] >= theChar) && (fileFirstChar[i] != 0x7F)) + thisHouseIndex = i; + i++; + } while ((thisHouseIndex == -1) && (i < 12)); + + if (thisHouseIndex == -1) + { + screenCount = housesFound - housePage; + if (screenCount > kDispFiles) + screenCount = kDispFiles; + thisHouseIndex = screenCount - 1; + } + if (wasIndex != thisHouseIndex) + { + InvalWindowRect(GetDialogWindow(dial), &loadHouseRects[wasIndex]); + InvalWindowRect(GetDialogWindow(dial), &loadHouseRects[thisHouseIndex]); + } } return(true); } diff --git a/GpApp/Settings.cpp b/GpApp/Settings.cpp index 3738e84..4eaaab4 100644 --- a/GpApp/Settings.cpp +++ b/GpApp/Settings.cpp @@ -5,7 +5,7 @@ //---------------------------------------------------------------------------- //============================================================================ - +#include "PLKeyEncoding.h" #include "PLSound.h" #include "PLTextUtils.h" #include "DialogUtils.h" @@ -146,54 +146,48 @@ Boolean BrainsFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - - case kEscapeKeyASCII: + + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); break; - - case kCapAKeyASCII: - case kAKeyASCII: + + case PL_KEY_ASCII('A'): *item = kDoDemoCheck; return(true); break; - - case kCapBKeyASCII: - case kBKeyASCII: + + case PL_KEY_ASCII('B'): *item = kDoBackgroundCheck; return(true); break; - - case kCapDKeyASCII: - case kDKeyASCII: + + case PL_KEY_ASCII('D'): *item = kBrainsDefault; FlashDialogButton(dial, kBrainsDefault); return(true); break; - - case kCapEKeyASCII: - case kEKeyASCII: + + case PL_KEY_ASCII('E'): *item = kDoErrorCheck; return(true); break; - - case kCapQKeyASCII: - case kQKeyASCII: + + case PL_KEY_ASCII('Q'): *item = kQuickTransitCheck; return(true); break; - - case kCapZKeyASCII: - case kZKeyASCII: + + case PL_KEY_ASCII('Z'): *item = kDoZoomsCheck; return(true); break; @@ -336,10 +330,10 @@ void SetControlsToDefaults (DialogPtr theDialog) PasStringCopy(PSTR("rt arrow"), tempRightStr); PasStringCopy(PSTR("dn arrow"), tempBattStr); PasStringCopy(PSTR("up arrow"), tempBandStr); - tempLeftMap = kLeftArrowKeyMap; - tempRightMap = kRightArrowKeyMap; - tempBattMap = kDownArrowKeyMap; - tempBandMap = kUpArrowKeyMap; + tempLeftMap = PL_KEY_SPECIAL(kLeftArrow); + tempRightMap = PL_KEY_SPECIAL(kRightArrow); + tempBattMap = PL_KEY_SPECIAL(kDownArrow); + tempBandMap = PL_KEY_SPECIAL(kUpArrow); wasEscPauseKey = false; SelectFromRadioGroup(theDialog, kTABPausesRadio, kESCPausesRadio, kTABPausesRadio); @@ -379,7 +373,7 @@ void UpdateSettingsControl (DialogPtr theDialog) Boolean ControlFilter (DialogPtr dial, EventRecord *event, short *item) { - long wasKeyMap; + intptr_t wasKeyMap; switch (event->what) { @@ -387,12 +381,12 @@ Boolean ControlFilter (DialogPtr dial, EventRecord *event, short *item) switch (whichCtrl) { case 0: - wasKeyMap = (long)GetKeyMapFromMessage(event->message); + wasKeyMap = event->message; if ((wasKeyMap == tempLeftMap) || (wasKeyMap == tempBattMap) || - (wasKeyMap == tempBandMap) || (wasKeyMap == kTabKeyMap) || - (wasKeyMap == kEscKeyMap) || (wasKeyMap == kDeleteKeyMap)) + (wasKeyMap == tempBandMap) || (wasKeyMap == PL_KEY_SPECIAL(kTab)) || + (wasKeyMap == PL_KEY_SPECIAL(kEscape)) || (wasKeyMap == PL_KEY_SPECIAL(kDelete))) { - if (wasKeyMap == kEscKeyMap) + if (wasKeyMap == PL_KEY_SPECIAL(kEscape)) { FlashDialogButton(dial, kCancelButton); *item = kCancelButton; @@ -409,12 +403,12 @@ Boolean ControlFilter (DialogPtr dial, EventRecord *event, short *item) break; case 1: - wasKeyMap = (long)GetKeyMapFromMessage(event->message); + wasKeyMap = event->message; if ((wasKeyMap == tempRightMap) || (wasKeyMap == tempBattMap) || - (wasKeyMap == tempBandMap) || (wasKeyMap == kTabKeyMap) || - (wasKeyMap == kEscKeyMap) || (wasKeyMap == kDeleteKeyMap)) + (wasKeyMap == tempBandMap) || (wasKeyMap == PL_KEY_SPECIAL(kTab)) || + (wasKeyMap == PL_KEY_SPECIAL(kEscape)) || (wasKeyMap == PL_KEY_SPECIAL(kDelete))) { - if (wasKeyMap == kEscKeyMap) + if (wasKeyMap == PL_KEY_SPECIAL(kEscape)) { FlashDialogButton(dial, kCancelButton); *item = kCancelButton; @@ -431,12 +425,12 @@ Boolean ControlFilter (DialogPtr dial, EventRecord *event, short *item) break; case 2: - wasKeyMap = (long)GetKeyMapFromMessage(event->message); + wasKeyMap = event->message; if ((wasKeyMap == tempRightMap) || (wasKeyMap == tempLeftMap) || - (wasKeyMap == tempBandMap) || (wasKeyMap == kTabKeyMap) || - (wasKeyMap == kEscKeyMap) || (wasKeyMap == kDeleteKeyMap)) + (wasKeyMap == tempBandMap) || (wasKeyMap == PL_KEY_SPECIAL(kTab)) || + (wasKeyMap == PL_KEY_SPECIAL(kEscape)) || (wasKeyMap == PL_KEY_SPECIAL(kDelete))) { - if (wasKeyMap == kEscKeyMap) + if (wasKeyMap == PL_KEY_SPECIAL(kEscape)) { FlashDialogButton(dial, kCancelButton); *item = kCancelButton; @@ -453,12 +447,12 @@ Boolean ControlFilter (DialogPtr dial, EventRecord *event, short *item) break; case 3: - wasKeyMap = (long)GetKeyMapFromMessage(event->message); + wasKeyMap = event->message; if ((wasKeyMap == tempRightMap) || (wasKeyMap == tempLeftMap) || - (wasKeyMap == tempBattMap) || (wasKeyMap == kTabKeyMap) || - (wasKeyMap == kEscKeyMap) || (wasKeyMap == kDeleteKeyMap)) + (wasKeyMap == tempBattMap) || (wasKeyMap == PL_KEY_SPECIAL(kTab)) || + (wasKeyMap == PL_KEY_SPECIAL(kEscape)) || (wasKeyMap == PL_KEY_SPECIAL(kDelete))) { - if (wasKeyMap == kEscKeyMap) + if (wasKeyMap == PL_KEY_SPECIAL(kEscape)) { FlashDialogButton(dial, kCancelButton); *item = kCancelButton; @@ -665,40 +659,40 @@ Boolean SoundFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - case kEscapeKeyASCII: + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); break; - case kUpArrowKeyASCII: + case PL_KEY_SPECIAL(kUpArrow): *item = kLouderItem; return(true); break; - case kDownArrowKeyASCII: + case PL_KEY_SPECIAL(kDownArrow): *item = kSofterItem; return(true); break; - case k0KeyASCII: - case k1KeyASCII: - case k2KeyASCII: - case k3KeyASCII: - case k4KeyASCII: - case k5KeyASCII: - case k6KeyASCII: - case k7KeyASCII: - newVolume = (((event->message) & charCodeMask) - k0KeyASCII); + case PL_KEY_ASCII('0'): + case PL_KEY_ASCII('1'): + case PL_KEY_ASCII('2'): + case PL_KEY_ASCII('3'): + case PL_KEY_ASCII('4'): + case PL_KEY_ASCII('5'): + case PL_KEY_ASCII('6'): + case PL_KEY_ASCII('7'): + newVolume = PL_KEY_GET_VALUE(event->message) - '0'; if (newVolume == 7L) SetDialogNumToStr(dial, kVolNumberItem, 11L); else @@ -710,21 +704,18 @@ Boolean SoundFilter (DialogPtr dial, EventRecord *event, short *item) return(false); break; - case kCapDKeyASCII: - case kDKeyASCII: + case PL_KEY_ASCII('D'): *item = kSoundDefault; FlashDialogButton(dial, kSoundDefault); return(true); break; - case kCapGKeyASCII: - case kGKeyASCII: + case PL_KEY_ASCII('G'): *item = kPlayMusicItem; return(true); break; - case kCapIKeyASCII: - case kIKeyASCII: + case PL_KEY_ASCII('I'): *item = kIdleMusicItem; return(true); break; @@ -949,22 +940,22 @@ Boolean DisplayFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - case kEscapeKeyASCII: + case PL_KEY_SPECIAL(kEscape): FlashDialogButton(dial, kCancelButton); *item = kCancelButton; return(true); break; - case kLeftArrowKeyASCII: + case PL_KEY_SPECIAL(kLeftArrow): switch (numNeighbors) { case 1: @@ -982,7 +973,7 @@ Boolean DisplayFilter (DialogPtr dial, EventRecord *event, short *item) return(true); break; - case kRightArrowKeyASCII: + case PL_KEY_SPECIAL(kRightArrow): switch (numNeighbors) { case 1: @@ -1000,7 +991,7 @@ Boolean DisplayFilter (DialogPtr dial, EventRecord *event, short *item) return(true); break; - case kUpArrowKeyASCII: + case PL_KEY_SPECIAL(kUpArrow): switch (wasDepthPref) { case kSwitchIfNeeded: @@ -1018,7 +1009,7 @@ Boolean DisplayFilter (DialogPtr dial, EventRecord *event, short *item) return(true); break; - case kDownArrowKeyASCII: + case PL_KEY_SPECIAL(kDownArrow): switch (wasDepthPref) { case kSwitchIfNeeded: @@ -1036,43 +1027,39 @@ Boolean DisplayFilter (DialogPtr dial, EventRecord *event, short *item) return(true); break; - case k1KeyASCII: + case PL_KEY_ASCII('1'): *item = kDisplay1Item; return(true); break; - case k3KeyASCII: + case PL_KEY_ASCII('3'): *item = kDisplay3Item; return(true); break; - case k9KeyASCII: + case PL_KEY_ASCII('9'): *item = kDisplay9Item; return(true); break; - case kCapBKeyASCII: - case kBKeyASCII: + case PL_KEY_ASCII('B'): *item = kDoColorFadeItem; return(true); break; - case kCapDKeyASCII: - case kDKeyASCII: + case PL_KEY_ASCII('D'): *item = kDispDefault; FlashDialogButton(dial, kDispDefault); return(true); break; - case kCapRKeyASCII: - case kRKeyASCII: + case PL_KEY_ASCII('R'): *item = kUseScreen2Item; FlashDialogButton(dial, kUseQDItem); return(true); break; - case kCapUKeyASCII: - case kUKeyASCII: + case PL_KEY_ASCII('U'): *item = kUseQDItem; return(true); break; @@ -1234,10 +1221,10 @@ void SetAllDefaults (void) PasStringCopy(PSTR("rt arrow"), rightName); PasStringCopy(PSTR("dn arrow"), batteryName); PasStringCopy(PSTR("up arrow"), bandName); - theGlider.leftKey = kLeftArrowKeyMap; - theGlider.rightKey = kRightArrowKeyMap; - theGlider.battKey = kDownArrowKeyMap; - theGlider.bandKey = kUpArrowKeyMap; + theGlider.leftKey = PL_KEY_SPECIAL(kLeftArrow); + theGlider.rightKey = PL_KEY_SPECIAL(kRightArrow); + theGlider.battKey = PL_KEY_SPECIAL(kDownArrow); + theGlider.bandKey = PL_KEY_SPECIAL(kUpArrow); isEscPauseKey = false; // Default sound settings isPlayMusicIdle = true; @@ -1311,35 +1298,31 @@ Boolean PrefsFilter (DialogPtr dial, EventRecord *event, short *item) switch (event->what) { case keyDown: - switch ((event->message) & charCodeMask) + switch (event->message) { - case kReturnKeyASCII: - case kEnterKeyASCII: + case PL_KEY_SPECIAL(kEnter): + case PL_KEY_NUMPAD_SPECIAL(kEnter): FlashDialogButton(dial, kOkayButton); *item = kOkayButton; return(true); break; - case kCapBKeyASCII: - case kBKeyASCII: + case PL_KEY_ASCII('B'): *item = kBrainsButton; return(true); break; - case kCapCKeyASCII: - case kCKeyASCII: + case PL_KEY_ASCII('C'): *item = kControlsButton; return(true); break; - case kCapDKeyASCII: - case kDKeyASCII: + case PL_KEY_ASCII('d'): *item = kDisplayButton; return(true); break; - case kCapSKeyASCII: - case kSKeyASCII: + case PL_KEY_ASCII('S'): *item = kSoundButton; return(true); break; diff --git a/GpApp/StringUtils.cpp b/GpApp/StringUtils.cpp index 05c0d36..4fa86f1 100644 --- a/GpApp/StringUtils.cpp +++ b/GpApp/StringUtils.cpp @@ -152,7 +152,7 @@ void GetLineOfText (StringPtr srcStr, short index, StringPtr textLine) do { i++; - if (srcStr[i] == kReturnKeyASCII) + if (srcStr[i] == '\r') { count++; if (count == index) @@ -172,7 +172,7 @@ void GetLineOfText (StringPtr srcStr, short index, StringPtr textLine) foundIt = false; do { - if (srcStr[i] == kReturnKeyASCII) + if (srcStr[i] == '\r') { stop = i; foundIt = true; @@ -226,9 +226,9 @@ void WrapText (StringPtr theText, short maxChars) { count++; chars++; - if (theText[count] == kReturnKeyASCII) + if (theText[count] == '\r') foundEdge = true; - else if (theText[count] == kSpaceBarASCII) + else if (theText[count] == ' ') { foundSpace = true; spaceIs = count; @@ -238,7 +238,7 @@ void WrapText (StringPtr theText, short maxChars) if ((!foundEdge) && (count < lastChar) && (foundSpace)) { - theText[spaceIs] = kReturnKeyASCII; + theText[spaceIs] = '\r'; count = spaceIs + 1; } } diff --git a/GpApp/Utilities.cpp b/GpApp/Utilities.cpp index 39f3e5e..7ae817d 100644 --- a/GpApp/Utilities.cpp +++ b/GpApp/Utilities.cpp @@ -4,6 +4,7 @@ //---------------------------------------------------------------------------- //============================================================================ +#include "PLKeyEncoding.h" #include "PLQuickdraw.h" #include "PLPasStr.h" #include "PLResources.h" @@ -429,8 +430,7 @@ Boolean WaitForInputEvent (short seconds) while (waiting) { GetKeys(theKeys); - if ((BitTst(&theKeys, kCommandKeyMap)) || (BitTst(&theKeys, kOptionKeyMap)) || - (BitTst(&theKeys, kShiftKeyMap)) || (BitTst(&theKeys, kControlKeyMap))) + if (BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kControl)) || BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kAlt)) || BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kShift))) waiting = false; if (GetNextEvent(everyEvent, &theEvent)) { @@ -472,8 +472,10 @@ void WaitCommandQReleased (void) while (waiting) { GetKeys(theKeys); - if ((!BitTst(&theKeys, kCommandKeyMap)) || (!BitTst(&theKeys, kQKeyMap))) + if (!BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kControl)) || !BitTst(theKeys, PL_KEY_ASCII('Q'))) waiting = false; + + Delay(1, nullptr); } FlushEvents(everyEvent, 0); } @@ -496,178 +498,15 @@ char KeyMapOffsetFromRawKey (char rawKeyCode) return (theOffset); } -//-------------------------------------------------------------- GetKeyMapFromMessage -// Gets the key map offset from a keyDown event's message field. - -char GetKeyMapFromMessage (intptr_t message) -{ - long theVirtual; - char offset; - - theVirtual = (message & keyCodeMask) >> 8; - offset = KeyMapOffsetFromRawKey((char)theVirtual); - return (offset); -} - //-------------------------------------------------------------- GetKeyName // Given a keyDown event (it's message field), this function returnsÉ // a string with that key's name (so we get "Shift" and "Esc", etc.). void GetKeyName (intptr_t message, StringPtr theName) { - long theASCII, theVirtual; - - theASCII = message & charCodeMask; - theVirtual = (message & keyCodeMask) >> 8; - - if ((theASCII >= kExclamationASCII) && (theASCII <= kZKeyASCII)) - { - - if ((theVirtual >= 0x0041) && (theVirtual <= 0x005C)) - { - PasStringCopy(PSTR("( )"), theName); - theName[2] = (char)theASCII; - } - else - { - PasStringCopy(PSTR(" key"), theName); - theName[1] = (char)theASCII; - } - } - else - { - switch (theASCII) - { - case kHomeKeyASCII: - PasStringCopy(PSTR("home"), theName); - break; - - case kEnterKeyASCII: - PasStringCopy(PSTR("enter"), theName); - break; - - case kEndKeyASCII: - PasStringCopy(PSTR("end"), theName); - break; - - case kHelpKeyASCII: - PasStringCopy(PSTR("help"), theName); - break; - - case kDeleteKeyASCII: - PasStringCopy(PSTR("delete"), theName); - break; - - case kTabKeyASCII: - PasStringCopy(PSTR("tab"), theName); - break; - - case kPageUpKeyASCII: - PasStringCopy(PSTR("pg up"), theName); - break; - - case kPageDownKeyASCII: - PasStringCopy(PSTR("pg dn"), theName); - break; - - case kReturnKeyASCII: - PasStringCopy(PSTR("return"), theName); - break; - - case kFunctionKeyASCII: - switch (theVirtual) - { - case 0x0060: - PasStringCopy(PSTR("F5"), theName); - break; - case 0x0061: - PasStringCopy(PSTR("F6"), theName); - break; - case 0x0062: - PasStringCopy(PSTR("F7"), theName); - break; - case 0x0063: - PasStringCopy(PSTR("F3"), theName); - break; - case 0x0064: - PasStringCopy(PSTR("F8"), theName); - break; - case 0x0065: - PasStringCopy(PSTR("F9"), theName); - break; - case 0x0067: - PasStringCopy(PSTR("F11"), theName); - break; - case 0x0069: - PasStringCopy(PSTR("F13"), theName); - break; - case 0x006B: - PasStringCopy(PSTR("F14"), theName); - break; - case 0x006D: - PasStringCopy(PSTR("F10"), theName); - break; - case 0x006F: - PasStringCopy(PSTR("F12"), theName); - break; - case 0x0071: - PasStringCopy(PSTR("F15"), theName); - break; - case 0x0076: - PasStringCopy(PSTR("F4"), theName); - break; - case 0x0078: - PasStringCopy(PSTR("F2"), theName); - break; - case 0x007A: - PasStringCopy(PSTR("F1"), theName); - break; - default: - NumToString(theVirtual, theName); - break; - } - break; - - case kClearKeyASCII: - PasStringCopy(PSTR("clear"), theName); - break; - - case kEscapeKeyASCII: - if (theVirtual == 0x0047) - PasStringCopy(PSTR("clear"), theName); - else - PasStringCopy(PSTR("esc"), theName); - break; - - case kLeftArrowKeyASCII: - PasStringCopy(PSTR("lf arrow"), theName); - break; - - case kRightArrowKeyASCII: - PasStringCopy(PSTR("rt arrow"), theName); - break; - - case kUpArrowKeyASCII: - PasStringCopy(PSTR("up arrow"), theName); - break; - - case kDownArrowKeyASCII: - PasStringCopy(PSTR("dn arrow"), theName); - break; - - case kSpaceBarASCII: - PasStringCopy(PSTR("space"), theName); - break; - - case kForwardDeleteASCII: - PasStringCopy(PSTR("frwd del"), theName); - break; - - default: - PasStringCopy(PSTR("????"), theName); - break; - } - } + PasStringCopy(PSTR("TODO"), theName); + + PL_NotYetImplemented_TODO("KeyNames"); } //-------------------------------------------------------------- OptionKeyDown @@ -678,7 +517,7 @@ Boolean OptionKeyDown (void) KeyMap theKeys; GetKeys(theKeys); - if (BitTst(&theKeys, kOptionKeyMap)) + if (BitTst(theKeys, PL_KEY_EITHER_SPECIAL(kAlt))) return (true); else return (false); diff --git a/GpCommon/GpBitfield.h b/GpCommon/GpBitfield.h new file mode 100644 index 0000000..b6f7934 --- /dev/null +++ b/GpCommon/GpBitfield.h @@ -0,0 +1,63 @@ +#pragma once + +template +class GpBitfield +{ +public: + GpBitfield(); + GpBitfield(const GpBitfield &other); + + bool operator==(const GpBitfield &other) const; + bool operator!=(const GpBitfield &other) const; + + void Set(unsigned int index, bool v); + bool Get(unsigned int index) const; + +private: + static const unsigned int TSizeBytes = (TSize + 7) / 8; + uint8_t m_bytes[TSizeBytes]; +}; + +template +inline GpBitfield::GpBitfield() +{ + for (unsigned int i = 0; i < TSizeBytes; i++) + m_bytes[i] = 0; +} + +template +inline GpBitfield::GpBitfield(const GpBitfield &other) + : m_bytes(other.m_bytes) +{ +} + +template +inline bool GpBitfield::operator==(const GpBitfield &other) const +{ + for (unsigned int i = 0; i < TSizeBytes; i++) + if (m_bytes[i] != other.m_bytes[i]) + return false; + + return true; +} + +template +inline bool GpBitfield::operator!=(const GpBitfield &other) const +{ + return !((*this) == other); +} + +template +void GpBitfield::Set(unsigned int index, bool v) +{ + if (v) + m_bytes[index / 8] |= (1 << (index & 7)); + else + m_bytes[index / 8] &= ~(1 << (index & 7)); +} + +template +bool GpBitfield::Get(unsigned int index) const +{ + return (m_bytes[index / 8] & (1 << (index & 7))) != 0; +} diff --git a/GpCommon/GpVOSEvent.h b/GpCommon/GpVOSEvent.h index 3e76993..89df554 100644 --- a/GpCommon/GpVOSEvent.h +++ b/GpCommon/GpVOSEvent.h @@ -1,5 +1,7 @@ #pragma once +#include + namespace GpKeyModifiers { enum GpKeyModifier @@ -14,11 +16,12 @@ namespace GpKeyIDSubsets enum GpKeyIDSubset { kASCII, + kUnicode, kSpecial, - kNumPadASCII, + kNumPadNumber, kNumPadSpecial, kFKey, // Key value is a raw F number - }; + }; } typedef GpKeyIDSubsets::GpKeyIDSubset GpKeyIDSubset_t; @@ -27,6 +30,7 @@ namespace GpKeySpecials { enum GpKeySpecial { + kTab, kEscape, kPrintScreen, kScrollLock, @@ -47,11 +51,33 @@ namespace GpKeySpecials kLeftAlt, kRightAlt, kNumLock, + kLeftArrow, + kUpArrow, + kDownArrow, + kRightArrow, + + kCount, }; } typedef GpKeySpecials::GpKeySpecial GpKeySpecial_t; + +namespace GpNumPadSpecials +{ + enum GpNumPadSpecial + { + kSlash, + kAsterisk, + kMinus, + kPlus, + + kCount, + }; +} + +typedef GpNumPadSpecials::GpNumPadSpecial GpNumPadSpecial_t; + namespace GpKeyboardInputEventTypes { enum GpKeyboardInputEventType @@ -68,8 +94,12 @@ struct GpKeyboardInputEvent { union KeyUnion { - GpKeySpecials::GpKeySpecial m_specialKey; + GpKeySpecial_t m_specialKey; + GpNumPadSpecial_t m_numPadSpecialKey; + uint8_t m_numPadNumber; char m_asciiChar; + uint32_t m_unicodeChar; + unsigned char m_fKey; }; GpKeyboardInputEventType_t m_eventType; @@ -135,3 +165,5 @@ struct GpVOSEvent EventUnion m_event; GpVOSEventType_t m_eventType; }; + +static const unsigned int GpFKeyMaximumInclusive = 24; diff --git a/GpD3D/GpMain_Win32.cpp b/GpD3D/GpMain_Win32.cpp index 70f3457..8358f76 100644 --- a/GpD3D/GpMain_Win32.cpp +++ b/GpD3D/GpMain_Win32.cpp @@ -36,6 +36,258 @@ static void PostMouseEvent(IGpVOSEventQueue *eventQueue, GpMouseEventType_t even } } +static bool IdentifyVKey(const WPARAM &wparam, const LPARAM &lparam, GpKeyIDSubset_t &outSubset, GpKeyboardInputEvent::KeyUnion &outKey) +{ + switch (wparam) + { + case VK_ESCAPE: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kEscape; + break; + case VK_PRINT: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kPrintScreen; + break; + case VK_SCROLL: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kScrollLock; + break; + case VK_PAUSE: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kPause; + break; + case VK_INSERT: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kInsert; + break; + case VK_HOME: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kHome; + break; + case VK_PRIOR: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kPageUp; + break; + case VK_NEXT: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kPageDown; + break; + case VK_DELETE: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kDelete; + break; + case VK_TAB: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kTab; + break; + case VK_END: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kEnd; + break; + case VK_BACK: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kBackspace; + break; + case VK_CAPITAL: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kCapsLock; + break; + case VK_RETURN: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kEnter; + break; + case VK_SHIFT: + { + UINT vkey = MapVirtualKeyW((lparam >> 16) & 0xff, MAPVK_VSC_TO_VK_EX); + + if (vkey == VK_LSHIFT || vkey == VK_SHIFT) + { + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kLeftShift; + } + else if (vkey == VK_RSHIFT) + { + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kRightShift; + } + else + return false; + } + break; + case VK_RSHIFT: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kRightShift; + break; + case VK_CONTROL: + outSubset = GpKeyIDSubsets::kSpecial; + if (lparam & 0x01000000) + outKey.m_specialKey = GpKeySpecials::kRightCtrl; + else + outKey.m_specialKey = GpKeySpecials::kLeftCtrl; + break; + case VK_MENU: + outSubset = GpKeyIDSubsets::kSpecial; + if (lparam & 0x01000000) + outKey.m_specialKey = GpKeySpecials::kRightAlt; + else + outKey.m_specialKey = GpKeySpecials::kLeftAlt; + break; + case VK_NUMLOCK: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kNumLock; + break; + case VK_NUMPAD0: + case VK_NUMPAD1: + case VK_NUMPAD2: + case VK_NUMPAD3: + case VK_NUMPAD4: + case VK_NUMPAD5: + case VK_NUMPAD6: + case VK_NUMPAD7: + case VK_NUMPAD8: + case VK_NUMPAD9: + outSubset = GpKeyIDSubsets::kNumPadNumber; + outKey.m_numPadNumber = static_cast(wparam - VK_NUMPAD0); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + outSubset = GpKeyIDSubsets::kASCII; + outKey.m_asciiChar = static_cast(wparam); + break; + case VK_F1: + case VK_F2: + case VK_F3: + case VK_F4: + case VK_F5: + case VK_F6: + case VK_F7: + case VK_F8: + case VK_F9: + case VK_F10: + case VK_F11: + case VK_F12: + case VK_F13: + case VK_F14: + case VK_F15: + case VK_F16: + case VK_F17: + case VK_F18: + case VK_F19: + case VK_F20: + case VK_F21: + case VK_F22: + case VK_F23: + case VK_F24: + outSubset = GpKeyIDSubsets::kFKey; + outKey.m_fKey = static_cast(wparam - VK_F1 + 1); + break; + case VK_OEM_COMMA: + outSubset = GpKeyIDSubsets::kASCII; + outKey.m_asciiChar = ','; + break; + case VK_OEM_MINUS: + outSubset = GpKeyIDSubsets::kASCII; + outKey.m_asciiChar = '-'; + break; + case VK_OEM_PERIOD: + outSubset = GpKeyIDSubsets::kASCII; + outKey.m_asciiChar = '.'; + break; + case VK_OEM_PLUS: + outSubset = GpKeyIDSubsets::kASCII; + outKey.m_asciiChar = '+'; + break; + case VK_UP: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kUpArrow; + break; + case VK_DOWN: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kDownArrow; + break; + case VK_LEFT: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kLeftArrow; + break; + case VK_RIGHT: + outSubset = GpKeyIDSubsets::kSpecial; + outKey.m_specialKey = GpKeySpecials::kRightArrow; + break; + default: + { + if (wparam >= VK_OEM_1 && wparam <= VK_OEM_102) + { + UINT charCode = MapVirtualKeyW(static_cast(wparam), MAPVK_VK_TO_CHAR); + if (charCode == 0) + return false; + + if (charCode < 128) + { + outSubset = GpKeyIDSubsets::kASCII; + outKey.m_asciiChar = static_cast(charCode); + break; + } + else + { + outSubset = GpKeyIDSubsets::kUnicode; + outKey.m_unicodeChar = charCode;; + break; + } + } + } + return false; + } + + return true; +} + +static void PostKeyboardEvent(IGpVOSEventQueue *eventQueue, GpKeyboardInputEventType_t eventType, GpKeyIDSubset_t subset, const GpKeyboardInputEvent::KeyUnion &key) +{ + if (GpVOSEvent *evt = eventQueue->QueueEvent()) + { + evt->m_eventType = GpVOSEventTypes::kKeyboardInput; + + GpKeyboardInputEvent &mEvent = evt->m_event.m_keyboardInputEvent; + mEvent.m_key = key; + mEvent.m_eventType = eventType; + mEvent.m_keyIDSubset = subset; + } +} + static void TranslateWindowsMessage(const MSG *msg, IGpVOSEventQueue *eventQueue) { WPARAM wParam = msg->wParam; @@ -79,6 +331,26 @@ static void TranslateWindowsMessage(const MSG *msg, IGpVOSEventQueue *eventQueue case WM_MOUSELEAVE: PostMouseEvent(eventQueue, GpMouseEventTypes::kLeave, GpMouseButtons::kNone, 0, 0); break; + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + { + GpKeyIDSubset_t subset; + GpKeyboardInputEvent::KeyUnion key; + if (IdentifyVKey(wParam, lParam, subset, key)) + PostKeyboardEvent(eventQueue, GpKeyboardInputEventTypes::kDown, subset, key); + } + break; + case WM_KEYUP: + case WM_SYSKEYUP: + { + GpKeyIDSubset_t subset; + GpKeyboardInputEvent::KeyUnion key; + if (IdentifyVKey(wParam, lParam, subset, key)) + PostKeyboardEvent(eventQueue, GpKeyboardInputEventTypes::kUp, subset, key); + } + break; + case WM_CHAR: + break; default: break; } diff --git a/PortabilityLayer/InputManager.cpp b/PortabilityLayer/InputManager.cpp index df427da..2780c18 100644 --- a/PortabilityLayer/InputManager.cpp +++ b/PortabilityLayer/InputManager.cpp @@ -1,6 +1,9 @@ #include "InputManager.h" +#include "MacRoman.h" +#include "PLKeyEncoding.h" #include +#include namespace PortabilityLayer { @@ -9,19 +12,68 @@ namespace PortabilityLayer public: InputManagerImpl(); - void GetKeys(unsigned char *keys16) const override; + void GetKeys(KeyMap &keyMap) const override; + void ApplyEvent(const GpKeyboardInputEvent &vosEvent) override; static InputManagerImpl *GetInstance(); private: - unsigned char m_keys[16]; + void ApplyEventAsKey(const GpKeyboardInputEvent &vosEvent, bool bit); + KeyMap m_keyMap; static InputManagerImpl ms_instance; }; - void InputManagerImpl::GetKeys(unsigned char *keys16) const + void InputManagerImpl::GetKeys(KeyMap &keyMap) const { - memcpy(keys16, m_keys, 16); + keyMap = m_keyMap; + } + + void InputManagerImpl::ApplyEvent(const GpKeyboardInputEvent &vosEvent) + { + if (vosEvent.m_eventType == GpKeyboardInputEventTypes::kDown) + ApplyEventAsKey(vosEvent, true); + else if (vosEvent.m_eventType == GpKeyboardInputEventTypes::kUp) + ApplyEventAsKey(vosEvent, false); + } + + void InputManagerImpl::ApplyEventAsKey(const GpKeyboardInputEvent &vosEvent, bool bit) + { + switch (vosEvent.m_keyIDSubset) + { + case GpKeyIDSubsets::kASCII: + assert(vosEvent.m_key.m_asciiChar >= 0 && vosEvent.m_key.m_asciiChar < 128); + m_keyMap.m_ascii.Set(vosEvent.m_key.m_asciiChar, bit); + break; + case GpKeyIDSubsets::kUnicode: + for (int i = 0; i < 256; i++) + { + if (MacRoman::g_toUnicode[i] == vosEvent.m_key.m_unicodeChar) + { + if (i < 128) + m_keyMap.m_ascii.Set(i, bit); + else + m_keyMap.m_macRoman.Set(i - 128, bit); + break; + } + } + break; + case GpKeyIDSubsets::kSpecial: + m_keyMap.m_special.Set(vosEvent.m_key.m_specialKey, bit); + break; + case GpKeyIDSubsets::kNumPadNumber: + m_keyMap.m_numPadNumber.Set(vosEvent.m_key.m_numPadNumber, bit); + break; + case GpKeyIDSubsets::kNumPadSpecial: + m_keyMap.m_numPadSpecial.Set(vosEvent.m_key.m_numPadSpecialKey, bit); + break; + case GpKeyIDSubsets::kFKey: + m_keyMap.m_fKey.Set(vosEvent.m_key.m_fKey - 1, bit); + break; + default: + assert(false); + break; + } } InputManagerImpl *InputManagerImpl::GetInstance() @@ -31,8 +83,6 @@ namespace PortabilityLayer InputManagerImpl::InputManagerImpl() { - for (int i = 0; i < sizeof(m_keys) / sizeof(m_keys[0]); i++) - m_keys[i] = 0; } InputManagerImpl InputManagerImpl::ms_instance; diff --git a/PortabilityLayer/InputManager.h b/PortabilityLayer/InputManager.h index 8c6805e..09e07a8 100644 --- a/PortabilityLayer/InputManager.h +++ b/PortabilityLayer/InputManager.h @@ -1,11 +1,15 @@ #pragma once +struct GpKeyboardInputEvent; +struct KeyMap; + namespace PortabilityLayer { class InputManager { public: - virtual void GetKeys(unsigned char *keys16) const = 0; + virtual void GetKeys(KeyMap &keys16) const = 0; + virtual void ApplyEvent(const GpKeyboardInputEvent &vosEvent) = 0; static InputManager *GetInstance(); }; diff --git a/PortabilityLayer/MenuManager.cpp b/PortabilityLayer/MenuManager.cpp index 91bdc45..228adda 100644 --- a/PortabilityLayer/MenuManager.cpp +++ b/PortabilityLayer/MenuManager.cpp @@ -803,7 +803,7 @@ namespace PortabilityLayer for (size_t i = 0; i < numItems; i++) { MenuItem &item = menu->menuItems[i]; - item.layoutYOffset = cumulativeHeight; + item.layoutYOffset = static_cast(cumulativeHeight); item.layoutHeight = kMenuItemHeight; const uint8_t *itemName = strBlob + item.nameOffsetInStringBlob; @@ -849,8 +849,8 @@ namespace PortabilityLayer { Menu *menu = *menuHdl; - uint32_t menuLeftXCoordinate = kMenuBarInitialPadding + menu->cumulativeOffset + menu->menuIndex * kMenuBarItemPadding * 2 - kMenuBarItemPadding; - uint32_t menuRightXCoordinate = menuLeftXCoordinate + menu->unpaddedTitleWidth + kMenuBarItemPadding * 2; + const size_t menuLeftXCoordinate = kMenuBarInitialPadding + menu->cumulativeOffset + menu->menuIndex * kMenuBarItemPadding * 2 - kMenuBarItemPadding; + const size_t menuRightXCoordinate = menuLeftXCoordinate + menu->unpaddedTitleWidth + kMenuBarItemPadding * 2; if (mouseXCoordinate >= menuLeftXCoordinate && mouseXCoordinate < menuRightXCoordinate) { @@ -878,7 +878,7 @@ namespace PortabilityLayer if (selectedMenuHandle) { Menu *menu = *selectedMenuHandle; - const int32_t xCoordinate = kMenuBarInitialPadding + menu->menuIndex * kMenuBarItemPadding * 2 + menu->cumulativeOffset - kMenuBarItemPadding; + const int32_t xCoordinate = static_cast(kMenuBarInitialPadding + menu->menuIndex * kMenuBarItemPadding * 2 + menu->cumulativeOffset - kMenuBarItemPadding); const Vec2i localPoint = point - Vec2i(xCoordinate, kMenuBarHeight); @@ -980,7 +980,7 @@ namespace PortabilityLayer return; m_haveItem = true; - m_itemIndex = item; + m_itemIndex = static_cast(item); if (m_currentMenu) RenderMenu(*m_currentMenu); @@ -1001,7 +1001,7 @@ namespace PortabilityLayer { PortabilityLayer::QDManager *qdManager = PortabilityLayer::QDManager::GetInstance(); - const Rect menuRect = Rect::Create(0, 0, menu->layoutHeight, menu->layoutWidth); + const Rect menuRect = Rect::Create(0, 0, static_cast(menu->layoutHeight), static_cast(menu->layoutWidth)); if (m_menuGraf == nullptr) { diff --git a/PortabilityLayer/PLCore.cpp b/PortabilityLayer/PLCore.cpp index 125b8fc..cbd0ba1 100644 --- a/PortabilityLayer/PLCore.cpp +++ b/PortabilityLayer/PLCore.cpp @@ -1,11 +1,14 @@ #include "PLCore.h" #include "PLApplication.h" #include "PLPasStr.h" +#include "PLKeyEncoding.h" +#include "PLQuickdraw.h" #include "AEManager.h" #include "DisplayDeviceManager.h" #include "FileManager.h" #include "FilePermission.h" +#include "FontFamily.h" #include "FontManager.h" #include "GpVOSEvent.h" #include "HostDirectoryCursor.h" @@ -19,14 +22,17 @@ #include "InputManager.h" #include "ResourceManager.h" #include "MacFileInfo.h" +#include "MacRoman.h" #include "MemoryManager.h" #include "MenuManager.h" #include "MemReaderStream.h" #include "MMHandleBlock.h" +#include "RenderedFont.h" #include "ResTypeID.h" #include "RandomNumberGenerator.h" #include "PLBigEndian.h" #include "PLEventQueue.h" +#include "PLKeyEncoding.h" #include "QDManager.h" #include "Vec2i.h" #include "WindowDef.h" @@ -94,6 +100,65 @@ static void TranslateMouseInputEvent(const GpMouseInputEvent &vosEvent, Portabil static void TranslateKeyboardInputEvent(const GpKeyboardInputEvent &vosEvent, PortabilityLayer::EventQueue *queue) { + PortabilityLayer::InputManager *inputManager = PortabilityLayer::InputManager::GetInstance(); + + if (vosEvent.m_eventType == GpKeyboardInputEventTypes::kUp || vosEvent.m_eventType == GpKeyboardInputEventTypes::kDown) + inputManager->ApplyEvent(vosEvent); + + intptr_t msg = 0; + + switch (vosEvent.m_keyIDSubset) + { + case GpKeyIDSubsets::kASCII: + msg = PL_KEY_ASCII(vosEvent.m_key.m_asciiChar); + break; + case GpKeyIDSubsets::kFKey: + msg = PL_KEY_FKEY(vosEvent.m_key.m_fKey); + break; + case GpKeyIDSubsets::kNumPadNumber: + msg = PL_KEY_NUMPAD_NUMBER(vosEvent.m_key.m_numPadNumber); + break; + case GpKeyIDSubsets::kSpecial: + msg = PL_KEY_SPECIAL_ENCODE(vosEvent.m_key.m_specialKey); + break; + case GpKeyIDSubsets::kNumPadSpecial: + msg = PL_KEY_NUMPAD_SPECIAL_ENCODE(vosEvent.m_key.m_numPadSpecialKey); + break; + case GpKeyIDSubsets::kUnicode: + for (int i = 128; i < 256; i++) + { + if (PortabilityLayer::MacRoman::g_toUnicode[i] == vosEvent.m_key.m_unicodeChar) + { + msg = PL_KEY_MACROMAN(i); + break; + } + } + break; + default: + PL_NotYetImplemented(); + } + + if (msg == 0) + return; + + EventRecord *evt = queue->Enqueue(); + + switch (vosEvent.m_eventType) + { + case GpKeyboardInputEventTypes::kUp: + evt->what = keyUp; + break; + case GpKeyboardInputEventTypes::kDown: + evt->what = keyUp; + break; + case GpKeyboardInputEventTypes::kAuto: + evt->what = autoKey; + break; + }; + + evt->message = msg; + + PL_NotYetImplemented_TODO("Modifiers"); } static void TranslateVOSEvent(const GpVOSEvent *vosEvent, PortabilityLayer::EventQueue *queue) @@ -408,7 +473,7 @@ long TickCount() return PortabilityLayer::DisplayDeviceManager::GetInstance()->GetTickCount(); } -void GetKeys(KeyMap keyMap) +void GetKeys(KeyMap &keyMap) { PortabilityLayer::InputManager::GetInstance()->GetKeys(keyMap); } @@ -423,10 +488,49 @@ short HiWord(Int32 v) return (((v >> 16) ^ 0x8000) & 0xffff) - 0x8000; } -bool BitTst(const KeyMap *keyMap, int bit) +static bool BitTestEitherSpecial(const KeyMap &keyMap, int eitherSpecial) { - const unsigned char *keyMapBytes = *keyMap; - return ((keyMapBytes[bit >> 3] >> (7 - (bit & 0x7))) & 1) != 0; + switch (eitherSpecial) + { + case KeyEventEitherSpecialCategories::kAlt: + return keyMap.m_special.Get(GpKeySpecials::kLeftAlt) || keyMap.m_special.Get(GpKeySpecials::kRightAlt); + case KeyEventEitherSpecialCategories::kShift: + return keyMap.m_special.Get(GpKeySpecials::kLeftShift) || keyMap.m_special.Get(GpKeySpecials::kRightShift); + case KeyEventEitherSpecialCategories::kControl: + return keyMap.m_special.Get(GpKeySpecials::kLeftCtrl) || keyMap.m_special.Get(GpKeySpecials::kRightCtrl); + default: + assert(false); + return false; + } +} + +bool BitTst(const KeyMap &keyMap, int encodedKey) +{ + const KeyEventType evtType = PL_KEY_GET_EVENT_TYPE(encodedKey); + const int evtValue = PL_KEY_GET_VALUE(encodedKey); + + switch (evtType) + { + case KeyEventType_Special: + return keyMap.m_special.Get(evtValue); + case KeyEventType_ASCII: + return keyMap.m_ascii.Get(evtValue); + case KeyEventType_MacRoman: + assert(evtValue >= 128 && evtValue < 256); + return keyMap.m_macRoman.Get(evtValue - 128); + case KeyEventType_NumPadNumber: + return keyMap.m_numPadNumber.Get(evtValue); + case KeyEventType_NumPadSpecial: + return keyMap.m_numPadSpecial.Get(evtValue); + case KeyEventType_FKey: + assert(evtValue >= 1 && evtValue <= GpFKeyMaximumInclusive); + return keyMap.m_fKey.Get(evtValue - 1); + case KeyEventType_EitherSpecial: + return BitTestEitherSpecial(keyMap, evtValue); + default: + assert(false); + return false; + } } void NumToString(long number, unsigned char *str) @@ -706,8 +810,40 @@ void DisposeDirectoryFiles(DirectoryFileListEntry *firstDFL) short StringWidth(const PLPasStr &str) { - PL_NotYetImplemented(); - return 0; + const PortabilityLayer::QDState *qdState = PortabilityLayer::QDManager::GetInstance()->GetState(); + PortabilityLayer::FontManager *fontManager = PortabilityLayer::FontManager::GetInstance(); + + const int textSize = qdState->m_textSize; + const int textFace = qdState->m_textFace; + const int fontID = qdState->m_fontID; + + int variationFlags = 0; + if (textFace & bold) + variationFlags |= PortabilityLayer::FontFamilyFlag_Bold; + + PortabilityLayer::FontFamily *fontFamily = nullptr; + + switch (fontID) + { + case applFont: + fontFamily = fontManager->GetApplicationFont(textSize, variationFlags); + break; + case systemFont: + fontFamily = fontManager->GetSystemFont(textSize, variationFlags); + break; + default: + PL_NotYetImplemented(); + return 0; + } + + if (!fontFamily) + return 0; + + PortabilityLayer::RenderedFont *rfont = fontManager->GetRenderedFontFromFamily(fontFamily, textSize, variationFlags); + if (!rfont) + return 0; + + return rfont->MeasureString(str.UChars(), str.Length()); } void GetMouse(Point *point) @@ -765,7 +901,10 @@ void GetDateTime(UInt32 *dateTime) void GetTime(DateTimeRec *dateTime) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("DateTime"); + dateTime->month = 1; + dateTime->hour = 0; + dateTime->minute = 0; } UInt32 GetDblTime() diff --git a/PortabilityLayer/PLCore.h b/PortabilityLayer/PLCore.h index e86c566..4a80ad1 100644 --- a/PortabilityLayer/PLCore.h +++ b/PortabilityLayer/PLCore.h @@ -181,8 +181,7 @@ typedef VersRecPtr *VersRecHndl; typedef WindowPtr WindowRef; // wtf? - -typedef unsigned char KeyMap[16]; +struct KeyMap; enum RegionID { @@ -207,6 +206,7 @@ enum EventCode mouseUp, mouseMove, keyDown, + keyUp, autoKey, updateEvt, osEvt, @@ -243,9 +243,6 @@ static const int everyEvent = -1; static const int iBeamCursor = 1; static const int watchCursor = 4; -static const int charCodeMask = 0xff; -static const int keyCodeMask = 0xff00; - static const int shiftKey = 0x1; static const int cmdKey = 0x2; // Ctrl static const int optionKey = 0x4; // Alt @@ -314,11 +311,11 @@ long MenuSelect(Point point); // Breaks into menu select routine (in practice we long MenuKey(int charCode); long TickCount(); -void GetKeys(KeyMap keyMap); +void GetKeys(KeyMap &keyMap); short LoWord(Int32 v); short HiWord(Int32 v); -bool BitTst(const KeyMap *keyMap, int bit); +bool BitTst(const KeyMap &keyMap, int bit); void NumToString(long number, unsigned char *str); void ParamText(const PLPasStr &title, const PLPasStr &a, const PLPasStr &b, const PLPasStr &c); diff --git a/PortabilityLayer/PLKeyEncoding.h b/PortabilityLayer/PLKeyEncoding.h new file mode 100644 index 0000000..ab50de7 --- /dev/null +++ b/PortabilityLayer/PLKeyEncoding.h @@ -0,0 +1,49 @@ +#pragma once + +#include "GpVOSEvent.h" +#include "GpBitfield.h" + +enum KeyEventType +{ + KeyEventType_Special, + KeyEventType_ASCII, + KeyEventType_MacRoman, + KeyEventType_NumPadNumber, + KeyEventType_NumPadSpecial, + KeyEventType_FKey, + + KeyEventType_EitherSpecial, +}; + +namespace KeyEventEitherSpecialCategories +{ + enum KeyEventEitherSpecialCategory + { + kControl, + kAlt, + kShift, + }; +} + +#define PL_KEY_SPECIAL(k) ((KeyEventType_Special) | (GpKeySpecials::k) << 3) +#define PL_KEY_SPECIAL_ENCODE(k) ((KeyEventType_Special) | (k) << 3) +#define PL_KEY_ASCII(k) ((KeyEventType_ASCII) | (k) << 3) +#define PL_KEY_MACROMAN(k) ((KeyEventType_MacRoman) | (k) << 3) +#define PL_KEY_NUMPAD_NUMBER(k) ((KeyEventType_NumPadNumber) | (k) << 3) +#define PL_KEY_NUMPAD_SPECIAL(k) ((KeyEventType_NumPadSpecial) | (GpKeySpecials::k) << 3) +#define PL_KEY_NUMPAD_SPECIAL_ENCODE(k) ((KeyEventType_NumPadSpecial) | (k) << 3) +#define PL_KEY_FKEY(k) ((KeyEventType_FKey) | (k) << 3) +#define PL_KEY_EITHER_SPECIAL(k) ((KeyEventType_EitherSpecial) | (KeyEventEitherSpecialCategories::k) << 3) + +#define PL_KEY_GET_EVENT_TYPE(k) (static_cast(k & 7)) +#define PL_KEY_GET_VALUE(k) ((k) >> 3) + +struct KeyMap +{ + GpBitfield m_special; + GpBitfield<128> m_ascii; + GpBitfield<128> m_macRoman; + GpBitfield<10> m_numPadNumber; + GpBitfield m_numPadSpecial; + GpBitfield m_fKey; +}; diff --git a/PortabilityLayer/PLQuickdraw.cpp b/PortabilityLayer/PLQuickdraw.cpp index 27047e3..139bad8 100644 --- a/PortabilityLayer/PLQuickdraw.cpp +++ b/PortabilityLayer/PLQuickdraw.cpp @@ -133,7 +133,7 @@ void MoveTo(int x, int y) void LineTo(int x, int y) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Polys"); } void SetOrigin(int x, int y) @@ -427,12 +427,12 @@ void PaintRect(const Rect *rect) void PaintOval(const Rect *rect) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Ovals"); } void PaintRgn(RgnHandle region) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Polys"); } void ClipRect(const Rect *rect) @@ -449,17 +449,17 @@ void ClipRect(const Rect *rect) void FrameRect(const Rect *rect) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Rects"); } void FrameOval(const Rect *rect) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Ovals"); } void FrameRoundRect(const Rect *rect, int w, int h) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Ovals"); } void PenMode(CopyBitsMode copyBitsMode) @@ -469,12 +469,12 @@ void PenMode(CopyBitsMode copyBitsMode) void PenMode(PenModeID penMode) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Polys"); } void PenPat(const Pattern *pattern) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Polys"); } void PenSize(int w, int h) @@ -484,7 +484,7 @@ void PenSize(int w, int h) void PenNormal() { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Polys"); } void EraseRect(const Rect *rect) @@ -499,24 +499,36 @@ void InvertRect(const Rect *rect) void InsetRect(Rect *rect, int x, int y) { - PL_NotYetImplemented(); + rect->left += x; + rect->right -= x; + rect->top += y; + rect->bottom -= y; } void Line(int x, int y) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Polys"); } Pattern *GetQDGlobalsGray(Pattern *pattern) { - PL_NotYetImplemented(); - return nullptr; + uint8_t *patternBytes = *pattern; + for (int i = 0; i < 8; i += 2) + { + patternBytes[i] = 0xaa; + patternBytes[i + 1] = 0x55; + } + + return pattern; } Pattern *GetQDGlobalsBlack(Pattern *pattern) { - PL_NotYetImplemented(); - return nullptr; + uint8_t *patternBytes = *pattern; + for (int i = 0; i < 8; i++) + patternBytes[i] = 255; + + return pattern; } void GetIndPattern(Pattern *pattern, int patListID, int index) @@ -712,7 +724,7 @@ void RectRgn(RgnHandle region, const Rect *rect) void UnionRgn(RgnHandle regionA, RgnHandle regionB, RgnHandle regionC) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Polys"); } void DisposeRgn(RgnHandle rgn) @@ -722,12 +734,12 @@ void DisposeRgn(RgnHandle rgn) void OpenRgn() { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Polys"); } void CloseRgn(RgnHandle rgn) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Polys"); } Boolean PtInRgn(Point point, RgnHandle rgn) @@ -738,12 +750,12 @@ Boolean PtInRgn(Point point, RgnHandle rgn) void GetClip(RgnHandle rgn) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Polys"); } void SetClip(RgnHandle rgn) { - PL_NotYetImplemented(); + PL_NotYetImplemented_TODO("Polys"); } diff --git a/PortabilityLayer/PortabilityLayer.vcxproj b/PortabilityLayer/PortabilityLayer.vcxproj index 9389171..d230dd9 100644 --- a/PortabilityLayer/PortabilityLayer.vcxproj +++ b/PortabilityLayer/PortabilityLayer.vcxproj @@ -127,6 +127,7 @@ + @@ -189,6 +190,7 @@ + diff --git a/PortabilityLayer/PortabilityLayer.vcxproj.filters b/PortabilityLayer/PortabilityLayer.vcxproj.filters index 9c27b26..840f09a 100644 --- a/PortabilityLayer/PortabilityLayer.vcxproj.filters +++ b/PortabilityLayer/PortabilityLayer.vcxproj.filters @@ -363,6 +363,12 @@ Header Files + + Header Files + + + Header Files +