2006-01-23 03:48:03 +00:00
|
|
|
#include "global.h"
|
|
|
|
|
#include "KeyboardDevice.h"
|
|
|
|
|
|
|
|
|
|
using namespace __gnu_cxx;
|
|
|
|
|
|
|
|
|
|
bool KeyboardDevice::AddLogicalDevice( int usagePage, int usage )
|
|
|
|
|
{
|
|
|
|
|
return usagePage == kHIDPage_GenericDesktop && usage == kHIDUsage_GD_Keyboard;
|
|
|
|
|
}
|
|
|
|
|
|
2006-02-10 09:21:39 +00:00
|
|
|
void KeyboardDevice::AddElement( int usagePage, int usage, int cookie, const CFDictionaryRef properties )
|
2006-01-23 03:48:03 +00:00
|
|
|
{
|
|
|
|
|
if( usagePage != kHIDPage_KeyboardOrKeypad )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if( usage < kHIDUsage_KeyboardA )
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if( usage <= kHIDUsage_KeyboardZ )
|
|
|
|
|
{
|
|
|
|
|
m_Mapping[cookie] = enum_add2( KEY_Ca, usage - kHIDUsage_KeyboardA );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( usage >= kHIDUsage_KeyboardF1 && usage <= kHIDUsage_KeyboardF12 )
|
|
|
|
|
{
|
|
|
|
|
m_Mapping[cookie] = enum_add2( KEY_F1, usage - kHIDUsage_KeyboardF1 );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( usage >= kHIDUsage_KeyboardF13 && usage <= kHIDUsage_KeyboardF16 )
|
|
|
|
|
{
|
|
|
|
|
m_Mapping[cookie] = enum_add2( KEY_F13, usage - kHIDUsage_KeyboardF13 );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// keypad 0 is again backward
|
|
|
|
|
if( usage >= kHIDUsage_Keypad1 && usage <= kHIDUsage_Keypad9 )
|
|
|
|
|
{
|
|
|
|
|
m_Mapping[cookie] = enum_add2( KEY_KP_C1, usage - kHIDUsage_Keypad1 );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define OTHER(n) (enum_add2(KEY_OTHER_0, (n)))
|
|
|
|
|
|
|
|
|
|
// [0, 8]
|
|
|
|
|
if( usage >= kHIDUsage_KeyboardF17 && usage <= kHIDUsage_KeyboardExecute )
|
|
|
|
|
{
|
|
|
|
|
m_Mapping[cookie] = OTHER( 0 + usage - kHIDUsage_KeyboardF17 );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// [9, 19]
|
|
|
|
|
if( usage >= kHIDUsage_KeyboardSelect && usage <= kHIDUsage_KeyboardVolumeDown )
|
|
|
|
|
{
|
|
|
|
|
m_Mapping[cookie] = OTHER( 9 + usage - kHIDUsage_KeyboardSelect );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2006-02-24 21:41:37 +00:00
|
|
|
// [20, 41]
|
2006-01-23 03:48:03 +00:00
|
|
|
if( usage >= kHIDUsage_KeypadEqualSignAS400 && usage <= kHIDUsage_KeyboardCancel )
|
|
|
|
|
{
|
|
|
|
|
m_Mapping[cookie] = OTHER( 20 + usage - kHIDUsage_KeypadEqualSignAS400 );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2006-02-24 21:41:37 +00:00
|
|
|
// [42, 47]
|
2006-01-23 03:48:03 +00:00
|
|
|
// XXX kHIDUsage_KeyboardClearOrAgain
|
|
|
|
|
if( usage >= kHIDUsage_KeyboardSeparator && usage <= kHIDUsage_KeyboardExSel )
|
|
|
|
|
{
|
|
|
|
|
m_Mapping[cookie] = OTHER( 32 + usage - kHIDUsage_KeyboardSeparator );
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define X(x,y) case x: m_Mapping[cookie] = y; return
|
|
|
|
|
|
|
|
|
|
// Time for the special cases
|
|
|
|
|
switch( usage )
|
|
|
|
|
{
|
|
|
|
|
X( kHIDUsage_Keyboard0, KEY_C0 );
|
|
|
|
|
X( kHIDUsage_Keypad0, KEY_KP_C0 );
|
|
|
|
|
X( kHIDUsage_KeyboardReturnOrEnter, KEY_ENTER );
|
|
|
|
|
X( kHIDUsage_KeyboardEscape, KEY_ESC );
|
|
|
|
|
X( kHIDUsage_KeyboardDeleteOrBackspace, KEY_BACK );
|
|
|
|
|
X( kHIDUsage_KeyboardTab, KEY_TAB );
|
|
|
|
|
X( kHIDUsage_KeyboardSpacebar, KEY_SPACE );
|
|
|
|
|
X( kHIDUsage_KeyboardHyphen, KEY_HYPHEN );
|
|
|
|
|
X( kHIDUsage_KeyboardEqualSign, KEY_EQUAL );
|
|
|
|
|
X( kHIDUsage_KeyboardOpenBracket, KEY_LBRACKET );
|
|
|
|
|
X( kHIDUsage_KeyboardCloseBracket, KEY_RBRACKET );
|
|
|
|
|
X( kHIDUsage_KeyboardBackslash, KEY_BACKSLASH );
|
|
|
|
|
X( kHIDUsage_KeyboardNonUSPound, KEY_HASH );
|
|
|
|
|
X( kHIDUsage_KeyboardSemicolon, KEY_SEMICOLON );
|
|
|
|
|
X( kHIDUsage_KeyboardQuote, KEY_SQUOTE );
|
|
|
|
|
X( kHIDUsage_KeyboardGraveAccentAndTilde, KEY_ACCENT );
|
|
|
|
|
X( kHIDUsage_KeyboardComma, KEY_COMMA );
|
|
|
|
|
X( kHIDUsage_KeyboardPeriod, KEY_PERIOD );
|
|
|
|
|
X( kHIDUsage_KeyboardSlash, KEY_SLASH );
|
|
|
|
|
X( kHIDUsage_KeyboardCapsLock, KEY_CAPSLOCK );
|
|
|
|
|
X( kHIDUsage_KeyboardPrintScreen, KEY_PRTSC );
|
|
|
|
|
X( kHIDUsage_KeyboardScrollLock, KEY_SCRLLOCK );
|
2006-02-24 21:41:37 +00:00
|
|
|
X( kHIDUsage_KeyboardPause, KEY_PAUSE );
|
2006-01-23 03:48:03 +00:00
|
|
|
X( kHIDUsage_KeyboardInsert, KEY_INSERT );
|
|
|
|
|
X( kHIDUsage_KeyboardHome, KEY_HOME );
|
|
|
|
|
X( kHIDUsage_KeyboardPageUp, KEY_PGUP );
|
|
|
|
|
X( kHIDUsage_KeyboardDeleteForward, KEY_DEL );
|
|
|
|
|
X( kHIDUsage_KeyboardEnd, KEY_END );
|
|
|
|
|
X( kHIDUsage_KeyboardPageDown, KEY_PGDN );
|
|
|
|
|
X( kHIDUsage_KeyboardRightArrow, KEY_RIGHT );
|
|
|
|
|
X( kHIDUsage_KeyboardLeftArrow, KEY_LEFT );
|
|
|
|
|
X( kHIDUsage_KeyboardDownArrow, KEY_DOWN );
|
|
|
|
|
X( kHIDUsage_KeyboardUpArrow, KEY_UP );
|
|
|
|
|
X( kHIDUsage_KeypadNumLock, KEY_NUMLOCK );
|
|
|
|
|
X( kHIDUsage_KeypadSlash, KEY_KP_SLASH );
|
|
|
|
|
X( kHIDUsage_KeypadEqualSign, KEY_KP_EQUAL );
|
|
|
|
|
X( kHIDUsage_KeypadAsterisk, KEY_KP_ASTERISK );
|
|
|
|
|
X( kHIDUsage_KeypadHyphen, KEY_KP_HYPHEN );
|
|
|
|
|
X( kHIDUsage_KeypadPlus, KEY_KP_PLUS );
|
|
|
|
|
X( kHIDUsage_KeypadEnter, KEY_KP_ENTER );
|
|
|
|
|
X( kHIDUsage_KeypadPeriod, KEY_KP_PERIOD );
|
2006-02-24 21:41:37 +00:00
|
|
|
X( kHIDUsage_KeyboardNonUSBackslash, OTHER(48) );
|
|
|
|
|
X( kHIDUsage_KeyboardApplication, OTHER(49) );
|
2006-01-23 03:48:03 +00:00
|
|
|
X( kHIDUsage_KeyboardClear, KEY_NUMLOCK ); // XXX
|
|
|
|
|
X( kHIDUsage_KeyboardHelp, KEY_INSERT );
|
|
|
|
|
X( kHIDUsage_KeyboardMenu, KEY_MENU );
|
|
|
|
|
// XXX kHIDUsage_KeyboardLockingCapsLock
|
|
|
|
|
// XXX kHIDUsage_KeyboardLockingNumLock
|
|
|
|
|
// XXX kHIDUsage_KeyboardLockingScrollLock
|
|
|
|
|
X( kHIDUsage_KeypadComma, KEY_KP_PERIOD ); // XXX
|
|
|
|
|
X( kHIDUsage_KeyboardReturn, KEY_ENTER );
|
2006-02-24 21:41:37 +00:00
|
|
|
X( kHIDUsage_KeyboardPrior, OTHER(50) );
|
2006-01-23 03:48:03 +00:00
|
|
|
X( kHIDUsage_KeyboardLeftControl, KEY_LCTRL );
|
|
|
|
|
X( kHIDUsage_KeyboardLeftShift, KEY_LSHIFT );
|
|
|
|
|
X( kHIDUsage_KeyboardLeftAlt, KEY_LALT );
|
|
|
|
|
X( kHIDUsage_KeyboardLeftGUI, KEY_LMETA );
|
|
|
|
|
X( kHIDUsage_KeyboardRightControl, KEY_RCTRL );
|
|
|
|
|
X( kHIDUsage_KeyboardRightShift, KEY_RSHIFT );
|
|
|
|
|
X( kHIDUsage_KeyboardRightAlt, KEY_RALT );
|
|
|
|
|
X( kHIDUsage_KeyboardRightGUI, KEY_RMETA );
|
|
|
|
|
}
|
|
|
|
|
#undef X
|
|
|
|
|
#undef OTHER
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KeyboardDevice::Open()
|
|
|
|
|
{
|
|
|
|
|
for( hash_map<int,DeviceButton>::const_iterator i = m_Mapping.begin(); i != m_Mapping.end(); ++i )
|
|
|
|
|
AddElementToQueue( i->first );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void KeyboardDevice::GetButtonPresses( vector<pair<DeviceInput, bool> >& vPresses, int cookie,
|
|
|
|
|
int value, const RageTimer& now ) const
|
|
|
|
|
{
|
|
|
|
|
hash_map<int, DeviceButton>::const_iterator iter = m_Mapping.find( cookie );
|
|
|
|
|
|
|
|
|
|
if( iter != m_Mapping.end() )
|
|
|
|
|
vPresses.push_back( pair<DeviceInput, bool>(DeviceInput(DEVICE_KEYBOARD, iter->second, value, now), value) );
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2006-02-27 17:51:27 +00:00
|
|
|
void KeyboardDevice::GetDevicesAndDescriptions( vector<InputDeviceInfo>& vDevices ) const
|
2006-01-23 03:48:03 +00:00
|
|
|
{
|
2006-02-27 17:51:27 +00:00
|
|
|
if( vDevices.size() && vDevices[0] == DEVICE_KEYBOARD )
|
2006-01-23 03:48:03 +00:00
|
|
|
return;
|
2006-02-27 17:51:27 +00:00
|
|
|
vDevices.insert( dev.begin(), InputDeviceInfo(DEVICE_KEYBOARD,"Keyboard") );
|
2006-01-23 03:48:03 +00:00
|
|
|
}
|
|
|
|
|
|
2006-01-27 10:33:07 +00:00
|
|
|
/*
|
|
|
|
|
* (c) 2005-2006 Steve Checkoway
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
|
* copy of this software and associated documentation files (the
|
|
|
|
|
* "Software"), to deal in the Software without restriction, including
|
|
|
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
|
|
|
* distribute, and/or sell copies of the Software, and to permit persons to
|
|
|
|
|
* whom the Software is furnished to do so, provided that the above
|
|
|
|
|
* copyright notice(s) and this permission notice appear in all copies of
|
|
|
|
|
* the Software and that both the above copyright notice(s) and this
|
|
|
|
|
* permission notice appear in supporting documentation.
|
|
|
|
|
*
|
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
|
|
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
|
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
|
|
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
|
|
|
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
|
|
|
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
|
|
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
|
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
*/
|