hack key emulation

This commit is contained in:
Eric Wasylishen 2016-02-08 01:51:44 -07:00
parent 660f7d4077
commit 3faf16b104
2 changed files with 57 additions and 7 deletions

View file

@ -556,9 +556,9 @@ static int IN_KeyForControllerButton(SDL_GameControllerButton button)
case SDL_CONTROLLER_BUTTON_B: return K_X360_B;
case SDL_CONTROLLER_BUTTON_X: return K_X360_X;
case SDL_CONTROLLER_BUTTON_Y: return K_X360_Y;
case SDL_CONTROLLER_BUTTON_BACK: return K_X360_BACK;
case SDL_CONTROLLER_BUTTON_BACK: return K_ESCAPE;
//case SDL_CONTROLLER_BUTTON_GUIDE: return K_X360_GUIDE;
case SDL_CONTROLLER_BUTTON_START: return K_X360_START;
case SDL_CONTROLLER_BUTTON_START: return K_ESCAPE;
case SDL_CONTROLLER_BUTTON_LEFTSTICK: return K_X360_LEFT_THUMB;
case SDL_CONTROLLER_BUTTON_RIGHTSTICK: return K_X360_RIGHT_THUMB;
case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: return K_X360_LEFT_SHOULDER;
@ -601,9 +601,9 @@ void IN_ControllerButton(SDL_JoystickID instanceid, SDL_GameControllerButton but
Key_Event(key, down);
// also send emulated keyboard key
emulatedkey = IN_EmulatedKeyForControllerKey(key);
if (emulatedkey)
Key_Event(emulatedkey, down);
// emulatedkey = IN_EmulatedKeyForControllerKey(key);
// if (emulatedkey)
// Key_Event(emulatedkey, down);
}
#define DOWN_THRESHOLD 0.5
@ -638,7 +638,7 @@ void IN_ControllerAxis(SDL_JoystickID instanceid, SDL_GameControllerAxis axis, S
_rawDualAxis.left.x = axisValue;
break;
case SDL_CONTROLLER_AXIS_LEFTY:
IN_ControllerAxisButton(_rawDualAxis.left.y, axisValue, K_X360_LEFT_THUMB_DOWN, K_X360_LEFT_THUMB_UP);
IN_ControllerAxisButton(_rawDualAxis.left.y, axisValue, K_X360_LEFT_THUMB_UP, K_X360_LEFT_THUMB_DOWN);
_rawDualAxis.left.y = axisValue;
break;
case SDL_CONTROLLER_AXIS_RIGHTX:
@ -646,7 +646,7 @@ void IN_ControllerAxis(SDL_JoystickID instanceid, SDL_GameControllerAxis axis, S
_rawDualAxis.right.x = axisValue;
break;
case SDL_CONTROLLER_AXIS_RIGHTY:
IN_ControllerAxisButton(_rawDualAxis.right.y, axisValue, K_X360_RIGHT_THUMB_DOWN, K_X360_RIGHT_THUMB_UP);
IN_ControllerAxisButton(_rawDualAxis.right.y, axisValue, K_X360_RIGHT_THUMB_UP, K_X360_RIGHT_THUMB_DOWN);
_rawDualAxis.right.y = axisValue;
break;

View file

@ -947,6 +947,35 @@ void Key_GetGrabbedInput (int *lastkey, int *lastchar)
*lastchar = key_inputgrab.lastchar;
}
static int IN_IsControllerKey(int button)
{
return button >= K_X360_DPAD_UP && button <= K_X360_RIGHT_THUMB_RIGHT;
}
static int IN_EmulatedKeyForControllerKey(int button)
{
switch (button)
{
case K_X360_DPAD_UP: return K_UPARROW;
case K_X360_DPAD_DOWN: return K_DOWNARROW;
case K_X360_DPAD_LEFT: return K_LEFTARROW;
case K_X360_DPAD_RIGHT: return K_RIGHTARROW;
case K_X360_LEFT_THUMB_UP: return K_UPARROW;
case K_X360_LEFT_THUMB_DOWN: return K_DOWNARROW;
case K_X360_LEFT_THUMB_LEFT: return K_LEFTARROW;
case K_X360_LEFT_THUMB_RIGHT: return K_RIGHTARROW;
case K_X360_RIGHT_THUMB_UP: return K_UPARROW;
case K_X360_RIGHT_THUMB_DOWN: return K_DOWNARROW;
case K_X360_RIGHT_THUMB_LEFT: return K_LEFTARROW;
case K_X360_RIGHT_THUMB_RIGHT: return K_RIGHTARROW;
// case K_X360_START: return K_ESCAPE;
// case K_X360_BACK: return K_ESCAPE;
case K_X360_A: return K_ENTER;
case K_X360_B: return K_ESCAPE;
default: return button;
}
}
/*
===================
Key_Event
@ -963,6 +992,27 @@ void Key_Event (int key, qboolean down)
if (key < 0 || key >= MAX_KEYS)
return;
if (IN_IsControllerKey(key))
{
int emukey = IN_EmulatedKeyForControllerKey(key);
if (key_dest == key_menu
&& !key_inputgrab.active)
{
key = emukey;
}
else
{
// handle keyup when leaving menu with an emulated key
if (!down &&
!keydown[key] &&
keydown[emukey])
{
key = emukey;
}
}
}
// handle fullscreen toggle
if (down && (key == K_ENTER || key == K_KP_ENTER) && keydown[K_ALT])
{