diff --git a/stepmania/src/arch/InputHandler/InputHandler.cpp b/stepmania/src/arch/InputHandler/InputHandler.cpp index 133b65d317..a3f8123805 100644 --- a/stepmania/src/arch/InputHandler/InputHandler.cpp +++ b/stepmania/src/arch/InputHandler/InputHandler.cpp @@ -3,7 +3,6 @@ #include "RageUtil.h" #include "InputHandler.h" #include "RageLog.h" -#include void InputHandler::UpdateTimer() { diff --git a/stepmania/src/arch/InputHandler/InputHandler_Carbon.cpp b/stepmania/src/arch/InputHandler/InputHandler_Carbon.cpp index 6857c0dbd8..bcc67f3c4b 100644 --- a/stepmania/src/arch/InputHandler/InputHandler_Carbon.cpp +++ b/stepmania/src/arch/InputHandler/InputHandler_Carbon.cpp @@ -337,6 +337,35 @@ RString InputHandler_Carbon::GetDeviceSpecificInputString( const DeviceInput &di return InputHandler::GetDeviceSpecificInputString( di ); } +wchar_t InputHandler_Carbon::DeviceButtonToChar( DeviceButton button, bool bUseCurrentKeyModifiers ) +{ + // Find the USB key code for this DeviceButton + UInt8 iMacVirtualKey; + if( KeyboardDevice::DeviceButtonToMacVirtualKey( button, iMacVirtualKey ) ) + { + UInt32 modifiers = 0; + if( bUseCurrentKeyModifiers ) + modifiers = GetCurrentKeyModifiers(); + + static unsigned long state = 0; + static Ptr keymap = nil; + Ptr new_keymap; + + new_keymap = (Ptr)GetScriptManagerVariable(smKCHRCache); + if( new_keymap != keymap ) + { + keymap = new_keymap; + state = 0; + } + // TODO: Use UCKeyTranslate + wchar_t ch = KeyTranslate( keymap, ((int)iMacVirtualKey)|modifiers, &state ) & 0xFFFF; + return ch; + } + + return InputHandler::DeviceButtonToChar( button, bUseCurrentKeyModifiers ); +} + + /* * (c) 2005, 2006 Steve Checkoway * All rights reserved. diff --git a/stepmania/src/arch/InputHandler/InputHandler_Carbon.h b/stepmania/src/arch/InputHandler/InputHandler_Carbon.h index 4a868146b9..5999297097 100644 --- a/stepmania/src/arch/InputHandler/InputHandler_Carbon.h +++ b/stepmania/src/arch/InputHandler/InputHandler_Carbon.h @@ -35,6 +35,7 @@ public: bool DevicesChanged() { LockMut( m_ChangeLock ); return m_bChanged; } void GetDevicesAndDescriptions( vector& vDevicesOut ); RString GetDeviceSpecificInputString( const DeviceInput &di ); + wchar_t DeviceButtonToChar( DeviceButton button, bool bUseCurrentKeyModifiers ); static void QueueCallBack( void *target, int result, void *refcon, void *sender ); }; diff --git a/stepmania/src/archutils/Darwin/KeyboardDevice.cpp b/stepmania/src/archutils/Darwin/KeyboardDevice.cpp index 22066c4c2e..8cbe07fa97 100644 --- a/stepmania/src/archutils/Darwin/KeyboardDevice.cpp +++ b/stepmania/src/archutils/Darwin/KeyboardDevice.cpp @@ -8,44 +8,43 @@ bool KeyboardDevice::AddLogicalDevice( int usagePage, int usage ) return usagePage == kHIDPage_GenericDesktop && usage == kHIDUsage_GD_Keyboard; } -void KeyboardDevice::AddElement( int usagePage, int usage, int cookie, const CFDictionaryRef properties ) +static bool UsbKeyToDeviceButton( UInt8 iUsbKey, DeviceButton &buttonOut ) { - if( usagePage != kHIDPage_KeyboardOrKeypad ) - return; + UInt8 usage = iUsbKey; if( usage < kHIDUsage_KeyboardA ) - return; + return false; if( usage <= kHIDUsage_KeyboardZ ) { - m_Mapping[cookie] = enum_add2( KEY_Ca, usage - kHIDUsage_KeyboardA ); - return; + buttonOut = enum_add2( KEY_Ca, usage - kHIDUsage_KeyboardA ); + return true; } // KEY_C0 = KEY_C1 - 1, kHIDUsage_Keyboard0 = kHIDUsage_Keyboard9 + 1 if( usage <= kHIDUsage_Keyboard9 ) { - m_Mapping[cookie] = enum_add2( KEY_C1, usage - kHIDUsage_Keyboard1 ); - return; + buttonOut = enum_add2( KEY_C1, usage - kHIDUsage_Keyboard1 ); + return true; } if( usage >= kHIDUsage_KeyboardF1 && usage <= kHIDUsage_KeyboardF12 ) { - m_Mapping[cookie] = enum_add2( KEY_F1, usage - kHIDUsage_KeyboardF1 ); - return; + buttonOut = enum_add2( KEY_F1, usage - kHIDUsage_KeyboardF1 ); + return true; } if( usage >= kHIDUsage_KeyboardF13 && usage <= kHIDUsage_KeyboardF16 ) { - m_Mapping[cookie] = enum_add2( KEY_F13, usage - kHIDUsage_KeyboardF13 ); - return; + buttonOut = enum_add2( KEY_F13, usage - kHIDUsage_KeyboardF13 ); + return true; } // keypad 0 is again backward if( usage >= kHIDUsage_Keypad1 && usage <= kHIDUsage_Keypad9 ) { - m_Mapping[cookie] = enum_add2( KEY_KP_C1, usage - kHIDUsage_Keypad1 ); - return; + buttonOut = enum_add2( KEY_KP_C1, usage - kHIDUsage_Keypad1 ); + return true; } #define OTHER(n) (enum_add2(KEY_OTHER_0, (n))) @@ -53,33 +52,33 @@ void KeyboardDevice::AddElement( int usagePage, int usage, int cookie, const CFD // [0, 8] if( usage >= kHIDUsage_KeyboardF17 && usage <= kHIDUsage_KeyboardExecute ) { - m_Mapping[cookie] = OTHER( 0 + usage - kHIDUsage_KeyboardF17 ); - return; + buttonOut = OTHER( 0 + usage - kHIDUsage_KeyboardF17 ); + return true; } // [9, 19] if( usage >= kHIDUsage_KeyboardSelect && usage <= kHIDUsage_KeyboardVolumeDown ) { - m_Mapping[cookie] = OTHER( 9 + usage - kHIDUsage_KeyboardSelect ); - return; + buttonOut = OTHER( 9 + usage - kHIDUsage_KeyboardSelect ); + return true; } // [20, 41] if( usage >= kHIDUsage_KeypadEqualSignAS400 && usage <= kHIDUsage_KeyboardCancel ) { - m_Mapping[cookie] = OTHER( 20 + usage - kHIDUsage_KeypadEqualSignAS400 ); - return; + buttonOut = OTHER( 20 + usage - kHIDUsage_KeypadEqualSignAS400 ); + return true; } // [42, 47] // XXX kHIDUsage_KeyboardClearOrAgain if( usage >= kHIDUsage_KeyboardSeparator && usage <= kHIDUsage_KeyboardExSel ) { - m_Mapping[cookie] = OTHER( 42 + usage - kHIDUsage_KeyboardSeparator ); - return; + buttonOut = OTHER( 32 + usage - kHIDUsage_KeyboardSeparator ); + return true; } -#define X(x,y) case x: m_Mapping[cookie] = y; return +#define X(x,y) case x: buttonOut = y; return true // Time for the special cases switch( usage ) @@ -147,6 +146,18 @@ void KeyboardDevice::AddElement( int usagePage, int usage, int cookie, const CFD } #undef X #undef OTHER + + return false; +} + +void KeyboardDevice::AddElement( int usagePage, int usage, int cookie, const CFDictionaryRef properties ) +{ + if( usagePage != kHIDPage_KeyboardOrKeypad ) + return; + + DeviceButton button; + if( UsbKeyToDeviceButton(usage,button) ) + m_Mapping[cookie] = button; } void KeyboardDevice::Open() @@ -171,6 +182,323 @@ void KeyboardDevice::GetDevicesAndDescriptions( vector& vDevice return; vDevices.insert( vDevices.begin(), InputDeviceInfo(DEVICE_KEYBOARD, "Keyboard") ); } + + +static bool DeviceButtonToUsbKey( DeviceButton button, UInt8 &iUsbKeyOut ) +{ + for( int i=0; i<256; i++ ) + { + UInt8 iUsbKey = (UInt8)i; + DeviceButton button2; + if( !UsbKeyToDeviceButton(iUsbKey,button2) ) + continue; + if( button == button2 ) + { + iUsbKeyOut = iUsbKey; + return true; + } + } + + return false; +} + +// http://lists.apple.com/archives/carbon-dev/2005/Feb/msg00071.html +// index represents USB keyboard usage value, content is Mac virtual keycode +static UInt8 g_iUsbKeyToMacVirtualKey[256] = +{ + 0xFF, /* 00 no event */ + 0xFF, /* 01 ErrorRollOver */ + 0xFF, /* 02 POSTFail */ + 0xFF, /* 03 ErrorUndefined */ + 0x00, /* 04 A */ + 0x0B, /* 05 B */ + 0x08, /* 06 C */ + 0x02, /* 07 D */ + 0x0E, /* 08 E */ + 0x03, /* 09 F */ + 0x05, /* 0A G */ + 0x04, /* 0B H */ + 0x22, /* 0C I */ + 0x26, /* 0D J */ + 0x28, /* 0E K */ + 0x25, /* 0F L */ + + 0x2E, /* 10 M */ + 0x2D, /* 11 N */ + 0x1F, /* 12 O */ + 0x23, /* 13 P */ + 0x0C, /* 14 Q */ + 0x0F, /* 15 R */ + 0x01, /* 16 S */ + 0x11, /* 17 T */ + 0x20, /* 18 U */ + 0x09, /* 19 V */ + 0x0D, /* 1A W */ + 0x07, /* 1B X */ + 0x10, /* 1C Y */ + 0x06, /* 1D Z */ + 0x12, /* 1E 1/! */ + 0x13, /* 1F 2/@ */ + + 0x14, /* 20 3 # */ + 0x15, /* 21 4 $ */ + 0x17, /* 22 5 % */ + 0x16, /* 23 6 ^ */ + 0x1A, /* 24 7 & */ + 0x1C, /* 25 8 * */ + 0x19, /* 26 9 ( */ + 0x1D, /* 27 0 ) */ + 0x24, /* 28 Return (Enter) */ + 0x35, /* 29 ESC */ + 0x33, /* 2A Delete (Backspace) */ + 0x30, /* 2B Tab */ + 0x31, /* 2C Spacebar */ + 0x1B, /* 2D - _ */ + 0x18, /* 2E = + */ + 0x21, /* 2F [ { */ + + 0x1E, /* 30 ] } */ + 0x2A, /* 31 \ | */ + 0xFF, /* 32 Non-US # and ~ (what?!!!) */ + 0x29, /* 33 ; : */ + 0x27, /* 34 ' " */ + 0x32, /* 35 ` ~ */ + 0x2B, /* 36 , < */ + 0x2F, /* 37 . > */ + 0x2C, /* 38 / ? */ + 0x39, /* 39 Caps Lock */ + 0x7A, /* 3A F1 */ + 0x78, /* 3B F2 */ + 0x63, /* 3C F3 */ + 0x76, /* 3D F4 */ + 0x60, /* 3E F5 */ + 0x61, /* 3F F6 */ + + 0x62, /* 40 F7 */ + 0x64, /* 41 F8 */ + 0x65, /* 42 F9 */ + 0x6D, /* 43 F10 */ + 0x67, /* 44 F11 */ + 0x6F, /* 45 F12 */ + 0x69, /* 46 F13/PrintScreen */ + 0x6B, /* 47 F14/ScrollLock */ + 0x71, /* 48 F15/Pause */ + 0x72, /* 49 Insert */ + 0x73, /* 4A Home */ + 0x74, /* 4B PageUp */ + 0x75, /* 4C Delete Forward */ + 0x77, /* 4D End */ + 0x79, /* 4E PageDown */ + 0x7C, /* 4F RightArrow */ + + 0x7B, /* 50 LeftArrow */ + 0x7D, /* 51 DownArrow */ + 0x7E, /* 52 UpArrow */ + 0x47, /* 53 NumLock/Clear */ + 0x4B, /* 54 Keypad / */ + 0x43, /* 55 Keypad * */ + 0x4E, /* 56 Keypad - */ + 0x45, /* 57 Keypad + */ + 0x4C, /* 58 Keypad Enter */ + 0x53, /* 59 Keypad 1 */ + 0x54, /* 5A Keypad 2 */ + 0x55, /* 5B Keypad 3 */ + 0x56, /* 5C Keypad 4 */ + 0x57, /* 5D Keypad 5 */ + 0x58, /* 5E Keypad 6 */ + 0x59, /* 5F Keypad 7 */ + + 0x5B, /* 60 Keypad 8 */ + 0x5C, /* 61 Keypad 9 */ + 0x52, /* 62 Keypad 0 */ + 0x41, /* 63 Keypad . */ + 0xFF, /* 64 Non-US \ and | (what ??!!) */ + 0x6E, /* 65 ApplicationKey (not on a mac!)*/ + 0x7F, /* 66 PowerKey */ + 0x51, /* 67 Keypad = */ + 0x69, /* 68 F13 */ + 0x6B, /* 69 F14 */ + 0x71, /* 6A F15 */ + 0xFF, /* 6B F16 */ + 0xFF, /* 6C F17 */ + 0xFF, /* 6D F18 */ + 0xFF, /* 6E F19 */ + 0xFF, /* 6F F20 */ + + 0x5B, /* 70 F21 */ + 0x5C, /* 71 F22 */ + 0x52, /* 72 F23 */ + 0x41, /* 73 F24 */ + 0xFF, /* 74 Execute */ + 0xFF, /* 75 Help */ + 0x7F, /* 76 Menu */ + 0x4C, /* 77 Select */ + 0x69, /* 78 Stop */ + 0x6B, /* 79 Again */ + 0x71, /* 7A Undo */ + 0xFF, /* 7B Cut */ + 0xFF, /* 7C Copy */ + 0xFF, /* 7D Paste */ + 0xFF, /* 7E Find */ + 0xFF, /* 7F Mute */ + + 0xFF, /* 80 no event */ + 0xFF, /* 81 no event */ + 0xFF, /* 82 no event */ + 0xFF, /* 83 no event */ + 0xFF, /* 84 no event */ + 0xFF, /* 85 no event */ + 0xFF, /* 86 no event */ + 0xFF, /* 87 no event */ + 0xFF, /* 88 no event */ + 0xFF, /* 89 no event */ + 0xFF, /* 8A no event */ + 0xFF, /* 8B no event */ + 0xFF, /* 8C no event */ + 0xFF, /* 8D no event */ + 0xFF, /* 8E no event */ + 0xFF, /* 8F no event */ + + 0xFF, /* 90 no event */ + 0xFF, /* 91 no event */ + 0xFF, /* 92 no event */ + 0xFF, /* 93 no event */ + 0xFF, /* 94 no event */ + 0xFF, /* 95 no event */ + 0xFF, /* 96 no event */ + 0xFF, /* 97 no event */ + 0xFF, /* 98 no event */ + 0xFF, /* 99 no event */ + 0xFF, /* 9A no event */ + 0xFF, /* 9B no event */ + 0xFF, /* 9C no event */ + 0xFF, /* 9D no event */ + 0xFF, /* 9E no event */ + 0xFF, /* 9F no event */ + + 0xFF, /* A0 no event */ + 0xFF, /* A1 no event */ + 0xFF, /* A2 no event */ + 0xFF, /* A3 no event */ + 0xFF, /* A4 no event */ + 0xFF, /* A5 no event */ + 0xFF, /* A6 no event */ + 0xFF, /* A7 no event */ + 0xFF, /* A8 no event */ + 0xFF, /* A9 no event */ + 0xFF, /* AA no event */ + 0xFF, /* AB no event */ + 0xFF, /* AC no event */ + 0xFF, /* AD no event */ + 0xFF, /* AE no event */ + 0xFF, /* AF no event */ + + 0xFF, /* B0 no event */ + 0xFF, /* B1 no event */ + 0xFF, /* B2 no event */ + 0xFF, /* B3 no event */ + 0xFF, /* B4 no event */ + 0xFF, /* B5 no event */ + 0xFF, /* B6 no event */ + 0xFF, /* B7 no event */ + 0xFF, /* B8 no event */ + 0xFF, /* B9 no event */ + 0xFF, /* BA no event */ + 0xFF, /* BB no event */ + 0xFF, /* BC no event */ + 0xFF, /* BD no event */ + 0xFF, /* BE no event */ + 0xFF, /* BF no event */ + + 0xFF, /* C0 no event */ + 0xFF, /* C1 no event */ + 0xFF, /* C2 no event */ + 0xFF, /* C3 no event */ + 0xFF, /* C4 no event */ + 0xFF, /* C5 no event */ + 0xFF, /* C6 no event */ + 0xFF, /* C7 no event */ + 0xFF, /* C8 no event */ + 0xFF, /* C9 no event */ + 0xFF, /* CA no event */ + 0xFF, /* CB no event */ + 0xFF, /* CC no event */ + 0xFF, /* CD no event */ + 0xFF, /* CE no event */ + 0xFF, /* CF no event */ + + 0xFF, /* D0 no event */ + 0xFF, /* D1 no event */ + 0xFF, /* D2 no event */ + 0xFF, /* D3 no event */ + 0xFF, /* D4 no event */ + 0xFF, /* D5 no event */ + 0xFF, /* D6 no event */ + 0xFF, /* D7 no event */ + 0xFF, /* D8 no event */ + 0xFF, /* D9 no event */ + 0xFF, /* DA no event */ + 0xFF, /* DB no event */ + 0xFF, /* DC no event */ + 0xFF, /* DD no event */ + 0xFF, /* DE no event */ + 0xFF, /* DF no event */ + + 0x3B, /* E0 left control key */ + 0x38, /* E1 left shift key key */ + 0x3A, /* E2 left alt/option key */ + 0x37, /* E3 left GUI (windows/cmd) key */ + + 0x3B, /* E4 right control key */ + 0x38, /* E5 right shift key key */ + 0x3A, /* E6 right alt/option key */ + 0x37, /* E7 right GUI (windows/cmd) key */ + 0xFF, /* E8 no event */ + 0xFF, /* E9 no event */ + 0xFF, /* EA no event */ + 0xFF, /* EB no event */ + 0xFF, /* EC no event */ + 0xFF, /* ED no event */ + 0xFF, /* EE no event */ + 0xFF, /* EF no event */ + + 0xFF, /* F0 no event */ + 0xFF, /* F1 no event */ + 0xFF, /* F2 no event */ + 0xFF, /* F3 no event */ + 0xFF, /* F4 no event */ + 0xFF, /* F5 no event */ + 0xFF, /* F6 no event */ + 0xFF, /* F7 no event */ + 0xFF, /* F8 no event */ + 0xFF, /* F9 no event */ + 0xFF, /* FA no event */ + 0xFF, /* FB no event */ + 0xFF, /* FC no event */ + 0xFF, /* FD no event */ + 0xFF, /* FE no event */ + 0xFF, /* FF no event */ +}; + +static bool UsbKeyToMacVirtualKey( UInt8 iUsbKey, UInt8 &iMacVirtualKeyOut ) +{ + // iUsbKey is always < ARRAYSIZE(g_iUsbKeyToMacVirtualKey) + iMacVirtualKeyOut = g_iUsbKeyToMacVirtualKey[iUsbKey]; + return iMacVirtualKeyOut != 0xFF; +} + +bool KeyboardDevice::DeviceButtonToMacVirtualKey( DeviceButton button, UInt8 &iMacVKOut ) +{ + UInt8 iUsbKey = 0; + if( !DeviceButtonToUsbKey(button,iUsbKey) ) + return false; + + if( !UsbKeyToMacVirtualKey(iUsbKey, iMacVKOut) ) + return false; + + return true; +} + /* * (c) 2005-2006 Steve Checkoway diff --git a/stepmania/src/archutils/Darwin/KeyboardDevice.h b/stepmania/src/archutils/Darwin/KeyboardDevice.h index b3e8b73dc1..9338aed1a2 100644 --- a/stepmania/src/archutils/Darwin/KeyboardDevice.h +++ b/stepmania/src/archutils/Darwin/KeyboardDevice.h @@ -18,6 +18,8 @@ public: void GetButtonPresses( vector >& vPresses, int cookie, int value, const RageTimer& now ) const; void GetDevicesAndDescriptions( vector& vDevices ) const; + + static bool DeviceButtonToMacVirtualKey( DeviceButton button, UInt8 &iMacVKOut ); };