diff --git a/desmume/src/cocoa/DefaultKeyMappings.plist b/desmume/src/cocoa/DefaultKeyMappings.plist index 14be6eb99..725c32d73 100644 --- a/desmume/src/cocoa/DefaultKeyMappings.plist +++ b/desmume/src/cocoa/DefaultKeyMappings.plist @@ -2,314 +2,343 @@ - Up + CommandTagList - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 126 - elementName - Up Arrow - - - Down - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 125 - elementName - Down Arrow - - - Left - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 123 - elementName - Left Arrow - - - Right - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 124 - elementName - Right Arrow - - - A - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 7 - elementName - X - - - B - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 6 - elementName - Z - - - X - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 1 - elementName - S - - - Y - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 0 - elementName - A - - - L - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 12 - elementName - Q - - - R - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 13 - elementName - W - - - Start - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 36 - elementName - Return - - - Select - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 48 - elementName - Tab - - - Touch - - - deviceCode - NSEventMouse - deviceName - Mouse - elementCode - 0 - elementName - Primary Button - useDeviceValues - - pointX - 0 - pointY - 0 - - - Microphone - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 50 - elementName - ` - - - Debug - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 42 - elementName - \ - - - Lid - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 51 - elementName - Delete (Backspace) - - - Speed Half - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 27 - elementName - - - floatValue - 0.5 - - - Speed Double - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 24 - elementName - = - floatValue - 2 - - - HUD - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 4 - elementName - H - - - Execute - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 117 - elementName - Forward Delete - - - Pause - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 119 - elementName - End - - - Reset - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 121 - elementName - Page Down - - - Mute - - - deviceCode - NSEventKeyboard - deviceName - Keyboard - elementCode - 71 - elementName - Numpad Clear - + Up + Down + Left + Right + A + B + X + Y + L + R + Start + Select + Touch + Microphone + Lid + Debug + Execute/Pause + Reset + Mute/Unmute + Load State Slot + Save State Slot + Copy Screen + Set Speed + Enable/Disable Speed Limiter + Enable/Disable Auto Frame Skip + Enable/Disable Cheats + Enable/Disable GPU State + DefaultInputMappings + + Up + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 126 + elementName + Up Arrow + + + Down + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 125 + elementName + Down Arrow + + + Left + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 123 + elementName + Left Arrow + + + Right + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 124 + elementName + Right Arrow + + + A + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 7 + elementName + X + + + B + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 6 + elementName + Z + + + X + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 1 + elementName + S + + + Y + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 0 + elementName + A + + + L + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 12 + elementName + Q + + + R + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 13 + elementName + W + + + Start + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 36 + elementName + Return + + + Select + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 48 + elementName + Tab + + + Touch + + + deviceCode + NSEventMouse + deviceName + Mouse + elementCode + 0 + elementName + Primary Button + useInputForIntCoord + + + + Microphone + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 50 + elementName + ` (Accent) + intValue1 + 1 + + + Lid + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 51 + elementName + Delete (Backspace) + + + Debug + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 42 + elementName + \ + + + HUD + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 4 + elementName + H + + + Execute/Pause + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 117 + elementName + Forward Delete + + + Reset + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 121 + elementName + Page Down + + + Mute/Unmute + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 71 + elementName + Numpad Clear + + + Load State Slot + + Save State Slot + + Copy Screen + + Set Speed + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 27 + elementName + - + floatValue0 + 0.5 + + + deviceCode + NSEventKeyboard + deviceName + Keyboard + elementCode + 24 + elementName + = + floatValue0 + 2 + + + Enable/Disable Speed Limiter + + Enable/Disable Auto Frame Skip + + Enable/Disable Cheats + + Enable/Disable GPU State + + diff --git a/desmume/src/cocoa/DefaultUserPrefs.plist b/desmume/src/cocoa/DefaultUserPrefs.plist index f687a308e..41e50bdc3 100644 Binary files a/desmume/src/cocoa/DefaultUserPrefs.plist and b/desmume/src/cocoa/DefaultUserPrefs.plist differ diff --git a/desmume/src/cocoa/KeyNames.plist b/desmume/src/cocoa/KeyNames.plist index bde239430..771b91749 100644 --- a/desmume/src/cocoa/KeyNames.plist +++ b/desmume/src/cocoa/KeyNames.plist @@ -113,7 +113,7 @@ 80 F19 50 - ` + ` (Accent) 27 - 24 diff --git a/desmume/src/cocoa/cocoa_input.h b/desmume/src/cocoa/cocoa_input.h index 106570fc8..73304c507 100644 --- a/desmume/src/cocoa/cocoa_input.h +++ b/desmume/src/cocoa/cocoa_input.h @@ -57,9 +57,9 @@ enum - (id) initWithMic:(CocoaDSMic *)theMic; -- (void) setSoundInputMode:(NSInteger)inputMode; -- (void) setControllerState:(BOOL)theState controlID:(NSUInteger)controlID; -- (void) setTouchState:(BOOL)theState location:(NSPoint)theLocation; +- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID; +- (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation; +- (void) setMicrophoneState:(BOOL)theState inputMode:(const NSInteger)inputMode; - (void) flush; @end diff --git a/desmume/src/cocoa/cocoa_input.mm b/desmume/src/cocoa/cocoa_input.mm index 4a2c443e9..d4c696e86 100644 --- a/desmume/src/cocoa/cocoa_input.mm +++ b/desmume/src/cocoa/cocoa_input.mm @@ -62,14 +62,7 @@ [super dealloc]; } -- (void) setSoundInputMode:(NSInteger)inputMode -{ - OSSpinLockLock(&spinlockControllerState); - self.cdsMic.mode = inputMode; - OSSpinLockUnlock(&spinlockControllerState); -} - -- (void) setControllerState:(BOOL)theState controlID:(NSUInteger)controlID +- (void) setControllerState:(BOOL)theState controlID:(const NSUInteger)controlID { if (controlID >= DSControllerState_StatesCount) { @@ -81,7 +74,7 @@ OSSpinLockUnlock(&spinlockControllerState); } -- (void) setTouchState:(BOOL)theState location:(NSPoint)theLocation +- (void) setTouchState:(BOOL)theState location:(const NSPoint)theLocation { OSSpinLockLock(&spinlockControllerState); controllerState[DSControllerState_Touch] = (theState) ? true : false; @@ -89,6 +82,14 @@ OSSpinLockUnlock(&spinlockControllerState); } +- (void) setMicrophoneState:(BOOL)theState inputMode:(const NSInteger)inputMode +{ + OSSpinLockLock(&spinlockControllerState); + controllerState[DSControllerState_Microphone] = (theState) ? true : false; + self.cdsMic.mode = inputMode; + OSSpinLockUnlock(&spinlockControllerState); +} + - (void) flush { OSSpinLockLock(&spinlockControllerState); @@ -140,15 +141,15 @@ { if (micMode == MICMODE_NONE) { - [self.cdsMic fillWithNullSamples]; + [cdsMic fillWithNullSamples]; } else if (micMode == MICMODE_INTERNAL_NOISE) { - [self.cdsMic fillWithInternalNoise]; + [cdsMic fillWithInternalNoise]; } else if (micMode == MICMODE_WHITE_NOISE) { - [self.cdsMic fillWithWhiteNoise]; + [cdsMic fillWithWhiteNoise]; } else if (micMode == MICMODE_SOUND_FILE) { diff --git a/desmume/src/cocoa/translations/English.lproj/MainMenu.strings b/desmume/src/cocoa/translations/English.lproj/MainMenu.strings index d37af29eb..02d0379c4 100644 Binary files a/desmume/src/cocoa/translations/English.lproj/MainMenu.strings and b/desmume/src/cocoa/translations/English.lproj/MainMenu.strings differ diff --git a/desmume/src/cocoa/translations/English.lproj/MainMenu.xib b/desmume/src/cocoa/translations/English.lproj/MainMenu.xib index d3e6f2103..7669bffed 100644 --- a/desmume/src/cocoa/translations/English.lproj/MainMenu.xib +++ b/desmume/src/cocoa/translations/English.lproj/MainMenu.xib @@ -12,7 +12,7 @@ YES - + YES @@ -1550,1938 +1550,13 @@ - - - 12 - {614, 409} - - YES - - 1 - - - 256 - - YES - - - 268 - {{125, 340}, {452, 21}} - - YES - - 75628096 - 272635904 - - - LucidaGrande - 13 - 1044 - - Set Input - - YES - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - 3 - MAA - - - - - - - 268 - {{125, 315}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 290}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 265}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 240}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 215}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 190}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 165}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 140}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 115}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 90}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 65}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{17, 340}, {100, 19}} - - 1000 - YES - - 67239424 - 134217728 - Up - - LucidaGrande - 12 - 16 - - - -1229176577 - 100 - - NSImage - Icon_ArrowUp_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 315}, {100, 19}} - - 1001 - YES - - 67239424 - 134217728 - Down - - - -1229176577 - 100 - - NSImage - Icon_ArrowDown_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 290}, {100, 19}} - - 1002 - YES - - 67239424 - 134217728 - Left - - - -1229176577 - 100 - - NSImage - Icon_ArrowLeft_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 265}, {100, 19}} - - 1003 - YES - - 67239424 - 134217728 - Right - - - -1229176577 - 100 - - NSImage - Icon_ArrowRight_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 240}, {100, 19}} - - 1004 - YES - - 67239424 - 134217728 - A - - - -1229176577 - 100 - - NSImage - Icon_DSButtonA_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 215}, {100, 19}} - - 1005 - YES - - 67239424 - 134217728 - B - - - -1229176577 - 100 - - NSImage - Icon_DSButtonB_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 190}, {100, 19}} - - 1006 - YES - - 67239424 - 134217728 - X - - - -1229176577 - 100 - - NSImage - Icon_DSButtonX_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 165}, {100, 19}} - - 1007 - YES - - 67239424 - 134217728 - Y - - - -1229176577 - 100 - - NSImage - Icon_DSButtonY_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 140}, {100, 19}} - - 1008 - YES - - 67239424 - 134217728 - L - - - -1229176577 - 100 - - NSImage - Icon_DSButtonL_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 115}, {100, 19}} - - 1009 - YES - - 67239424 - 134217728 - R - - - -1229176577 - 100 - - NSImage - Icon_DSButtonR_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 90}, {100, 19}} - - 1010 - YES - - 67239424 - 134217728 - Start - - - -1229176577 - 100 - - NSImage - Icon_DSButtonStart_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 65}, {100, 19}} - - 1011 - YES - - 67239424 - 134217728 - Select - - - -1229176577 - 100 - - NSImage - Icon_DSButtonSelect_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 40}, {100, 19}} - - 3000 - YES - - 67239424 - 134217728 - Lid - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{125, 40}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 15}, {452, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{17, 15}, {100, 19}} - - 3001 - YES - - 67239424 - 134217728 - Debug - - - -1229176577 - 100 - - - - 400 - 75 - - - - {{10, 33}, {594, 363}} - - - Controller - - - - - 2 - - - 256 - - YES - - - 268 - - YES - - - 2304 - - YES - - - 256 - {558, 308} - - YES - - - 256 - {558, 17} - - - - - - -2147483392 - {{480, 0}, {16, 17}} - - - - YES - - 47 - 10 - 3.4028234663852886e+38 - - 75628096 - 2048 - - - LucidaGrande - 11 - 3100 - - - 6 - System - headerColor - - 3 - MQA - - - - 6 - System - headerTextColor - - - - - 67239424 - 134348800 - Set - - - 4000 - -1229176577 - 36 - - - 200 - 25 - - 3 - YES - - - - 136 - 40 - 1000 - - 75628096 - 2048 - Input Device - - - 3 - MC4zMzMzMzI5ODU2AA - - - - - 67239488 - 272765952 - Text - - - - - - 3 - YES - - - - 132 - 40 - 1000 - - 75628096 - 2048 - Input Element - - - - - - 67239488 - 137216 - Text Cell - - - YES - 1 - - 6 - System - controlBackgroundColor - - - - - 3 - YES - - - - 131 - 10 - 3.4028234663852886e+38 - - 75628096 - 2048 - Use Device Coordinates - - - - - - 67239424 - 0 - - - - 1215582719 - 2 - - NSImage - NSSwitch - - - NSSwitch - - - - 200 - 25 - - 3 - YES - YES - - - - 46 - 10 - 3.4028234663852886e+38 - - 75628096 - 2048 - X - - - - - - 337772096 - -2147350528 - Text Cell - - - - YES - - YES - allowsFloats - formatterBehavior - locale - maximum - maximumFractionDigits - minimum - negativeInfinitySymbol - nilSymbol - numberStyle - positiveInfinitySymbol - usesGroupingSeparator - - - YES - - - - - - - - - -∞ - - - +∞ - - - - #0 - #0 - - - - - - - - NaN - - YES - - YES - - - YES - - - - - - - 3 - YES - YES - YES - - . - , - NO - NO - NO - - - - - - 3 - YES - YES - - - - 48 - 10 - 3.4028234663852886e+38 - - 75628096 - 2048 - Y - - - - - - 337772096 - -2147350528 - Text Cell - - - - YES - - YES - allowsFloats - formatterBehavior - locale - maximum - maximumFractionDigits - minimum - negativeInfinitySymbol - nilSymbol - numberStyle - positiveInfinitySymbol - usesGroupingSeparator - - - YES - - - - - - - -∞ - - - +∞ - - - - #0 - #0 - - - - - - - - NaN - - - - - - 3 - YES - YES - YES - - . - , - NO - NO - NO - - - - - - 3 - YES - YES - - - - 3 - 2 - - - 6 - System - gridColor - - 3 - MC41AA - - - 18 - 851443712 - - - 3 - 0 - 15 - 0 - NO - 0 - - - {{1, 17}, {558, 308}} - - - - - 4 - - - - -2147483392 - {{480, 17}, {15, 257}} - - - _doScroller: - 0.99633699633699635 - - - - -2147483392 - {{1, 274}, {558, 15}} - - 1 - - _doScroller: - 0.99821109123434704 - - - - 2304 - - YES - - - {{1, 0}, {558, 17}} - - - - - 4 - - - - {{17, 34}, {560, 326}} - - - 562 - - - - - - QSAAAEEgAABBoAAAQaAAAA - - - - 268 - {{44, 4}, {28, 23}} - - YES - - -2080244224 - 134217728 - - - - -2033434369 - 162 - - NSImage - NSRemoveTemplate - - - - 400 - 75 - - - - - 268 - {{17, 4}, {28, 23}} - - YES - - -2080244224 - 134217728 - - - - -2033434369 - 162 - - NSImage - NSAddTemplate - - - - 400 - 75 - - - - {{10, 33}, {594, 363}} - - Touch Pad - - - - - 3 - - - 256 - - YES - - - 268 - {{153, 341}, {424, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{17, 341}, {128, 19}} - - 2000 - YES - - 67239424 - 134217728 - Activate Mic - - - -1229176577 - 100 - - NSImage - Icon_Microphone_420x420 - - - - 400 - 75 - - - - - 12 - - YES - - - 274 - - YES - - - 268 - {{18, 69}, {528, 18}} - - YES - - 537001472 - 0 - - 50 - 38 - 47 - 2 - - - - - 268 - {{16, 39}, {532, 25}} - - YES - - -1543373312 - 0 - - - 100 - 0.0 - 50 - 0.0 - 5 - 0 - NO - NO - - - - - 268 - {{247, 14}, {70, 17}} - - YES - - 605158976 - 272630784 - Input Gain - - - - - - - - - 268 - {{15, 109}, {54, 17}} - - YES - - 605158976 - 272630784 - Device: - - - - - - - - - 268 - {{71, 103}, {478, 26}} - - YES - - -1539178944 - 2048 - - - 109199615 - 129 - - - 400 - 75 - - - - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - - 1 - YES - YES - 2 - - - - {{1, 1}, {564, 137}} - - - - {{14, 55}, {566, 153}} - - {0, 0} - - 67239424 - 0 - Sound Input Device Settings - - - 6 - System - textBackgroundColor - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 1 - 0 - 2 - NO - - - - 12 - - YES - - - 274 - - YES - - - 268 - {{18, 14}, {290, 78}} - - YES - 4 - 1 - - YES - - 604110336 - 0 - Sound Input Device (NOT IMPLEMENTED) - - - 4 - 1211912703 - 0 - - NSRadioButton - - - - 200 - 25 - - - -2080244224 - 0 - Internal Noise Samples - - - 1 - 1211912703 - 0 - - 549453824 - {18, 18} - - YES - - YES - - - - TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw -IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ -29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 -dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA -AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG -AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ -0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ -7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ -5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ -3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD -AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns -AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ -6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ -/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ -///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl -YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA -AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD -AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu -AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB -AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES -AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS -AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw -cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA -AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA -BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA -AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA -AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 -cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD -AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH -SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF -hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 -vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt -7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq -Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo -aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e -n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX -2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW -FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O -Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 -ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt -rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA -AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA -AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl -A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq -DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU -HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 -MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v -UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ -eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj -rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn -5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh -AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK -CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY -GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 -MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S -UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 -d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV -pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK -0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// -AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw -BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA -FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H -LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh -Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ -h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp -svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb -1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX -8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE -AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg -QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA - - - - - - 3 - MCAwAA - - - - 400 - 75 - - - 67239424 - 0 - White Noise - - - 3 - 1211912703 - 0 - - 400 - 75 - - - 604110336 - 0 - Sound File: - - - 2 - 1211912703 - 0 - - 400 - 75 - - - {290, 18} - {4, 2} - 1151868928 - NSActionCell - - 67239424 - 0 - Radio - - 1211912703 - 0 - - 549453824 - {18, 18} - - YES - - YES - - - - TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw -IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ -29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 -dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA -AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG -AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ -0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ -7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ -5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ -3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD -AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns -AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ -6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ -/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ -///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl -YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA -AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD -AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu -AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB -AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES -AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS -AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - - - - - - - - 400 - 75 - - 1 - - - - - - - - 268 - {{130, 12}, {324, 21}} - - YES - - 612499008 - 272635904 - - - NOT IMPLEMENTED - - YES - - - - - - - 268 - {{456, 5}, {96, 32}} - - YES - - 604110336 - 134217728 - Choose... - - - -2038284033 - 129 - - - 200 - 25 - - - - {{1, 1}, {564, 102}} - - - - {{14, 212}, {566, 118}} - - {0, 0} - - 67239424 - 0 - Sound Input Options - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 1 - 0 - 2 - NO - - - {{10, 33}, {594, 363}} - - Microphone - - - - - 4 - - - 256 - - YES - - - 268 - {{153, 312}, {424, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{153, 286}, {424, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{153, 339}, {424, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{17, 339}, {128, 19}} - - 3002 - YES - - 67239424 - 134217728 - Speed 1/2x - - - -1229176577 - 100 - - NSImage - Icon_DoubleSpeed_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 312}, {128, 19}} - - 3003 - YES - - 67239424 - 134217728 - Speed 2x - - - -1229176577 - 100 - - NSImage - Icon_Speed2x_420x420 - - - - 400 - 75 - - - - - 268 - {{17, 286}, {128, 19}} - - 3004 - YES - - 67239424 - 134217728 - HUD - - - -1229176577 - 100 - - NSImage - Icon_ShowHUD_420x420 - - - - 400 - 75 - - - - - 268 - {{153, 259}, {424, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{17, 259}, {128, 19}} - - 3005 - YES - - 67239424 - 134217728 - Execute - - - -1229176577 - 100 - - NSImage - Icon_Execute_420x420 - - - - 400 - 75 - - - - - 268 - {{153, 232}, {424, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{17, 232}, {128, 19}} - - 3006 - YES - - 67239424 - 134217728 - Pause - - - -1229176577 - 100 - - NSImage - Icon_Pause_420x420 - - - - 400 - 75 - - - - - 268 - {{153, 205}, {424, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{17, 205}, {128, 19}} - - 3007 - YES - - 67239424 - 134217728 - Reset - - - -1229176577 - 100 - - NSImage - Icon_Reset_420x420 - - - - 400 - 75 - - - - {{10, 33}, {594, 363}} - - Utility - - - - - - - 0 - YES - YES - - YES - - - AppDelegate EmuControllerDelegate - + InputManager @@ -3582,7 +1657,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 10245 0 - + + 3 + MQA + YES @@ -3596,13 +1674,19 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 6 System selectedTextBackgroundColor - + + 3 + MC42NjY2NjY2NjY3AA + 6 System selectedTextColor - + + 3 + MAA + @@ -3681,7 +1765,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA Read Me - + + 6 + System + controlColor + + @@ -4067,7 +2156,11 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - + + LucidaGrande + 13 + 1044 + 0 YES YES @@ -4090,7 +2183,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA App Description - + + 6 + System + controlTextColor + + @@ -4103,7 +2201,11 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 73530881 4329472 - + + LucidaGrande + 11 + 3100 + Build Info YES @@ -4245,7 +2347,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA Display - + + NSImage + Icon_ShowHUD_420x420 + {0, 0} @@ -4331,7 +2436,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - + + YES + {1.79769e+308, 1.79769e+308} @@ -4441,7 +2548,12 @@ L3d3dy5hZHZhbnNjZW5lLmNvbS9vZmZsaW5lL2RhdGFzL0FEVkFOc0NFbmVfUlRvb2xEUy56aXA0 ADVANsCEne Database - + + 6 + System + textBackgroundColor + + 3 MCAwLjgwMDAwMDAxMTkAA @@ -4583,8 +2695,13 @@ aGVhdHMuZ2JhdGVtcC5uZXQvA 1211912703 2 - - + + NSImage + NSSwitch + + + NSSwitch + 200 @@ -4661,7 +2778,7 @@ aGVhdHMuZ2JhdGVtcC5uZXQvA 1211912703 2 - + @@ -4684,7 +2801,7 @@ aGVhdHMuZ2JhdGVtcC5uZXQvA 1211912703 2 - + @@ -4835,1131 +2952,306 @@ aGVhdHMuZ2JhdGVtcC5uZXQvA 2 NSView - + 268 YES - - - 12 - {{13, 10}, {614, 409}} - + + + {{197, 15}, {247, 17}} + - - YES - - 1 - - - 256 - - YES - - - 268 - {{125, 340}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 315}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 290}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 265}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 240}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 215}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 190}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 165}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 140}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 115}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 90}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 65}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{17, 340}, {100, 19}} - - - 1000 - YES - - 67239424 - 134217728 - Up - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{17, 315}, {100, 19}} - - - 1001 - YES - - 67239424 - 134217728 - Down - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{17, 290}, {100, 19}} - - - 1002 - YES - - 67239424 - 134217728 - Left - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{17, 265}, {100, 19}} - - - 1003 - YES - - 67239424 - 134217728 - Right - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{17, 240}, {100, 19}} - - - 1004 - YES - - 67239424 - 134217728 - A - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{17, 215}, {100, 19}} - - - 1005 - YES - - 67239424 - 134217728 - B - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{17, 190}, {100, 19}} - - - 1006 - YES - - 67239424 - 134217728 - X - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{17, 165}, {100, 19}} - - - 1007 - YES - - 67239424 - 134217728 - Y - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{17, 140}, {100, 19}} - - - 1008 - YES - - 67239424 - 134217728 - L - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{17, 115}, {100, 19}} - - - 1009 - YES - - 67239424 - 134217728 - R - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{17, 90}, {100, 19}} - - - 1010 - YES - - 67239424 - 134217728 - Start - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{17, 65}, {100, 19}} - - - 1011 - YES - - 67239424 - 134217728 - Select - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{17, 40}, {100, 19}} - - - 3000 - YES - - 67239424 - 134217728 - Lid - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 268 - {{125, 40}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{125, 15}, {452, 21}} - - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{17, 15}, {100, 19}} - - - 3001 - YES - - 67239424 - 134217728 - Debug - - - -1229176577 - 100 - - - - 400 - 75 - - - - {{10, 33}, {594, 363}} - - - - Controller - - + YES + + 605158976 + 171971584 + Click this area to map mouse input. + + LucidaGrande-Bold + 13 + 16 - - 3 - - - 256 - - YES - - - 268 - {{153, 341}, {424, 21}} - - YES - - 75628096 - 272635904 - - - Set Input - - YES - - - - - - - 268 - {{17, 341}, {128, 19}} - - 2000 - YES - - 67239424 - 134217728 - Activate Mic - - - -1229176577 - 100 - - - - 400 - 75 - - - - - 12 - - YES - - - 274 - - YES - - - 268 - {{18, 69}, {528, 18}} - - YES - - 537001472 - 0 - - 50 - 38 - 47 - 2 - - - - - 268 - {{16, 39}, {532, 25}} - - YES - - -1543373312 - 0 - - - 100 - 0.0 - 50 - 0.0 - 5 - 0 - NO - NO - - - - - 268 - {{247, 14}, {70, 17}} - - YES - - 605158976 - 272630784 - Input Gain - - - - - - - - - 268 - {{15, 109}, {54, 17}} - - YES - - 605158976 - 272630784 - Device: - - - - - - - - - 268 - {{71, 103}, {478, 26}} - - YES - - -1539178944 - 2048 - - - 109199615 - 129 - - - 400 - 75 - - - - - 1048576 - 2147483647 - 1 - - - _popUpItemAction: - - - YES - - OtherViews - - YES - - - - - 1 - YES - YES - 2 - - - - {{1, 1}, {564, 137}} - - - - {{14, 55}, {566, 153}} - - {0, 0} - - 67239424 - 0 - Sound Input Device Settings - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 1 - 0 - 2 - NO - - - - 12 - - YES - - - 274 - - YES - - - 268 - {{18, 14}, {290, 78}} - - YES - 4 - 1 - - YES - - 604110336 - 0 - Sound Input Device (NOT IMPLEMENTED) - - - 4 - 1211912703 - 0 - - - - 200 - 25 - - - -2080244224 - 0 - Internal Noise Samples - - - 1 - 1211912703 - 0 - - 549453824 - {18, 18} - - YES - - YES - - - - TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw -IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ -29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 -dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA -AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG -AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ -0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ -7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ -5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ -3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD -AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns -AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ -6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ -/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ -///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl -YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA -AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD -AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu -AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB -AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES -AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS -AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw -cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA -AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA -BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA -AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA -AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 -cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD -AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH -SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF -hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 -vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt -7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq -Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo -aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e -n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX -2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW -FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O -Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 -ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt -rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA -AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA -AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl -A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq -DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU -HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 -MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v -UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ -eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj -rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn -5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh -AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK -CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY -GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 -MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S -UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 -d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV -pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK -0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// -AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw -BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA -FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H -LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh -Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ -h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp -svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb -1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX -8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE -AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg -QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA - - - - - - - - 400 - 75 - - - 67239424 - 0 - White Noise - - - 3 - 1211912703 - 0 - - 400 - 75 - - - 604110336 - 0 - Sound File: - - - 2 - 1211912703 - 0 - - 400 - 75 - - - {290, 18} - {4, 2} - 1151868928 - NSActionCell - - 67239424 - 0 - Radio - - 1211912703 - 0 - - 549453824 - {18, 18} - - YES - - YES - - - - TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw -IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ -29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 -dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA -AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG -AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ -0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ -7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ -5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ -3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD -AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns -AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ -6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ -/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ -///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl -YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA -AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD -AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu -AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB -AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES -AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS -AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - - - - - - - - 400 - 75 - - 1 - - - - - - - - 268 - {{130, 12}, {324, 21}} - - YES - - 612499008 - 272635904 - - - NOT IMPLEMENTED - - YES - - - - - - - 268 - {{456, 5}, {96, 32}} - - YES - - 604110336 - 134217728 - Choose... - - - -2038284033 - 129 - - - 200 - 25 - - - - {{1, 1}, {564, 102}} - - - - {{14, 212}, {566, 118}} - - {0, 0} - - 67239424 - 0 - Sound Input Options - - - - 3 - MCAwLjgwMDAwMDAxMTkAA - - - - 1 - 0 - 2 - NO - - - {{10, 33}, {594, 363}} - - Microphone - - - - - - - 0 - YES - YES - - YES - + + + + + + 274 + + YES + + + 2304 + + YES + + + 256 + {638, 437} + + + YES + + + 256 + {638, 17} + + + + + + + -2147483392 + {{584, 0}, {16, 17}} + + + + + YES + + InputCommandTagColumn + 155 + 16 + 1000 + + 75628096 + 2048 + Set Command + + + 3 + MC4zMzMzMzI5ODU2AA + + + 6 + System + headerTextColor + + + + + 67239424 + 131072 + Command + + + -2034482945 + 100 + + + + 200 + 25 + + 3 + YES + + + + InputDeviceColumn + 175 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + Input Device + + + 6 + System + headerColor + + + + + + 69336641 + 137216 + Text Cell + + + + 6 + System + controlBackgroundColor + + + + + 3 + YES + + + + InputSettingsSummaryColumn + 136 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + Input Settings Summary + + + + + + 69336641 + 137216 + Text Cell + + + + + + 3 + YES + + + + InputSettingsColumn + 69 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + + + + + + + 604110336 + 134348800 + Settings + + + -2035007233 + 36 + + + 200 + 25 + + + + + RemoveInputColumn + 67 + 10 + 3.4028234663852886e+38 + + 75628096 + 2048 + + + + + + + 67239424 + 134348800 + Remove + + + -2035007233 + 36 + + + 200 + 25 + + + + + 3 + 2 + + + 6 + System + gridColor + + 3 + MC41AA + + + 17 + 1402994688 + + + InputPreferences + 0 + 15 + 0 + NO + 0 + NO + YES + + + {{1, 17}, {638, 437}} + + + + + 4 + + + + -2147483392 + {{584, 17}, {15, 102}} + + + + _doScroller: + 0.96411483253588515 + + + + -2147483392 + {{1, 420}, {624, 15}} + + + 1 + + _doScroller: + 0.99843505477308292 + + + + 2304 + + YES + + + {{1, 0}, {638, 17}} + + + + + 4 + + + + {{0, 42}, {640, 455}} + + + 562 + + + + + + QSAAAEEgAABBmAAAQZgAAA + - {640, 433} + {640, 497} InputPrefsView @@ -6138,7 +3430,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA YES - + + + @@ -6160,7 +3454,13 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NaN - + + YES + + + YES + + @@ -6436,7 +3736,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 0 - + + NSRadioButton + 200 @@ -6542,7 +3844,10 @@ QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA - + + 3 + MCAwAA + 400 @@ -7219,7 +4524,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -7241,7 +4546,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -7287,7 +4592,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -7309,7 +4614,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -7331,7 +4636,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -7394,7 +4699,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 0 - + . ¤ @@ -7440,7 +4745,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NaN - + 0 @@ -7719,7 +5024,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -7741,7 +5046,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -7798,7 +5103,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -7955,7 +5260,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -8613,7 +5918,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NaN - + @@ -8697,7 +6002,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NSView - + 268 YES @@ -8716,6 +6021,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{18, 14}, {165, 38}} + YES 2 1 @@ -8906,10 +6212,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {494, 62}} + {{17, 454}, {496, 78}} + {0, 0} 67239424 @@ -8943,6 +6251,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 12}, {462, 18}} + YES -2080244224 @@ -8952,7 +6261,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -8963,10 +6272,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {494, 38}} + {{17, 16}, {496, 54}} + {0, 0} 67239424 @@ -9000,6 +6311,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 32}, {145, 18}} + YES 67239424 @@ -9009,7 +6321,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -9022,6 +6334,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 12}, {118, 18}} + YES 67239424 @@ -9031,7 +6344,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -9042,10 +6355,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {494, 58}} + {{17, 74}, {496, 74}} + {0, 0} 67239424 @@ -9079,6 +6394,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 61}, {205, 18}} + YES 604110336 @@ -9088,7 +6404,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -9101,6 +6417,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{140, 33}, {240, 22}} + YES -2070806976 @@ -9119,6 +6436,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{15, 37}, {120, 17}} + YES 68288064 @@ -9135,6 +6453,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{382, 27}, {100, 32}} + YES 67239424 @@ -9155,6 +6474,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 12}, {149, 18}} + YES 604110336 @@ -9164,7 +6484,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -9177,6 +6497,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{12, 81}, {229, 32}} + YES 67239424 @@ -9195,10 +6516,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {494, 119}} + {{17, 152}, {496, 135}} + {0, 0} 67239424 @@ -9232,6 +6555,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 117}, {182, 18}} + YES 67239424 @@ -9241,7 +6565,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -9254,6 +6578,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{140, 86}, {240, 22}} + YES -2070806976 @@ -9272,6 +6597,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{15, 89}, {120, 17}} + YES 68288064 @@ -9288,6 +6614,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{382, 80}, {100, 32}} + YES 67239424 @@ -9308,6 +6635,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{140, 59}, {240, 22}} + YES -2070806976 @@ -9326,6 +6654,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{15, 62}, {120, 17}} + YES 68288064 @@ -9342,6 +6671,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{382, 53}, {100, 32}} + YES 67239424 @@ -9362,6 +6692,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 32}, {230, 18}} + YES -1543373312 @@ -9371,7 +6702,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -9384,6 +6715,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 12}, {236, 18}} + YES 604110336 @@ -9393,7 +6725,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -9404,10 +6736,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {494, 143}} + {{17, 291}, {496, 159}} + {0, 0} 67239424 @@ -9441,6 +6775,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 32}, {197, 18}} + YES -2080244224 @@ -9450,7 +6785,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -9463,6 +6798,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 12}, {217, 18}} + YES 67239424 @@ -9472,7 +6808,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -9483,10 +6819,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {494, 58}} + {{17, 536}, {496, 74}} + {0, 0} 67239424 @@ -9507,11 +6845,2132 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {530, 630} + + NSView PreferencesWindowDelegate + + 1 + 2 + {{235, 183}, {600, 376}} + 1685586944 + InputSettingsMicrophone + NSWindow + + + + 256 + + YES + + + 12 + + YES + + + 274 + + YES + + + 268 + {{18, 69}, {528, 18}} + + + YES + + 537001472 + 0 + + 50 + 38 + 47 + 2 + + + + + 268 + {{16, 39}, {532, 25}} + + + YES + + -1543373312 + 0 + + + 100 + 0.0 + 50 + 0.0 + 5 + 0 + NO + NO + + + + + 268 + {{247, 14}, {70, 17}} + + + YES + + 605158976 + 272630784 + Input Gain + + + + + + + + + 268 + {{15, 109}, {54, 17}} + + + YES + + 605158976 + 272630784 + Device: + + + + + + + + + 268 + {{71, 103}, {478, 26}} + + + YES + + -1539178944 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + YES + + + + + 1 + YES + YES + 2 + + + + {{1, 1}, {564, 137}} + + + + + {{17, 56}, {566, 153}} + + + {0, 0} + + 67239424 + 0 + Sound Input Device Settings + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 12 + + YES + + + 274 + + YES + + + 268 + {{18, 14}, {290, 78}} + + + YES + 4 + 1 + + YES + + 604110336 + 0 + Sound Input Device (NOT IMPLEMENTED) + + + 4 + 1211912703 + 0 + + + + 200 + 25 + + + -2080244224 + 0 + Internal Noise Samples + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + 67239424 + 0 + White Noise + + + 3 + 1211912703 + 0 + + 400 + 75 + + + 604110336 + 0 + Sound File: + + + 2 + 1211912703 + 0 + + 400 + 75 + + + {290, 18} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + 1 + + + + + + + + 268 + {{130, 12}, {324, 21}} + + + YES + + 612499008 + 272635904 + + + NOT IMPLEMENTED + + YES + + + + + + + 268 + {{456, 5}, {96, 32}} + + + YES + + 604110336 + 134217728 + Choose... + + + -2038284033 + 129 + + + 200 + 25 + + + + {{1, 1}, {564, 102}} + + + + + {{17, 213}, {566, 118}} + + + {0, 0} + + 67239424 + 0 + Sample Source + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 268 + {{490, 12}, {96, 32}} + + + 1 + YES + + 67239424 + 134217728 + OK + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + + 268 + {{394, 12}, {96, 32}} + + + YES + + 67239424 + 134217728 + Cancel + + + -2038284033 + 129 + + Gw + 200 + 25 + + + + + 268 + {{17, 339}, {566, 17}} + + + YES + + 70385217 + 272634880 + + + Device Info Summary + + + + + + + {600, 376} + + + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 1 + 2 + {{235, 296}, {350, 263}} + 1685586944 + InputSettingsTouch + NSWindow + + + + 256 + + YES + + + 12 + + YES + + + 256 + + YES + + + 268 + {{97, 44}, {17, 17}} + + + YES + + 68288064 + 71304192 + X: + + + + + + + + + 268 + {{119, 42}, {96, 22}} + + + YES + + -1804468671 + -1874852864 + + + + + YES + + YES + allowsFloats + formatterBehavior + locale + maximum + maximumFractionDigits + maximumIntegerDigits + minimum + minimumIntegerDigits + negativeInfinitySymbol + nilSymbol + numberStyle + positiveInfinitySymbol + usesGroupingSeparator + + + YES + + + + + + + + + -∞ + + + +∞ + + + + # + # + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + NO + + + YES + + + + + + + 268 + {{97, 16}, {17, 17}} + + + YES + + 68288064 + 71304192 + Y: + + + + + + + + + 268 + {{119, 14}, {96, 22}} + + + YES + + -1804468671 + -1874852864 + + + + + YES + + YES + allowsFloats + formatterBehavior + locale + maximum + maximumFractionDigits + maximumIntegerDigits + minimum + minimumIntegerDigits + negativeInfinitySymbol + nilSymbol + numberStyle + positiveInfinitySymbol + usesGroupingSeparator + + + YES + + + + + + + + + -∞ + + + +∞ + + + + # + # + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + NO + + + YES + + + + + + {{1, 1}, {314, 74}} + + + + + {{17, 56}, {316, 90}} + + + {0, 0} + + 67239424 + 0 + User Defined Coordinates + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 268 + {{240, 12}, {96, 32}} + + + 1 + YES + + 67239424 + 134217728 + OK + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + + 268 + {{18, 202}, {314, 18}} + + + YES + + 67239424 + 0 + Use user defined coordinates + + + 1211912703 + 2 + + + + + 200 + 25 + + + + + 268 + {{17, 154}, {316, 42}} + + + YES + + 67239424 + 272760832 + If this setting is disabled, then the Touch command will read the coordinates from the input device instead. + + + + + + + + + 268 + {{144, 12}, {96, 32}} + + + YES + + 67239424 + 134217728 + Cancel + + + -2038284033 + 129 + + Gw + 200 + 25 + + + + + 268 + {{17, 226}, {316, 17}} + + + YES + + 70385217 + 272634880 + + + Device Info Summary + + + + + + + {350, 263} + + + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 1 + 2 + {{235, 434}, {350, 125}} + 1685586944 + InputSettingsLoadStateSlot + NSWindow + + + + 256 + + YES + + + 268 + {{121, 56}, {212, 26}} + + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + Slot 1 + + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + YES + + + + Slot 2 + + 2147483647 + + + _popUpItemAction: + 1 + + + + + Slot 3 + + 2147483647 + + + _popUpItemAction: + 2 + + + + + Slot 4 + + 2147483647 + + + _popUpItemAction: + 3 + + + + + Slot 5 + + 2147483647 + + + _popUpItemAction: + 4 + + + + + Slot 6 + + 2147483647 + + + _popUpItemAction: + 5 + + + + + Slot 7 + + 2147483647 + + + _popUpItemAction: + 6 + + + + + Slot 8 + + 2147483647 + + + _popUpItemAction: + 7 + + + + + Slot 9 + + 2147483647 + + + _popUpItemAction: + 8 + + + + + Slot 10 + + 2147483647 + + + _popUpItemAction: + 9 + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{17, 62}, {102, 17}} + + + YES + + 68288064 + 272630784 + Load State Slot: + + + + + + + + + 268 + {{240, 12}, {96, 32}} + + + 1 + YES + + 67239424 + 134217728 + OK + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + + 268 + {{144, 12}, {96, 32}} + + + YES + + 67239424 + 134217728 + Cancel + + + -2038284033 + 129 + + Gw + 200 + 25 + + + + + 268 + {{17, 88}, {316, 17}} + + + YES + + 70385217 + 272634880 + + + Device Info Summary + + + + + + + {350, 125} + + + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 1 + 2 + {{235, 459}, {350, 125}} + 1685586944 + InputSettingsSaveStateSlot + NSWindow + + + + 256 + + YES + + + 268 + {{119, 56}, {214, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + Slot 1 + + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + YES + + + + Slot 2 + + 2147483647 + + + _popUpItemAction: + 1 + + + + + Slot 3 + + 2147483647 + + + _popUpItemAction: + 2 + + + + + Slot 4 + + 2147483647 + + + _popUpItemAction: + 3 + + + + + Slot 5 + + 2147483647 + + + _popUpItemAction: + 4 + + + + + Slot 6 + + 2147483647 + + + _popUpItemAction: + 5 + + + + + Slot 7 + + 2147483647 + + + _popUpItemAction: + 6 + + + + + Slot 8 + + 2147483647 + + + _popUpItemAction: + 7 + + + + + Slot 9 + + 2147483647 + + + _popUpItemAction: + 8 + + + + + Slot 10 + + 2147483647 + + + _popUpItemAction: + 9 + + + + + + 1 + YES + YES + 2 + + + + + 268 + {{17, 62}, {100, 17}} + + YES + + 68288064 + 272630784 + Save State Slot: + + + + + + + + + 268 + {{240, 12}, {96, 32}} + + 1 + YES + + 67239424 + 134217728 + OK + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + + 268 + {{144, 12}, {96, 32}} + + YES + + 67239424 + 134217728 + Cancel + + + -2038284033 + 129 + + Gw + 200 + 25 + + + + + 268 + {{17, 88}, {316, 17}} + + YES + + 70385217 + 272634880 + + + Device Info Summary + + + + + + + {350, 125} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 1 + 2 + {{235, 399}, {467, 160}} + 1685586944 + InputSettingsSpeedLimit + NSWindow + + + + 256 + + YES + + + 268 + {{17, 123}, {316, 17}} + + YES + + 70385217 + 272634880 + + + Device Info Summary + + + + + + + + 268 + {{30, 71}, {411, 26}} + + YES + + -2079981824 + 0 + + + 10 + 0.0 + 1 + 0.0 + 11 + 1 + NO + NO + + + + + 268 + {{20, 98}, {38, 17}} + + YES + + 68288064 + 138413056 + 0x + + + + + + + + + 268 + {{412, 98}, {38, 17}} + + YES + + 68288064 + 138413056 + 10x + + + + + + + + + 268 + {{98, 98}, {38, 17}} + + YES + + 68288064 + 138413056 + 2x + + + + + + + + + 268 + {{177, 98}, {38, 17}} + + YES + + 68288064 + 138413056 + 4x + + + + + + + + + 268 + {{255, 98}, {38, 17}} + + YES + + 68288064 + 138413056 + 6x + + + + + + + + + 268 + {{335, 98}, {38, 17}} + + YES + + 68288064 + 138413056 + 8x + + + + + + + + + 268 + {{14, 12}, {169, 32}} + + 100 + YES + + 67239424 + 134217728 + Set to Normal Speed + + + -2038021889 + 129 + + + + 400 + 75 + + + + + 268 + {{145, 48}, {123, 17}} + + YES + + 68288064 + 272630784 + Speed limit set to: + + + + + + + + + 268 + {{270, 48}, {57, 17}} + + YES + + 68288064 + 4195328 + + + + YES + + YES + allowsFloats + alwaysShowsDecimalSeparator + formatterBehavior + lenient + locale + maximumFractionDigits + minimumFractionDigits + negativeFormat + negativeInfinitySymbol + nilSymbol + numberStyle + positiveFormat + positiveInfinitySymbol + usesGroupingSeparator + + + YES + + + + + + + + #0.00x + -∞ + + + #0.00x + +∞ + + + + #0.00x + #0.00x + + + + + + + + NaN + + + + + + 3 + YES + YES + YES + + . + , + NO + NO + YES + + speedX + + + + + + + + 268 + {{357, 12}, {96, 32}} + + 1 + YES + + 67239424 + 134217728 + OK + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + + 268 + {{261, 12}, {96, 32}} + + YES + + 67239424 + 134217728 + Cancel + + + -2038284033 + 129 + + Gw + 200 + 25 + + + + {467, 160} + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + + + 1 + 2 + {{235, 276}, {516, 283}} + 1685586944 + InputSettingsGPUState + NSWindow + + + + 256 + + YES + + + 12 + + YES + + + 256 + + YES + + + 268 + {{18, 14}, {444, 142}} + + + YES + 6 + 2 + + YES + + -2080244224 + 0 + Main GPU - All Layers + + + 1211912703 + 0 + + + + 200 + 25 + + + 67239424 + 0 + Sub GPU - All Layers + + + 6 + 1211912703 + 0 + + 400 + 75 + + + 67239424 + 0 + Main BG0 + + + 1 + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFxgEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFzodzAAcAAAwYAAAF1gAAAAAACAAIAAgACAABAAEAAQABAAAMGGFw +cGwCAAAAbW50clJHQiBYWVogB9YABAADABMALAASYWNzcEFQUEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAPbWAAEAAAAA0y1hcHBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAOclhZWgAAASwAAAAUZ1hZWgAAAUAAAAAUYlhZWgAAAVQAAAAUd3RwdAAAAWgAAAAUY2hhZAAA +AXwAAAAsclRSQwAAAagAAAAOZ1RSQwAAAbgAAAAOYlRSQwAAAcgAAAAOdmNndAAAAdgAAAMSbmRpbgAA +BOwAAAY+ZGVzYwAACywAAABkZHNjbQAAC5AAAAAubW1vZAAAC8AAAAAoY3BydAAAC+gAAAAtWFlaIAAA +AAAAAF1KAAA0kQAACCVYWVogAAAAAAAAdCAAALRgAAAjPVhZWiAAAAAAAAAlbAAAFyoAAKfDWFlaIAAA +AAAAAPNSAAEAAAABFs9zZjMyAAAAAAABDEIAAAXe///zJgAAB5IAAP2R///7ov///aMAAAPcAADAbGN1 +cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAHZjZ3QAAAAAAAAAAAAD +AQAAAQACBAUGBwkKCw0ODxASExQWFxgaGxweHyAiIyQmJygpKywtLzAxMjM1Njc4OTs8PT5AQUJDREZH +SElKS0xOT1BRUlNUVVZXWFlaW1xdXl9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SF +hoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnZ6foKGio6SlpqanqKmqq6ytra6vsLGysrO0tba3uLi5uru8 +vL2+v8DBwcLDxMXGxsfIycrKy8zNzs7P0NHS0tPU1dbW19jZ2drb3Nzd3t/g4eLi4+Tl5ufo6enq6+zt +7u/w8fHy8/T19vf4+fr7/P3+/v8AAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR8gISIjJCUnKCkq +Ky0uLzAxMzQ1Njc4OTo7PD0/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaWltcXV5fYGFiY2RlZmdo +aWprbG1ub3BxcnN0dXZ3d3h5ent8fH1+f4CBgoKDhIWGh4iIiYqLjI2Oj5CRkpOUlJWWl5iZmpucnZ2e +n6ChoqOkpaamp6ipqqusra6vsLCxsrO0tba3uLm5uru8vb6/wMHCw8TFx8jJysvMzc7P0NDR0tPU1dbX +2Nna29ze3+Dh4uPk5ebn6err7O3u7/Hy8/T19vf5+vv8/f7/AAIDAwQFBgcICQoKCwwNDg8QERITFBUW +FxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODg5Ojs8PT4+P0BBQkNDREVGR0hJSUpLTE1O +Tk9QUVJSU1RVVVZXWFhZWltbXF1eXl9gYWFiY2RkZWZnZ2hpaWprbGxtbm5vcHFxcnNzdHV1dnd4eHl6 +ent8fH1+fn+AgYGCg4SEhYaHiImJiouMjY6Oj5CRkpOTlJWWl5iZmZqbnJ2en6ChoqOkpaanqKmqq6yt +rq+xsrO0tba3uLq7vL2+wMHDxMbHycrMzs/R0tTW19nb3d7g4uTm6Ors7vDy9Pb4+vz+/wAAbmRpbgAA +AAAAAAY2AACXGgAAVjoAAFPKAACJ3gAAJ8IAABaoAABQDQAAVDkAAiuFAAIZmQABeFEAAwEAAAIAAAAA +AAEABgANABcAIwAxAEAAUgBlAHsAkwCrAMUA4gD/AR8BPwFhAYUBqgHQAfgCIAJLAncCpQLSAwIDMwNl +A5gDzgQFBD0EdQSvBOsFKQVnBacF6AYqBm4GtQb8B0UHkgfkCDkIkAjnCT4JmAn0ClAKrQsLC2sLygwq +DIwM8Q1XDcAOKA6SDv4PbA/bEE0QxBE7EbQSMRKwEzITuRREFNAVYBXxFocXHhfAGGIZBBmsGlQa+RuU +HC4czh1yHhQeux9jIA0gvCFoIhkizyOJJEEk+SW6JnknOygFKMspkypiKzIsASzXLawuhy9gMD4xGzH8 +MtszvzSgNYY2cjdcOEw5OTorOxs8CD0EPfU+6z/nQOFB2ELUQ9VE00XcRttH5EjxSgBLCUwdTTFOUE9v +UI9Rt1LdVAVVNlZsV6VY4FohW21ct135X09goGH0Y0tkqGYFZ19oxGova5ptCG54b/BxbnLsdG119Xd/ +eQh6knwqfcV/W4D4gpSEO4Xih4CJKorYjIqOOY/jkZuTWJUOlsyYiZpSnB6d4Z+soX+jWqUvpxOo+6rj +rMuuwLC4sra0rra0uL+60LzfvwDBHcLdxLXGhchYyi7MCs3lz7rRmtOA1WPXR9kq2xPc/97s4M/iveSn +5o3obupT7ELuLPAM8fLz0PW396H5f/tZ/T3//wAAAAEAAwALABYAJQA3AE0AZQCBAJ8AwQDlAQsBNQFh +AZABwQH1AisCZAKfAtwDHANfA6MD6gQ0BH8EzQT1BR0FcAXEBhsGdAbPBy0HXAeMB+4IUgi4CSAJVAmK +CfYKZArVC0cLgQu8DDIMqw0mDaIOIQ6hDyQPqRAvELgQ/RFDEc8SXRLuE4AUFRSrFUMV3RZ5FxcXthhY +GPwZoRpIGvEbnBxJHPgdqB5bHw8fxSB9ITch8iKwJDAk8yW3Jn4nRigQKNwpqSp5K0osHCzxLccuoC95 +MFUxMzISMvMz1TS5NaA2hzdxOFw5STo4Oyg8Gj4DPvs/9EDuQepD6ETpRexG8Uf3SP9LFEwhTTBOQE9S +UGZSklOrVMVV4Vb/WB5ZP1phW4Vcq13SXvthUmJ/Y69k4GYSZ0dofGm0au1tZG6ib+FxInJlc6l073Y2 +d396FXtjfLJ+A39VgKmB/4NWhK+GCYjCiiGLgYzjjkePrJESknuT5Ja8mCuZm5sMnH+d9J9qoOGiWqPV +pVGmz6eOqE6pzqtRrNSuWq/gsWmy8rR+tgu5Kbq6vE294b93wQ7Cp8RBxd3He8kZyrrLisxbzf/Po9FK +0vHUm9ZF1/HZn9tO3Cbc/96x4GTiGePQ5YjnQegf6Pzquex27jbv9/G583z0X/VC9wj40Pqa/GX+Mf// +AAAAAQADAAsAJQA3AE0AZQCBAJ8AwQELATUBYQGQAcEB9QIrAmQCnwLcAxwDXwOjA+oENAR/BM0FHQVw +BcQGGwZ0Bs8HLQeMB+4IUgi4CSAJign2CmQK1QtHC7wMMgyrDSYNog4hDqEPJA+pEC8QuBFDEl0S7hOA +FBUUqxVDFnkXFxe2GFgY/BpIGvEbnBxJHPgdqB8PH8UgfSE3IfIjbyQwJPMltydGKBAo3Cp5K0osHC3H +LqAveTEzMhIy8zS5NaA2hzhcOUk6ODwaPQ4+Az/0QO5C6EPoROlG8Uf3SglLFEwhTkBPUlF7UpJUxVXh +Vv9ZP1phXKtd0mAlYVJjr2TgZhJofGm0au1tZG6ib+FxInJldO92Nnd/eMl6FXyyfgN/VYCpgf+Er4YJ +h2WIwoohi4GOR4+skRKSe5PklVCWvJgrmZubDJx/nfSfaqDholqj1aVRps+oTqnOq1Gs1K2Xrlqv4LFp +svK0frYLt5m5Kbnxurq8Tb3hv3fBDsHawqfEQcUPxd3He8hKyRnKusuKzFvN/87Rz6PQdtFK0vHTxtSb +1kXXG9fx2MjZn9tO3Cbc/93Y3rHfiuBk4hni9ePQ5KzliOZk50HoH+j86drqueuX7HbtVu427xbv9/DX +8bnymvN89F/1QvYl9wj37PjQ+bX6mvt//GX9S/4x//8AAGRlc2MAAAAAAAAACkNvbG9yIExDRAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABIAAAAcAEMAbwBsAG8AcgAgAEwAQwBE +AABtbW9kAAAAAAAABhAAAJxOAAAAAL5zkQAAAAAAAAAAAAAAAAAAAAAAdGV4dAAAAABDb3B5cmlnaHQg +QXBwbGUgQ29tcHV0ZXIsIEluYy4sIDIwMDUAAAAAA + + + + + + + + 400 + 75 + + + 67239424 + 0 + Sub BG0 + + + 7 + 1211912703 + 0 + + 400 + 75 + + + 67239424 + 0 + Main BG1 + + + 2 + 1211912703 + 0 + + 400 + 75 + + + 67239424 + 0 + Sub BG1 + + + 8 + 1211912703 + 0 + + 400 + 75 + + + 67239424 + 0 + Main BG2 + + + 3 + 1211912703 + 0 + + 400 + 75 + + + 67239424 + 0 + Sub BG2 + + + 9 + 1211912703 + 0 + + 400 + 75 + + + 67239424 + 0 + Main BG3 + + + 4 + 1211912703 + 0 + + 400 + 75 + + + 67239424 + 0 + Sub BG3 + + + 10 + 1211912703 + 0 + + 400 + 75 + + + 67239424 + 0 + Main OBJ + + + 5 + 1211912703 + 0 + + 400 + 75 + + + 67239424 + 0 + Sub OBJ + + + 11 + 1211912703 + 0 + + 400 + 75 + + + {220, 22} + {4, 2} + 1151868928 + NSActionCell + + 67239424 + 0 + Radio + + 1211912703 + 0 + + 549453824 + {18, 18} + + YES + + YES + + + + TU0AKgAABRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAADAAAAAwAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAADwRERGLJycnySsrK/A1NTXw +IyMjyRwcHIsJCQk8AAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFRUVdVBQUOCoqKj/ +29vb//n5+f/6+vr/2tra/6qqqv9UVFTgHx8fdQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUZGRl5 +dXV198PDw//8/Pz////////////////////////////U1NT/fHx89yUlJXkAAAAFAAAAAAAAAAAAAAAA +AAAAAxEREUZqamrmtbW1/+3t7f/+/v7//v7+//7+/v/9/f3//f39//39/f/39/f/xMTE/3d3d+YZGRlG +AAAAAwAAAAAAAAAAAAAACkJCQqGtra3/xsbG/+vr6//y8vL/9fX1//X19f/z8/P/9fX1//Ly8v/u7u7/ +0tLS/6+vr/9KSkqhAAAACgAAAAAAAAAAAAAAF3h4eN2/v7//z8/P/93d3f/q6ur/7+/v/+/v7//w8PD/ +7e3t/+3t7f/i4uL/zs7O/8XFxf98fHzdAAAAFwAAAAAAAAADAAAAJKSkpPjOzs7/2dnZ/+Dg4P/i4uL/ +5eXl/+bm5v/n5+f/5eXl/+Li4v/e3t7/2tra/9DQ0P+srKz4AAAAJAAAAAMAAAADAAAALrCwsPrW1tb/ +3t7e/+Tk5P/p6en/6+vr/+zs7P/p6en/6+vr/+fn5//k5OT/4ODg/9nZ2f+zs7P6AAAALgAAAAMAAAAD +AAAALp2dnezg4OD/5eXl/+rq6v/u7u7/8PDw//Dw8P/x8fH/8PDw/+7u7v/q6ur/5ubm/+Hh4f+ZmZns +AAAALgAAAAMAAAADAAAAJG5ubs/l5eX/6enp/+/v7//y8vL/9vb2//r6+v/5+fn/9/f3//b29v/x8fH/ +6+vr/+Tk5P9ra2vPAAAAJAAAAAMAAAAAAAAAFy4uLpPCwsL67Ozs//Pz8//5+fn//v7+//7+/v/+/v7/ +/v7+//v7+//19fX/8PDw/8LCwvosLCyTAAAAFwAAAAAAAAAAAAAACgAAAENfX1/S5OTk/vn5+f/+/v7/ +///////////////////////////8/Pz/5ubm/l9fX9IAAABDAAAACgAAAAAAAAAAAAAAAwAAABcAAABl +YmJi3NLS0v3////////////////////////////////V1dX9ZGRk3AAAAGUAAAAXAAAAAwAAAAAAAAAA +AAAAAAAAAAUAAAAfAAAAZTMzM8KAgIDwv7+//O3t7f/t7e3/v7+//ICAgPAzMzPCAAAAZQAAAB8AAAAF +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAFwAAAEMAAAB3AAAAnwAAALMAAACzAAAAnwAAAHcAAABD +AAAAFwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAoAAAAXAAAAJAAAAC4AAAAu +AAAAJAAAABcAAAAKAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAwAAAAMAAAADAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQEAAAMAAAABABIAAAEB +AAMAAAABABIAAAECAAMAAAAEAAAFugEDAAMAAAABAAEAAAEGAAMAAAABAAIAAAERAAQAAAABAAAACAES +AAMAAAABAAEAAAEVAAMAAAABAAQAAAEWAAMAAAABABIAAAEXAAQAAAABAAAFEAEcAAMAAAABAAEAAAFS +AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA + + + + + + + + 400 + 75 + + + + + + + + {{1, 1}, {480, 166}} + + + + + {{17, 56}, {482, 182}} + + + {0, 0} + + 67239424 + 0 + GPU Layers + + + + 3 + MCAwLjgwMDAwMDAxMTkAA + + + + 1 + 0 + 2 + NO + + + + 268 + {{406, 12}, {96, 32}} + + + 1 + YES + + 67239424 + 134217728 + OK + + + -2038284033 + 129 + + DQ + 200 + 25 + + + + + 268 + {{310, 12}, {96, 32}} + + + YES + + 67239424 + 134217728 + Cancel + + + -2038284033 + 129 + + Gw + 200 + 25 + + + + + 268 + {{17, 246}, {482, 17}} + + + YES + + 70385217 + 272634880 + + + Device Info Summary + + + + + + + {516, 283} + + + + {{0, 0}, {1920, 1178}} + {1.79769e+308, 1.79769e+308} + 1 2 @@ -9522,7 +8981,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {1.79769e+308, 1.79769e+308} - + 256 YES @@ -9531,6 +8990,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{119, 300}, {166, 22}} + YES -1804468671 @@ -9549,6 +9009,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{119, 246}, {166, 44}} + YES -1805517311 @@ -9567,6 +9028,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 302}, {71, 17}} + YES 68288064 @@ -9583,6 +9045,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 270}, {63, 17}} + YES 68288064 @@ -9599,6 +9062,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 220}, {97, 17}} + YES 68288064 @@ -9615,6 +9079,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 178}, {60, 17}} + YES 68288064 @@ -9631,6 +9096,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 150}, {69, 17}} + YES 68288064 @@ -9647,6 +9113,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{119, 176}, {169, 27}} + YES 71433728 @@ -9667,6 +9134,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{116, 144}, {172, 26}} + YES -2076049856 @@ -9766,6 +9234,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{116, 214}, {172, 26}} + YES -2076049856 @@ -10038,6 +9507,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 55}, {271, 85}} + YES 67239424 @@ -10054,6 +9524,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{104, 12}, {96, 32}} + YES 67239424 @@ -10071,6 +9542,8 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {305, 339} + + {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} @@ -10086,7 +9559,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {1.79769e+308, 1.79769e+308} {700, 250} - + 256 YES @@ -10095,16 +9568,13 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 310}, {666, 34}} + YES 67239424 272629760 You have files that were created from a previous version of DeSmuME. Would you like to migrate them to work with this version? - - LucidaGrande-Bold - 13 - 16 - + @@ -10115,6 +9585,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 292 {{362, 12}, {162, 32}} + 2 YES @@ -10136,6 +9607,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 292 {{200, 12}, {162, 32}} + YES 67239424 @@ -10156,6 +9628,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 274}, {666, 28}} + YES 67239424 @@ -10176,6 +9649,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 292 {{18, 21}, {182, 18}} + YES 67239424 @@ -10185,7 +9659,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -10198,6 +9672,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 292 {{524, 12}, {162, 32}} + 1 YES @@ -10229,12 +9704,14 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 256 {700, 195} + YES 256 {700, 17} + @@ -10242,6 +9719,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{544, 0}, {16, 17}} + YES @@ -10265,7 +9743,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1215582719 2 - + @@ -10397,6 +9875,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 17}, {700, 195}} + @@ -10407,6 +9886,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{544, 17}, {15, 180}} + _doScroller: 0.92307692307692313 @@ -10416,6 +9896,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{1, 197}, {598, 15}} + 1 _doScroller: @@ -10430,6 +9911,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 0}, {700, 17}} + @@ -10439,6 +9921,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{-1, 53}, {702, 213}} + 562 @@ -10450,6 +9933,8 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {700, 364} + + {{0, 0}, {1920, 1178}} {700, 272} @@ -10465,7 +9950,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {1.79769e+308, 1.79769e+308} - + 256 YES @@ -10474,6 +9959,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 112}, {346, 68}} + YES 67239424 @@ -10490,6 +9976,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{270, 12}, {96, 32}} + 1 YES @@ -10511,6 +9998,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{144, 12}, {126, 32}} + YES 67239424 @@ -10531,6 +10019,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 48}, {346, 56}} + YES 67239424 @@ -10544,6 +10033,8 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {380, 200} + + {{0, 0}, {1440, 878}} {1.79769e+308, 1.79769e+308} @@ -10672,7 +10163,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {1.79769e+308, 1.79769e+308} - + 256 YES @@ -10691,14 +10182,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 256 {270, 321} - YES 256 {270, 17} - @@ -10706,7 +10195,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{256, 0}, {16, 17}} - YES @@ -10733,7 +10221,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1215582719 2 - + @@ -10816,7 +10304,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 17}, {270, 321}} - @@ -10827,7 +10314,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{256, 17}, {15, 306}} - _doScroller: 0.99689440993788825 @@ -10837,7 +10323,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{1, 323}, {270, 15}} - 1 _doScroller: @@ -10852,7 +10337,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 0}, {270, 17}} - @@ -10862,7 +10346,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{20, 49}, {272, 339}} - 562 @@ -10877,7 +10360,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{113, 12}, {185, 32}} - YES 67239424 @@ -10898,7 +10380,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{47, 19}, {28, 23}} - YES -2080244224 @@ -10908,7 +10389,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2033434369 162 - + + NSImage + NSRemoveTemplate + 400 @@ -10920,7 +10404,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{20, 19}, {28, 23}} - YES -2080244224 @@ -10930,7 +10413,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2033434369 162 - + + NSImage + NSAddTemplate + 400 @@ -10952,7 +10438,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{100, 372}, {209, 26}} - YES -2076049856 @@ -11017,7 +10502,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 301 {{2, 33}, {320, 290}} - NSView @@ -11025,7 +10509,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 402}, {129, 18}} - YES 67239424 @@ -11035,7 +10518,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -11048,7 +10531,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{15, 378}, {83, 17}} - YES 68288064 @@ -11069,7 +10551,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 12 {{14, 320}, {292, 5}} - {0, 0} 67239424 @@ -11092,7 +10573,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{103, 331}, {203, 39}} - YES -1805517311 @@ -11110,7 +10590,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{15, 353}, {83, 17}} - YES 68288064 @@ -11127,7 +10606,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{114, 6}, {96, 32}} - YES 67239424 @@ -11146,12 +10624,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {324, 428}} - {{297, 16}, {326, 444}} - {0, 0} 67239424 @@ -11175,7 +10651,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{89, 446}, {70, 14}} - YES 68288064 @@ -11196,7 +10671,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{89, 421}, {69, 14}} - YES 68288064 @@ -11213,7 +10687,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{160, 421}, {135, 14}} - YES 70385217 @@ -11231,7 +10704,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{161, 446}, {134, 14}} - YES 70385217 @@ -11249,7 +10721,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{90, 394}, {190, 18}} - YES -2080244224 @@ -11259,7 +10730,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -11284,7 +10755,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{20, 396}, {64, 64}} - YES 130560 @@ -11299,8 +10769,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {640, 480} - - {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} @@ -11784,7 +11252,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1215582719 2 - + @@ -12534,7 +12002,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NaN - + @@ -13104,7 +12572,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {1.79769e+308, 1.79769e+308} - + 256 YES @@ -13123,7 +12591,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 32}, {171, 18}} - 1 YES @@ -13134,7 +12601,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -13147,7 +12614,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 12}, {187, 18}} - 10 YES @@ -13158,7 +12624,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -13169,12 +12635,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {244, 58}} - {{17, 404}, {246, 74}} - {0, 0} 67239424 @@ -13208,7 +12672,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{16, 52}, {158, 18}} - 2 YES @@ -13219,7 +12682,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -13232,7 +12695,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{35, 32}, {120, 18}} - 3 YES @@ -13243,7 +12705,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -13256,7 +12718,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{35, 12}, {132, 18}} - 4 YES @@ -13267,7 +12728,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -13278,12 +12739,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {244, 78}} - {{17, 224}, {246, 94}} - {0, 0} 67239424 @@ -13317,7 +12776,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{15, 32}, {177, 18}} - 5 YES @@ -13328,7 +12786,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -13341,7 +12799,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{15, 12}, {130, 18}} - 6 YES @@ -13352,7 +12809,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -13365,7 +12822,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 265 {{176, 54}, {27, 27}} - YES -2080244224 @@ -13387,7 +12843,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{15, 61}, {157, 14}} - YES 68288064 @@ -13402,12 +12857,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {244, 85}} - {{17, 119}, {246, 101}} - {0, 0} 67239424 @@ -13431,13 +12884,16 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{63, 18}, {154, 19}} - YES -2080244224 134217728 Save Settings as Default - + + LucidaGrande + 12 + 16 + -2038152961 164 @@ -13462,7 +12918,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{15, 32}, {127, 18}} - 9 YES @@ -13473,7 +12928,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -13486,7 +12941,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{15, 12}, {103, 18}} - YES 67239424 @@ -13496,7 +12950,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -13507,12 +12961,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {244, 58}} - {{17, 41}, {246, 74}} - {0, 0} 67239424 @@ -13546,7 +12998,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{18, 14}, {145, 38}} - YES 2 1 @@ -13737,12 +13188,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {244, 62}} - {{17, 322}, {246, 78}} - {0, 0} 67239424 @@ -13763,8 +13212,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {280, 498} - - {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} @@ -14313,7 +13760,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -14336,7 +13783,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -14359,7 +13806,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -14382,7 +13829,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -14405,7 +13852,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -14428,7 +13875,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -14451,7 +13898,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -14495,7 +13942,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -14544,7 +13991,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {1.79769e+308, 1.79769e+308} - + 256 YES @@ -14553,7 +14000,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{20, 18}, {164, 19}} - YES -2080244224 @@ -14584,7 +14030,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{18, 14}, {129, 378}} - YES 19 1 @@ -15082,12 +14527,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {168, 402}} - {{17, 41}, {170, 418}} - {0, 0} 67239424 @@ -15111,7 +14554,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 485}, {169, 18}} - YES -2080244224 @@ -15121,7 +14563,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -15134,7 +14576,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 465}, {135, 18}} - YES 67239424 @@ -15144,7 +14585,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -15154,8 +14595,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {204, 521} - - {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} @@ -15198,7 +14637,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -15220,7 +14659,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -15242,7 +14681,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -15308,7 +14747,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NaN - + @@ -15957,7 +15396,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -15979,7 +15418,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -16036,7 +15475,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -16788,7 +16227,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -16908,7 +16347,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NaN - + @@ -18258,14 +17697,14 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 279 2 - {{1360, 92}, {467, 135}} + {{1360, 99}, {467, 128}} -461897728 Set Speed Limit NSPanel {1.79769e+308, 1.79769e+308} - + 256 YES @@ -18274,6 +17713,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{30, 43}, {411, 26}} + YES -2079981824 @@ -18284,7 +17724,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 0.0 1 0.0 - 6 + 11 1 NO NO @@ -18293,8 +17733,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 - {{17, 77}, {38, 17}} + {{20, 70}, {38, 17}} + YES 68288064 @@ -18309,8 +17750,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 - {{412, 77}, {38, 17}} + {{412, 70}, {38, 17}} + YES 68288064 @@ -18325,8 +17767,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 - {{97, 77}, {38, 17}} + {{98, 70}, {38, 17}} + YES 68288064 @@ -18341,8 +17784,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 - {{176, 77}, {38, 17}} + {{177, 70}, {38, 17}} + YES 68288064 @@ -18357,8 +17801,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 - {{254, 77}, {38, 17}} + {{255, 70}, {38, 17}} + YES 68288064 @@ -18373,8 +17818,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 - {{335, 77}, {38, 17}} + {{335, 70}, {38, 17}} + YES 68288064 @@ -18391,6 +17837,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{32, 18}, {133, 19}} + 100 YES @@ -18412,6 +17859,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{260, 21}, {123, 17}} + YES 68288064 @@ -18428,6 +17876,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{385, 21}, {57, 17}} + YES 68288064 @@ -18481,7 +17930,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NaN - + @@ -18506,8 +17955,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 - {{158, 100}, {154, 18}} + {{158, 93}, {154, 18}} + YES -2080244224 @@ -18517,7 +17967,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1211912703 2 - + @@ -18526,7 +17976,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - {467, 135} + {467, 128} + + {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} @@ -18691,7 +18143,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NaN - + @@ -18876,16 +18328,18 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {580, 592} {580, 592} - + 256 {580, 592} + + {{0, 0}, {1920, 1178}} {580, 614} {580, 614} - + 268 YES @@ -18927,6 +18381,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{0, 69}, {523, 133}} + @@ -18990,6 +18445,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {523, 202}} + @@ -19001,6 +18457,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 256 {{524, 1}, {15, 202}} + _doScroller: 0.99248120300751874 @@ -19010,6 +18467,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{-100, -100}, {87, 18}} + 1 _doScroller: @@ -19019,6 +18477,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{20, 61}, {540, 204}} + 18 @@ -19030,6 +18489,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 265 {{397, 342}, {166, 28}} + YES 69336577 @@ -19058,6 +18518,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{365, 340}, {30, 30}} + YES 130560 @@ -19075,6 +18536,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 288 {{125, 16}, {438, 28}} + YES 67239424 @@ -19091,6 +18553,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 34 {{12, 50}, {556, 5}} + {0, 0} 67239424 @@ -19113,6 +18576,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 269 {{17, 273}, {546, 28}} + YES 67239424 @@ -19129,6 +18593,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 269 {{17, 309}, {546, 17}} + YES 68288064 @@ -19145,6 +18610,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 10 {{12, 332}, {556, 5}} + {0, 0} 67239424 @@ -19167,6 +18633,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 269 {{17, 489}, {546, 42}} + YES 67239424 @@ -19183,6 +18650,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 269 {{17, 539}, {546, 17}} + YES 68288064 @@ -19199,6 +18667,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 10 {{12, 478}, {556, 5}} + {0, 0} 67239424 @@ -19221,6 +18690,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 269 {{17, 455}, {546, 17}} + YES 68288064 @@ -19237,6 +18707,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 269 {{17, 405}, {546, 42}} + YES 67239424 @@ -19253,6 +18724,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 347}, {77, 17}} + YES 68288064 @@ -19269,6 +18741,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 377}, {78, 17}} + YES 68288064 @@ -19285,6 +18758,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 266 {{100, 345}, {256, 22}} + YES -1804468671 @@ -19302,6 +18776,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 266 {{100, 375}, {256, 22}} + YES -1804468671 @@ -19319,6 +18794,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 265 {{358, 370}, {209, 32}} + YES 67239424 @@ -19339,6 +18815,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 288 {{14, 12}, {112, 32}} + YES 67239424 @@ -19356,10 +18833,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {580, 567} + + NSView - + 268 YES @@ -19401,6 +18880,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{0, 18}, {524, 62}} + @@ -19464,6 +18944,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {524, 80}} + @@ -19475,6 +18956,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 256 {{525, 1}, {15, 80}} + _doScroller: 0.99248120300751874 @@ -19484,6 +18966,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{-100, -100}, {87, 18}} + 1 _doScroller: @@ -19493,6 +18976,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{20, 61}, {541, 82}} + 18 @@ -19537,6 +19021,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{0, 6}, {523, 65}} + @@ -19600,6 +19085,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {523, 80}} + @@ -19611,6 +19097,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 256 {{524, 1}, {15, 80}} + _doScroller: 0.99248120300751874 @@ -19620,6 +19107,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{-100, -100}, {87, 18}} + 1 _doScroller: @@ -19629,6 +19117,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{20, 167}, {540, 82}} + 18 @@ -19640,6 +19129,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 265 {{397, 342}, {166, 28}} + YES 69336577 @@ -19668,6 +19158,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{365, 340}, {30, 30}} + YES 130560 @@ -19685,6 +19176,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 288 {{125, 16}, {438, 28}} + YES 67239424 @@ -19701,6 +19193,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 34 {{12, 50}, {556, 5}} + {0, 0} 67239424 @@ -19723,6 +19216,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 256 {{17, 145}, {206, 14}} + YES 68288064 @@ -19739,6 +19233,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 256 {{17, 251}, {206, 14}} + YES 68288064 @@ -19755,6 +19250,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 269 {{17, 273}, {546, 28}} + YES 67239424 @@ -19771,6 +19267,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 269 {{17, 309}, {546, 17}} + YES 68288064 @@ -19787,6 +19284,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 10 {{12, 332}, {556, 5}} + {0, 0} 67239424 @@ -19809,6 +19307,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 269 {{17, 489}, {546, 42}} + YES 67239424 @@ -19825,6 +19324,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 269 {{17, 539}, {546, 17}} + YES 68288064 @@ -19841,6 +19341,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 10 {{12, 478}, {556, 5}} + {0, 0} 67239424 @@ -19863,6 +19364,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 269 {{17, 455}, {546, 17}} + YES 68288064 @@ -19879,6 +19381,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 269 {{17, 405}, {546, 42}} + YES 67239424 @@ -19895,6 +19398,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 347}, {77, 17}} + YES 68288064 @@ -19911,6 +19415,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 377}, {78, 17}} + YES 68288064 @@ -19927,6 +19432,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 266 {{100, 345}, {255, 22}} + YES -1804468671 @@ -19944,6 +19450,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 266 {{100, 375}, {255, 22}} + YES -1804468671 @@ -19961,6 +19468,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 265 {{358, 370}, {209, 32}} + YES 67239424 @@ -19981,6 +19489,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 288 {{14, 12}, {112, 32}} + YES 67239424 @@ -19998,10 +19507,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {580, 567} + + NSView - + 268 YES @@ -20010,6 +19521,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{342, 55}, {224, 32}} + YES 67239424 @@ -20030,6 +19542,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{17, 52}, {326, 42}} + YES 67239424 @@ -20046,6 +19559,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{342, 12}, {224, 32}} + YES 67239424 @@ -20066,6 +19580,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 268 {{14, 12}, {112, 32}} + YES 67239424 @@ -20096,6 +19611,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 2322 {{0, 157}, {523, 14}} + @@ -20159,6 +19675,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{1, 1}, {523, 443}} + @@ -20170,6 +19687,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 256 {{524, 1}, {15, 443}} + _doScroller: 1 @@ -20180,6 +19698,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA -2147483392 {{-100, -100}, {87, 18}} + 1 _doScroller: @@ -20189,6 +19708,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{20, 102}, {540, 445}} + 18 @@ -20197,6 +19717,8 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {580, 567} + + NSView @@ -20421,22 +19943,29 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA YES - + YES - deviceName - elementName - useDeviceCoordinates - pointX - pointY + intValue0 + intValue1 + intValue2 + intValue3 + floatValue0 + floatValue1 + floatValue2 + floatValue3 + object0 + object1 + object2 + object3 + useInputForIntCoord + useInputForFloatCoord + useInputForScalar + useInputForSender + deviceInfoSummary YES - YES - YES - YES - YES - YES @@ -20673,14 +20202,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1691 - - - viewInput - - - - 1692 - mLoadStateSlot @@ -20769,126 +20290,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 2025 - - - inputButtonSet: - - - - 2039 - - - - inputButtonSet: - - - - 2040 - - - - inputButtonSet: - - - - 2041 - - - - inputButtonSet: - - - - 2042 - - - - inputButtonSet: - - - - 2043 - - - - inputButtonSet: - - - - 2044 - - - - inputButtonSet: - - - - 2045 - - - - inputButtonSet: - - - - 2046 - - - - inputButtonSet: - - - - 2047 - - - - inputButtonSet: - - - - 2048 - - - - inputButtonSet: - - - - 2049 - - - - inputButtonSet: - - - - 2050 - - - - inputButtonSet: - - - - 2051 - - - - inputButtonSet: - - - - 2052 - - - - inputPrefsView - - - - 2087 - prefGeneralView @@ -20905,14 +20306,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 2094 - - - prefWindow - - - - 2196 - viewSound @@ -21073,38 +20466,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 2381 - - - selectSoundInputMode: - - - - 2422 - - - - selectSoundInputMode: - - - - 2423 - - - - selectSoundInputMode: - - - - 2424 - - - - selectSoundInputMode: - - - - 2425 - selectSPUSyncMode: @@ -21632,230 +20993,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 3532 - - - value: selection.Input_Up - - - - - - value: selection.Input_Up - value - selection.Input_Up - 2 - - - 3536 - - - - value: selection.Input_Down - - - - - - value: selection.Input_Down - value - selection.Input_Down - 2 - - - 3537 - - - - value: selection.Input_Left - - - - - - value: selection.Input_Left - value - selection.Input_Left - 2 - - - 3538 - - - - value: selection.Input_Right - - - - - - value: selection.Input_Right - value - selection.Input_Right - 2 - - - 3539 - - - - value: selection.Input_A - - - - - - value: selection.Input_A - value - selection.Input_A - 2 - - - 3540 - - - - value: selection.Input_B - - - - - - value: selection.Input_B - value - selection.Input_B - 2 - - - 3541 - - - - value: selection.Input_X - - - - - - value: selection.Input_X - value - selection.Input_X - 2 - - - 3542 - - - - value: selection.Input_Y - - - - - - value: selection.Input_Y - value - selection.Input_Y - 2 - - - 3543 - - - - value: selection.Input_L - - - - - - value: selection.Input_L - value - selection.Input_L - 2 - - - 3545 - - - - value: selection.Input_R - - - - - - value: selection.Input_R - value - selection.Input_R - 2 - - - 3546 - - - - value: selection.Input_Start - - - - - - value: selection.Input_Start - value - selection.Input_Start - 2 - - - 3547 - - - - value: selection.Input_Select - - - - - - value: selection.Input_Select - value - selection.Input_Select - 2 - - - 3548 - - - - value: selection.Input_Lid - - - - - - value: selection.Input_Lid - value - selection.Input_Lid - 2 - - - 3549 - - - - value: selection.Input_Microphone - - - - - - value: selection.Input_Microphone - value - selection.Input_Microphone - 2 - - - 3550 - value: selection.AutoloadRomName @@ -22912,30 +22049,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 5183 - - - value: selection.Input_Debug - - - - - - value: selection.Input_Debug - value - selection.Input_Debug - 2 - - - 5317 - - - - inputButtonSet: - - - - 5318 - value: selection.nickname @@ -24437,646 +23550,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 5737 - - - value: selection.Input_Start - - - - - - value: selection.Input_Start - value - selection.Input_Start - 2 - - - 5878 - - - - value: selection.Input_B - - - - - - value: selection.Input_B - value - selection.Input_B - 2 - - - 5880 - - - - value: selection.Input_Debug - - - - - - value: selection.Input_Debug - value - selection.Input_Debug - 2 - - - 5881 - - - - value: selection.Input_Pause - - - - - - value: selection.Input_Pause - value - selection.Input_Pause - 2 - - - 5882 - - - - value: selection.Input_Up - - - - - - value: selection.Input_Up - value - selection.Input_Up - 2 - - - 5883 - - - - value: selection.Input_HUD - - - - - - value: selection.Input_HUD - value - selection.Input_HUD - 2 - - - 5884 - - - - value: selection.Input_A - - - - - - value: selection.Input_A - value - selection.Input_A - 2 - - - 5885 - - - - value: selection.Input_SpeedDouble - - - - - - value: selection.Input_SpeedDouble - value - selection.Input_SpeedDouble - 2 - - - 5886 - - - - value: selection.Input_Select - - - - - - value: selection.Input_Select - value - selection.Input_Select - 2 - - - 5887 - - - - enabled: arrangedObjects.pointY - - - - - - enabled: arrangedObjects.pointY - enabled - arrangedObjects.pointY - 2 - - - 5888 - - - - value: selection.Input_Microphone - - - - - - value: selection.Input_Microphone - value - selection.Input_Microphone - 2 - - - 5889 - - - - value: selection.Input_Y - - - - - - value: selection.Input_Y - value - selection.Input_Y - 2 - - - 5890 - - - - enabled: arrangedObjects.elementName - - - - - - enabled: arrangedObjects.elementName - enabled - arrangedObjects.elementName - 2 - - - 5891 - - - - value: selection.Input_Execute - - - - - - value: selection.Input_Execute - value - selection.Input_Execute - 2 - - - 5892 - - - - value: selection.Input_Lid - - - - - - value: selection.Input_Lid - value - selection.Input_Lid - 2 - - - 5893 - - - - enabled: arrangedObjects.deviceName - - - - - - enabled: arrangedObjects.deviceName - enabled - arrangedObjects.deviceName - 2 - - - 5894 - - - - value: selection.Input_X - - - - - - value: selection.Input_X - value - selection.Input_X - 2 - - - 5895 - - - - value: selection.Input_Reset - - - - - - value: selection.Input_Reset - value - selection.Input_Reset - 2 - - - 5896 - - - - value: selection.Input_R - - - - - - value: selection.Input_R - value - selection.Input_R - 2 - - - 5897 - - - - enabled: arrangedObjects.useDeviceCoordinates - - - - - - enabled: arrangedObjects.useDeviceCoordinates - enabled - arrangedObjects.useDeviceCoordinates - 2 - - - 5898 - - - - value: selection.Input_SpeedHalf - - - - - - value: selection.Input_SpeedHalf - value - selection.Input_SpeedHalf - 2 - - - 5899 - - - - value: selection.Input_L - - - - - - value: selection.Input_L - value - selection.Input_L - 2 - - - 5900 - - - - value: selection.Input_Left - - - - - - value: selection.Input_Left - value - selection.Input_Left - 2 - - - 5901 - - - - enabled: arrangedObjects.pointX - - - - - - enabled: arrangedObjects.pointX - enabled - arrangedObjects.pointX - 2 - - - 5902 - - - - value: selection.Input_Down - - - - - - value: selection.Input_Down - value - selection.Input_Down - 2 - - - 5903 - - - - value: selection.Input_Right - - - - - - value: selection.Input_Right - value - selection.Input_Right - 2 - - - 5904 - - - - selectSoundInputMode: - - - - 5905 - - - - inputButtonSet: - - - - 5906 - - - - inputButtonSet: - - - - 5907 - - - - inputButtonSet: - - - - 5908 - - - - inputButtonSet: - - - - 5909 - - - - inputButtonSet: - - - - 5910 - - - - inputButtonSet: - - - - 5911 - - - - inputButtonSet: - - - - 5912 - - - - inputButtonSet: - - - - 5913 - - - - inputButtonSet: - - - - 5914 - - - - inputButtonSet: - - - - 5915 - - - - add: - - - - 5916 - - - - inputButtonSet: - - - - 5917 - - - - selectSoundInputMode: - - - - 5918 - - - - selectSoundInputMode: - - - - 5919 - - - - inputButtonSet: - - - - 5920 - - - - inputButtonSet: - - - - 5921 - - - - inputButtonSet: - - - - 5922 - - - - inputButtonSet: - - - - 5923 - - - - remove: - - - - 5924 - - - - inputButtonSet: - - - - 5925 - - - - inputButtonSet: - - - - 5926 - - - - inputButtonSet: - - - - 5927 - - - - inputButtonSet: - - - - 5928 - - - - inputButtonSet: - - - - 5929 - - - - inputButtonSet: - - - - 5930 - - - - inputButtonSet: - - - - 5931 - - - - selectSoundInputMode: - - - - 5932 - value: selection.isSpeedLimitEnabled @@ -26215,38 +24688,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 6105 - - - selectedTag: values.Input_AudioInputMode - - - - - - selectedTag: values.Input_AudioInputMode - selectedTag - values.Input_AudioInputMode - 2 - - - 6107 - - - - selectedTag: values.Input_AudioInputMode - - - - - - selectedTag: values.Input_AudioInputMode - selectedTag - values.Input_AudioInputMode - 2 - - - 6108 - selectedTag: values.Render3D_RenderingEngine @@ -29300,7 +27741,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA emuControl - + 7003 @@ -29309,7 +27750,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA inputManager - + 7004 @@ -29317,18 +27758,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA inputManager - + 7005 - - - inputManager - - - - 7006 - toggleExecutePause: @@ -29369,6 +27802,576 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 7013 + + + viewInput + + + + 7108 + + + + inputPrefsView + + + + 7109 + + + + inputManager + + + + 7110 + + + + prefWindow + + + + 7111 + + + + inputPrefsOutlineView + + + + 7157 + + + + dataSource + + + + 7164 + + + + delegate + + + + 7165 + + + + inputPrefOutlineView + + + + 7166 + + + + removeInput: + + + + 7167 + + + + setInputAdd: + + + + 7170 + + + + inputSettingsGPUState + + + + 7296 + + + + inputSettingsLoadStateSlot + + + + 7297 + + + + inputSettingsMicrophone + + + + 7298 + + + + inputSettingsSaveStateSlot + + + + 7299 + + + + inputSettingsTouch + + + + 7300 + + + + showSettingsSheet: + + + + 7321 + + + + closeSettingsSheet: + + + + 7322 + + + + closeSettingsSheet: + + + + 7323 + + + + closeSettingsSheet: + + + + 7324 + + + + closeSettingsSheet: + + + + 7325 + + + + closeSettingsSheet: + + + + 7326 + + + + inputSettingsController + + + + 7391 + + + + closeSettingsSheet: + + + + 7394 + + + + closeSettingsSheet: + + + + 7397 + + + + closeSettingsSheet: + + + + 7400 + + + + closeSettingsSheet: + + + + 7403 + + + + closeSettingsSheet: + + + + 7406 + + + + selectedTag: selection.intValue0 + + + + + + selectedTag: selection.intValue0 + selectedTag + selection.intValue0 + 2 + + + 7407 + + + + selectedTag: selection.intValue0 + + + + + + selectedTag: selection.intValue0 + selectedTag + selection.intValue0 + 2 + + + 7410 + + + + selectedTag: selection.intValue0 + + + + + + selectedTag: selection.intValue0 + selectedTag + selection.intValue0 + 2 + + + 7411 + + + + enabled: selection.useInputForIntCoord + + + + + + enabled: selection.useInputForIntCoord + enabled + selection.useInputForIntCoord + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 7417 + + + + enabled: selection.useInputForIntCoord + + + + + + enabled: selection.useInputForIntCoord + enabled + selection.useInputForIntCoord + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 7419 + + + + value: selection.useInputForIntCoord + + + + + + value: selection.useInputForIntCoord + value + selection.useInputForIntCoord + + NSValueTransformerName + NSNegateBoolean + + 2 + + + 7421 + + + + value: selection.intValue1 + + + + + + value: selection.intValue1 + value + selection.intValue1 + 2 + + + 7422 + + + + value: selection.intValue2 + + + + + + value: selection.intValue2 + value + selection.intValue2 + 2 + + + 7423 + + + + value: selection.deviceInfoSummary + + + + + + value: selection.deviceInfoSummary + value + selection.deviceInfoSummary + 2 + + + 7435 + + + + value: selection.deviceInfoSummary + + + + + + value: selection.deviceInfoSummary + value + selection.deviceInfoSummary + 2 + + + 7438 + + + + value: selection.deviceInfoSummary + + + + + + value: selection.deviceInfoSummary + value + selection.deviceInfoSummary + 2 + + + 7441 + + + + value: selection.deviceInfoSummary + + + + + + value: selection.deviceInfoSummary + value + selection.deviceInfoSummary + 2 + + + 7444 + + + + value: selection.deviceInfoSummary + + + + + + value: selection.deviceInfoSummary + value + selection.deviceInfoSummary + 2 + + + 7447 + + + + selectedTag: selection.intValue1 + + + + + + selectedTag: selection.intValue1 + selectedTag + selection.intValue1 + + NSConditionallySetsEnabled + + + 2 + + + 7448 + + + + value: selection.deviceInfoSummary + + + + + + value: selection.deviceInfoSummary + value + selection.deviceInfoSummary + 2 + + + 7453 + + + + value: selection.floatValue0 + + + + + + value: selection.floatValue0 + value + selection.floatValue0 + + YES + + YES + NSAllowsEditingMultipleValuesSelection + NSRaisesForNotApplicableKeys + NSValidatesImmediately + + + YES + + + + + + 2 + + + 7482 + + + + inputSettingsSetSpeedLimit + + + + 7484 + + + + closeSettingsSheet: + + + + 7490 + + + + closeSettingsSheet: + + + + 7491 + + + + changeSpeed: + + + + 7492 + + + + value: selection.floatValue0 + + + + + + value: selection.floatValue0 + value + selection.floatValue0 + + YES + + YES + NSAllowsEditingMultipleValuesSelection + NSConditionallySetsEnabled + NSContinuouslyUpdatesValue + NSRaisesForNotApplicableKeys + NSValidatesImmediately + + + YES + + + + + + + + 2 + + + 7495 + @@ -31044,302 +30047,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA General Preferences View - - 1301 - - - YES - - - - Input Preferences View - - - 1496 - - - YES - - - - - - - 1497 - - - YES - - - - - - 1500 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1501 - - - YES - - - - - - 1502 - - - YES - - - - - - - - - 1365 - - - YES - - - - - - 1366 - - - - - 1444 - - - YES - - - - - - 1445 - - - - - 1446 - - - YES - - - - - - 1447 - - - - - 1448 - - - YES - - - - - - 1449 - - - - - 1450 - - - YES - - - - - - 1451 - - - - - 1456 - - - YES - - - - - - 1457 - - - - - 1460 - - - YES - - - - - - 1461 - - - - - 1462 - - - YES - - - - - - 1463 - - - - - 1464 - - - YES - - - - - - 1465 - - - - - 1468 - - - YES - - - - - - 1469 - - - - - 1470 - - - YES - - - - - - 1471 - - - - - 1472 - - - YES - - - - - - 1473 - - - - - 1474 - - - YES - - - - - - 1475 - - - - - 1395 - - - YES - - - - - - 1396 - - - - - 1478 - - - YES - - - - - - 1479 - - - 1538 @@ -31434,160 +30141,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - - 1555 - - - YES - - - - - - 1556 - - - - - 1557 - - - YES - - - - - - 1558 - - - - - 1559 - - - YES - - - - - - 1560 - - - - - 1561 - - - YES - - - - - - 1562 - - - - - 1563 - - - YES - - - - - - 1564 - - - - - 1565 - - - YES - - - - - - 1566 - - - YES - - - - - - 1567 - - - YES - - - - - - 1568 - - - YES - - - - - - 1569 - - - YES - - - - - - 1570 - - - YES - - - - - - 1571 - - - - - 1572 - - - - - 1573 - - - - - 1574 - - - - - 1575 - - - - - 1576 - - - 1584 @@ -32103,184 +30656,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - - 2269 - - - YES - - - - - - - - - - 1397 - - - YES - - - - - - 1398 - - - - - 1399 - - - YES - - - - - - 1400 - - - - - 1401 - - - YES - - - - - - 1402 - - - - - 1409 - - - YES - - - - - - 1410 - - - - - 1403 - - - YES - - - - - - 1404 - - - YES - - - - - - 1405 - - - YES - - - - - - 1406 - - - - - 2286 - - - YES - - - - - - - - 2276 - - - YES - - - - - - - - - - 2283 - - - - - 2282 - - - - - 2278 - - - - - 2279 - - - - - 2277 - - - - - 2302 - - - YES - - - - - - 2303 - - - - - 2318 - - - YES - - - - - - 2319 - - - 2320 @@ -33002,34 +31377,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - - 1480 - - - YES - - - - - - 1481 - - - - - 1383 - - - YES - - - - - - 1386 - - - 2604 @@ -37173,40 +35520,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - - 5281 - - - Input Prefs Touch Array Controller - - - 5313 - - - YES - - - - - - 5314 - - - YES - - - - - - 5315 - - - - - 5316 - - - 24 @@ -37936,1070 +36249,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA About Window Controller - - 5738 - - - YES - - - - - - - - - 5739 - - - YES - - - - - - 5740 - - - YES - - - - - - 5741 - - - YES - - - - - - 5742 - - - YES - - - - - - 5743 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5744 - - - YES - - - - - - 5745 - - - YES - - - - - - 5746 - - - YES - - - - - - 5747 - - - YES - - - - - - 5748 - - - YES - - - - - - 5749 - - - YES - - - - - - 5750 - - - YES - - - - - - 5751 - - - YES - - - - - - 5752 - - - YES - - - - - - 5753 - - - YES - - - - - - 5754 - - - YES - - - - - - 5755 - - - YES - - - - - - 5756 - - - YES - - - - - - 5757 - - - YES - - - - - - 5758 - - - YES - - - - - - 5759 - - - YES - - - - - - 5760 - - - YES - - - - - - 5761 - - - YES - - - - - - 5762 - - - YES - - - - - - 5763 - - - YES - - - - - - 5764 - - - YES - - - - - - 5765 - - - YES - - - - - - 5766 - - - YES - - - - - - 5767 - - - YES - - - - - - 5768 - - - YES - - - - - - 5769 - - - YES - - - - - - 5770 - - - YES - - - - - - 5771 - - - YES - - - - - - 5772 - - - - - 5773 - - - - - 5774 - - - - - 5775 - - - - - 5776 - - - - - 5777 - - - - - 5778 - - - - - 5779 - - - - - 5780 - - - - - 5781 - - - - - 5782 - - - - - 5783 - - - - - 5784 - - - - - 5785 - - - - - 5786 - - - - - 5787 - - - - - 5788 - - - - - 5789 - - - - - 5790 - - - - - 5791 - - - - - 5792 - - - - - 5793 - - - - - 5794 - - - - - 5795 - - - - - 5796 - - - - - 5797 - - - - - 5798 - - - - - 5799 - - - - - 5800 - - - YES - - - - - - - - 5801 - - - YES - - - - - - - - - 5802 - - - YES - - - - - - 5803 - - - YES - - - - - - 5804 - - - - - 5805 - - - - - 5806 - - - - - 5807 - - - YES - - - - - - - - - - - 5808 - - - - - 5809 - - - - - 5810 - - - YES - - - - - - 5811 - - - YES - - - - - - 5812 - - - YES - - - - - - 5813 - - - YES - - - - - - 5814 - - - YES - - - - - - 5815 - - - YES - - - - - - 5816 - - - - - 5817 - - - - - 5818 - - - - - 5819 - - - YES - - - - - - 5820 - - - - - 5821 - - - YES - - - - - - 5822 - - - - - 5823 - - - - - 5824 - - - YES - - - - - - - - - 5825 - - - YES - - - - - - - - 5826 - - - YES - - - - - - - - - - 5827 - - - YES - - - - - - 5828 - - - YES - - - - - - 5829 - - - - - 5830 - - - - - 5831 - - - YES - - - - - - 5832 - - - YES - - - - - - 5833 - - - YES - - - - - - 5834 - - - YES - - - - - - 5835 - - - YES - - - - - - 5836 - - - - - 5837 - - - YES - - - - - - 5838 - - - YES - - - - - - 5839 - - - - - 5840 - - - - - 5841 - - - - - 5842 - - - - - 5843 - - - YES - - - - - - 5844 - - - YES - - - - - - 5845 - - - YES - - - - - - - - - - 5846 - - - - - 5847 - - - - - 5848 - - - - - 5849 - - - - - 5850 - - - - - 5851 - - - - - 5852 - - - - - 5853 - - - YES - - - - - - - - - - - - - - - - - 5854 - - - YES - - - - - - 5855 - - - YES - - - - - - 5856 - - - YES - - - - - - 5857 - - - YES - - - - - - 5858 - - - YES - - - - - - 5859 - - - YES - - - - - - 5860 - - - YES - - - - - - 5861 - - - YES - - - - - - 5862 - - - YES - - - - - - 5863 - - - YES - - - - - - 5864 - - - YES - - - - - - 5865 - - - YES - - - - - - 5866 - - - - - 5867 - - - - - 5868 - - - - - 5869 - - - - - 5870 - - - - - 5871 - - - - - 5872 - - - - - 5873 - - - - - 5874 - - - - - 5875 - - - - - 5876 - - - - - 5877 - - - 5933 @@ -40223,9 +37472,1278 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 7002 - + + + 7014 + + + YES + + + + + Input Preferences View + + + 7128 + + + YES + + + + + + + + + 7132 + + + + + 7131 + + + + + 7130 + + + YES + + + + + + + + + + 7129 + + + + + 7137 + + + YES + + + + + + 7136 + + + YES + + + + + + 7135 + + + YES + + + + + + 7134 + + + YES + + + + + + 7133 + + + YES + + + + + + 7142 + + + + + 7141 + + + + + 7140 + + + + + 7139 + + + + + 7138 + + + + + 7168 + + + YES + + + + + + 7169 + + + + + 7171 + + + YES + + + + + + 7172 + + + YES + + + + + + + + + + + 7173 + + + YES + + + + + + 7174 + + + YES + + + + + + + + + + 7175 + + + YES + + + + + + 7176 + + + YES + + + + + + + + + + 7179 + + + YES + + + + + + 7180 + + + YES + + + + + + + + + 7181 + + + YES + + + + + + + + + + 7182 + + + YES + + + + + + + + 7183 + + + YES + + + + + + 7184 + + + YES + + + + + + 7185 + + + YES + + + + + + + + + + 7186 + + + + + 7187 + + + + + 7188 + + + + + 7189 + + + + + 7190 + + + + + 7191 + + + + + 7192 + + + + + 7193 + + + YES + + + + + + 7194 + + + YES + + + + + + 7195 + + + YES + + + + + + 7196 + + + YES + + + + + + 7197 + + + YES + + + + + + 7198 + + + + + 7199 + + + YES + + + + + + 7200 + + + YES + + + + + + 7201 + + + + + 7202 + + + + + 7203 + + + + + 7204 + + + + + 7210 + + + YES + + + + + + 7211 + + + YES + + + + + + 7212 + + + YES + + + + + + + + + + + + + + + 7213 + + + + + 7214 + + + + + 7215 + + + + + 7216 + + + YES + + + + + + 7217 + + + + + 7218 + + + + + 7219 + + + + + 7220 + + + + + 7221 + + + + + 7222 + + + + + 7223 + + + + + 7224 + + + + + 7225 + + + YES + + + + + + 7226 + + + YES + + + + + + + + + + 7227 + + + YES + + + + + + 7228 + + + YES + + + + + + 7229 + + + YES + + + + + + 7230 + + + YES + + + + + + + + + + + + + + + 7231 + + + + + 7232 + + + + + 7233 + + + + + 7234 + + + + + 7235 + + + + + 7236 + + + + + 7237 + + + + + 7238 + + + + + 7239 + + + + + 7240 + + + + + 7241 + + + + + 7266 + + + YES + + + + + + 7267 + + + YES + + + + + + + + + + + + + + + + + + 7268 + + + + + 7269 + + + + + 7270 + + + + + 7271 + + + + + 7272 + + + + + 7273 + + + + + 7274 + + + + + 7275 + + + + + 7276 + + + + + 7277 + + + + + 7278 + + + + + 7279 + + + + + 7280 + + + + + 7293 + + + YES + + + + + + + + + 7285 + + + YES + + + + + + 7286 + + + + + 7287 + + + YES + + + + + + 7288 + + + YES + + + + + + 7289 + + + YES + + + + + + 7292 + + + + + 7290 + + + YES + + + + + + 7291 + + + YES + + + + + + 7294 + + + + + 7295 + + + + + 7301 + + + YES + + + + + + 7302 + + + + + 7305 + + + YES + + + + + + 7308 + + + + + 7309 + + + YES + + + + + + 7312 + + + + + 7313 + + + YES + + + + + + 7316 + + + + + 7317 + + + YES + + + + + + 7320 + + + + + 7353 + + + Input Settings Controller + + + 7354 + + + YES + + + + + + 7355 + + + + + 7358 + + + YES + + + + + + 7359 + + + + + 7392 + + + YES + + + + + + 7393 + + + + + 7395 + + + YES + + + + + + 7396 + + + + + 7398 + + + YES + + + + + + 7399 + + + + + 7401 + + + YES + + + + + + 7402 + + + + + 7404 + + + YES + + + + + + 7405 + + + + + 7433 + + + YES + + + + + + 7434 + + + + + 7436 + + + YES + + + + + + 7437 + + + + + 7439 + + + YES + + + + + + 7440 + + + + + 7442 + + + YES + + + + + + 7443 + + + + + 7445 + + + YES + + + + + + 7446 + + + + + 7449 + + + YES + + + + + + 7450 + + + YES + + + + + + + + + + + + + + + + + + 7451 + + + YES + + + + + + 7452 + + + + + 7454 + + + YES + + + + + + 7455 + + + YES + + + + + + 7456 + + + YES + + + + + + 7457 + + + YES + + + + + + 7458 + + + YES + + + + + + 7459 + + + YES + + + + + + 7460 + + + YES + + + + + + 7462 + + + YES + + + + + + 7463 + + + YES + + + + + + 7464 + + + YES + + + + + + 7465 + + + + + 7466 + + + + + 7468 + + + + + 7469 + + + + + 7470 + + + + + 7471 + + + + + 7472 + + + + + 7473 + + + + + 7474 + + + + + 7486 + + + YES + + + + + + 7487 + + + YES + + + + + + 7488 + + + + + 7489 + + + + + 7461 + + + YES + + + + + + 7467 + + + @@ -40319,113 +38837,22 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 130.ImportedFromIB2 130.editorWindowContentRectSynchronizationRect 1300.IBPluginDependency - 1301.IBEditorWindowLastContentRect - 1301.IBPluginDependency 131.IBPluginDependency 131.ImportedFromIB2 134.IBPluginDependency 134.ImportedFromIB2 136.IBPluginDependency 136.ImportedFromIB2 - 1365.IBPluginDependency - 1365.IBViewBoundsToFrameTransform - 1366.IBPluginDependency - 1383.IBPluginDependency - 1383.IBViewBoundsToFrameTransform - 1386.IBPluginDependency - 1395.IBPluginDependency - 1395.IBViewBoundsToFrameTransform - 1396.IBPluginDependency - 1397.IBPluginDependency - 1397.IBViewBoundsToFrameTransform - 1398.IBPluginDependency - 1399.IBPluginDependency - 1399.IBViewBoundsToFrameTransform - 1400.IBPluginDependency - 1401.IBPluginDependency - 1401.IBViewBoundsToFrameTransform - 1402.IBPluginDependency - 1403.IBPluginDependency - 1403.IBViewBoundsToFrameTransform - 1404.IBPluginDependency - 1405.IBEditorWindowLastContentRect - 1405.IBPluginDependency - 1406.IBPluginDependency - 1409.IBPluginDependency - 1409.IBViewBoundsToFrameTransform - 1410.IBPluginDependency 143.IBPluginDependency 143.ImportedFromIB2 144.IBPluginDependency 144.ImportedFromIB2 - 1444.IBAttributePlaceholdersKey - 1444.IBPluginDependency - 1444.IBViewBoundsToFrameTransform - 1445.IBPluginDependency - 1446.IBAttributePlaceholdersKey - 1446.IBPluginDependency - 1446.IBViewBoundsToFrameTransform - 1447.IBPluginDependency - 1448.IBAttributePlaceholdersKey - 1448.IBPluginDependency - 1448.IBViewBoundsToFrameTransform - 1449.IBPluginDependency 145.IBPluginDependency 145.ImportedFromIB2 - 1450.IBAttributePlaceholdersKey - 1450.IBPluginDependency - 1450.IBViewBoundsToFrameTransform - 1451.IBPluginDependency - 1456.IBAttributePlaceholdersKey - 1456.IBPluginDependency - 1456.IBViewBoundsToFrameTransform - 1457.IBPluginDependency - 1460.IBAttributePlaceholdersKey - 1460.IBPluginDependency - 1460.IBViewBoundsToFrameTransform - 1461.IBPluginDependency - 1462.IBAttributePlaceholdersKey - 1462.IBPluginDependency - 1462.IBViewBoundsToFrameTransform - 1463.IBPluginDependency - 1464.IBAttributePlaceholdersKey - 1464.IBPluginDependency - 1464.IBViewBoundsToFrameTransform - 1465.IBPluginDependency - 1468.IBAttributePlaceholdersKey - 1468.IBPluginDependency - 1468.IBViewBoundsToFrameTransform - 1469.IBPluginDependency - 1470.IBAttributePlaceholdersKey - 1470.IBPluginDependency - 1470.IBViewBoundsToFrameTransform - 1471.IBPluginDependency - 1472.IBAttributePlaceholdersKey - 1472.IBPluginDependency - 1472.IBViewBoundsToFrameTransform - 1473.IBPluginDependency - 1474.IBAttributePlaceholdersKey - 1474.IBPluginDependency - 1474.IBViewBoundsToFrameTransform - 1475.IBPluginDependency - 1478.IBAttributePlaceholdersKey - 1478.IBPluginDependency - 1478.IBViewBoundsToFrameTransform - 1479.IBAttributePlaceholdersKey - 1479.IBPluginDependency - 1480.IBAttributePlaceholdersKey - 1480.IBPluginDependency - 1480.IBViewBoundsToFrameTransform - 1481.IBPluginDependency 149.IBPluginDependency 149.ImportedFromIB2 - 1496.IBAttributePlaceholdersKey - 1496.IBPluginDependency - 1496.IBViewBoundsToFrameTransform - 1497.IBPluginDependency 150.IBPluginDependency 150.ImportedFromIB2 - 1500.IBPluginDependency 1507.IBAttributePlaceholdersKey 1507.IBPluginDependency 1507.IBViewBoundsToFrameTransform @@ -40461,39 +38888,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 1547.IBPluginDependency 1547.IBViewBoundsToFrameTransform 1548.IBPluginDependency - 1555.IBPluginDependency - 1555.IBViewBoundsToFrameTransform - 1556.IBPluginDependency - 1557.IBPluginDependency - 1557.IBViewBoundsToFrameTransform - 1558.IBPluginDependency - 1559.IBPluginDependency - 1559.IBViewBoundsToFrameTransform - 1560.IBPluginDependency - 1561.IBPluginDependency - 1561.IBViewBoundsToFrameTransform - 1562.IBPluginDependency - 1563.IBPluginDependency - 1563.IBViewBoundsToFrameTransform - 1564.IBPluginDependency - 1565.IBPluginDependency - 1565.IBViewBoundsToFrameTransform - 1566.IBPluginDependency - 1566.IBViewBoundsToFrameTransform - 1567.IBPluginDependency - 1567.IBViewBoundsToFrameTransform - 1568.IBPluginDependency - 1568.IBViewBoundsToFrameTransform - 1569.IBPluginDependency - 1569.IBViewBoundsToFrameTransform - 1570.IBPluginDependency - 1570.IBViewBoundsToFrameTransform - 1571.IBPluginDependency - 1572.IBPluginDependency - 1573.IBPluginDependency - 1574.IBPluginDependency - 1575.IBPluginDependency - 1576.IBPluginDependency 1577.IBAttributePlaceholdersKey 1577.IBPluginDependency 1577.IBViewBoundsToFrameTransform @@ -40608,19 +39002,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 2262.IBNumberFormatterLocalizesFormatMetadataKey 2262.IBPluginDependency 2265.IBViewBoundsToFrameTransform - 2269.IBPluginDependency - 2269.IBViewBoundsToFrameTransform - 2276.IBPluginDependency - 2276.IBViewBoundsToFrameTransform - 2277.IBAttributePlaceholdersKey - 2277.IBPluginDependency - 2278.IBAttributePlaceholdersKey - 2278.IBPluginDependency - 2279.IBPluginDependency - 2282.IBAttributePlaceholdersKey - 2283.IBAttributePlaceholdersKey - 2286.IBPluginDependency - 2286.IBViewBoundsToFrameTransform 2287.IBPluginDependency 2287.IBViewBoundsToFrameTransform 2288.IBPluginDependency @@ -40641,12 +39022,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 2299.IBPluginDependency 23.IBPluginDependency 23.ImportedFromIB2 - 2302.IBPluginDependency - 2302.IBViewBoundsToFrameTransform - 2303.IBPluginDependency - 2318.IBPluginDependency - 2318.IBViewBoundsToFrameTransform - 2319.IBPluginDependency 2320.IBPluginDependency 2320.IBViewBoundsToFrameTransform 2321.IBPluginDependency @@ -41676,14 +40051,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 5193.IBNumberFormatterBehaviorMetadataKey 5193.IBNumberFormatterLocalizesFormatMetadataKey 5193.IBPluginDependency - 5281.IBPluginDependency - 5313.IBPluginDependency - 5313.IBViewBoundsToFrameTransform - 5314.IBAttributePlaceholdersKey - 5314.IBPluginDependency - 5314.IBViewBoundsToFrameTransform - 5315.IBPluginDependency - 5316.IBPluginDependency 5329.IBPluginDependency 534.IBPluginDependency 535.IBPluginDependency @@ -41752,228 +40119,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 5702.IBPluginDependency 5703.IBPluginDependency 5713.IBPluginDependency - 5738.IBAttributePlaceholdersKey - 5738.IBEditorWindowLastContentRect - 5738.IBPluginDependency - 5738.IBViewBoundsToFrameTransform - 5741.IBPluginDependency - 5742.IBPluginDependency - 5743.IBPluginDependency - 5744.IBAttributePlaceholdersKey - 5744.IBPluginDependency - 5744.IBViewBoundsToFrameTransform - 5745.IBPluginDependency - 5745.IBViewBoundsToFrameTransform - 5746.IBPluginDependency - 5746.IBViewBoundsToFrameTransform - 5747.IBAttributePlaceholdersKey - 5747.IBPluginDependency - 5747.IBViewBoundsToFrameTransform - 5748.IBAttributePlaceholdersKey - 5748.IBPluginDependency - 5748.IBViewBoundsToFrameTransform - 5749.IBPluginDependency - 5749.IBViewBoundsToFrameTransform 575.IBPluginDependency - 5750.IBPluginDependency - 5750.IBViewBoundsToFrameTransform - 5751.IBPluginDependency - 5751.IBViewBoundsToFrameTransform - 5752.IBPluginDependency - 5752.IBViewBoundsToFrameTransform - 5753.IBPluginDependency - 5753.IBViewBoundsToFrameTransform - 5754.IBPluginDependency - 5754.IBViewBoundsToFrameTransform - 5755.IBPluginDependency - 5755.IBViewBoundsToFrameTransform - 5756.IBPluginDependency - 5756.IBViewBoundsToFrameTransform - 5757.IBPluginDependency - 5757.IBViewBoundsToFrameTransform - 5758.IBPluginDependency - 5758.IBViewBoundsToFrameTransform - 5759.IBPluginDependency - 5759.IBViewBoundsToFrameTransform 576.IBEditorWindowLastContentRect 576.IBPluginDependency - 5760.IBPluginDependency - 5760.IBViewBoundsToFrameTransform - 5761.IBAttributePlaceholdersKey - 5761.IBPluginDependency - 5761.IBViewBoundsToFrameTransform - 5762.IBAttributePlaceholdersKey - 5762.IBPluginDependency - 5762.IBViewBoundsToFrameTransform - 5763.IBAttributePlaceholdersKey - 5763.IBPluginDependency - 5763.IBViewBoundsToFrameTransform - 5764.IBAttributePlaceholdersKey - 5764.IBPluginDependency - 5764.IBViewBoundsToFrameTransform - 5765.IBAttributePlaceholdersKey - 5765.IBPluginDependency - 5765.IBViewBoundsToFrameTransform - 5766.IBAttributePlaceholdersKey - 5766.IBPluginDependency - 5766.IBViewBoundsToFrameTransform - 5767.IBAttributePlaceholdersKey - 5767.IBPluginDependency - 5767.IBViewBoundsToFrameTransform - 5768.IBAttributePlaceholdersKey - 5768.IBPluginDependency - 5768.IBViewBoundsToFrameTransform - 5769.IBAttributePlaceholdersKey - 5769.IBPluginDependency - 5769.IBViewBoundsToFrameTransform - 5770.IBAttributePlaceholdersKey - 5770.IBPluginDependency - 5770.IBViewBoundsToFrameTransform - 5771.IBAttributePlaceholdersKey - 5771.IBPluginDependency - 5771.IBViewBoundsToFrameTransform - 5772.IBPluginDependency - 5773.IBPluginDependency - 5774.IBPluginDependency - 5775.IBPluginDependency - 5776.IBPluginDependency - 5777.IBPluginDependency - 5778.IBPluginDependency - 5779.IBPluginDependency 578.IBPluginDependency - 5780.IBPluginDependency - 5781.IBPluginDependency - 5782.IBPluginDependency - 5783.IBPluginDependency - 5784.IBPluginDependency - 5785.IBPluginDependency - 5786.IBPluginDependency - 5787.IBPluginDependency - 5788.IBPluginDependency - 5789.IBPluginDependency - 5790.IBPluginDependency - 5791.IBPluginDependency - 5792.IBPluginDependency - 5793.IBPluginDependency - 5794.IBPluginDependency - 5795.IBPluginDependency - 5796.IBPluginDependency - 5797.IBPluginDependency - 5798.IBPluginDependency - 5799.IBPluginDependency 58.IBPluginDependency 58.ImportedFromIB2 - 5800.IBPluginDependency - 5801.IBPluginDependency - 5801.IBViewBoundsToFrameTransform - 5802.IBPluginDependency - 5802.IBViewBoundsToFrameTransform - 5803.IBPluginDependency - 5803.IBViewBoundsToFrameTransform - 5804.IBPluginDependency - 5805.IBPluginDependency - 5807.IBPluginDependency - 5808.IBPluginDependency - 5809.IBPluginDependency - 5814.IBPluginDependency - 5815.IBPluginDependency - 5816.IBPluginDependency - 5817.IBPluginDependency - 5818.IBPluginDependency - 5820.IBNumberFormatterBehaviorMetadataKey - 5820.IBNumberFormatterLocalizesFormatMetadataKey - 5820.IBPluginDependency - 5822.IBNumberFormatterBehaviorMetadataKey - 5822.IBNumberFormatterLocalizesFormatMetadataKey - 5822.IBPluginDependency - 5823.IBPluginDependency - 5825.IBPluginDependency - 5825.IBViewBoundsToFrameTransform - 5826.IBPluginDependency - 5826.IBViewBoundsToFrameTransform - 5827.IBPluginDependency - 5827.IBViewBoundsToFrameTransform - 5828.IBAttributePlaceholdersKey - 5828.IBPluginDependency - 5828.IBViewBoundsToFrameTransform - 5829.IBAttributePlaceholdersKey - 5829.IBPluginDependency - 5830.IBPluginDependency - 5831.IBPluginDependency - 5831.IBViewBoundsToFrameTransform - 5832.IBPluginDependency - 5832.IBViewBoundsToFrameTransform - 5833.IBPluginDependency - 5833.IBViewBoundsToFrameTransform - 5834.IBPluginDependency - 5834.IBViewBoundsToFrameTransform - 5835.IBPluginDependency - 5835.IBViewBoundsToFrameTransform - 5836.IBPluginDependency - 5837.IBPluginDependency - 5838.IBEditorWindowLastContentRect - 5838.IBPluginDependency - 5839.IBPluginDependency - 5840.IBPluginDependency - 5841.IBPluginDependency - 5842.IBPluginDependency - 5843.IBPluginDependency - 5843.IBViewBoundsToFrameTransform - 5844.IBPluginDependency - 5844.IBViewBoundsToFrameTransform - 5845.IBPluginDependency - 5845.IBViewBoundsToFrameTransform - 5846.IBAttributePlaceholdersKey - 5846.IBPluginDependency - 5847.IBPluginDependency - 5848.IBAttributePlaceholdersKey - 5848.IBPluginDependency - 5849.IBAttributePlaceholdersKey - 5850.IBAttributePlaceholdersKey - 5851.IBPluginDependency - 5852.IBPluginDependency - 5854.IBAttributePlaceholdersKey - 5854.IBPluginDependency - 5854.IBViewBoundsToFrameTransform - 5855.IBPluginDependency - 5855.IBViewBoundsToFrameTransform - 5856.IBAttributePlaceholdersKey - 5856.IBPluginDependency - 5856.IBViewBoundsToFrameTransform - 5857.IBPluginDependency - 5857.IBViewBoundsToFrameTransform - 5858.IBAttributePlaceholdersKey - 5858.IBPluginDependency - 5858.IBViewBoundsToFrameTransform - 5859.IBPluginDependency - 5859.IBViewBoundsToFrameTransform - 5860.IBAttributePlaceholdersKey - 5860.IBPluginDependency - 5860.IBViewBoundsToFrameTransform - 5861.IBAttributePlaceholdersKey - 5861.IBPluginDependency - 5861.IBViewBoundsToFrameTransform - 5862.IBAttributePlaceholdersKey - 5862.IBPluginDependency - 5862.IBViewBoundsToFrameTransform - 5863.IBPluginDependency - 5863.IBViewBoundsToFrameTransform - 5864.IBPluginDependency - 5864.IBViewBoundsToFrameTransform - 5865.IBPluginDependency - 5865.IBViewBoundsToFrameTransform - 5866.IBPluginDependency - 5867.IBPluginDependency - 5868.IBPluginDependency - 5869.IBPluginDependency - 5870.IBPluginDependency - 5871.IBPluginDependency - 5872.IBPluginDependency - 5873.IBPluginDependency - 5874.IBPluginDependency - 5875.IBPluginDependency - 5876.IBPluginDependency - 5877.IBPluginDependency 5933.IBEditorWindowLastContentRect 5933.IBPluginDependency 5933.IBViewBoundsToFrameTransform @@ -42250,14 +40401,254 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA 6998.IBPluginDependency 6999.IBPluginDependency 7002.IBPluginDependency + 7014.IBEditorWindowLastContentRect + 7014.IBPluginDependency + 7014.IBViewBoundsToFrameTransform + 7128.IBPluginDependency + 7128.IBViewBoundsToFrameTransform + 7129.IBPluginDependency + 7130.IBPluginDependency + 7131.IBPluginDependency + 7132.IBPluginDependency + 7137.IBPluginDependency + 7138.IBPluginDependency 714.IBEditorWindowLastContentRect 714.IBPluginDependency 714.IBViewBoundsToFrameTransform + 7140.IBPluginDependency + 7141.IBPluginDependency 715.IBPluginDependency + 7168.IBPluginDependency + 7168.IBViewBoundsToFrameTransform + 7169.IBPluginDependency + 7171.IBEditorWindowLastContentRect + 7171.IBPluginDependency + 7171.IBWindowTemplateEditedContentRect + 7171.NSWindowTemplate.visibleAtLaunch + 7172.IBPluginDependency + 7173.IBEditorWindowLastContentRect + 7173.IBPluginDependency + 7173.IBWindowTemplateEditedContentRect + 7173.NSWindowTemplate.visibleAtLaunch + 7174.IBPluginDependency + 7175.IBEditorWindowLastContentRect + 7175.IBPluginDependency + 7175.IBWindowTemplateEditedContentRect + 7175.NSWindowTemplate.visibleAtLaunch + 7176.IBPluginDependency + 7179.IBEditorWindowLastContentRect + 7179.IBPluginDependency + 7179.IBWindowTemplateEditedContentRect + 7179.NSWindowTemplate.visibleAtLaunch + 7180.IBPluginDependency + 7181.IBPluginDependency + 7181.IBViewBoundsToFrameTransform + 7182.IBPluginDependency + 7182.IBViewBoundsToFrameTransform + 7183.IBPluginDependency + 7183.IBViewBoundsToFrameTransform + 7184.IBPluginDependency + 7184.IBViewBoundsToFrameTransform + 7185.IBPluginDependency + 7185.IBViewBoundsToFrameTransform + 7186.IBAttributePlaceholdersKey + 7186.IBPluginDependency + 7187.IBPluginDependency + 7188.IBAttributePlaceholdersKey + 7188.IBPluginDependency + 7189.IBAttributePlaceholdersKey + 7190.IBAttributePlaceholdersKey + 7191.IBPluginDependency + 7192.IBPluginDependency + 7193.IBPluginDependency + 7193.IBViewBoundsToFrameTransform + 7194.IBPluginDependency + 7194.IBViewBoundsToFrameTransform + 7195.IBPluginDependency + 7195.IBViewBoundsToFrameTransform + 7196.IBPluginDependency + 7196.IBViewBoundsToFrameTransform + 7197.IBPluginDependency + 7197.IBViewBoundsToFrameTransform + 7198.IBPluginDependency + 7199.IBPluginDependency 72.IBPluginDependency 72.ImportedFromIB2 + 7200.IBEditorWindowLastContentRect + 7200.IBPluginDependency + 7201.IBPluginDependency + 7202.IBPluginDependency + 7203.IBPluginDependency + 7204.IBPluginDependency + 7210.IBPluginDependency + 7210.IBViewBoundsToFrameTransform + 7211.IBPluginDependency + 7212.IBEditorWindowLastContentRect + 7212.IBPluginDependency + 7213.IBPluginDependency + 7214.IBPluginDependency + 7215.IBPluginDependency + 7216.IBPluginDependency + 7216.IBViewBoundsToFrameTransform + 7217.IBPluginDependency + 7218.IBPluginDependency + 7219.IBPluginDependency + 7220.IBPluginDependency + 7221.IBPluginDependency + 7222.IBPluginDependency + 7223.IBPluginDependency + 7224.IBPluginDependency + 7225.IBEditorWindowLastContentRect + 7225.IBPluginDependency + 7225.IBWindowTemplateEditedContentRect + 7225.NSWindowTemplate.visibleAtLaunch + 7226.IBPluginDependency + 7227.IBPluginDependency + 7227.IBViewBoundsToFrameTransform + 7228.IBPluginDependency + 7228.IBViewBoundsToFrameTransform + 7229.IBPluginDependency + 7230.IBEditorWindowLastContentRect + 7230.IBPluginDependency + 7231.IBPluginDependency + 7232.IBPluginDependency + 7233.IBPluginDependency + 7234.IBPluginDependency + 7235.IBPluginDependency + 7236.IBPluginDependency + 7237.IBPluginDependency + 7238.IBPluginDependency + 7239.IBPluginDependency + 7240.IBPluginDependency + 7241.IBPluginDependency + 7266.IBPluginDependency + 7266.IBViewBoundsToFrameTransform + 7267.IBPluginDependency + 7267.IBViewBoundsToFrameTransform + 7268.IBPluginDependency + 7269.IBPluginDependency + 7270.IBPluginDependency + 7285.IBPluginDependency + 7285.IBViewBoundsToFrameTransform + 7286.IBPluginDependency + 7287.IBPluginDependency + 7287.IBViewBoundsToFrameTransform + 7288.IBPluginDependency + 7289.IBPluginDependency + 7289.IBViewBoundsToFrameTransform + 7290.IBPluginDependency + 7290.IBViewBoundsToFrameTransform + 7291.IBPluginDependency + 7292.IBPluginDependency + 7293.IBPluginDependency + 7293.IBViewBoundsToFrameTransform + 7294.IBNumberFormatterBehaviorMetadataKey + 7294.IBNumberFormatterLocalizesFormatMetadataKey + 7294.IBPluginDependency + 7295.IBNumberFormatterBehaviorMetadataKey + 7295.IBNumberFormatterLocalizesFormatMetadataKey + 7295.IBPluginDependency + 7301.IBPluginDependency + 7301.IBViewBoundsToFrameTransform + 7302.IBPluginDependency + 7305.IBPluginDependency + 7305.IBViewBoundsToFrameTransform + 7308.IBPluginDependency + 7309.IBPluginDependency + 7309.IBViewBoundsToFrameTransform + 7312.IBPluginDependency + 7313.IBPluginDependency + 7313.IBViewBoundsToFrameTransform + 7316.IBPluginDependency + 7317.IBPluginDependency + 7317.IBViewBoundsToFrameTransform + 7320.IBPluginDependency + 7353.IBPluginDependency + 7354.IBPluginDependency + 7354.IBViewBoundsToFrameTransform + 7355.IBPluginDependency + 7358.IBPluginDependency + 7358.IBViewBoundsToFrameTransform + 7359.IBPluginDependency + 7392.IBPluginDependency + 7392.IBViewBoundsToFrameTransform + 7393.IBPluginDependency + 7395.IBPluginDependency + 7395.IBViewBoundsToFrameTransform + 7396.IBPluginDependency + 7398.IBPluginDependency + 7398.IBViewBoundsToFrameTransform + 7399.IBPluginDependency 74.IBPluginDependency 74.ImportedFromIB2 + 7401.IBPluginDependency + 7401.IBViewBoundsToFrameTransform + 7402.IBPluginDependency + 7404.IBPluginDependency + 7404.IBViewBoundsToFrameTransform + 7405.IBPluginDependency + 7433.IBPluginDependency + 7433.IBViewBoundsToFrameTransform + 7434.IBPluginDependency + 7436.IBPluginDependency + 7436.IBViewBoundsToFrameTransform + 7437.IBPluginDependency + 7439.IBPluginDependency + 7439.IBViewBoundsToFrameTransform + 7440.IBPluginDependency + 7442.IBPluginDependency + 7442.IBViewBoundsToFrameTransform + 7443.IBPluginDependency + 7445.IBPluginDependency + 7445.IBViewBoundsToFrameTransform + 7446.IBPluginDependency + 7449.IBEditorWindowLastContentRect + 7449.IBPluginDependency + 7449.IBWindowTemplateEditedContentRect + 7449.NSWindowTemplate.visibleAtLaunch + 7450.IBPluginDependency + 7451.IBPluginDependency + 7451.IBViewBoundsToFrameTransform + 7452.IBPluginDependency + 7454.IBPluginDependency + 7454.IBViewBoundsToFrameTransform + 7455.IBPluginDependency + 7455.IBViewBoundsToFrameTransform + 7456.IBPluginDependency + 7456.IBViewBoundsToFrameTransform + 7457.IBPluginDependency + 7457.IBViewBoundsToFrameTransform + 7458.IBPluginDependency + 7458.IBViewBoundsToFrameTransform + 7459.IBPluginDependency + 7459.IBViewBoundsToFrameTransform + 7460.IBPluginDependency + 7460.IBViewBoundsToFrameTransform + 7461.IBPluginDependency + 7461.IBViewBoundsToFrameTransform + 7462.IBPluginDependency + 7462.IBViewBoundsToFrameTransform + 7463.IBPluginDependency + 7463.IBViewBoundsToFrameTransform + 7464.IBPluginDependency + 7465.IBNumberFormatterBehaviorMetadataKey + 7465.IBNumberFormatterLocalizesFormatMetadataKey + 7465.IBPluginDependency + 7466.IBPluginDependency + 7467.IBPluginDependency + 7468.IBPluginDependency + 7469.IBPluginDependency + 7470.IBPluginDependency + 7471.IBPluginDependency + 7472.IBPluginDependency + 7473.IBPluginDependency + 7474.IBPluginDependency + 7486.IBPluginDependency + 7486.IBViewBoundsToFrameTransform + 7487.IBPluginDependency + 7487.IBViewBoundsToFrameTransform + 7488.IBPluginDependency + 7489.IBPluginDependency 75.IBPluginDependency 75.ImportedFromIB2 783.IBPluginDependency @@ -42474,52 +40865,52 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - P4AAAL+AAABB8AAAwu4AAA + P4AAAL+AAABB8AAAwoYAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - P4AAAL+AAABBiAAAwxAAAA + P4AAAL+AAABBiAAAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - P4AAAL+AAABDzgAAwxAAAA + P4AAAL+AAABDzgAAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - P4AAAL+AAABCwgAAwxAAAA + P4AAAL+AAABCwgAAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - P4AAAL+AAABDMAAAwxAAAA + P4AAAL+AAABDMAAAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - P4AAAL+AAABDfgAAwxAAAA + P4AAAL+AAABDfgAAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - P4AAAL+AAABDp4AAwxAAAA + P4AAAL+AAABDp4AAwrgAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - P4AAAL+AAABCAAAAwiwAAA + P4AAAL+AAABCAAAAwgwAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - P4AAAL+AAABDMAAAwgwAAA + P4AAAL+AAABDggAAwhAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - P4AAAL+AAABDloAAwgwAAA + P4AAAL+AAABDwIAAwhAAAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -42557,7 +40948,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{522, 812}, {146, 23}} com.apple.InterfaceBuilder.CocoaPlugin - {{1228, 823}, {117, 253}} + {{1199, 823}, {117, 253}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -42594,8 +40985,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {{436, 809}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin - {{643, 640}, {640, 433}} - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -42603,261 +40992,15 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAw6eAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwjQAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDGQAAw6gAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - AUGQAABC2AAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBgAAAwsoAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDVwAAwegAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCjgAAwxgAAA - - com.apple.InterfaceBuilder.CocoaPlugin - {{443, 824}, {414, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBcAAAwxUAAA - + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the DS controller's Up button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw6aAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the DS controller's Down button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCUAAAxEaAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the DS controller's Left button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCUAAAxEBAAA - - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the DS controller's Right button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw2gAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the DS controller's A button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw46AAA - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the DS controller's B button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCUAAAxC2AAA - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the DS controller's X button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw2sAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the DS controller's Y button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCUAAAxCEAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the DS controller's L button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCUAAAxBrAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the DS controller's R button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAwqQAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the DS controller's Start button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCUAAAxA5AAA - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the DS controller's Select button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAwiwAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sets the microphone activation hotkey. Whenever this hotkey is pressed, the emulator will accept sound input. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw6cAAA - - - YES - - - YES - - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Simulates the closing and opening of the DS lid. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAwmQAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - InitialTabViewItem - - InitialTabViewItem - - - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBUAAAw9CAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin ToolTip @@ -42919,61 +41062,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA P4AAAL+AAABC5AAAwgQAAA com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAw44AAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAw4GAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAw2oAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAw1EAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwzgAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDAgAAw5gAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwwYAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwtoAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwqgAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwmwAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwggAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin ToolTip @@ -43153,53 +41241,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA AUGQAABCHAAAA com.apple.InterfaceBuilder.CocoaPlugin - - AUFgAABAoAAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDJwAAwrQAAA - - - ToolTip - - ToolTip - - Use a physical microphone or other other sound input device connected to your Mac. [NOT YET IMPLEMENTED IN THIS VERSION] - - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Predefined noise samples that simulate sounds like blowing into the microphone. (Some games, such as "The Legend of Zelda: Spirit Tracks," work especially well with this.) - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Randomly generated white noise that simulates sounds like blowing into the microphone. May also be useful if a game needs you to speak into the microphone. - - - - ToolTip - - ToolTip - - Use a sound file. (Whenever the microphone is activated, the sound will begin at the start of the file.) [NOT YET IMPLEMENTED IN THIS VERSION] - - - com.apple.InterfaceBuilder.CocoaPlugin - - AUFgAABDPAAAA - - com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABCngAAwwcAAA @@ -43242,16 +41283,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABChgAAwggAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDxAAAwggAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin P4AAAL+AAABDqAAAwhQAAA @@ -43579,9 +41610,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{873, 105}, {700, 364}} + {{596, 105}, {700, 364}} com.apple.InterfaceBuilder.CocoaPlugin - {{873, 105}, {700, 364}} + {{596, 105}, {700, 364}} @@ -43677,7 +41708,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA P4AAAL+AAABBiAAAwswAAA - {{645, 1136}, {512, 20}} + {{607, 1136}, {512, 20}} com.apple.InterfaceBuilder.CocoaPlugin {74, 862} @@ -43692,7 +41723,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA P4AAAL+AAABBiAAAw6WAAA com.apple.InterfaceBuilder.CocoaPlugin - {{919, 843}, {315, 293}} + {{881, 843}, {315, 293}} com.apple.InterfaceBuilder.CocoaPlugin {{475, 832}, {234, 43}} com.apple.InterfaceBuilder.CocoaPlugin @@ -43769,9 +41800,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA AUGoAABDXwAAA - {{971, 87}, {640, 480}} + {{915, 238}, {640, 480}} com.apple.InterfaceBuilder.CocoaPlugin - {{971, 87}, {640, 480}} + {{915, 238}, {640, 480}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -44799,7 +42830,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA P4AAAL+AAABC3gAAw9EAAA com.apple.InterfaceBuilder.CocoaPlugin - {{728, 816}, {209, 71}} + {{1302, 582}, {209, 71}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -45278,25 +43309,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBAAAAwfgAAA - - - ToolTip - - ToolTip - - Activates the DS's debugger mode. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAADDAAAAwegAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{855, 920}, {64, 6}} @@ -45395,528 +43407,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - - InitialTabViewItem - - InitialTabViewItem - - - - - {{330, 736}, {614, 409}} - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBUAAAw9CAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Activates the emulator's debug mode. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAADDAAAAwegAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBAAAAwfgAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwjQAAA - - - ToolTip - - ToolTip - - Simulates the closing and opening of the DS lid. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw6wAAA - - - ToolTip - - ToolTip - - Sets the DS controller's Up button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw6aAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwggAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwmwAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwqgAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwtoAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwwYAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAw1EAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDAgAAw5gAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAwzgAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAw2oAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAw4GAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAw44AAA - - {{833, 933}, {218, 203}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABC+gAAw6eAAA - - - ToolTip - - ToolTip - - Sets the DS controller's A button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw46AAA - - - ToolTip - - ToolTip - - Sets the DS controller's Down button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCUAAAxEaAAA - - - ToolTip - - ToolTip - - Sets the DS controller's Left button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCUAAAxEBAAA - - - ToolTip - - ToolTip - - Sets the DS controller's Right button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw2gAAA - - - ToolTip - - ToolTip - - Sets the DS controller's B button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCUAAAxC2AAA - - - ToolTip - - ToolTip - - Sets the DS controller's X button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw2sAAA - - - ToolTip - - ToolTip - - Sets the DS controller's Y button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCUAAAxCEAAA - - - ToolTip - - ToolTip - - Sets the DS controller's L button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCUAAAxBrAAA - - - ToolTip - - ToolTip - - Sets the DS controller's R button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAwqQAAA - - - ToolTip - - ToolTip - - Sets the DS controller's Start button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCUAAAxA5AAA - - - ToolTip - - ToolTip - - Sets the DS controller's Select button. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAwiwAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + {{795, 933}, {218, 203}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw7MAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAwhQAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCMAAAwhQAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - com.apple.InterfaceBuilder.CocoaPlugin - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - AUFgAABDPAAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - AUFgAABAoAAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDGQAAw6gAAA - - - ToolTip - - ToolTip - - Sets the microphone activation hotkey. Whenever this hotkey is pressed, the emulator will accept sound input. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw6cAAA - - - YES - - - YES - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDVwAAwegAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBgAAAwsoAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - AUGQAABC2AAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABCjgAAwxgAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBcAAAwxUAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{443, 824}, {414, 23}} - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDxAAAwggAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABChgAAwggAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDJwAAwrQAAA - - - ToolTip - - ToolTip - - Use a physical microphone or other other sound input device connected to your Mac. [NOT YET IMPLEMENTED IN THIS VERSION] - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Predefined noise samples that simulate sounds like blowing into the microphone. (Some games, such as "The Legend of Zelda: Spirit Tracks," work especially well with this.) - - - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Randomly generated white noise that simulates sounds like blowing into the microphone. May also be useful if a game needs you to speak into the microphone. - - - - ToolTip - - ToolTip - - Use a sound file. (Whenever the microphone is activated, the sound will begin at the start of the file.) [NOT YET IMPLEMENTED IN THIS VERSION] - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - ToolTip - - ToolTip - - Sends the Reset command to the emulator. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw0MAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDGQAAw0UAAA - - - ToolTip - - ToolTip - - Sends the Pause command to the emulator. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw14AAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDGQAAw2AAAA - - - ToolTip - - ToolTip - - Sends the Execute command to the emulator. - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw3kAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDGQAAw3sAAA - - - ToolTip - - ToolTip - - Sets the hotkey to toggle the HUD. (Holding down the hotkey will toggle the HUD visible state. For example, if the HUD is normally hidden, and you press this hotkey, the HUD will show until the hotkey is released.) - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw4oAAA - - - ToolTip - - ToolTip - - Sets the hotkey to double the emulation speed. (The emulation speed is affected only while the hotkey is held down. When the hotkey is released, the emulation speed reverts back to its previous speed.) - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw5cAAA - - - ToolTip - - ToolTip - - Sets the hotkey to halve the emulation speed. (The emulation speed is affected only while the hotkey is held down. When the hotkey is released, the emulation speed reverts back to its previous speed.) - - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABBiAAAw6SAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDGQAAw6WAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDGQAAw4sAAA - - com.apple.InterfaceBuilder.CocoaPlugin - - P4AAAL+AAABDGQAAw5gAAA - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin {{1058, 810}, {450, 35}} com.apple.InterfaceBuilder.CocoaPlugin @@ -45943,7 +43439,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{969, 1053}, {278, 83}} + {{921, 1053}, {278, 83}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -46116,9 +43612,9 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin {{832, 932}, {616, 0}} com.apple.InterfaceBuilder.CocoaPlugin - {{1000, 375}, {580, 592}} + {{930, 321}, {580, 592}} com.apple.InterfaceBuilder.CocoaPlugin - {{1000, 375}, {580, 592}} + {{930, 321}, {580, 592}} @@ -46441,14 +43937,388 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + {{707, 309}, {640, 497}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAAAAAAAAw/eAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin {{1271, 124}, {328, 434}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDHQAAwegAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1237, 579}, {350, 263}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1237, 579}, {350, 263}} + + com.apple.InterfaceBuilder.CocoaPlugin + {{1202, 1031}, {350, 125}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1202, 1031}, {350, 125}} + + com.apple.InterfaceBuilder.CocoaPlugin + {{1017, 180}, {600, 376}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1017, 180}, {600, 376}} + + com.apple.InterfaceBuilder.CocoaPlugin + {{632, 301}, {516, 283}} + com.apple.InterfaceBuilder.CocoaPlugin + {{632, 301}, {516, 283}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDTwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABDtgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABD5AAAwgwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABChgAAwggAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAwrQAAA + + + ToolTip + + ToolTip + + Use a physical microphone or other other sound input device connected to your Mac. [NOT YET IMPLEMENTED IN THIS VERSION] + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Predefined noise samples that simulate sounds like blowing into the microphone. (Some games, such as "The Legend of Zelda: Spirit Tracks," work especially well with this.) + + + com.apple.InterfaceBuilder.CocoaPlugin + + ToolTip + + ToolTip + + Randomly generated white noise that simulates sounds like blowing into the microphone. May also be useful if a game needs you to speak into the microphone. + + + + ToolTip + + ToolTip + + Use a sound file. (Whenever the microphone is activated, the sound will begin at the start of the file.) [NOT YET IMPLEMENTED IN THIS VERSION] + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDVwAAwegAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBgAAAwsoAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + AUGQAABC2AAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCjgAAwxgAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBcAAAwxUAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + {{443, 824}, {414, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCrAAAwqAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1051, 870}, {156, 203}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC2AAAwpoAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1202, 877}, {350, 125}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1202, 877}, {350, 125}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAwswAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCrAAAwqAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1409, 597}, {156, 203}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABBgAAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAw5uAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCkAAAwrYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCvAAAwrwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCkAAAwnwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCvAAAwoQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + AUGIAABCYAAAA + + + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABD9QAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDcAAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDFQAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDFQAAwoYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABD9IAAwkQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBkAAAw1oAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw0IAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDxQAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDEAAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCVAAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCVAAAwoYAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDzYAAwhQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw3EAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAws4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAws4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBiAAAw7EAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCkAAAwjQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + {{1127, 996}, {467, 160}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1127, 996}, {467, 160}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCbAAAwt4AAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABC3gAAwvIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABCxAAAwxIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABD9oAAwxIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDMgAAwxIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDgIAAwxIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDp4AAwxIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABD0AAAwxIAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABBYAAAwigAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDqoAAwrQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABD6QAAwrQAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDjQAAwlwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDOgAAwlwAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -46759,16 +44629,16 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{1051, 1043}, {118, 93}} + {{1013, 1043}, {118, 93}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{1146, 464}, {467, 135}} + {{1145, 377}, {467, 128}} com.apple.InterfaceBuilder.CocoaPlugin - {{1146, 464}, {467, 135}} + {{1145, 377}, {467, 128}} com.apple.InterfaceBuilder.CocoaPlugin @@ -46789,7 +44659,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - 7013 + 7495 @@ -47319,7 +45189,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA DisplayView NSView - + IBProjectSource userinterface/DisplayWindowController.h @@ -47447,7 +45317,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA - + EmuControllerDelegate @@ -47475,7 +45345,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA closeRom: closeSheet: closeWindow: - copy: exportRomSave: importRomSave: loadEmuSaveStateSlot: @@ -47552,7 +45421,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA id id id - id @@ -47578,7 +45446,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA closeRom: closeSheet: closeWindow: - copy: exportRomSave: importRomSave: loadEmuSaveStateSlot: @@ -47685,10 +45552,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA closeWindow: id - - copy: - id - exportRomSave: id @@ -47909,63 +45772,19 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA InputManager NSObject - - YES - - YES - changeCoreSpeed: - changeVolume: - saveScreenshotAs: - toggleGPUState: - - - YES - id - id - id - id - - - - YES - - YES - changeCoreSpeed: - changeVolume: - saveScreenshotAs: - toggleGPUState: - - - YES - - changeCoreSpeed: - id - - - changeVolume: - id - - - saveScreenshotAs: - id - - - toggleGPUState: - id - - - YES YES emuControl hidInputTarget + inputPrefsOutlineView YES EmuControllerDelegate id + NSOutlineView @@ -47974,6 +45793,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA YES emuControl hidInputTarget + inputPrefsOutlineView YES @@ -47985,6 +45805,10 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA hidInputTarget id + + inputPrefsOutlineView + NSOutlineView + @@ -47996,14 +45820,56 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA InputPrefsView NSView - inputButtonSet: - id + YES + + YES + changeSpeed: + closeSettingsSheet: + removeInput: + setInputAdd: + showSettingsSheet: + + + YES + id + id + id + id + id + - inputButtonSet: - - inputButtonSet: - id + YES + + YES + changeSpeed: + closeSettingsSheet: + removeInput: + setInputAdd: + showSettingsSheet: + + + YES + + changeSpeed: + id + + + closeSettingsSheet: + id + + + removeInput: + id + + + setInputAdd: + id + + + showSettingsSheet: + id + @@ -48011,11 +45877,27 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA YES inputManager + inputPrefOutlineView + inputSettingsController + inputSettingsGPUState + inputSettingsLoadStateSlot + inputSettingsMicrophone + inputSettingsSaveStateSlot + inputSettingsSetSpeedLimit + inputSettingsTouch prefWindow YES InputManager + NSOutlineView + NSObjectController + NSWindow + NSWindow + NSWindow + NSWindow + NSWindow + NSWindow NSWindow @@ -48024,6 +45906,14 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA YES inputManager + inputPrefOutlineView + inputSettingsController + inputSettingsGPUState + inputSettingsLoadStateSlot + inputSettingsMicrophone + inputSettingsSaveStateSlot + inputSettingsSetSpeedLimit + inputSettingsTouch prefWindow @@ -48032,6 +45922,38 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA inputManager InputManager + + inputPrefOutlineView + NSOutlineView + + + inputSettingsController + NSObjectController + + + inputSettingsGPUState + NSWindow + + + inputSettingsLoadStateSlot + NSWindow + + + inputSettingsMicrophone + NSWindow + + + inputSettingsSaveStateSlot + NSWindow + + + inputSettingsSetSpeedLimit + NSWindow + + + inputSettingsTouch + NSWindow + prefWindow NSWindow @@ -48064,7 +45986,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA selectDisplaySize: selectSPUSyncMethod: selectSPUSyncMode: - selectSoundInputMode: selectVideoFilterType: setUseBilinear: showDisplayView: @@ -48098,7 +46019,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA id id id - id @@ -48119,7 +46039,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA selectDisplaySize: selectSPUSyncMethod: selectSPUSyncMode: - selectSoundInputMode: selectVideoFilterType: setUseBilinear: showDisplayView: @@ -48187,10 +46106,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA selectSPUSyncMode: id - - selectSoundInputMode: - id - selectVideoFilterType: id @@ -48843,7 +46758,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA NSObject - + IBFrameworkSource AppKit.framework/Headers/NSOutlineView.h @@ -49024,6 +46939,11 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA AppKit.framework/Headers/NSObjectController.h + + NSOutlineView + NSTableView + + NSPanel NSWindow @@ -49310,30 +47230,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA ColorSwatch_Violet_16x16 ColorSwatch_Yellow_16x16 Icon_ActionReplay_32x32 - Icon_ArrowDown_420x420 - Icon_ArrowLeft_420x420 - Icon_ArrowRight_420x420 - Icon_ArrowUp_420x420 Icon_CodeBreaker_128x128 - Icon_DSButtonA_420x420 - Icon_DSButtonB_420x420 - Icon_DSButtonL_420x420 - Icon_DSButtonR_420x420 - Icon_DSButtonSelect_420x420 - Icon_DSButtonStart_420x420 - Icon_DSButtonX_420x420 - Icon_DSButtonY_420x420 Icon_DeSmuME_32x32 - Icon_DoubleSpeed_420x420 Icon_Emulation_420x420 - Icon_Execute_420x420 Icon_Input_420x420 - Icon_Microphone_420x420 - Icon_Pause_420x420 - Icon_Reset_420x420 Icon_ShowHUD_420x420 Icon_Speaker_420x420 - Icon_Speed2x_420x420 Icon_VolumeFull_16x16 NSActionTemplate NSAddTemplate @@ -49364,30 +47266,12 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA {16, 16} {16, 16} {32, 32} - {420, 420} - {420, 420} - {420, 420} - {420, 420} {128, 128} - {420, 420} - {420, 420} - {420, 420} - {420, 420} - {420, 420} - {420, 420} - {420, 420} - {420, 420} {32, 32} {420, 420} {420, 420} {420, 420} {420, 420} - {420, 420} - {420, 420} - {420, 420} - {420, 420} - {420, 420} - {420, 420} {20, 20} {15, 15} {8, 8} diff --git a/desmume/src/cocoa/userinterface/DisplayWindowController.mm b/desmume/src/cocoa/userinterface/DisplayWindowController.mm index e290e6945..b0790b52d 100644 --- a/desmume/src/cocoa/userinterface/DisplayWindowController.mm +++ b/desmume/src/cocoa/userinterface/DisplayWindowController.mm @@ -75,6 +75,15 @@ enum OGLVertexAttributeID OGLVertexAttributeID_TexCoord0 = 8 }; +#ifndef MAC_OS_X_VERSION_10_7 +// In Mac OS X, strnlen() is unsupported prior to v10.7, so define it here. +static size_t strnlen(const char *s, size_t n) +{ + const char *p = (const char *)memchr(s, 0, n); + return(p ? p-s : n); +} +#endif // MAC_OS_X_VERSION_10_7 + @implementation DisplayWindowController @synthesize emuControl; @@ -1310,10 +1319,11 @@ enum OGLVertexAttributeID - (BOOL) handleHIDQueue:(IOHIDQueueRef)hidQueue { BOOL isHandled = NO; - std::string inputStr; DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; InputAttributesList inputList = InputManagerEncodeHIDQueue(hidQueue); + char inputStr[INPUT_HANDLER_STRING_LENGTH*2]; + memset(inputStr, '\0', INPUT_HANDLER_STRING_LENGTH*2); const size_t inputCount = inputList.size(); @@ -1321,16 +1331,18 @@ enum OGLVertexAttributeID { const InputAttributes &inputAttr = inputList[i]; - if (inputAttr.inputState == INPUT_ATTRIBUTE_STATE_ON) + if (inputAttr.state == INPUT_ATTRIBUTE_STATE_ON) { - inputStr = inputAttr.deviceName + ":" + inputAttr.elementName; + strlcpy(inputStr, inputAttr.deviceName, INPUT_HANDLER_STRING_LENGTH*2); + strlcat(inputStr, ":", INPUT_HANDLER_STRING_LENGTH*2); + strlcat(inputStr, inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH*2); break; } } - if (!inputStr.empty()) + if (strnlen(inputStr, INPUT_HANDLER_STRING_LENGTH*2) != 0) { - [[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr.c_str() encoding:NSUTF8StringEncoding]]; + [[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr encoding:NSUTF8StringEncoding]]; } CommandAttributesList cmdList = [inputManager generateCommandListUsingInputList:&inputList]; @@ -1355,8 +1367,12 @@ enum OGLVertexAttributeID if (keyPressed && [theEvent window] != nil) { - std::string inputStr = inputAttr.deviceName + ":" + inputAttr.elementName; - [[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr.c_str() encoding:NSUTF8StringEncoding]]; + char inputStr[INPUT_HANDLER_STRING_LENGTH*2]; + strlcpy(inputStr, inputAttr.deviceName, INPUT_HANDLER_STRING_LENGTH*2); + strlcat(inputStr, ":", INPUT_HANDLER_STRING_LENGTH*2); + strlcat(inputStr, inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH*2); + + [[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr encoding:NSUTF8StringEncoding]]; } isHandled = [inputManager dispatchCommandUsingInputAttributes:&inputAttr]; @@ -1383,10 +1399,15 @@ enum OGLVertexAttributeID if (buttonPressed && [theEvent window] != nil) { char inputCoordBuf[256] = {0}; - snprintf(inputCoordBuf, 256, " X:%i Y:%i", (int)inputAttr.floatValue[0], (int)inputAttr.floatValue[1]); + snprintf(inputCoordBuf, 256, " X:%i Y:%i", (int)inputAttr.intCoordX, (int)inputAttr.intCoordY); - std::string inputStr = inputAttr.deviceName + ":" + inputAttr.elementName + std::string(inputCoordBuf); - [[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr.c_str() encoding:NSUTF8StringEncoding]]; + char inputStr[INPUT_HANDLER_STRING_LENGTH*2]; + strlcpy(inputStr, inputAttr.deviceName, INPUT_HANDLER_STRING_LENGTH*2); + strlcat(inputStr, ":", INPUT_HANDLER_STRING_LENGTH*2); + strlcat(inputStr, inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH*2); + strlcat(inputStr, inputCoordBuf, INPUT_HANDLER_STRING_LENGTH*2); + + [[windowController emuControl] setStatusText:[NSString stringWithCString:inputStr encoding:NSUTF8StringEncoding]]; } isHandled = [inputManager dispatchCommandUsingInputAttributes:&inputAttr]; diff --git a/desmume/src/cocoa/userinterface/EmuControllerDelegate.h b/desmume/src/cocoa/userinterface/EmuControllerDelegate.h index 2fb48b03b..863bedb73 100644 --- a/desmume/src/cocoa/userinterface/EmuControllerDelegate.h +++ b/desmume/src/cocoa/userinterface/EmuControllerDelegate.h @@ -65,6 +65,10 @@ NSInteger selectedExportRomSaveID; NSInteger selectedRomSaveTypeID; + CGFloat lastSetSpeedScalar; + BOOL isSoundMuted; + float lastSetVolumeValue; + NSImage *iconVolumeFull; NSImage *iconVolumeTwoThird; NSImage *iconVolumeOneThird; @@ -200,7 +204,7 @@ - (void) cmdCopyScreen:(NSValue *)cmdAttrValue; -- (void) cmdToggleSpeedScalar:(NSValue *)cmdAttrValue; +- (void) cmdHoldToggleSpeedScalar:(NSValue *)cmdAttrValue; - (void) cmdToggleSpeedLimiter:(NSValue *)cmdAttrValue; - (void) cmdToggleAutoFrameSkip:(NSValue *)cmdAttrValue; - (void) cmdToggleCheats:(NSValue *)cmdAttrValue; diff --git a/desmume/src/cocoa/userinterface/EmuControllerDelegate.mm b/desmume/src/cocoa/userinterface/EmuControllerDelegate.mm index aa9018659..4f6f27674 100644 --- a/desmume/src/cocoa/userinterface/EmuControllerDelegate.mm +++ b/desmume/src/cocoa/userinterface/EmuControllerDelegate.mm @@ -118,6 +118,10 @@ selectedRomSaveTypeID = ROMSAVETYPE_AUTOMATIC; selectedExportRomSaveID = 0; + lastSetSpeedScalar = 1.0f; + isSoundMuted = NO; + lastSetVolumeValue = MAX_VOLUME; + iconExecute = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]]; iconPause = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Pause_420x420" ofType:@"png"]]; iconSpeedNormal = [[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Speed1x_420x420" ofType:@"png"]]; @@ -275,14 +279,20 @@ else if (vol > 0.0f && vol <= VOLUME_THRESHOLD_LOW) { newImage = iconVolumeOneThird; + isSoundMuted = NO; + lastSetVolumeValue = vol; } else if (vol > VOLUME_THRESHOLD_LOW && vol <= VOLUME_THRESHOLD_HIGH) { newImage = iconVolumeTwoThird; + isSoundMuted = NO; + lastSetVolumeValue = vol; } else { newImage = iconVolumeFull; + isSoundMuted = NO; + lastSetVolumeValue = vol; } if (newImage != currentImage) @@ -639,14 +649,12 @@ - (IBAction) loadEmuSaveStateSlot:(id)sender { - const NSInteger slotNumber = [CocoaDSUtil getIBActionSenderTag:sender]; - [inputManager dispatchCommandUsingIBAction:_cmd tag:slotNumber]; + [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) saveEmuSaveStateSlot:(id)sender { - const NSInteger slotNumber = [CocoaDSUtil getIBActionSenderTag:sender]; - [inputManager dispatchCommandUsingIBAction:_cmd tag:slotNumber]; + [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) importRomSave:(id)sender @@ -708,22 +716,22 @@ - (IBAction) toggleExecutePause:(id)sender { - [inputManager dispatchCommandUsingIBAction:_cmd tag:0]; + [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) reset:(id)sender { - [inputManager dispatchCommandUsingIBAction:_cmd tag:0]; + [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) toggleSpeedLimiter:(id)sender { - [inputManager dispatchCommandUsingIBAction:_cmd tag:0]; + [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) toggleAutoFrameSkip:(id)sender { - [inputManager dispatchCommandUsingIBAction:_cmd tag:0]; + [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) toggleKeepMinDisplaySizeAtNormal:(id)sender @@ -753,8 +761,7 @@ - (IBAction) toggleGPUState:(id)sender { - const NSInteger bitNumber = [CocoaDSUtil getIBActionSenderTag:sender]; - [inputManager dispatchCommandUsingIBAction:_cmd tag:bitNumber]; + [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) changeRomSaveType:(id)sender @@ -768,13 +775,15 @@ - (IBAction) toggleCheats:(id)sender { - [inputManager dispatchCommandUsingIBAction:_cmd tag:0]; + [inputManager dispatchCommandUsingIBAction:_cmd sender:sender]; } - (IBAction) changeCoreSpeed:(id)sender { + CGFloat newSpeedScalar = (CGFloat)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0f; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; - [cdsCore setSpeedScalar:(CGFloat)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0f]; + [cdsCore setSpeedScalar:newSpeedScalar]; + lastSetSpeedScalar = newSpeedScalar; } - (IBAction) changeCoreEmuFlags:(id)sender @@ -985,14 +994,18 @@ [cmdAttrValue getValue:&cmdAttr]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; - NSUInteger controlID = (NSUInteger)cmdAttr.commandID; - BOOL theState = (cmdAttr.inputState == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO; + const NSUInteger controlID = cmdAttr.intValue[0]; + const BOOL theState = (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_ON) ? YES : NO; if (controlID == DSControllerState_Touch) { - NSPoint touchLoc = NSMakePoint(cmdAttr.floatValue[0], cmdAttr.floatValue[1]); + const NSPoint touchLoc = (cmdAttr.useInputForIntCoord) ? NSMakePoint(cmdAttr.input.intCoordX, cmdAttr.input.intCoordY) : NSMakePoint(cmdAttr.intValue[1], cmdAttr.intValue[2]); [[cdsCore cdsController] setTouchState:theState location:touchLoc]; } + else if (controlID == DSControllerState_Microphone) + { + [[cdsCore cdsController] setMicrophoneState:theState inputMode:cmdAttr.intValue[1]]; + } else { [[cdsCore cdsController] setControllerState:theState controlID:controlID]; @@ -1004,6 +1017,11 @@ CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; + if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) + { + return; + } + NSString *saveStatePath = [[CocoaDSFile saveStateURL] path]; if (saveStatePath == nil) { @@ -1011,7 +1029,7 @@ return; } - const NSInteger slotNumber = cmdAttr.integerValue[0]; + const NSInteger slotNumber = (cmdAttr.useInputForSender) ? [CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : cmdAttr.intValue[0]; if (slotNumber < 0 || slotNumber > MAX_SAVESTATE_SLOTS) { return; @@ -1037,6 +1055,11 @@ CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; + if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) + { + return; + } + NSString *saveStatePath = [[CocoaDSFile saveStateURL] path]; if (saveStatePath == nil) { @@ -1051,7 +1074,7 @@ return; } - const NSInteger slotNumber = cmdAttr.integerValue[0]; + const NSInteger slotNumber = (cmdAttr.useInputForSender) ? [CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : cmdAttr.intValue[0]; if (slotNumber < 0 || slotNumber > MAX_SAVESTATE_SLOTS) { return; @@ -1077,18 +1100,26 @@ [mainWindow copy:nil]; } -- (void) cmdToggleSpeedScalar:(NSValue *)cmdAttrValue +- (void) cmdHoldToggleSpeedScalar:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; - CGFloat speedScalar = cmdAttr.floatValue[0]; - + const float speedScalar = (cmdAttr.useInputForScalar) ? cmdAttr.input.scalar : cmdAttr.floatValue[0]; CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; - [cdsCore setSpeedScalar:speedScalar]; + + [cdsCore setSpeedScalar:(cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) ? lastSetSpeedScalar : speedScalar]; } - (void) cmdToggleSpeedLimiter:(NSValue *)cmdAttrValue { + CommandAttributes cmdAttr; + [cmdAttrValue getValue:&cmdAttr]; + + if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) + { + return; + } + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore isSpeedLimitEnabled]) @@ -1105,6 +1136,14 @@ - (void) cmdToggleAutoFrameSkip:(NSValue *)cmdAttrValue { + CommandAttributes cmdAttr; + [cmdAttrValue getValue:&cmdAttr]; + + if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) + { + return; + } + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore isFrameSkipEnabled]) @@ -1121,6 +1160,14 @@ - (void) cmdToggleCheats:(NSValue *)cmdAttrValue { + CommandAttributes cmdAttr; + [cmdAttrValue getValue:&cmdAttr]; + + if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) + { + return; + } + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore isCheatingEnabled]) @@ -1137,14 +1184,19 @@ - (void) cmdToggleExecutePause:(NSValue *)cmdAttrValue { + CommandAttributes cmdAttr; + [cmdAttrValue getValue:&cmdAttr]; + + if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF || [self currentRom] == nil) + { + return; + } + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; if ([cdsCore coreState] == CORESTATE_PAUSE) { - if ([self currentRom] != nil) - { - [self executeCore]; - } + [self executeCore]; } else { @@ -1154,7 +1206,10 @@ - (void) cmdReset:(NSValue *)cmdAttrValue { - if ([self currentRom] == nil) + CommandAttributes cmdAttr; + [cmdAttrValue getValue:&cmdAttr]; + + if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF || [self currentRom] == nil) { return; } @@ -1187,13 +1242,46 @@ } } +- (void) cmdToggleMute:(NSValue *)cmdAttrValue +{ + CommandAttributes cmdAttr; + [cmdAttrValue getValue:&cmdAttr]; + + if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) + { + return; + } + + float vol = 0.0f; + + if (isSoundMuted) + { + isSoundMuted = NO; + vol = lastSetVolumeValue; + [self setStatusText:@"Sound unmuted."]; + } + else + { + isSoundMuted = YES; + [self setStatusText:@"Sound muted."]; + } + + [self setCurrentVolumeValue:vol]; + [CocoaDSUtil messageSendOneWayWithFloat:[cdsSpeaker receivePort] msgID:MESSAGE_SET_VOLUME floatValue:vol]; +} + - (void) cmdToggleGPUState:(NSValue *)cmdAttrValue { CommandAttributes cmdAttr; [cmdAttrValue getValue:&cmdAttr]; + if (cmdAttr.input.state == INPUT_ATTRIBUTE_STATE_OFF) + { + return; + } + CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; - const NSInteger bitNumber = cmdAttr.integerValue[0]; + const NSInteger bitNumber = (cmdAttr.useInputForSender) ? [CocoaDSUtil getIBActionSenderTag:cmdAttr.input.sender] : cmdAttr.intValue[0]; const UInt32 flagBit = [cdsCore.cdsGPU gpuStateFlags] ^ (1 << bitNumber); [cdsCore.cdsGPU setGpuStateFlags:flagBit]; @@ -1837,13 +1925,9 @@ [(NSMenuItem*)theItem setState:NSOnState]; } } - else if (speedScalar == [theItem tag]) - { - [(NSMenuItem*)theItem setState:NSOnState]; - } else { - [(NSMenuItem*)theItem setState:NSOffState]; + [(NSMenuItem*)theItem setState:(speedScalar == [theItem tag]) ? NSOnState : NSOffState]; } } else if ([(id)theItem isMemberOfClass:[NSToolbarItem class]]) @@ -1866,56 +1950,28 @@ { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - if ([cdsCore isSpeedLimitEnabled]) - { - [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_DISABLE_SPEED_LIMIT]; - } - else - { - [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_ENABLE_SPEED_LIMIT]; - } + [(NSMenuItem*)theItem setTitle:([cdsCore isSpeedLimitEnabled]) ? NSSTRING_TITLE_DISABLE_SPEED_LIMIT : NSSTRING_TITLE_ENABLE_SPEED_LIMIT]; } } else if (theAction == @selector(toggleAutoFrameSkip:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - if ([cdsCore isFrameSkipEnabled]) - { - [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_DISABLE_AUTO_FRAME_SKIP]; - } - else - { - [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_ENABLE_AUTO_FRAME_SKIP]; - } + [(NSMenuItem*)theItem setTitle:([cdsCore isFrameSkipEnabled]) ? NSSTRING_TITLE_DISABLE_AUTO_FRAME_SKIP : NSSTRING_TITLE_ENABLE_AUTO_FRAME_SKIP]; } } - else if (theAction == @selector(cheatsDisable:)) + else if (theAction == @selector(toggleCheats:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - if ([cdsCore isCheatingEnabled]) - { - [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_DISABLE_CHEATS]; - } - else - { - [(NSMenuItem*)theItem setTitle:NSSTRING_TITLE_ENABLE_CHEATS]; - } + [(NSMenuItem*)theItem setTitle:([cdsCore isCheatingEnabled]) ? NSSTRING_TITLE_DISABLE_CHEATS : NSSTRING_TITLE_ENABLE_CHEATS]; } } else if (theAction == @selector(changeRomSaveType:)) { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - if ([self selectedRomSaveTypeID] == [theItem tag]) - { - [(NSMenuItem*)theItem setState:NSOnState]; - } - else - { - [(NSMenuItem*)theItem setState:NSOffState]; - } + [(NSMenuItem*)theItem setState:([self selectedRomSaveTypeID] == [theItem tag]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(openEmuSaveState:) || @@ -1940,14 +1996,7 @@ { if ([(id)theItem isMemberOfClass:[NSMenuItem class]]) { - if ([cdsCore.cdsGPU gpuStateByBit:[theItem tag]]) - { - [(NSMenuItem*)theItem setState:NSOnState]; - } - else - { - [(NSMenuItem*)theItem setState:NSOffState]; - } + [(NSMenuItem*)theItem setState:([cdsCore.cdsGPU gpuStateByBit:[theItem tag]]) ? NSOnState : NSOffState]; } } else if (theAction == @selector(changeScale:)) @@ -1979,13 +2028,9 @@ [(NSMenuItem*)theItem setState:NSOnState]; } } - else if (viewRotation == [theItem tag]) - { - [(NSMenuItem*)theItem setState:NSOnState]; - } else { - [(NSMenuItem*)theItem setState:NSOffState]; + [(NSMenuItem*)theItem setState:(viewRotation == [theItem tag]) ? NSOnState : NSOffState]; } } } diff --git a/desmume/src/cocoa/userinterface/InputManager.h b/desmume/src/cocoa/userinterface/InputManager.h index 7a59d48ec..c7b41e025 100644 --- a/desmume/src/cocoa/userinterface/InputManager.h +++ b/desmume/src/cocoa/userinterface/InputManager.h @@ -23,9 +23,9 @@ #include #include -#define INPUT_HANDLER_MAX_ATTRIBUTE_VALUES 4 +#define INPUT_HANDLER_STRING_LENGTH 256 -enum +enum InputAttributeState { INPUT_ATTRIBUTE_STATE_OFF = 0, INPUT_ATTRIBUTE_STATE_ON, @@ -46,38 +46,41 @@ enum typedef struct { - std::string deviceName; - std::string deviceCode; - std::string elementName; - std::string elementCode; + char deviceName[INPUT_HANDLER_STRING_LENGTH]; + char deviceCode[INPUT_HANDLER_STRING_LENGTH]; + char elementName[INPUT_HANDLER_STRING_LENGTH]; + char elementCode[INPUT_HANDLER_STRING_LENGTH]; - NSInteger inputState; - - NSInteger integerValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES]; - CGFloat floatValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES]; - id object[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES]; + InputAttributeState state; // The input state that is sent on command dispatch + int32_t intCoordX; // The X-coordinate as an int for commands that require a location + int32_t intCoordY; // The Y-coordinate as an int for commands that require a location + float floatCoordX; // The X-coordinate as a float for commands that require a location + float floatCoordY; // The Y-coordinate as a float for commands that require a location + float scalar; // A scalar value for commands that require a scalar + id sender; // An object for commands that require an object } InputAttributes; typedef struct { - SEL selector; - NSInteger commandID; - NSInteger inputState; + char tag[INPUT_HANDLER_STRING_LENGTH]; // A string identifier for these attributes + SEL selector; // The selector that is called on command dispatch + int32_t intValue[4]; // Context dependent int values + float floatValue[4]; // Context dependent float values + id object[4]; // Context dependent objects - NSInteger integerValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES]; - BOOL useIntegerInputValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES]; + bool useInputForIntCoord; // The command will prefer the input device's int coordinate + bool useInputForFloatCoord; // The command will prefer the input device's float coordinate + bool useInputForScalar; // The command will prefer the input device's scalar + bool useInputForSender; // The command will prefer the input device's sender - CGFloat floatValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES]; - BOOL useFloatInputValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES]; - - id object[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES]; - BOOL useObjectInputValue[INPUT_HANDLER_MAX_ATTRIBUTE_VALUES]; + InputAttributes input; // The input device's attributes } CommandAttributes; typedef std::vector InputAttributesList; typedef std::vector CommandAttributesList; -typedef std::tr1::unordered_map CommandTagMap; // Key = Input key in deviceCode:elementCode format, Value = Command Tag +typedef std::tr1::unordered_map InputCommandMap; // Key = Input key in deviceCode:elementCode format, Value = CommandAttributes typedef std::tr1::unordered_map CommandAttributesMap; // Key = Command Tag, Value = CommandAttributes +typedef std::tr1::unordered_map CommandSelectorMap; // Key = Command Tag, Value = Obj-C Selector #pragma mark - @interface InputHIDDevice : NSObject @@ -141,36 +144,58 @@ void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSen @interface InputManager : NSObject { EmuControllerDelegate *emuControl; + NSOutlineView *inputPrefsOutlineView; id hidInputTarget; InputHIDManager *hidManager; - - CommandTagMap commandMap; - CommandAttributesMap commandMasterList; + NSMutableDictionary *inputMappings; + + InputCommandMap commandMap; + CommandAttributesMap defaultCommandAttributes; + CommandSelectorMap commandSelector; } -@property (assign) IBOutlet EmuControllerDelegate *emuControl; +@property (readonly) IBOutlet EmuControllerDelegate *emuControl; +@property (readonly) IBOutlet NSOutlineView *inputPrefsOutlineView; @property (retain) id hidInputTarget; +@property (retain) NSMutableDictionary *inputMappings; - (void) addMappingsUsingUserDefaults; -- (void) addMappingUsingDeviceInfoDictionary:(NSDictionary *)deviceDict commandTag:(const char *)commandTag; -- (void) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(const char *)commandTag; -- (void) addMappingUsingInputList:(const InputAttributesList *)inputList commandTag:(const char *)commandTag; -- (void) addMappingForIBAction:(const SEL)theSelector commandTag:(const char *)commandTag; -- (void) addMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode commandTag:(const char *)commandTag; +- (void) addMappingUsingDeviceInfoDictionary:(NSDictionary *)deviceDict commandAttributes:(const CommandAttributes *)cmdAttr; +- (void) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandAttributes:(const CommandAttributes *)cmdAttr; +- (void) addMappingUsingInputList:(const InputAttributesList *)inputList commandAttributes:(const CommandAttributes *)cmdAttr; +- (void) addMappingForIBAction:(const SEL)theSelector commandAttributes:(const CommandAttributes *)cmdAttr; +- (void) addMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode commandAttributes:(const CommandAttributes *)cmdAttr; - (void) removeMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode; -- (void) removeAllMappingsOfCommandTag:(const char *)commandTag; +- (void) removeAllMappingsForCommandTag:(const char *)commandTag; - (CommandAttributesList) generateCommandListUsingInputList:(const InputAttributesList *)inputList; - (void) dispatchCommandList:(const CommandAttributesList *)cmdList; - (BOOL) dispatchCommandUsingInputAttributes:(const InputAttributes *)inputAttr; -- (BOOL) dispatchCommandUsingIBAction:(const SEL)theSelector tag:(const NSInteger)tagValue; +- (BOOL) dispatchCommandUsingIBAction:(const SEL)theSelector sender:(id)sender; -- (void) writeUserDefaultsMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(const char *)commandTag; +- (void) writeDefaultsInputMappings; +- (SEL) selectorOfCommandTag:(const char *)commandTag; +- (CommandAttributes) defaultCommandAttributesForCommandTag:(const char *)commandTag; + +- (CommandAttributes) mappedCommandAttributesOfDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode; +- (void) setMappedCommandAttributes:(const CommandAttributes *)cmdAttr deviceCode:(const char *)deviceCode elementCode:(const char *)elementCode; +- (void) updateInputSettingsSummaryInDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo commandTag:(const char *)commandTag; + +CommandAttributes NewDefaultCommandAttributes(const char *commandTag); +CommandAttributes NewCommandAttributesForSelector(const char *commandTag, const SEL theSelector); +CommandAttributes NewCommandAttributesForDSControl(const char *commandTag, const NSUInteger controlID); +void UpdateCommandAttributesWithDeviceInfoDictionary(CommandAttributes *cmdAttr, NSDictionary *deviceInfo); + +NSDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes *cmdAttr, + NSString *deviceCode, + NSString *deviceName, + NSString *elementCode, + NSString *elementName); InputAttributesList InputManagerEncodeHIDQueue(const IOHIDQueueRef hidQueue); InputAttributes InputManagerEncodeKeyboardInput(const unsigned short keyCode, BOOL keyPressed); InputAttributes InputManagerEncodeMouseButtonInput(const NSInteger buttonNumber, const NSPoint touchLoc, BOOL buttonPressed); -InputAttributes InputManagerEncodeIBAction(const SEL theSelector, const NSInteger tagValue); +InputAttributes InputManagerEncodeIBAction(const SEL theSelector, id sender); @end diff --git a/desmume/src/cocoa/userinterface/InputManager.mm b/desmume/src/cocoa/userinterface/InputManager.mm index 21189d840..ac84d916f 100644 --- a/desmume/src/cocoa/userinterface/InputManager.mm +++ b/desmume/src/cocoa/userinterface/InputManager.mm @@ -19,6 +19,7 @@ #import "InputManager.h" #import "EmuControllerDelegate.h" +#import "cocoa_globals.h" #import "cocoa_input.h" #import "cocoa_util.h" @@ -63,6 +64,15 @@ extern "C" #endif // !__LP64__ || MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 +#ifndef MAC_OS_X_VERSION_10_7 +// In Mac OS X, strnlen() is unsupported prior to v10.7, so define it here. +static size_t strnlen(const char *s, size_t n) +{ + const char *p = (const char *)memchr(s, 0, n); + return(p ? p-s : n); +} +#endif // MAC_OS_X_VERSION_10_7 + #pragma mark - @implementation InputHIDDevice @@ -217,22 +227,17 @@ InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef, const char return inputAttr; } - char deviceCodeBuf[256] = {0}; - char deviceNameBuf[256] = {0}; - char elementCodeBuf[256] = {0}; - char elementNameBuf[256] = {0}; - IOHIDElementRef hidElementRef = IOHIDValueGetElement(hidValueRef); NSInteger elementUsagePage = IOHIDElementGetUsagePage(hidElementRef); NSInteger elementUsage = IOHIDElementGetUsage(hidElementRef); if (altElementCode == NULL) { - snprintf(elementCodeBuf, 256, "0x%04lX/0x%04lX", (long)elementUsagePage, (long)elementUsage); + snprintf(inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH, "0x%04lX/0x%04lX", (long)elementUsagePage, (long)elementUsage); } else { - strncpy(elementCodeBuf, altElementCode, 256); + strncpy(inputAttr.elementCode, altElementCode, INPUT_HANDLER_STRING_LENGTH); } if (altElementName == NULL) @@ -242,11 +247,11 @@ InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef, const char { if (elementUsagePage == kHIDPage_Button) { - snprintf(elementNameBuf, 256, "Button %li", (long)elementUsage); + snprintf(inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH, "Button %li", (long)elementUsage); } else if (elementUsagePage == kHIDPage_VendorDefinedStart) { - snprintf(elementNameBuf, 256, "VendorDefined %li", (long)elementUsage); + snprintf(inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH, "VendorDefined %li", (long)elementUsage); } else { @@ -255,18 +260,18 @@ InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef, const char NSString *elementNameLookup = (NSString *)[elementUsagePageDict valueForKey:[NSString stringWithFormat:@"0x%04lX", (long)elementUsage]]; if (elementNameLookup != nil) { - strncpy(elementNameBuf, [elementNameLookup cStringUsingEncoding:NSUTF8StringEncoding], 256); + strncpy(inputAttr.elementName, [elementNameLookup cStringUsingEncoding:NSUTF8StringEncoding], 256); } } } else { - CFStringGetCString(cfElementName, elementNameBuf, 256, kCFStringEncodingUTF8); + CFStringGetCString(cfElementName, inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH, kCFStringEncodingUTF8); } } else { - strncpy(elementNameBuf, altElementName, 256); + strncpy(inputAttr.elementName, altElementName, INPUT_HANDLER_STRING_LENGTH); } IOHIDDeviceRef hidDeviceRef = IOHIDElementGetDevice(hidElementRef); @@ -286,35 +291,37 @@ InputAttributes InputAttributesOfHIDValue(IOHIDValueRef hidValueRef, const char SInt32 locationID = 0; CFNumberGetValue(cfLocationIDNumber, kCFNumberSInt32Type, &locationID); - snprintf(deviceCodeBuf, 256, "%d/%d/0x%08X", (int)vendorID, (int)productID, (unsigned int)locationID); + snprintf(inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH, "%d/%d/0x%08X", (int)vendorID, (int)productID, (unsigned int)locationID); } else { char cfDeviceCodeBuf[256] = {0}; CFStringGetCString(cfDeviceCode, cfDeviceCodeBuf, 256, kCFStringEncodingUTF8); - snprintf(deviceCodeBuf, 256, "%d/%d/%s", (int)vendorID, (int)productID, cfDeviceCodeBuf); + snprintf(inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH, "%d/%d/%s", (int)vendorID, (int)productID, cfDeviceCodeBuf); } CFStringRef cfDeviceName = (CFStringRef)IOHIDDeviceGetProperty(hidDeviceRef, CFSTR(kIOHIDProductKey)); if (cfDeviceName == nil) { - strncpy(deviceNameBuf, deviceCodeBuf, 256); + strncpy(inputAttr.deviceName, inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH); } else { - CFStringGetCString(cfDeviceName, deviceNameBuf, 256, kCFStringEncodingUTF8); + CFStringGetCString(cfDeviceName, inputAttr.deviceName, INPUT_HANDLER_STRING_LENGTH, kCFStringEncodingUTF8); } BOOL onState = (altOnState == nil) ? GetOnStateFromHIDValueRef(hidValueRef) : [altOnState boolValue]; CFIndex logicalValue = IOHIDValueGetIntegerValue(hidValueRef); + NSInteger logicalMin = IOHIDElementGetLogicalMin(hidElementRef); + NSInteger logicalMax = IOHIDElementGetLogicalMax(hidElementRef); - inputAttr.deviceCode = std::string(deviceCodeBuf); - inputAttr.deviceName = std::string(deviceNameBuf); - inputAttr.elementCode = std::string(elementCodeBuf); - inputAttr.elementName = std::string(elementNameBuf); - inputAttr.inputState = (onState) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; - inputAttr.integerValue[0] = (NSInteger)logicalValue; - inputAttr.floatValue[0] = (CGFloat)logicalValue; + inputAttr.state = (onState) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; + inputAttr.intCoordX = 0; + inputAttr.intCoordY = 0; + inputAttr.floatCoordX = 0.0f; + inputAttr.floatCoordY = 0.0f; + inputAttr.scalar = (float)(logicalValue - logicalMin) / (float)(logicalMax - logicalMin); + inputAttr.sender = nil; return inputAttr; } @@ -788,7 +795,9 @@ void HandleDeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSen @implementation InputManager @synthesize emuControl; +@synthesize inputPrefsOutlineView; @dynamic hidInputTarget; +@synthesize inputMappings; static std::tr1::unordered_map keyboardNameTable; // Key = Key code, Value = Key name @@ -813,76 +822,116 @@ static std::tr1::unordered_map keyboardNameTable; / } hidManager = [[InputHIDManager alloc] initWithInputManager:self]; + inputMappings = [[NSMutableDictionary dictionaryWithCapacity:128] retain]; - // Initialize the master command list. - CommandAttributes cmdDSControlRight = {@selector(cmdUpdateDSController:), DSControllerState_Right, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlLeft = {@selector(cmdUpdateDSController:), DSControllerState_Left, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlDown = {@selector(cmdUpdateDSController:), DSControllerState_Down, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlUp = {@selector(cmdUpdateDSController:), DSControllerState_Up, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlSelect = {@selector(cmdUpdateDSController:), DSControllerState_Select, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlStart = {@selector(cmdUpdateDSController:), DSControllerState_Start, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlB = {@selector(cmdUpdateDSController:), DSControllerState_B, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlA = {@selector(cmdUpdateDSController:), DSControllerState_A, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlY = {@selector(cmdUpdateDSController:), DSControllerState_Y, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlX = {@selector(cmdUpdateDSController:), DSControllerState_X, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlL = {@selector(cmdUpdateDSController:), DSControllerState_L, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlR = {@selector(cmdUpdateDSController:), DSControllerState_R, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlDebug = {@selector(cmdUpdateDSController:), DSControllerState_Debug, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlLid = {@selector(cmdUpdateDSController:), DSControllerState_Lid, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlTouch = {@selector(cmdUpdateDSController:), DSControllerState_Touch, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {YES, YES, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdDSControlMic = {@selector(cmdUpdateDSController:), DSControllerState_Microphone, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; + // Initialize the selectors used for each command tag. (Do this in code rather than in an external file.) + commandSelector["Up"] = @selector(cmdUpdateDSController:); + commandSelector["Down"] = @selector(cmdUpdateDSController:); + commandSelector["Right"] = @selector(cmdUpdateDSController:); + commandSelector["Left"] = @selector(cmdUpdateDSController:); + commandSelector["A"] = @selector(cmdUpdateDSController:); + commandSelector["B"] = @selector(cmdUpdateDSController:); + commandSelector["X"] = @selector(cmdUpdateDSController:); + commandSelector["Y"] = @selector(cmdUpdateDSController:); + commandSelector["L"] = @selector(cmdUpdateDSController:); + commandSelector["R"] = @selector(cmdUpdateDSController:); + commandSelector["Start"] = @selector(cmdUpdateDSController:); + commandSelector["Select"] = @selector(cmdUpdateDSController:); + commandSelector["Touch"] = @selector(cmdUpdateDSController:); + commandSelector["Microphone"] = @selector(cmdUpdateDSController:); + commandSelector["Debug"] = @selector(cmdUpdateDSController:); + commandSelector["Lid"] = @selector(cmdUpdateDSController:); - CommandAttributes cmdLoadEmuSaveStateSlot = {@selector(cmdLoadEmuSaveStateSlot:), 0, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {YES, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdSaveEmuSaveStateSlot = {@selector(cmdSaveEmuSaveStateSlot:), 0, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {YES, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdCopyScreen = {@selector(cmdCopyScreen:), 0, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdToggleSpeedHalf = {@selector(cmdToggleSpeedScalar:), 0, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.5f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdToggleSpeedDouble = {@selector(cmdToggleSpeedScalar:), 0, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {2.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdToggleSpeedLimiter = {@selector(cmdToggleSpeedLimiter:), 0, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdToggleAutoFrameSkip = {@selector(cmdToggleAutoFrameSkip:), 0, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdToggleCheats = {@selector(cmdToggleCheats:), 0, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdToggleExecutePause = {@selector(cmdToggleExecutePause:), 0, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdReset = {@selector(cmdReset:), 0, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {NO, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; - CommandAttributes cmdToggleGPUState = {@selector(cmdToggleGPUState:), 0, INPUT_ATTRIBUTE_STATE_OFF, {0, 0, 0, 0}, {YES, NO, NO, NO}, {0.0f, 0.0f, 0.0f, 0.0f}, {NO, NO, NO, NO}, {NULL, NULL, NULL, NULL}, {NO, NO, NO, NO}}; + commandSelector["Load State Slot"] = @selector(cmdLoadEmuSaveStateSlot:); + commandSelector["Save State Slot"] = @selector(cmdSaveEmuSaveStateSlot:); + commandSelector["Copy Screen"] = @selector(cmdCopyScreen:); + commandSelector["Set Speed"] = @selector(cmdHoldToggleSpeedScalar:); + commandSelector["Enable/Disable Speed Limiter"] = @selector(cmdToggleSpeedLimiter:); + commandSelector["Enable/Disable Auto Frame Skip"] = @selector(cmdToggleAutoFrameSkip:); + commandSelector["Enable/Disable Cheats"] = @selector(cmdToggleCheats:); + commandSelector["Execute/Pause"] = @selector(cmdToggleExecutePause:); + commandSelector["Reset"] = @selector(cmdReset:); + commandSelector["Mute/Unmute"] = @selector(cmdToggleMute:); + commandSelector["Enable/Disable GPU State"] = @selector(cmdToggleGPUState:); - commandMasterList["Up"] = cmdDSControlUp; - commandMasterList["Down"] = cmdDSControlDown; - commandMasterList["Right"] = cmdDSControlRight; - commandMasterList["Left"] = cmdDSControlLeft; - commandMasterList["A"] = cmdDSControlA; - commandMasterList["B"] = cmdDSControlB; - commandMasterList["X"] = cmdDSControlX; - commandMasterList["Y"] = cmdDSControlY; - commandMasterList["L"] = cmdDSControlL; - commandMasterList["R"] = cmdDSControlR; - commandMasterList["Start"] = cmdDSControlStart; - commandMasterList["Select"] = cmdDSControlSelect; - commandMasterList["Touch"] = cmdDSControlTouch; - commandMasterList["Microphone"] = cmdDSControlMic; - commandMasterList["Debug"] = cmdDSControlDebug; - commandMasterList["Lid"] = cmdDSControlLid; + // Generate the default command attributes for each command tag. (Do this in code rather than in an external file.) + CommandAttributes cmdDSControlRight = NewCommandAttributesForDSControl("Right", DSControllerState_Right); + CommandAttributes cmdDSControlLeft = NewCommandAttributesForDSControl("Left", DSControllerState_Left); + CommandAttributes cmdDSControlDown = NewCommandAttributesForDSControl("Down", DSControllerState_Down); + CommandAttributes cmdDSControlUp = NewCommandAttributesForDSControl("Up", DSControllerState_Up); + CommandAttributes cmdDSControlSelect = NewCommandAttributesForDSControl("Select", DSControllerState_Select); + CommandAttributes cmdDSControlStart = NewCommandAttributesForDSControl("Start", DSControllerState_Start); + CommandAttributes cmdDSControlB = NewCommandAttributesForDSControl("B", DSControllerState_B); + CommandAttributes cmdDSControlA = NewCommandAttributesForDSControl("A", DSControllerState_A); + CommandAttributes cmdDSControlY = NewCommandAttributesForDSControl("Y", DSControllerState_Y); + CommandAttributes cmdDSControlX = NewCommandAttributesForDSControl("X", DSControllerState_X); + CommandAttributes cmdDSControlL = NewCommandAttributesForDSControl("L", DSControllerState_L); + CommandAttributes cmdDSControlR = NewCommandAttributesForDSControl("R", DSControllerState_R); + CommandAttributes cmdDSControlDebug = NewCommandAttributesForDSControl("Debug", DSControllerState_Debug); + CommandAttributes cmdDSControlLid = NewCommandAttributesForDSControl("Lid", DSControllerState_Lid); - commandMasterList["Load State Slot"] = cmdLoadEmuSaveStateSlot; - commandMasterList["Save State Slot"] = cmdSaveEmuSaveStateSlot; - commandMasterList["Copy Screen"] = cmdCopyScreen; - commandMasterList["Speed Half"] = cmdToggleSpeedHalf; - commandMasterList["Speed Double"] = cmdToggleSpeedDouble; - commandMasterList["Enable/Disable Speed Limiter"] = cmdToggleSpeedLimiter; - commandMasterList["Enable/Disable Auto Frame Skip"] = cmdToggleAutoFrameSkip; - commandMasterList["Enable/Disable Cheats"] = cmdToggleCheats; - commandMasterList["Execute/Pause"] = cmdToggleExecutePause; - commandMasterList["Reset"] = cmdReset; - commandMasterList["Enable/Disable GPU State"] = cmdToggleGPUState; + CommandAttributes cmdDSControlTouch = NewCommandAttributesForDSControl("Touch", DSControllerState_Touch); + cmdDSControlTouch.useInputForIntCoord = true; - [self addMappingForIBAction:@selector(loadEmuSaveStateSlot:) commandTag:"Load State Slot"]; - [self addMappingForIBAction:@selector(saveEmuSaveStateSlot:) commandTag:"Save State Slot"]; - [self addMappingForIBAction:@selector(toggleSpeedHalf:) commandTag:"Speed Half"]; - [self addMappingForIBAction:@selector(toggleSpeedDouble:) commandTag:"Speed Double"]; - [self addMappingForIBAction:@selector(toggleSpeedLimiter:) commandTag:"Enable/Disable Speed Limiter"]; - [self addMappingForIBAction:@selector(toggleAutoFrameSkip:) commandTag:"Enable/Disable Auto Frame Skip"]; - [self addMappingForIBAction:@selector(toggleCheats:) commandTag:"Enable/Disable Cheats"]; - [self addMappingForIBAction:@selector(toggleExecutePause:) commandTag:"Execute/Pause"]; - [self addMappingForIBAction:@selector(reset:) commandTag:"Reset"]; - [self addMappingForIBAction:@selector(cmdToggleGPUState:) commandTag:"Enable/Disable GPU State"]; + CommandAttributes cmdDSControlMic = NewCommandAttributesForDSControl("Microphone", DSControllerState_Microphone); + cmdDSControlMic.intValue[1] = MICMODE_INTERNAL_NOISE; + + CommandAttributes cmdLoadEmuSaveStateSlot = NewCommandAttributesForSelector("Load State Slot", commandSelector["Load State Slot"]); + CommandAttributes cmdSaveEmuSaveStateSlot = NewCommandAttributesForSelector("Save State Slot", commandSelector["Save State Slot"]); + CommandAttributes cmdCopyScreen = NewCommandAttributesForSelector("Copy Screen", commandSelector["Copy Screen"]); + + CommandAttributes cmdToggleSpeed = NewCommandAttributesForSelector("Set Speed", commandSelector["Set Speed"]); + cmdToggleSpeed.floatValue[0] = 1.0f; + + CommandAttributes cmdToggleSpeedLimiter = NewCommandAttributesForSelector("Enable/Disable Speed Limiter", commandSelector["Enable/Disable Speed Limiter"]); + CommandAttributes cmdToggleAutoFrameSkip = NewCommandAttributesForSelector("Enable/Disable Auto Frame Skip", commandSelector["Enable/Disable Auto Frame Skip"]); + CommandAttributes cmdToggleCheats = NewCommandAttributesForSelector("Enable/Disable Cheats", commandSelector["Enable/Disable Cheats"]); + CommandAttributes cmdToggleExecutePause = NewCommandAttributesForSelector("Execute/Pause", commandSelector["Execute/Pause"]); + CommandAttributes cmdReset = NewCommandAttributesForSelector("Reset", commandSelector["Reset"]); + CommandAttributes cmdToggleMute = NewCommandAttributesForSelector("Mute/Unmute", commandSelector["Mute/Unmute"]); + CommandAttributes cmdToggleGPUState = NewCommandAttributesForSelector("Enable/Disable GPU State", commandSelector["Enable/Disable GPU State"]); + + defaultCommandAttributes["Up"] = cmdDSControlUp; + defaultCommandAttributes["Down"] = cmdDSControlDown; + defaultCommandAttributes["Right"] = cmdDSControlRight; + defaultCommandAttributes["Left"] = cmdDSControlLeft; + defaultCommandAttributes["A"] = cmdDSControlA; + defaultCommandAttributes["B"] = cmdDSControlB; + defaultCommandAttributes["X"] = cmdDSControlX; + defaultCommandAttributes["Y"] = cmdDSControlY; + defaultCommandAttributes["L"] = cmdDSControlL; + defaultCommandAttributes["R"] = cmdDSControlR; + defaultCommandAttributes["Start"] = cmdDSControlStart; + defaultCommandAttributes["Select"] = cmdDSControlSelect; + defaultCommandAttributes["Touch"] = cmdDSControlTouch; + defaultCommandAttributes["Microphone"] = cmdDSControlMic; + defaultCommandAttributes["Debug"] = cmdDSControlDebug; + defaultCommandAttributes["Lid"] = cmdDSControlLid; + + defaultCommandAttributes["Load State Slot"] = cmdLoadEmuSaveStateSlot; + defaultCommandAttributes["Save State Slot"] = cmdSaveEmuSaveStateSlot; + defaultCommandAttributes["Copy Screen"] = cmdCopyScreen; + defaultCommandAttributes["Set Speed"] = cmdToggleSpeed; + defaultCommandAttributes["Enable/Disable Speed Limiter"] = cmdToggleSpeedLimiter; + defaultCommandAttributes["Enable/Disable Auto Frame Skip"] = cmdToggleAutoFrameSkip; + defaultCommandAttributes["Enable/Disable Cheats"] = cmdToggleCheats; + defaultCommandAttributes["Execute/Pause"] = cmdToggleExecutePause; + defaultCommandAttributes["Reset"] = cmdReset; + defaultCommandAttributes["Mute/Unmute"] = cmdToggleMute; + defaultCommandAttributes["Enable/Disable GPU State"] = cmdToggleGPUState; + + // Map all IBActions (the target object is an EmuControllerDelegate) + [self addMappingForIBAction:@selector(loadEmuSaveStateSlot:) commandAttributes:&cmdLoadEmuSaveStateSlot]; + [self addMappingForIBAction:@selector(saveEmuSaveStateSlot:) commandAttributes:&cmdSaveEmuSaveStateSlot]; + [self addMappingForIBAction:@selector(copy:) commandAttributes:&cmdCopyScreen]; + [self addMappingForIBAction:@selector(toggleSpeedLimiter:) commandAttributes:&cmdToggleSpeedLimiter]; + [self addMappingForIBAction:@selector(toggleAutoFrameSkip:) commandAttributes:&cmdToggleAutoFrameSkip]; + [self addMappingForIBAction:@selector(toggleCheats:) commandAttributes:&cmdToggleCheats]; + [self addMappingForIBAction:@selector(toggleExecutePause:) commandAttributes:&cmdToggleExecutePause]; + [self addMappingForIBAction:@selector(reset:) commandAttributes:&cmdReset]; + [self addMappingForIBAction:@selector(toggleGPUState:) commandAttributes:&cmdToggleGPUState]; + + [self addMappingsUsingUserDefaults]; return self; } @@ -890,6 +939,7 @@ static std::tr1::unordered_map keyboardNameTable; / - (void)dealloc { [hidManager release]; + [self setInputMappings:nil]; [super dealloc]; } @@ -911,81 +961,129 @@ static std::tr1::unordered_map keyboardNameTable; / - (void) addMappingsUsingUserDefaults { // Check to see if the DefaultKeyMappings.plist files exists. - NSDictionary *defaultMappings = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]]; + NSDictionary *defaultKeyMappingsDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]]; + if (defaultKeyMappingsDict == nil) + { + return; + } + + NSDictionary *defaultMappings = [defaultKeyMappingsDict valueForKey:@"DefaultInputMappings"]; if (defaultMappings == nil) { return; } - NSDictionary *userMappings = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"]; - if (userMappings == nil) + NSArray *commandTagList = [defaultKeyMappingsDict valueForKey:@"CommandTagList"]; + if (commandTagList == nil) { - // If the input mappings does not exist in the user's preferences file, then copy all the mappings from the - // DefaultKeyMappings.plist file to the preferences file. - [[NSUserDefaults standardUserDefaults] setObject:defaultMappings forKey:@"Input_ControllerMappings"]; + return; } - else + + // At this point, we need to check every key in the user's preference file and make sure that all the keys + // exist. The keys that must exist are all listed in the DefaultKeyMappings.plist file. + BOOL userMappingsDidChange = NO; + NSMutableDictionary *tempUserMappings = [NSMutableDictionary dictionaryWithDictionary:[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"]]; + + for (NSString *commandTag in commandTagList) { - // At this point, we need to check every key in the user's preference file and make sure that all the keys - // exist. The keys that must exist are all listed in the DefaultKeyMappings.plist file. - BOOL userMappingsDidChange = NO; - NSMutableDictionary *tempUserMappings = [NSMutableDictionary dictionaryWithDictionary:userMappings]; - - NSArray *inputKeys = [defaultMappings allKeys]; - for(NSString *inputString in inputKeys) + if ([tempUserMappings objectForKey:commandTag] == nil) { - if ([tempUserMappings objectForKey:inputString] == nil) - { - [tempUserMappings setValue:[defaultMappings valueForKey:inputString] forKey:inputString]; - userMappingsDidChange = YES; - } - } - - // If we had to add a missing key, then we need to copy our temporary dictionary back to the - // user's preferences file. - if (userMappingsDidChange) - { - [[NSUserDefaults standardUserDefaults] setObject:tempUserMappings forKey:@"Input_ControllerMappings"]; + [tempUserMappings setValue:[defaultMappings valueForKey:commandTag] forKey:commandTag]; + userMappingsDidChange = YES; } } - NSArray *commandTagList = [defaultMappings allKeys]; - for(NSString *commandTag in commandTagList) + // If we had to add a missing key, then we need to copy our temporary dictionary back to the + // user's preferences file. + if (userMappingsDidChange) + { + [[NSUserDefaults standardUserDefaults] setObject:tempUserMappings forKey:@"Input_ControllerMappings"]; + } + + // Finally, add all the input mappings per user defaults. + NSDictionary *userMappings = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"]; + for (NSString *commandTag in commandTagList) { NSArray *deviceInfoList = (NSArray *)[userMappings valueForKey:commandTag]; + [[self inputMappings] setObject:[NSMutableArray arrayWithCapacity:2] forKey:commandTag]; + for(NSDictionary *deviceInfo in deviceInfoList) { - [self addMappingUsingDeviceInfoDictionary:deviceInfo commandTag:[commandTag cStringUsingEncoding:NSUTF8StringEncoding]]; + const char *cmdTag = [commandTag cStringUsingEncoding:NSUTF8StringEncoding]; + CommandAttributes cmdAttr = defaultCommandAttributes[cmdTag]; + UpdateCommandAttributesWithDeviceInfoDictionary(&cmdAttr, deviceInfo); + + // Force DS control commands to use IDs from code instead of from the file. + // (In other words, we can't trust an external file with this information since + // IDs might desync if the DS Control ID enumeration changes.) + if (cmdAttr.selector == @selector(cmdUpdateDSController:)) + { + cmdAttr.intValue[0] = defaultCommandAttributes[cmdTag].intValue[0]; + } + + // Copy all command attributes into a new deviceInfo dictionary. + NSDictionary *newDeviceInfo = DeviceInfoDictionaryWithCommandAttributes(&cmdAttr, + [deviceInfo valueForKey:@"deviceCode"], + [deviceInfo valueForKey:@"deviceName"], + [deviceInfo valueForKey:@"elementCode"], + [deviceInfo valueForKey:@"elementName"]); + + [self addMappingUsingDeviceInfoDictionary:newDeviceInfo commandAttributes:&cmdAttr]; } } } -- (void) addMappingUsingDeviceInfoDictionary:(NSDictionary *)deviceInfo commandTag:(const char *)commandTag +- (void) addMappingUsingDeviceInfoDictionary:(NSDictionary *)deviceInfo commandAttributes:(const CommandAttributes *)cmdAttr { NSString *deviceCode = (NSString *)[deviceInfo valueForKey:@"deviceCode"]; NSString *elementCode = (NSString *)[deviceInfo valueForKey:@"elementCode"]; - if (deviceCode == nil || elementCode == nil || commandTag == NULL) + if (deviceCode == nil || elementCode == nil || cmdAttr == NULL) { return; } - [self addMappingUsingDeviceCode:[deviceCode cStringUsingEncoding:NSUTF8StringEncoding] elementCode:[elementCode cStringUsingEncoding:NSUTF8StringEncoding] commandTag:commandTag]; + [self addMappingUsingDeviceCode:[deviceCode cStringUsingEncoding:NSUTF8StringEncoding] + elementCode:[elementCode cStringUsingEncoding:NSUTF8StringEncoding] + commandAttributes:cmdAttr]; + + // Save the input device info for the user defaults. + NSString *commandTagString = [NSString stringWithCString:cmdAttr->tag encoding:NSUTF8StringEncoding]; + NSMutableArray *inputList = (NSMutableArray *)[[self inputMappings] valueForKey:commandTagString]; + NSMutableDictionary *newDeviceInfo = [NSMutableDictionary dictionaryWithDictionary:deviceInfo]; + + [self updateInputSettingsSummaryInDeviceInfoDictionary:newDeviceInfo commandTag:cmdAttr->tag]; + + if (inputList == nil) + { + inputList = [NSMutableArray arrayWithObject:newDeviceInfo]; + [[self inputMappings] setObject:inputList forKey:commandTagString]; + } + else + { + [inputList addObject:newDeviceInfo]; + } } -- (void) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(const char *)commandTag +- (void) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandAttributes:(const CommandAttributes *)cmdAttr { - if (inputAttr == NULL || commandTag == NULL) + if (inputAttr == NULL) { return; } - [self addMappingUsingDeviceCode:inputAttr->deviceCode.c_str() elementCode:inputAttr->elementCode.c_str() commandTag:commandTag]; + NSDictionary *deviceInfo = DeviceInfoDictionaryWithCommandAttributes(cmdAttr, + [NSString stringWithCString:inputAttr->deviceCode encoding:NSUTF8StringEncoding], + [NSString stringWithCString:inputAttr->deviceName encoding:NSUTF8StringEncoding], + [NSString stringWithCString:inputAttr->elementCode encoding:NSUTF8StringEncoding], + [NSString stringWithCString:inputAttr->elementName encoding:NSUTF8StringEncoding]); + + [self addMappingUsingDeviceInfoDictionary:deviceInfo commandAttributes:cmdAttr]; } -- (void) addMappingUsingInputList:(const InputAttributesList *)inputList commandTag:(const char *)commandTag +- (void) addMappingUsingInputList:(const InputAttributesList *)inputList commandAttributes:(const CommandAttributes *)cmdAttr { - if (inputList == NULL || commandTag == NULL) + if (inputList == NULL) { return; } @@ -995,39 +1093,42 @@ static std::tr1::unordered_map keyboardNameTable; / for (unsigned int i = 0; i < inputCount; i++) { const InputAttributes &inputAttr = (*inputList)[i]; - - if (inputAttr.inputState != INPUT_ATTRIBUTE_STATE_ON) + if (inputAttr.state != INPUT_ATTRIBUTE_STATE_ON) { continue; } - [self addMappingUsingInputAttributes:&inputAttr commandTag:commandTag]; + [self addMappingUsingInputAttributes:&inputAttr commandAttributes:cmdAttr]; } } -- (void) addMappingForIBAction:(const SEL)theSelector commandTag:(const char *)commandTag +- (void) addMappingForIBAction:(const SEL)theSelector commandAttributes:(const CommandAttributes *)cmdAttr { - if (theSelector == nil || commandTag == NULL) + if (theSelector == nil) { return; } - [self addMappingUsingDeviceCode:"IBAction" elementCode:sel_getName(theSelector) commandTag:commandTag]; + CommandAttributes IBActionCmdAttr = *cmdAttr; + IBActionCmdAttr.useInputForSender = true; + + [self addMappingUsingDeviceCode:"IBAction" elementCode:sel_getName(theSelector) commandAttributes:&IBActionCmdAttr]; } -- (void) addMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode commandTag:(const char *)commandTag +- (void) addMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode commandAttributes:(const CommandAttributes *)cmdAttr { - if (deviceCode == NULL || elementCode == NULL || commandTag == NULL) + if (deviceCode == NULL || elementCode == NULL || cmdAttr == NULL) { return; } - // Remove all mappings to commandTag in order to force a 1:1 mapping (except for IBAction mappings). - // TODO: Remove this restriction when the code supports multiple inputs being mapped to the same command tag. - [self removeAllMappingsOfCommandTag:commandTag]; + // Remove all previous instances of this particular input device. (We will not be supporting + // many-to-many mappings at this time. + [self removeMappingUsingDeviceCode:deviceCode elementCode:elementCode]; + // Map the input. const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode); - commandMap[inputKey] = std::string(commandTag); + commandMap[inputKey] = *cmdAttr; } - (void) removeMappingUsingDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode @@ -1039,28 +1140,56 @@ static std::tr1::unordered_map keyboardNameTable; / const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode); - CommandTagMap::iterator it = commandMap.find(inputKey); + InputCommandMap::iterator it = commandMap.find(inputKey); if (it != commandMap.end()) { commandMap.erase(it); } + + for (NSString *inputCommandTag in [self inputMappings]) + { + NSMutableArray *inputList = (NSMutableArray *)[[self inputMappings] valueForKey:inputCommandTag]; + NSMutableArray *inputRemovalList = [NSMutableArray arrayWithCapacity:1]; + + for (NSDictionary *inputDeviceInfo in inputList) + { + NSString *deviceCodeString = [NSString stringWithCString:deviceCode encoding:NSUTF8StringEncoding]; + NSString *elementCodeString = [NSString stringWithCString:elementCode encoding:NSUTF8StringEncoding]; + NSString *inputDeviceCode = (NSString *)[inputDeviceInfo valueForKey:@"deviceCode"]; + NSString *inputElementCode = (NSString *)[inputDeviceInfo valueForKey:@"elementCode"]; + + if ([inputDeviceCode isEqualToString:deviceCodeString] && [inputElementCode isEqualToString:elementCodeString]) + { + [inputRemovalList addObject:inputDeviceInfo]; + } + } + + for (NSDictionary *inputDeviceInfoToRemove in inputRemovalList) + { + [inputList removeObject:inputDeviceInfoToRemove]; + } + } } -- (void) removeAllMappingsOfCommandTag:(const char *)commandTag +- (void) removeAllMappingsForCommandTag:(const char *)cmdTag { - if (commandTag == NULL) + if (cmdTag == NULL) { return; } - + // This loop removes all mappings to commandTag, with the exception of IBAction mappings. - for (CommandTagMap::iterator it=commandMap.begin(); it!=commandMap.end(); ++it) + for (InputCommandMap::iterator it=commandMap.begin(); it!=commandMap.end(); ++it) { - if (it->first.find("IBAction") == std::string::npos && it->second == std::string(commandTag)) + if (it->first.find("IBAction") == std::string::npos && strncmp(it->second.tag, cmdTag, INPUT_HANDLER_STRING_LENGTH) == 0) { commandMap.erase(it); } } + + NSString *commandTag = [NSString stringWithCString:cmdTag encoding:NSUTF8StringEncoding]; + NSMutableArray *inputList = (NSMutableArray *)[[self inputMappings] valueForKey:commandTag]; + [inputList removeAllObjects]; } - (CommandAttributesList) generateCommandListUsingInputList:(const InputAttributesList *)inputList @@ -1074,44 +1203,18 @@ static std::tr1::unordered_map keyboardNameTable; / // All inputs require a device code and element code for mapping. If one or both are // not present, reject the input. - if (inputAttr.deviceCode.empty() || inputAttr.elementCode.empty()) + if (strnlen(inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH) == 0 || + strnlen(inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH) == 0) { continue; } - // Look up the command key using the input key. - const std::string inputKey = inputAttr.deviceCode + ":" + inputAttr.elementCode; - const std::string commandTag = commandMap[inputKey]; + // Look up the command attributes using the input key. + const std::string inputKey = std::string(inputAttr.deviceCode) + ":" + std::string(inputAttr.elementCode); + CommandAttributes cmdAttr = commandMap[inputKey]; - if (commandTag.empty()) - { - continue; - } - - // Look up the command attributes using the command key. - CommandAttributes cmdAttr = commandMasterList[commandTag]; - cmdAttr.inputState = inputAttr.inputState; - - // Override command values with input values as necessary. - for (unsigned int j = 0; j < INPUT_HANDLER_MAX_ATTRIBUTE_VALUES; j++) - { - if (cmdAttr.useIntegerInputValue[j]) - { - cmdAttr.integerValue[j] = inputAttr.integerValue[j]; - } - - if (cmdAttr.useFloatInputValue[j]) - { - cmdAttr.floatValue[j] = inputAttr.floatValue[j]; - } - - if (cmdAttr.useObjectInputValue[j]) - { - cmdAttr.object[j] = inputAttr.object[j]; - } - } - - cmdList.push_back(cmdAttr); + cmdAttr.input = inputAttr; // Copy the input state to the command attributes. + cmdList.push_back(cmdAttr); // Add the command attributes to the list. } return cmdList; @@ -1137,42 +1240,18 @@ static std::tr1::unordered_map keyboardNameTable; / // All inputs require a device code and element code for mapping. If one or both are // not present, reject the input. - if (inputAttr->deviceCode.empty() || inputAttr->elementCode.empty()) + if (strnlen(inputAttr->deviceCode, INPUT_HANDLER_STRING_LENGTH) == 0 || + strnlen(inputAttr->elementCode, INPUT_HANDLER_STRING_LENGTH) == 0) { return didCommandDispatch; } // Look up the command key using the input key. - const std::string inputKey = inputAttr->deviceCode + ":" + inputAttr->elementCode; - const std::string commandTag = commandMap[inputKey]; + const std::string inputKey = std::string(inputAttr->deviceCode) + ":" + std::string(inputAttr->elementCode); + CommandAttributes cmdAttr = commandMap[inputKey]; - if (commandTag.empty()) - { - return didCommandDispatch; - } - - // Look up the command attributes using the command key. - CommandAttributes cmdAttr = commandMasterList[commandTag]; - cmdAttr.inputState = inputAttr->inputState; - - // Override command values with input values as necessary. - for (unsigned int j = 0; j < INPUT_HANDLER_MAX_ATTRIBUTE_VALUES; j++) - { - if (cmdAttr.useIntegerInputValue[j]) - { - cmdAttr.integerValue[j] = inputAttr->integerValue[j]; - } - - if (cmdAttr.useFloatInputValue[j]) - { - cmdAttr.floatValue[j] = inputAttr->floatValue[j]; - } - - if (cmdAttr.useObjectInputValue[j]) - { - cmdAttr.object[j] = inputAttr->object[j]; - } - } + // Copy the input state to the command attributes. + cmdAttr.input = *inputAttr; if ([emuControl respondsToSelector:cmdAttr.selector]) { @@ -1183,30 +1262,276 @@ static std::tr1::unordered_map keyboardNameTable; / return didCommandDispatch; } -- (BOOL) dispatchCommandUsingIBAction:(const SEL)theSelector tag:(NSInteger)tagValue +- (BOOL) dispatchCommandUsingIBAction:(const SEL)theSelector sender:(id)sender { - InputAttributes inputAttr = InputManagerEncodeIBAction(theSelector, tagValue); + const InputAttributes inputAttr = InputManagerEncodeIBAction(theSelector, sender); return [self dispatchCommandUsingInputAttributes:&inputAttr]; } -- (void) writeUserDefaultsMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(const char *)commandTag +- (void) writeDefaultsInputMappings { - NSString *deviceCode = [NSString stringWithCString:inputAttr->deviceCode.c_str() encoding:NSUTF8StringEncoding]; - NSString *deviceName = [NSString stringWithCString:inputAttr->deviceName.c_str() encoding:NSUTF8StringEncoding]; - NSString *elementCode = [NSString stringWithCString:inputAttr->elementCode.c_str() encoding:NSUTF8StringEncoding]; - NSString *elementName = [NSString stringWithCString:inputAttr->elementName.c_str() encoding:NSUTF8StringEncoding]; - NSString *commandTagString = [NSString stringWithCString:commandTag encoding:NSUTF8StringEncoding]; + [[NSUserDefaults standardUserDefaults] setObject:[self inputMappings] forKey:@"Input_ControllerMappings"]; +} + +- (SEL) selectorOfCommandTag:(const char *)commandTag +{ + return commandSelector[commandTag]; +} + +- (CommandAttributes) defaultCommandAttributesForCommandTag:(const char *)commandTag +{ + return defaultCommandAttributes[commandTag]; +} + +- (CommandAttributes) mappedCommandAttributesOfDeviceCode:(const char *)deviceCode elementCode:(const char *)elementCode +{ + const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode); + return commandMap[inputKey]; +} + +- (void) setMappedCommandAttributes:(const CommandAttributes *)cmdAttr deviceCode:(const char *)deviceCode elementCode:(const char *)elementCode +{ + const std::string inputKey = std::string(deviceCode) + ":" + std::string(elementCode); + commandMap[inputKey] = *cmdAttr; +} + +- (void) updateInputSettingsSummaryInDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo commandTag:(const char *)commandTag +{ + NSString *inputSummary = @""; - NSDictionary *deviceInfo = [NSDictionary dictionaryWithObjectsAndKeys: - deviceCode, @"deviceCode", - deviceName, @"deviceName", - elementCode, @"elementCode", - elementName, @"elementName", - nil]; + if (strncmp(commandTag, "Touch", INPUT_HANDLER_STRING_LENGTH) == 0) + { + const BOOL useInputForIntCoord = [(NSNumber *)[deviceInfo valueForKey:@"useInputForIntCoord"] boolValue]; + if (useInputForIntCoord) + { + inputSummary = @"Use Device Coordinates"; + } + else + { + const int xCoord = (int)[(NSNumber *)[deviceInfo valueForKey:@"intValue1"] intValue]; + const int yCoord = (int)[(NSNumber *)[deviceInfo valueForKey:@"intValue2"] intValue]; + inputSummary = [NSString stringWithFormat:@"X:%i Y:%i", xCoord, yCoord]; + } + } + else if (strncmp(commandTag, "Microphone", INPUT_HANDLER_STRING_LENGTH) == 0) + { + const NSInteger micMode = [(NSNumber *)[deviceInfo valueForKey:@"intValue1"] integerValue]; + switch (micMode) + { + case MICMODE_NONE: + inputSummary = @"None"; + break; + + case MICMODE_INTERNAL_NOISE: + inputSummary = @"Internal Noise Samples"; + break; + + case MICMODE_SOUND_FILE: + inputSummary = @"Sound File:"; + break; + + case MICMODE_WHITE_NOISE: + inputSummary = @"White Noise"; + break; + + case MICMODE_PHYSICAL: + inputSummary = @"Physical:"; + break; + + default: + break; + } + } + else if (strncmp(commandTag, "Load State Slot", INPUT_HANDLER_STRING_LENGTH) == 0) + { + const NSInteger slotNumber = [(NSNumber *)[deviceInfo valueForKey:@"intValue0"] integerValue] + 1; + inputSummary = [NSString stringWithFormat:NSSTRING_TITLE_SLOT_NUMBER, slotNumber]; + } + else if (strncmp(commandTag, "Save State Slot", INPUT_HANDLER_STRING_LENGTH) == 0) + { + const NSInteger slotNumber = [(NSNumber *)[deviceInfo valueForKey:@"intValue0"] integerValue] + 1; + inputSummary = [NSString stringWithFormat:NSSTRING_TITLE_SLOT_NUMBER, slotNumber]; + } + else if (strncmp(commandTag, "Set Speed", INPUT_HANDLER_STRING_LENGTH) == 0) + { + const float speedScalar = [(NSNumber *)[deviceInfo valueForKey:@"floatValue0"] floatValue]; + inputSummary = [NSString stringWithFormat:@"%1.2fx Speed", speedScalar]; + } + else if (strncmp(commandTag, "Enable/Disable GPU State", INPUT_HANDLER_STRING_LENGTH) == 0) + { + const NSInteger gpuStateID = [(NSNumber *)[deviceInfo valueForKey:@"intValue0"] integerValue]; + switch (gpuStateID) + { + case 0: + inputSummary = @"Main GPU - All Layers"; + break; + + case 1: + inputSummary = @"Main BG0"; + break; + + case 2: + inputSummary = @"Main BG1"; + break; + + case 3: + inputSummary = @"Main BG2"; + break; + + case 4: + inputSummary = @"Main BG3"; + break; + + case 5: + inputSummary = @"Main OBJ"; + break; + + case 6: + inputSummary = @"Sub GPU - All Layers"; + break; + + case 7: + inputSummary = @"Sub BG0"; + break; + + case 8: + inputSummary = @"Sub BG1"; + break; + + case 9: + inputSummary = @"Sub BG2"; + break; + + case 10: + inputSummary = @"Sub BG3"; + break; + + case 11: + inputSummary = @"Sub OBJ"; + break; + + default: + break; + } + } - NSMutableDictionary *tempUserMappings = [NSMutableDictionary dictionaryWithDictionary:[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"]]; - [tempUserMappings setValue:[NSArray arrayWithObject:deviceInfo] forKey:commandTagString]; - [[NSUserDefaults standardUserDefaults] setValue:tempUserMappings forKey:@"Input_ControllerMappings"]; + [deviceInfo setObject:inputSummary forKey:@"inputSettingsSummary"]; +} + +CommandAttributes NewDefaultCommandAttributes(const char *commandTag) +{ + CommandAttributes cmdAttr; + + strncpy(cmdAttr.tag, commandTag, INPUT_HANDLER_STRING_LENGTH); + cmdAttr.selector = nil; + cmdAttr.intValue[0] = 0; + cmdAttr.intValue[1] = 0; + cmdAttr.intValue[2] = 0; + cmdAttr.intValue[3] = 0; + cmdAttr.floatValue[0] = 0; + cmdAttr.floatValue[1] = 0; + cmdAttr.floatValue[2] = 0; + cmdAttr.floatValue[3] = 0; + cmdAttr.object[0] = 0; + cmdAttr.object[1] = 0; + cmdAttr.object[2] = 0; + cmdAttr.object[3] = 0; + + cmdAttr.useInputForIntCoord = false; + cmdAttr.useInputForFloatCoord = false; + cmdAttr.useInputForScalar = false; + cmdAttr.useInputForSender = false; + + return cmdAttr; +} + +CommandAttributes NewCommandAttributesForSelector(const char *commandTag, const SEL theSelector) +{ + CommandAttributes cmdAttr = NewDefaultCommandAttributes(commandTag); + cmdAttr.selector = theSelector; + + return cmdAttr; +} + +CommandAttributes NewCommandAttributesForDSControl(const char *commandTag, const NSUInteger controlID) +{ + CommandAttributes cmdAttr = NewCommandAttributesForSelector(commandTag, @selector(cmdUpdateDSController:)); + cmdAttr.intValue[0] = controlID; + + return cmdAttr; +} + +void UpdateCommandAttributesWithDeviceInfoDictionary(CommandAttributes *cmdAttr, NSDictionary *deviceInfo) +{ + if (cmdAttr == NULL || deviceInfo == nil) + { + return; + } + + NSNumber *intValue0 = (NSNumber *)[deviceInfo valueForKey:@"intValue0"]; + NSNumber *intValue1 = (NSNumber *)[deviceInfo valueForKey:@"intValue1"]; + NSNumber *intValue2 = (NSNumber *)[deviceInfo valueForKey:@"intValue2"]; + NSNumber *intValue3 = (NSNumber *)[deviceInfo valueForKey:@"intValue3"]; + NSNumber *floatValue0 = (NSNumber *)[deviceInfo valueForKey:@"floatValue0"]; + NSNumber *floatValue1 = (NSNumber *)[deviceInfo valueForKey:@"floatValue1"]; + NSNumber *floatValue2 = (NSNumber *)[deviceInfo valueForKey:@"floatValue2"]; + NSNumber *floatValue3 = (NSNumber *)[deviceInfo valueForKey:@"floatValue3"]; + NSNumber *useInputForIntCoord = (NSNumber *)[deviceInfo valueForKey:@"useInputForIntCoord"]; + NSNumber *useInputForFloatCoord = (NSNumber *)[deviceInfo valueForKey:@"useInputForFloatCoord"]; + NSNumber *useInputForScalar = (NSNumber *)[deviceInfo valueForKey:@"useInputForScalar"]; + NSNumber *useInputForSender = (NSNumber *)[deviceInfo valueForKey:@"useInputForSender"]; + + if (intValue0 != nil) cmdAttr->intValue[0] = [intValue0 intValue]; + if (intValue1 != nil) cmdAttr->intValue[1] = [intValue1 intValue]; + if (intValue2 != nil) cmdAttr->intValue[2] = [intValue2 intValue]; + if (intValue3 != nil) cmdAttr->intValue[3] = [intValue3 intValue]; + if (floatValue0 != nil) cmdAttr->floatValue[0] = [floatValue0 floatValue]; + if (floatValue1 != nil) cmdAttr->floatValue[1] = [floatValue1 floatValue]; + if (floatValue2 != nil) cmdAttr->floatValue[2] = [floatValue2 floatValue]; + if (floatValue3 != nil) cmdAttr->floatValue[3] = [floatValue3 floatValue]; + if (useInputForIntCoord != nil) cmdAttr->useInputForIntCoord = [useInputForIntCoord boolValue]; + if (useInputForFloatCoord != nil) cmdAttr->useInputForFloatCoord = [useInputForFloatCoord boolValue]; + if (useInputForScalar != nil) cmdAttr->useInputForScalar = [useInputForScalar boolValue]; + if (useInputForSender != nil) cmdAttr->useInputForSender = [useInputForSender boolValue]; +} + +NSDictionary* DeviceInfoDictionaryWithCommandAttributes(const CommandAttributes *cmdAttr, + NSString *deviceCode, + NSString *deviceName, + NSString *elementCode, + NSString *elementName) +{ + if (cmdAttr == NULL || + deviceCode == nil || + deviceName == nil || + elementCode == nil || + elementName == nil) + { + return nil; + } + + NSString *deviceInfoSummary = [[deviceName stringByAppendingString:@": "] stringByAppendingString:elementName]; + + return [NSDictionary dictionaryWithObjectsAndKeys: + deviceCode, @"deviceCode", + deviceName, @"deviceName", + elementCode, @"elementCode", + elementName, @"elementName", + deviceInfoSummary, @"deviceInfoSummary", + @"", @"inputSettingsSummary", + [NSNumber numberWithInt:cmdAttr->intValue[0]], @"intValue0", + [NSNumber numberWithInt:cmdAttr->intValue[1]], @"intValue1", + [NSNumber numberWithInt:cmdAttr->intValue[2]], @"intValue2", + [NSNumber numberWithInt:cmdAttr->intValue[3]], @"intValue3", + [NSNumber numberWithFloat:cmdAttr->floatValue[0]], @"floatValue0", + [NSNumber numberWithFloat:cmdAttr->floatValue[1]], @"floatValue1", + [NSNumber numberWithFloat:cmdAttr->floatValue[2]], @"floatValue2", + [NSNumber numberWithFloat:cmdAttr->floatValue[3]], @"floatValue3", + [NSNumber numberWithBool:cmdAttr->useInputForIntCoord], @"useInputForIntCoord", + [NSNumber numberWithBool:cmdAttr->useInputForFloatCoord], @"useInputForFloatCoord", + [NSNumber numberWithBool:cmdAttr->useInputForScalar], @"useInputForScalar", + [NSNumber numberWithBool:cmdAttr->useInputForSender], @"useInputForSender", + nil]; } InputAttributesList InputManagerEncodeHIDQueue(const IOHIDQueueRef hidQueue) @@ -1234,7 +1559,8 @@ InputAttributesList InputManagerEncodeHIDQueue(const IOHIDQueueRef hidQueue) size_t hidInputCount = hidInputList.size(); for (unsigned int i = 0; i < hidInputCount; i++) { - if (hidInputList[i].deviceCode.empty() || hidInputList[i].elementCode.empty()) + if (strnlen(hidInputList[i].deviceCode, INPUT_HANDLER_STRING_LENGTH) == 0 || + strnlen(hidInputList[i].elementCode, INPUT_HANDLER_STRING_LENGTH) == 0) { continue; } @@ -1258,65 +1584,76 @@ InputAttributesList InputManagerEncodeHIDQueue(const IOHIDQueueRef hidQueue) InputAttributes InputManagerEncodeKeyboardInput(const unsigned short keyCode, BOOL keyPressed) { std::string elementName = keyboardNameTable[keyCode]; - char elementCodeBuf[256] = {0}; - snprintf(elementCodeBuf, 256, "%d", keyCode); InputAttributes inputAttr; - inputAttr.deviceCode = "NSEventKeyboard"; - inputAttr.deviceName = "Keyboard"; - inputAttr.elementCode = std::string(elementCodeBuf); - inputAttr.elementName = (elementName.empty()) ? inputAttr.elementCode : elementName; - inputAttr.inputState = (keyPressed) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; + strncpy(inputAttr.deviceCode, "NSEventKeyboard", INPUT_HANDLER_STRING_LENGTH); + strncpy(inputAttr.deviceName, "Keyboard", INPUT_HANDLER_STRING_LENGTH); + snprintf(inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH, "%d", keyCode); + strncpy(inputAttr.elementName, (elementName.empty()) ? inputAttr.elementCode : elementName.c_str(), INPUT_HANDLER_STRING_LENGTH); + + inputAttr.state = (keyPressed) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; + inputAttr.intCoordX = 0; + inputAttr.intCoordY = 0; + inputAttr.floatCoordX = 0.0f; + inputAttr.floatCoordY = 0.0f; + inputAttr.scalar = (keyPressed) ? 1.0f : 0.0f; + inputAttr.sender = nil; return inputAttr; } InputAttributes InputManagerEncodeMouseButtonInput(const NSInteger buttonNumber, const NSPoint touchLoc, BOOL buttonPressed) { - char elementNameBuf[256] = {0}; - snprintf(elementNameBuf, 256, "Button %i", (int)buttonNumber); - - char elementCodeBuf[256] = {0}; - snprintf(elementCodeBuf, 256, "%i", (int)buttonNumber); + InputAttributes inputAttr; + strncpy(inputAttr.deviceCode, "NSEventMouse", INPUT_HANDLER_STRING_LENGTH); + strncpy(inputAttr.deviceName, "Mouse", INPUT_HANDLER_STRING_LENGTH); + snprintf(inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH, "%i", (const int)buttonNumber); switch (buttonNumber) { case kCGMouseButtonLeft: - strncpy(elementNameBuf, "Primary Button", 256); + strncpy(inputAttr.elementName, "Primary Button", INPUT_HANDLER_STRING_LENGTH); break; case kCGMouseButtonRight: - strncpy(elementNameBuf, "Secondary Button", 256); + strncpy(inputAttr.elementName, "Secondary Button", INPUT_HANDLER_STRING_LENGTH); break; case kCGMouseButtonCenter: - strncpy(elementNameBuf, "Center Button", 256); + strncpy(inputAttr.elementName, "Center Button", INPUT_HANDLER_STRING_LENGTH); break; default: + snprintf(inputAttr.elementName, INPUT_HANDLER_STRING_LENGTH, "Button %i", (const int)buttonNumber); break; } - InputAttributes inputAttr; - inputAttr.deviceCode = "NSEventMouse"; - inputAttr.deviceName = "Mouse"; - inputAttr.elementCode = std::string(elementCodeBuf); - inputAttr.elementName = std::string(elementNameBuf); - inputAttr.inputState = (buttonPressed) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; - inputAttr.floatValue[0] = touchLoc.x; - inputAttr.floatValue[1] = touchLoc.y; + inputAttr.state = (buttonPressed) ? INPUT_ATTRIBUTE_STATE_ON : INPUT_ATTRIBUTE_STATE_OFF; + inputAttr.intCoordX = (int32_t)touchLoc.x; + inputAttr.intCoordY = (int32_t)touchLoc.y; + inputAttr.floatCoordX = touchLoc.x; + inputAttr.floatCoordY = touchLoc.y; + inputAttr.scalar = (buttonPressed) ? 1.0f : 0.0f; + inputAttr.sender = nil; return inputAttr; } -InputAttributes InputManagerEncodeIBAction(const SEL theSelector, const NSInteger tagValue) +InputAttributes InputManagerEncodeIBAction(const SEL theSelector, id sender) { InputAttributes inputAttr; - inputAttr.deviceCode = "IBAction"; - inputAttr.deviceName = "Application"; - inputAttr.elementCode = std::string(sel_getName(theSelector)); - inputAttr.elementName = inputAttr.elementCode; - inputAttr.integerValue[0] = tagValue; + strncpy(inputAttr.deviceCode, "IBAction", INPUT_HANDLER_STRING_LENGTH); + strncpy(inputAttr.deviceName, "Application", INPUT_HANDLER_STRING_LENGTH); + strncpy(inputAttr.elementCode, sel_getName(theSelector), INPUT_HANDLER_STRING_LENGTH); + strncpy(inputAttr.elementName, inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH); + + inputAttr.state = INPUT_ATTRIBUTE_STATE_ON; + inputAttr.intCoordX = 0; + inputAttr.intCoordY = 0; + inputAttr.floatCoordX = 0.0f; + inputAttr.floatCoordY = 0.0f; + inputAttr.scalar = 1.0f; + inputAttr.sender = sender; return inputAttr; } diff --git a/desmume/src/cocoa/userinterface/appDelegate.h b/desmume/src/cocoa/userinterface/appDelegate.h index 069bfaa6f..dea98de63 100644 --- a/desmume/src/cocoa/userinterface/appDelegate.h +++ b/desmume/src/cocoa/userinterface/appDelegate.h @@ -105,7 +105,6 @@ - (void) setupSlotMenuItems; - (NSMenuItem *) addSlotMenuItem:(NSMenu *)menu slotNumber:(NSUInteger)slotNumber; - (void) setupUserDefaults; -- (void) updateInputDisplayFields; - (IBAction) showMigrationWindow:(id)sender; - (IBAction) handleMigrationWindow:(id)sender; - (void) setRomInfoPanelBoxTitleColors; diff --git a/desmume/src/cocoa/userinterface/appDelegate.mm b/desmume/src/cocoa/userinterface/appDelegate.mm index ad9d0e630..5cb120751 100644 --- a/desmume/src/cocoa/userinterface/appDelegate.mm +++ b/desmume/src/cocoa/userinterface/appDelegate.mm @@ -201,6 +201,8 @@ // Setup the applications settings from the user defaults file. [self setupUserDefaults]; + + [inputPrefsView initSettingsSheets]; } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification @@ -471,9 +473,6 @@ [prefBindings setValue:[cheatDatabasePath lastPathComponent] forKey:@"R4CheatDatabaseName"]; } - // Set the sound input mode per user preferences. - [[cdsCore cdsController] setSoundInputMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"Input_AudioInputMode"]]; - // Update the SPU Sync controls in the Preferences window. if ([[NSUserDefaults standardUserDefaults] integerForKey:@"SPU_SyncMode"] == SPU_SYNC_MODE_DUAL_SYNC_ASYNC) { @@ -495,9 +494,6 @@ [prefBindings setValue:nil forKey:@"AutoloadRomName"]; } - // Update all of the input display fields. - [self updateInputDisplayFields]; - // Set the menu for the display rotation. const double displayRotation = (double)[[NSUserDefaults standardUserDefaults] floatForKey:@"DisplayView_Rotation"]; [prefWindowDelegate updateDisplayRotationMenu:displayRotation]; @@ -506,40 +502,6 @@ [prefWindowDelegate updateVolumeIcon:nil]; [emuControl setupUserDefaults]; - [inputManager addMappingsUsingUserDefaults]; -} - -- (void) updateInputDisplayFields -{ - PreferencesWindowDelegate *prefWindowDelegate = [prefWindow delegate]; - NSMutableDictionary *prefBindings = [prefWindowDelegate bindings]; - - if ([[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"] == nil) - { - return; - } - - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Up"] forKey:@"Input_Up"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Down"] forKey:@"Input_Down"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Left"] forKey:@"Input_Left"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Right"] forKey:@"Input_Right"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"A"] forKey:@"Input_A"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"B"] forKey:@"Input_B"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"X"] forKey:@"Input_X"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Y"] forKey:@"Input_Y"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"L"] forKey:@"Input_L"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"R"] forKey:@"Input_R"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Start"] forKey:@"Input_Start"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Select"] forKey:@"Input_Select"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Microphone"] forKey:@"Input_Microphone"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Lid"] forKey:@"Input_Lid"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Debug"] forKey:@"Input_Debug"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Speed Half"] forKey:@"Input_SpeedHalf"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Speed Double"] forKey:@"Input_SpeedDouble"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"HUD"] forKey:@"Input_HUD"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Execute"] forKey:@"Input_Execute"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Pause"] forKey:@"Input_Pause"]; - [prefBindings setValue:[inputPrefsView parseMappingDisplayString:"Reset"] forKey:@"Input_Reset"]; } - (IBAction) showMigrationWindow:(id)sender diff --git a/desmume/src/cocoa/userinterface/inputPrefsView.h b/desmume/src/cocoa/userinterface/inputPrefsView.h index 28903c906..a20816460 100644 --- a/desmume/src/cocoa/userinterface/inputPrefsView.h +++ b/desmume/src/cocoa/userinterface/inputPrefsView.h @@ -21,27 +21,72 @@ @class CocoaDSController; +@interface InputPrefProperties : NSObject +{ + NSString *commandTag; + NSImage *icon; + NSWindow *settingsSheet; +} -@interface InputPrefsView : NSView +@property (retain) NSString *commandTag; +@property (retain) NSImage *icon; +@property (retain) NSWindow *settingsSheet; + +- (id) initWithCommandTag:(NSString *)theCommandTag icon:(NSImage *)theIcon sheet:(NSWindow *)theSheet; + +@end + +#pragma mark - + +@interface InputPrefsView : NSView { NSWindow *prefWindow; + NSOutlineView *inputPrefOutlineView; + NSObjectController *inputSettingsController; + + NSWindow *inputSettingsMicrophone; + NSWindow *inputSettingsTouch; + NSWindow *inputSettingsLoadStateSlot; + NSWindow *inputSettingsSaveStateSlot; + NSWindow *inputSettingsSetSpeedLimit; + NSWindow *inputSettingsGPUState; + InputManager *inputManager; - NSButton *lastConfigButton; - NSInteger configInputTargetID; + NSString *configInputTargetID; NSMutableDictionary *configInputList; - std::tr1::unordered_map commandTagMap; // Key = Command ID, Value = Command Tag - NSDictionary *displayStringBindings; + NSDictionary *inputPrefProperties; + NSDictionary *inputSettingsMappings; + NSArray *commandTagList; } @property (readonly) IBOutlet NSWindow *prefWindow; +@property (readonly) IBOutlet NSOutlineView *inputPrefOutlineView; +@property (readonly) IBOutlet NSObjectController *inputSettingsController; + +@property (readonly) IBOutlet NSWindow *inputSettingsMicrophone; +@property (readonly) IBOutlet NSWindow *inputSettingsTouch; +@property (readonly) IBOutlet NSWindow *inputSettingsLoadStateSlot; +@property (readonly) IBOutlet NSWindow *inputSettingsSaveStateSlot; +@property (readonly) IBOutlet NSWindow *inputSettingsSetSpeedLimit; +@property (readonly) IBOutlet NSWindow *inputSettingsGPUState; + @property (readonly) IBOutlet InputManager *inputManager; -@property (assign) NSInteger configInputTargetID; +@property (retain) NSString *configInputTargetID; + +- (void) initSettingsSheets; +- (NSString *) commandTagFromInputList:(NSArray *)inputList; - (BOOL) handleKeyboardEvent:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed; - (BOOL) handleMouseButtonEvent:(NSEvent *)mouseEvent buttonPressed:(BOOL)buttonPressed; -- (NSString *) parseMappingDisplayString:(const char *)commandTag; +- (BOOL) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(NSString *)commandTag; +- (void) setMappingUsingDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo; +- (void) didEndSettingsSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo; -- (IBAction) inputButtonSet:(id)sender; +- (IBAction) setInputAdd:(id)sender; +- (IBAction) removeInput:(id)sender; +- (IBAction) changeSpeed:(id)sender; +- (IBAction) showSettingsSheet:(id)sender; +- (IBAction) closeSettingsSheet:(id)sender; @end diff --git a/desmume/src/cocoa/userinterface/inputPrefsView.mm b/desmume/src/cocoa/userinterface/inputPrefsView.mm index 273b4cee9..582d8c487 100644 --- a/desmume/src/cocoa/userinterface/inputPrefsView.mm +++ b/desmume/src/cocoa/userinterface/inputPrefsView.mm @@ -21,12 +21,61 @@ #import "cocoa_globals.h" #import "cocoa_input.h" +#import "cocoa_util.h" #define INPUT_HOLD_TIME 0.1 // Time in seconds to hold a button in its on state when mapping an input. +@implementation InputPrefProperties + +@synthesize commandTag; +@synthesize icon; +@synthesize settingsSheet; + +- (id)init +{ + return [self initWithCommandTag:@"" icon:nil sheet:nil]; +} + +- (id) initWithCommandTag:(NSString *)theCommandTag icon:(NSImage *)theIcon sheet:(NSWindow *)theSheet +{ + self = [super init]; + if (self == nil) + { + return self; + } + + commandTag = [theCommandTag retain]; + icon = [theIcon retain]; + settingsSheet = [theSheet retain]; + + return self; +} + +- (void)dealloc +{ + [self setCommandTag:nil]; + [self setIcon:nil]; + [self setSettingsSheet:nil]; + + [super dealloc]; +} + +@end + + +#pragma mark - + @implementation InputPrefsView @synthesize prefWindow; +@synthesize inputPrefOutlineView; +@synthesize inputSettingsController; +@synthesize inputSettingsMicrophone; +@synthesize inputSettingsTouch; +@synthesize inputSettingsLoadStateSlot; +@synthesize inputSettingsSaveStateSlot; +@synthesize inputSettingsSetSpeedLimit; +@synthesize inputSettingsGPUState; @synthesize inputManager; @dynamic configInputTargetID; @@ -38,57 +87,34 @@ return self; } - lastConfigButton = nil; - configInputTargetID = 0; - configInputList = [[NSMutableDictionary alloc] initWithCapacity:32]; + configInputTargetID = nil; + configInputList = [[NSMutableDictionary alloc] initWithCapacity:128]; - displayStringBindings = [[NSDictionary alloc] initWithObjectsAndKeys: - @"Input_Up", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_UP], - @"Input_Down", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_DOWN], - @"Input_Left", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_LEFT], - @"Input_Right", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_RIGHT], - @"Input_A", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_A], - @"Input_B", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_B], - @"Input_X", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_X], - @"Input_Y", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_Y], - @"Input_L", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_L], - @"Input_R", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_R], - @"Input_Start", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_START], - @"Input_Select", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_SELECT], - @"Input_Microphone", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_SIM_MIC], - @"Input_Lid", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_LID], - @"Input_Debug", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_DEBUG], - @"Input_SpeedHalf", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_SPEED_HALF], - @"Input_SpeedDouble", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_SPEED_DOUBLE], - @"Input_HUD", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_TOGGLE_HUD], - @"Input_Execute", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_EXECUTE], - @"Input_Pause", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_PAUSE], - @"Input_Reset", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_RESET], - @"Input_Touch", [NSString stringWithFormat:@"%i", PREF_INPUT_BUTTON_TOUCH], - nil]; + inputPrefProperties = [[NSDictionary alloc] initWithObjectsAndKeys: + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"UNKNOWN COMMAND", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowUp_420x420" ofType:@"png"]] autorelease], @"Up", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowDown_420x420" ofType:@"png"]] autorelease], @"Down", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowLeft_420x420" ofType:@"png"]] autorelease], @"Left", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ArrowRight_420x420" ofType:@"png"]] autorelease], @"Right", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonA_420x420" ofType:@"png"]] autorelease], @"A", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonB_420x420" ofType:@"png"]] autorelease], @"B", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonX_420x420" ofType:@"png"]] autorelease], @"X", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonY_420x420" ofType:@"png"]] autorelease], @"Y", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonL_420x420" ofType:@"png"]] autorelease], @"L", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonR_420x420" ofType:@"png"]] autorelease], @"R", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonStart_420x420" ofType:@"png"]] autorelease], @"Start", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"Select", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Microphone_420x420" ofType:@"png"]] autorelease], @"Microphone", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_ShowHUD_420x420" ofType:@"png"]] autorelease], @"HUD", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]] autorelease], @"Execute", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Pause_420x420" ofType:@"png"]] autorelease], @"Pause", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Execute_420x420" ofType:@"png"]] autorelease], @"Execute/Pause", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_Reset_420x420" ofType:@"png"]] autorelease], @"Reset", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_DSButtonSelect_420x420" ofType:@"png"]] autorelease], @"Touch", + [[[NSImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Icon_VolumeMute_16x16" ofType:@"png"]] autorelease], @"Mute/Unmute", + nil]; - commandTagMap[PREF_INPUT_BUTTON_UP] = "Up"; - commandTagMap[PREF_INPUT_BUTTON_DOWN] = "Down"; - commandTagMap[PREF_INPUT_BUTTON_LEFT] = "Left"; - commandTagMap[PREF_INPUT_BUTTON_RIGHT] = "Right"; - commandTagMap[PREF_INPUT_BUTTON_A] = "A"; - commandTagMap[PREF_INPUT_BUTTON_B] = "B"; - commandTagMap[PREF_INPUT_BUTTON_X] = "X"; - commandTagMap[PREF_INPUT_BUTTON_Y] = "Y"; - commandTagMap[PREF_INPUT_BUTTON_L] = "L"; - commandTagMap[PREF_INPUT_BUTTON_R] = "R"; - commandTagMap[PREF_INPUT_BUTTON_START] = "Start"; - commandTagMap[PREF_INPUT_BUTTON_SELECT] = "Select"; - commandTagMap[PREF_INPUT_BUTTON_SIM_MIC] = "Microphone"; - commandTagMap[PREF_INPUT_BUTTON_LID] = "Lid"; - commandTagMap[PREF_INPUT_BUTTON_DEBUG] = "Debug"; - commandTagMap[PREF_INPUT_BUTTON_SPEED_HALF] = "Speed Half"; - commandTagMap[PREF_INPUT_BUTTON_SPEED_DOUBLE] = "Speed Double"; - commandTagMap[PREF_INPUT_BUTTON_TOGGLE_HUD] = "HUD"; - commandTagMap[PREF_INPUT_BUTTON_EXECUTE] = "Execute"; - commandTagMap[PREF_INPUT_BUTTON_PAUSE] = "Pause"; - commandTagMap[PREF_INPUT_BUTTON_RESET] = "Reset"; - commandTagMap[PREF_INPUT_BUTTON_TOUCH] = "Touch"; + commandTagList = [[[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultKeyMappings" ofType:@"plist"]] valueForKey:@"CommandTagList"] retain]; return self; } @@ -96,102 +122,163 @@ - (void)dealloc { [configInputList release]; - [displayStringBindings release]; + [inputPrefProperties release]; + [inputSettingsMappings release]; + [commandTagList release]; [super dealloc]; } #pragma mark Dynamic Properties -- (void) setConfigInputTargetID:(NSInteger)targetID +- (void) setConfigInputTargetID:(NSString *)targetID { - if (targetID == 0) + if (targetID == nil) { - [lastConfigButton setState:NSOffState]; - lastConfigButton = nil; + [configInputTargetID release]; } - configInputTargetID = targetID; - [[self inputManager] setHidInputTarget:(targetID == 0) ? nil : self]; + configInputTargetID = [targetID retain]; + [[self inputManager] setHidInputTarget:(targetID == nil) ? nil : self]; } -- (NSInteger) configInputTargetID +- (NSString *) configInputTargetID { return configInputTargetID; } #pragma mark Class Methods +- (void) initSettingsSheets +{ + inputSettingsMappings = [[NSDictionary alloc] initWithObjectsAndKeys: + inputSettingsMicrophone, @"Microphone", + inputSettingsTouch, @"Touch", + inputSettingsLoadStateSlot, @"Load State Slot", + inputSettingsSaveStateSlot, @"Save State Slot", + inputSettingsSetSpeedLimit, @"Set Speed", + inputSettingsGPUState, @"Enable/Disable GPU State", + nil]; +} + +- (NSString *) commandTagFromInputList:(NSArray *)inputList +{ + NSString *commandTag = nil; + if (inputList == nil) + { + return commandTag; + } + + NSDictionary *inputMappings = [inputManager inputMappings]; + for (NSString *tag in inputMappings) + { + if (inputList == [inputMappings valueForKey:tag]) + { + commandTag = tag; + break; + } + } + + return commandTag; +} + - (BOOL) handleKeyboardEvent:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed { - BOOL isHandled = NO; - - if ([self configInputTargetID] == 0) - { - return isHandled; - } - - std::string commandTag = commandTagMap[[self configInputTargetID]]; - if (commandTag.empty()) - { - return isHandled; - } - - InputAttributes inputAttr = InputManagerEncodeKeyboardInput([theEvent keyCode], keyPressed); - [inputManager addMappingUsingInputAttributes:&inputAttr commandTag:commandTag.c_str()]; - [inputManager writeUserDefaultsMappingUsingInputAttributes:&inputAttr commandTag:commandTag.c_str()]; - - NSMutableDictionary *prefWindowBindings = [(PreferencesWindowDelegate *)[prefWindow delegate] bindings]; - NSString *displayBinding = (NSString *)[displayStringBindings valueForKey:[NSString stringWithFormat:@"%i", [self configInputTargetID]]]; - [prefWindowBindings setValue:[self parseMappingDisplayString:commandTag.c_str()] forKey:displayBinding]; - - [self setConfigInputTargetID:0]; - - isHandled = YES; - return isHandled; + const InputAttributes inputAttr = InputManagerEncodeKeyboardInput([theEvent keyCode], keyPressed); + return [self addMappingUsingInputAttributes:&inputAttr commandTag:[self configInputTargetID]]; } - (BOOL) handleMouseButtonEvent:(NSEvent *)mouseEvent buttonPressed:(BOOL)buttonPressed { - BOOL isHandled = NO; - - if ([self configInputTargetID] == 0) - { - return isHandled; - } - - std::string commandTag = commandTagMap[[self configInputTargetID]]; - if (commandTag.empty()) - { - return isHandled; - } - - InputAttributes inputAttr = InputManagerEncodeMouseButtonInput([mouseEvent buttonNumber], NSMakePoint(0.0f, 0.0f), buttonPressed); - [inputManager addMappingUsingInputAttributes:&inputAttr commandTag:commandTag.c_str()]; - [inputManager writeUserDefaultsMappingUsingInputAttributes:&inputAttr commandTag:commandTag.c_str()]; - - NSMutableDictionary *prefWindowBindings = [(PreferencesWindowDelegate *)[prefWindow delegate] bindings]; - NSString *displayBinding = (NSString *)[displayStringBindings valueForKey:[NSString stringWithFormat:@"%i", [self configInputTargetID]]]; - [prefWindowBindings setValue:[self parseMappingDisplayString:commandTag.c_str()] forKey:displayBinding]; - - [self setConfigInputTargetID:0]; - - isHandled = YES; - return isHandled; + const InputAttributes inputAttr = InputManagerEncodeMouseButtonInput([mouseEvent buttonNumber], NSMakePoint(0.0f, 0.0f), buttonPressed); + return [self addMappingUsingInputAttributes:&inputAttr commandTag:[self configInputTargetID]]; } -- (NSString *) parseMappingDisplayString:(const char *)commandTag +- (BOOL) addMappingUsingInputAttributes:(const InputAttributes *)inputAttr commandTag:(NSString *)commandTag { - NSDictionary *userMappings = [[NSUserDefaults standardUserDefaults] dictionaryForKey:@"Input_ControllerMappings"]; - NSArray *mappingList = (NSArray *)[userMappings valueForKey:[NSString stringWithCString:commandTag encoding:NSUTF8StringEncoding]]; - NSDictionary *mapping = (NSDictionary *)[mappingList objectAtIndex:0]; - NSString *deviceName = (NSString *)[mapping valueForKey:@"deviceName"]; - NSString *elementName = (NSString *)[mapping valueForKey:@"elementName"]; + BOOL didMap = NO; - NSString *displayString = [NSString stringWithString:deviceName]; - displayString = [displayString stringByAppendingString:@": "]; - displayString = [displayString stringByAppendingString:elementName]; + if (commandTag == nil) + { + return didMap; + } - return displayString; + const char *cmdTag = [commandTag cStringUsingEncoding:NSUTF8StringEncoding]; + if (cmdTag == NULL) + { + return didMap; + } + + // Add the input mapping. + const CommandAttributes cmdAttr = [inputManager defaultCommandAttributesForCommandTag:cmdTag]; + [inputManager addMappingUsingInputAttributes:inputAttr commandAttributes:&cmdAttr]; + [inputManager writeDefaultsInputMappings]; + + // Deselect the row of the command tag. + NSDictionary *inputMappings = [inputManager inputMappings]; + NSArray *mappingList = (NSArray *)[inputMappings valueForKey:[self configInputTargetID]]; + const NSInteger rowNumber = [inputPrefOutlineView rowForItem:mappingList]; + if (rowNumber != -1) + { + [inputPrefOutlineView deselectRow:rowNumber]; + } + + // Update all expanded command tags. + for (NSString *tag in inputMappings) + { + NSArray *inputList = (NSArray *)[inputMappings valueForKey:tag]; + if ([inputPrefOutlineView isItemExpanded:inputList]) + { + [inputPrefOutlineView reloadItem:inputList reloadChildren:YES]; + } + } + + [self setConfigInputTargetID:nil]; + + didMap = YES; + return didMap; +} + +- (void) setMappingUsingDeviceInfoDictionary:(NSMutableDictionary *)deviceInfo +{ + if (deviceInfo == nil) + { + return; + } + + NSString *deviceCode = (NSString *)[deviceInfo valueForKey:@"deviceCode"]; + NSString *elementCode = (NSString *)[deviceInfo valueForKey:@"elementCode"]; + const char *devCode = [deviceCode cStringUsingEncoding:NSUTF8StringEncoding]; + const char *elCode = [elementCode cStringUsingEncoding:NSUTF8StringEncoding]; + + CommandAttributes cmdAttr = [inputManager mappedCommandAttributesOfDeviceCode:devCode elementCode:elCode]; + UpdateCommandAttributesWithDeviceInfoDictionary(&cmdAttr, deviceInfo); + [inputManager updateInputSettingsSummaryInDeviceInfoDictionary:deviceInfo commandTag:cmdAttr.tag]; + [inputManager setMappedCommandAttributes:&cmdAttr deviceCode:devCode elementCode:elCode]; + [inputManager writeDefaultsInputMappings]; +} + +- (void) didEndSettingsSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo +{ + [sheet orderOut:self]; + + NSOutlineView *outlineView = (NSOutlineView *)contextInfo; + NSMutableDictionary *deviceInfo = (NSMutableDictionary *)[inputSettingsController content]; + + switch (returnCode) + { + case NSCancelButton: + break; + + case NSOKButton: + [self setMappingUsingDeviceInfoDictionary:deviceInfo]; + [outlineView reloadItem:deviceInfo reloadChildren:NO]; + break; + + default: + break; + } + + [inputSettingsController setContent:nil]; } #pragma mark InputHIDManagerTarget Protocol @@ -199,7 +286,7 @@ { BOOL isHandled = NO; - if ([self configInputTargetID] == 0) + if ([self configInputTargetID] == nil) { ClearHIDQueue(hidQueue); return isHandled; @@ -211,11 +298,15 @@ for (unsigned int i = 0; i < inputCount; i++) { const InputAttributes &inputAttr = inputList[i]; - const std::string inputKey = inputAttr.deviceCode + ":" + inputAttr.elementCode; - NSString *inputKeyStr = [NSString stringWithCString:inputKey.c_str() encoding:NSUTF8StringEncoding]; + char inputKey[INPUT_HANDLER_STRING_LENGTH*2]; + strlcpy(inputKey, inputAttr.deviceCode, INPUT_HANDLER_STRING_LENGTH*2); + strlcat(inputKey, ":", INPUT_HANDLER_STRING_LENGTH*2); + strlcat(inputKey, inputAttr.elementCode, INPUT_HANDLER_STRING_LENGTH*2); + + NSString *inputKeyStr = [NSString stringWithCString:inputKey encoding:NSUTF8StringEncoding]; NSDate *inputOnDate = [configInputList valueForKey:inputKeyStr]; - if (inputAttr.inputState == INPUT_ATTRIBUTE_STATE_ON) + if (inputAttr.state == INPUT_ATTRIBUTE_STATE_ON) { if (inputOnDate == nil) { @@ -233,21 +324,7 @@ } else { - std::string commandTag = commandTagMap[[self configInputTargetID]]; - if (commandTag.empty()) - { - continue; - } - - // Add the input mapping. - [inputManager addMappingUsingInputAttributes:&inputAttr commandTag:commandTag.c_str()]; - [inputManager writeUserDefaultsMappingUsingInputAttributes:&inputAttr commandTag:commandTag.c_str()]; - - NSMutableDictionary *prefWindowBindings = [(PreferencesWindowDelegate *)[prefWindow delegate] bindings]; - NSString *displayBinding = (NSString *)[displayStringBindings valueForKey:[NSString stringWithFormat:@"%i", [self configInputTargetID]]]; - [prefWindowBindings setValue:[self parseMappingDisplayString:commandTag.c_str()] forKey:displayBinding]; - - [self setConfigInputTargetID:0]; + isHandled = [self addMappingUsingInputAttributes:&inputAttr commandTag:[self configInputTargetID]]; break; } } @@ -258,6 +335,199 @@ return isHandled; } +#pragma mark NSOutlineViewDelegate Protocol + +- (BOOL)selectionShouldChangeInOutlineView:(NSOutlineView *)outlineView +{ + return NO; +} + +- (BOOL)outlineView:(NSOutlineView *)outlineView shouldTrackCell:(NSCell *)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item +{ + if ([(NSString *)[tableColumn identifier] isEqualToString:@"InputCommandTagColumn"] || + [(NSString *)[tableColumn identifier] isEqualToString:@"InputSettingsColumn"] || + [(NSString *)[tableColumn identifier] isEqualToString:@"RemoveInputColumn"]) + { + return YES; + } + + return NO; +} + +- (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item +{ + NSString *columnID = (NSString *)[tableColumn identifier]; + NSCell *outCell = [tableColumn dataCellForRow:[outlineView rowForItem:item]]; + + if ([columnID isEqualToString:@"InputCommandTagColumn"]) + { + if ([item isKindOfClass:[NSArray class]]) + { + NSString *commandTag = [self commandTagFromInputList:item]; + if (commandTag != nil) + { + NSImage *buttonImage = (NSImage *)[inputPrefProperties valueForKey:commandTag]; + if (buttonImage == nil) + { + buttonImage = (NSImage *)[inputPrefProperties valueForKey:@"UNKNOWN COMMAND"]; + } + + [outCell setTitle:commandTag]; + [outCell setImage:buttonImage]; + } + else + { + outCell = [[[NSCell alloc] init] autorelease]; + } + } + else + { + outCell = [[[NSCell alloc] init] autorelease]; + } + } + else if ([columnID isEqualToString:@"InputDeviceColumn"]) + { + NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName] + traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0 + weight:0 + size:[[outCell font] pointSize]]; + [outCell setFont:newFont]; + } + else if ([columnID isEqualToString:@"InputSettingsSummaryColumn"]) + { + NSFont *newFont = [[NSFontManager sharedFontManager] fontWithFamily:[[outCell font] familyName] + traits:([item isKindOfClass:[NSArray class]]) ? NSBoldFontMask : 0 + weight:0 + size:[[outCell font] pointSize]]; + [outCell setFont:newFont]; + } + else if ([columnID isEqualToString:@"InputSettingsColumn"]) + { + if ([item isKindOfClass:[NSDictionary class]]) + { + NSString *commandTag = [self commandTagFromInputList:[outlineView parentForItem:item]]; + NSWindow *theSheet = (NSWindow *)[inputSettingsMappings valueForKey:commandTag]; + [outCell setEnabled:(theSheet == nil) ? NO : YES]; + } + else + { + outCell = [[[NSCell alloc] init] autorelease]; + } + } + else if ([columnID isEqualToString:@"RemoveInputColumn"]) + { + if (![item isKindOfClass:[NSDictionary class]]) + { + outCell = [[[NSCell alloc] init] autorelease]; + } + } + + return outCell; +} + +#pragma mark NSOutlineViewDataSource Protocol +- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item +{ + if (item == nil) + { + NSString *commandTag = [commandTagList objectAtIndex:index]; + return [[inputManager inputMappings] valueForKey:commandTag]; + } + else if ([item isKindOfClass:[NSArray class]]) + { + return [(NSArray *)item objectAtIndex:index]; + } + + return nil; +} + +- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item +{ + if ([item isKindOfClass:[NSArray class]]) + { + return YES; + } + + return NO; +} + +- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item +{ + NSInteger numberChildren = 0; + + if (item == nil) + { + numberChildren = [commandTagList count]; + } + else if ([item isKindOfClass:[NSArray class]]) + { + numberChildren = [(NSArray *)item count]; + } + + return numberChildren; +} + +- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item +{ + NSString *columnID = (NSString *)[tableColumn identifier]; + + if ([columnID isEqualToString:@"InputCommandTagColumn"]) + { + if ([item isKindOfClass:[NSDictionary class]]) + { + return nil; + } + } + else if ([columnID isEqualToString:@"InputDeviceColumn"]) + { + if ([item isKindOfClass:[NSArray class]]) + { + const unsigned long inputCount = (unsigned long)[(NSArray *)item count]; + return [NSString stringWithFormat:(inputCount != 1) ? @"%ld Inputs Mapped" : @"%ld Input Mapped", inputCount]; + } + else if ([item isKindOfClass:[NSDictionary class]]) + { + return [item valueForKey:@"deviceInfoSummary"]; + } + + return @""; + } + else if ([columnID isEqualToString:@"InputSettingsSummaryColumn"]) + { + NSString *settingsSummary = @""; + + if ([item isKindOfClass:[NSDictionary class]]) + { + settingsSummary = [item valueForKey:@"inputSettingsSummary"]; + } + + return settingsSummary; + } + else if ([columnID isEqualToString:@"InputSettingsColumn"]) + { + return nil; + } + else if ([columnID isEqualToString:@"RemoveInputColumn"]) + { + return nil; + } + + return item; +} + +- (id)outlineView:(NSOutlineView *)outlineView persistentObjectForItem:(id)item +{ + return [self commandTagFromInputList:item]; +} + +- (id)outlineView:(NSOutlineView *)outlineView itemForPersistentObject:(id)object +{ + NSString *commandTag = (NSString *)object; + NSArray *inputList = (NSArray *)[[inputManager inputMappings] valueForKey:commandTag]; + + return inputList; +} + #pragma mark NSResponder Methods - (void)keyDown:(NSEvent *)theEvent @@ -328,25 +598,81 @@ #pragma mark IBAction Methods -- (IBAction) inputButtonSet:(id)sender +- (IBAction) setInputAdd:(id)sender { - NSButton *theButton = (NSButton *)sender; + NSOutlineView *outlineView = (NSOutlineView *)sender; + const NSInteger rowNumber = [outlineView clickedRow]; - if ([self configInputTargetID] != 0 && lastConfigButton != theButton) - { - [lastConfigButton setState:NSOffState]; - } + [configInputList removeAllObjects]; - if ([theButton state] == NSOnState) + if ([outlineView isRowSelected:rowNumber]) { - lastConfigButton = theButton; - [configInputList removeAllObjects]; - [self setConfigInputTargetID:[theButton tag]]; + [outlineView deselectRow:rowNumber]; + [self setConfigInputTargetID:nil]; } else { - [self setConfigInputTargetID:0]; + [outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:rowNumber] byExtendingSelection:NO]; + + NSArray *inputList = (NSArray *)[outlineView itemAtRow:rowNumber]; + [self setConfigInputTargetID:[self commandTagFromInputList:inputList]]; + [prefWindow makeFirstResponder:self]; } } +- (IBAction) removeInput:(id)sender +{ + NSOutlineView *outlineView = (NSOutlineView *)sender; + const NSInteger rowNumber = [outlineView clickedRow]; + + NSDictionary *deviceInfo = (NSDictionary *)[outlineView itemAtRow:rowNumber]; + [inputManager removeMappingUsingDeviceCode:[(NSString *)[deviceInfo valueForKey:@"deviceCode"] cStringUsingEncoding:NSUTF8StringEncoding] elementCode:[(NSString *)[deviceInfo valueForKey:@"elementCode"] cStringUsingEncoding:NSUTF8StringEncoding]]; + + NSMutableArray *inputList = (NSMutableArray *)[outlineView parentForItem:deviceInfo]; + [inputList removeObject:deviceInfo]; + + [outlineView reloadItem:inputList reloadChildren:YES]; + [inputManager writeDefaultsInputMappings]; +} + +- (IBAction) changeSpeed:(id)sender +{ + NSMutableDictionary *deviceInfo = (NSMutableDictionary *)[inputSettingsController content]; + if (deviceInfo != nil) + { + const float speedScalar = (float)[CocoaDSUtil getIBActionSenderTag:sender] / 100.0f; + [deviceInfo setObject:[NSNumber numberWithFloat:speedScalar] forKey:@"floatValue0"]; + } +} + +- (IBAction) showSettingsSheet:(id)sender +{ + NSOutlineView *outlineView = (NSOutlineView *)sender; + const NSInteger rowNumber = [outlineView clickedRow]; + + NSMutableDictionary *item = (NSMutableDictionary *)[outlineView itemAtRow:rowNumber]; + NSString *commandTag = [self commandTagFromInputList:[outlineView parentForItem:item]]; + NSWindow *theSheet = (NSWindow *)[inputSettingsMappings valueForKey:commandTag]; + + if (theSheet == nil) + { + return; + } + + [inputSettingsController setContent:item]; + + [NSApp beginSheet:theSheet + modalForWindow:prefWindow + modalDelegate:self + didEndSelector:@selector(didEndSettingsSheet:returnCode:contextInfo:) + contextInfo:outlineView]; +} + +- (IBAction) closeSettingsSheet:(id)sender +{ + NSWindow *sheet = [(NSControl *)sender window]; + [sheet makeFirstResponder:nil]; // Force end of editing of any text fields. + [NSApp endSheet:sheet returnCode:[CocoaDSUtil getIBActionSenderTag:sender]]; +} + @end diff --git a/desmume/src/cocoa/userinterface/preferencesWindowDelegate.h b/desmume/src/cocoa/userinterface/preferencesWindowDelegate.h index dabd9f08d..d525a2007 100644 --- a/desmume/src/cocoa/userinterface/preferencesWindowDelegate.h +++ b/desmume/src/cocoa/userinterface/preferencesWindowDelegate.h @@ -97,8 +97,6 @@ - (IBAction) chooseCheatDatabase:(id)sender; - (void) chooseCheatDatabaseDidEnd:(NSOpenPanel *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo; -- (IBAction) selectSoundInputMode:(id)sender; - - (IBAction) selectDisplayMode:(id)sender; - (IBAction) selectDisplaySize:(id)sender; - (IBAction) selectDisplayRotation:(id)sender; diff --git a/desmume/src/cocoa/userinterface/preferencesWindowDelegate.mm b/desmume/src/cocoa/userinterface/preferencesWindowDelegate.mm index 4af226250..4ae81a42d 100644 --- a/desmume/src/cocoa/userinterface/preferencesWindowDelegate.mm +++ b/desmume/src/cocoa/userinterface/preferencesWindowDelegate.mm @@ -377,12 +377,6 @@ } } -- (IBAction) selectSoundInputMode:(id)sender -{ - CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content]; - [cdsCore.cdsController setSoundInputMode:[[NSUserDefaults standardUserDefaults] integerForKey:@"Input_AudioInputMode"]]; -} - - (IBAction) selectDisplayMode:(id)sender { const NSInteger displayMode = [(NSMenuItem *)sender tag]; @@ -762,7 +756,7 @@ { [prefWindowController setContent:bindings]; - if ([viewInput configInputTargetID] != 0) + if ([viewInput configInputTargetID] != nil) { [[viewInput inputManager] setHidInputTarget:viewInput]; } @@ -770,7 +764,7 @@ - (void)windowWillClose:(NSNotification *)notification { - [viewInput setConfigInputTargetID:0]; + [viewInput setConfigInputTargetID:nil]; } @end