protot/3rdparty/RuntimeCompiledCpp/Systems/RocketLibSystem/Input.cpp

355 lines
4.7 KiB
C++

/*
* This source file is part of libRocket, the HTML/CSS Interface Middleware
*
* For the latest information, see http://www.librocket.com
*
* Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd
*
* 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, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* 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. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/
#include "Input.h"
/**
This map contains 4 different mappings from key identifiers to character codes. Each entry represents a different
combination of shift and capslock state.
*/
char ascii_map[4][51] =
{
// shift off and capslock off
{
0,
' ',
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z',
';',
'=',
',',
'-',
'.',
'/',
'`',
'[',
'\\',
']',
'\'',
0,
0
},
// shift on and capslock off
{
0,
' ',
')',
'!',
'@',
'#',
'$',
'%',
'^',
'&',
'*',
'(',
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
':',
'+',
'<',
'_',
'>',
'?',
'~',
'{',
'|',
'}',
'"',
0,
0
},
// shift on and capslock on
{
0,
' ',
')',
'!',
'@',
'#',
'$',
'%',
'^',
'&',
'*',
'(',
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z',
':',
'+',
'<',
'_',
'>',
'?',
'~',
'{',
'|',
'}',
'"',
0,
0
},
// shift off and capslock on
{
0,
' ',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'0',
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
';',
'=',
',',
'-',
'.',
'/',
'`',
'[',
'\\',
']',
'\'',
0,
0
}
};
char keypad_map[2][18] =
{
{
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'\n',
'*',
'+',
0,
'-',
'.',
'/',
'='
},
{
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
'\n',
'*',
'+',
0,
'-',
0,
'/',
'='
}
};
Rocket::Core::Context* Input::context = NULL;
// Sets the context to send input events to.
void Input::SetContext(Rocket::Core::Context* _context)
{
context = _context;
}
// Returns the character code for a key identifer / key modifier combination.
Rocket::Core::word Input::GetCharacterCode(Rocket::Core::Input::KeyIdentifier key_identifier, int key_modifier_state)
{
// Check if we have a keycode capable of generating characters on the main keyboard (ie, not on the numeric
// keypad; that is dealt with below).
if (key_identifier <= Rocket::Core::Input::KI_OEM_102)
{
// Get modifier states
bool shift = (key_modifier_state & Rocket::Core::Input::KM_SHIFT) > 0;
bool capslock = (key_modifier_state & Rocket::Core::Input::KM_CAPSLOCK) > 0;
// Return character code based on identifier and modifiers
if (shift && !capslock)
return ascii_map[1][key_identifier];
if (shift && capslock)
return ascii_map[2][key_identifier];
if (!shift && capslock)
return ascii_map[3][key_identifier];
return ascii_map[0][key_identifier];
}
// Check if we have a keycode from the numeric keypad.
else if (key_identifier <= Rocket::Core::Input::KI_OEM_NEC_EQUAL)
{
if (key_modifier_state & Rocket::Core::Input::KM_NUMLOCK)
return keypad_map[0][key_identifier - Rocket::Core::Input::KI_NUMPAD0];
else
return keypad_map[1][key_identifier - Rocket::Core::Input::KI_NUMPAD0];
}
else if (key_identifier == Rocket::Core::Input::KI_RETURN)
return '\n';
return 0;
}