Add support for use back button as ESC, as example first button in SDL_GAMECONTROLLERCONFIG

This commit is contained in:
Denis Pauk 2017-10-14 18:58:19 +03:00
parent 4bfd1cb9d4
commit 61da3dffd1
4 changed files with 63 additions and 17 deletions

View file

@ -73,6 +73,7 @@ static qboolean mlooking;
static int joystick_yaw, joystick_pitch; static int joystick_yaw, joystick_pitch;
static int joystick_forwardmove, joystick_sidemove; static int joystick_forwardmove, joystick_sidemove;
static int joystick_up; static int joystick_up;
static int back_button_id = -1;
static char last_hat = SDL_HAT_CENTERED; static char last_hat = SDL_HAT_CENTERED;
static qboolean left_trigger = false; static qboolean left_trigger = false;
static qboolean right_trigger = false; static qboolean right_trigger = false;
@ -523,6 +524,15 @@ IN_Update(void)
#endif #endif
break; break;
#if SDL_VERSION_ATLEAST(2, 0, 0) #if SDL_VERSION_ATLEAST(2, 0, 0)
case SDL_CONTROLLERBUTTONUP:
case SDL_CONTROLLERBUTTONDOWN: /* Handle Controller Back button */
{
qboolean down = (event.type == SDL_CONTROLLERBUTTONDOWN);
if(event.cbutton.button == SDL_CONTROLLER_BUTTON_BACK) {
Key_Event(K_JOY_BACK, down, true);
}
}
break;
case SDL_CONTROLLERAXISMOTION: /* Handle Controller Motion */ case SDL_CONTROLLERAXISMOTION: /* Handle Controller Motion */
{ {
char* direction_type; char* direction_type;
@ -635,6 +645,9 @@ IN_Update(void)
case SDL_JOYBUTTONDOWN: case SDL_JOYBUTTONDOWN:
{ {
qboolean down = (event.type == SDL_JOYBUTTONDOWN); qboolean down = (event.type == SDL_JOYBUTTONDOWN);
/* Ignore back button, we dont need event for such button */
if (back_button_id == event.jbutton.button)
return;
if(event.jbutton.button <= (K_JOY32 - K_JOY1)) { if(event.jbutton.button <= (K_JOY32 - K_JOY1)) {
Key_Event(event.jbutton.button + K_JOY1, down, true); Key_Event(event.jbutton.button + K_JOY1, down, true);
} }
@ -824,6 +837,11 @@ IN_MLookUp(void)
} }
#if SDL_VERSION_ATLEAST(2, 0, 0) #if SDL_VERSION_ATLEAST(2, 0, 0)
/*
* Shutdown haptic functionality
*/
static void IN_Haptic_Shutdown(void);
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
/* /*
* Init haptic effects * Init haptic effects
@ -852,7 +870,9 @@ IN_Haptic_Effect_Init(int dir, int period, int magnitude, int length, int attack
effect_id = SDL_HapticNewEffect(joystick_haptic, &haptic_effect); effect_id = SDL_HapticNewEffect(joystick_haptic, &haptic_effect);
if (effect_id < 0) if (effect_id < 0)
{ {
Com_Printf ("SDL_HapticNewEffect failed: %s", SDL_GetError()); Com_Printf ("SDL_HapticNewEffect failed: %s\n", SDL_GetError());
Com_Printf ("Please try to rerun game. Effects will be disabled for now.\n");
IN_Haptic_Shutdown();
} }
return effect_id; return effect_id;
} }
@ -1006,7 +1026,7 @@ IN_Haptic_Effect_Shutdown(int * effect_id)
} }
static void static void
IN_Haptic_Effects_Shotdown(void) IN_Haptic_Effects_Shutdown(void)
{ {
for (int i=0; i<HAPTIC_EFFECT_LAST; i++) for (int i=0; i<HAPTIC_EFFECT_LAST; i++)
{ {
@ -1030,7 +1050,7 @@ Haptic_Feedback(char *name)
if (last_haptic_volume != (int)(joy_haptic_magnitude->value * 255)) if (last_haptic_volume != (int)(joy_haptic_magnitude->value * 255))
{ {
IN_Haptic_Effects_Shotdown(); IN_Haptic_Effects_Shutdown();
IN_Haptic_Effects_Init(); IN_Haptic_Effects_Init();
} }
last_haptic_volume = joy_haptic_magnitude->value * 255; last_haptic_volume = joy_haptic_magnitude->value * 255;
@ -1217,6 +1237,7 @@ IN_Init(void)
if(SDL_IsGameController(i)) if(SDL_IsGameController(i))
{ {
SDL_GameControllerButtonBind backBind;
controller = SDL_GameControllerOpen(i); controller = SDL_GameControllerOpen(i);
Com_Printf ("Controller settings: %s\n", SDL_GameControllerMapping(controller)); Com_Printf ("Controller settings: %s\n", SDL_GameControllerMapping(controller));
Com_Printf ("Controller axis: \n"); Com_Printf ("Controller axis: \n");
@ -1235,6 +1256,12 @@ IN_Init(void)
Com_Printf (" * triggerleft = %f\n", joy_axis_triggerleft_threshold->value); Com_Printf (" * triggerleft = %f\n", joy_axis_triggerleft_threshold->value);
Com_Printf (" * triggerright = %f\n", joy_axis_triggerright_threshold->value); Com_Printf (" * triggerright = %f\n", joy_axis_triggerright_threshold->value);
backBind = SDL_GameControllerGetBindForButton(controller, SDL_CONTROLLER_BUTTON_BACK);
if (backBind.bindType == SDL_CONTROLLER_BINDTYPE_BUTTON) {
back_button_id = backBind.value.button;
Com_Printf ("\nBack button JOY%d will be unbindable.\n", back_button_id+1);
}
break; break;
} }
else else
@ -1244,7 +1271,7 @@ IN_Init(void)
guid = SDL_JoystickGetDeviceGUID(i); guid = SDL_JoystickGetDeviceGUID(i);
SDL_JoystickGetGUIDString(guid, joystick_guid, 255); SDL_JoystickGetGUIDString(guid, joystick_guid, 255);
Com_Printf ("For use joystic as game contoller please set SDL_GAMECONTROLLERCONFIG:\n"); Com_Printf ("For use joystic as game contoller please set SDL_GAMECONTROLLERCONFIG:\n");
Com_Printf ("e.g.: SDL_GAMECONTROLLERCONFIG='%s,%s,leftx:a0,lefty:a1,rightx:a2,righty:a3,...\n", joystick_guid, SDL_JoystickName(joystick)); Com_Printf ("e.g.: SDL_GAMECONTROLLERCONFIG='%s,%s,leftx:a0,lefty:a1,rightx:a2,righty:a3,back:b1,...\n", joystick_guid, SDL_JoystickName(joystick));
} }
} }
} }
@ -1266,6 +1293,18 @@ IN_Init(void)
/* /*
* Shuts the backend down * Shuts the backend down
*/ */
static void
IN_Haptic_Shutdown(void)
{
if (joystick_haptic)
{
IN_Haptic_Effects_Shutdown();
SDL_HapticClose(joystick_haptic);
joystick_haptic = NULL;
}
}
void void
IN_Shutdown(void) IN_Shutdown(void)
{ {
@ -1276,16 +1315,11 @@ IN_Shutdown(void)
Com_Printf("Shutting down input.\n"); Com_Printf("Shutting down input.\n");
#if SDL_VERSION_ATLEAST(2, 0, 0) #if SDL_VERSION_ATLEAST(2, 0, 0)
if (joystick_haptic) IN_Haptic_Shutdown();
{
IN_Haptic_Effects_Shotdown();
SDL_HapticClose(joystick_haptic);
joystick_haptic = NULL;
}
if (controller) if (controller)
{ {
back_button_id = -1;
SDL_GameControllerClose(controller); SDL_GameControllerClose(controller);
controller = NULL; controller = NULL;
} }

View file

@ -147,6 +147,8 @@ keyname_t keynames[] = {
{"TRIG_LEFT", K_TRIG_LEFT}, {"TRIG_LEFT", K_TRIG_LEFT},
{"TRIG_RIGHT", K_TRIG_RIGHT}, {"TRIG_RIGHT", K_TRIG_RIGHT},
{"JOY_BACK", K_JOY_BACK},
{"AUX1", K_AUX1}, {"AUX1", K_AUX1},
{"AUX2", K_AUX2}, {"AUX2", K_AUX2},
{"AUX3", K_AUX3}, {"AUX3", K_AUX3},
@ -756,7 +758,7 @@ Key_Bind_f(void)
} }
/* don't allow binding escape or the special console keys */ /* don't allow binding escape or the special console keys */
if(b == K_ESCAPE || b == '^' || b == '`' || b == '~') if(b == K_ESCAPE || b == '^' || b == '`' || b == '~' || b == K_JOY_BACK)
{ {
if(doneWithDefaultCfg) if(doneWithDefaultCfg)
{ {
@ -1102,12 +1104,12 @@ Key_Event(int key, qboolean down, qboolean special)
} }
/* Key is unbound */ /* Key is unbound */
if ((key >= K_MOUSE1) && !keybindings[key] && (cls.key_dest != key_console)) if ((key >= K_MOUSE1 && key != K_JOY_BACK) && !keybindings[key] && (cls.key_dest != key_console))
{ {
Com_Printf("%s is unbound, hit F4 to set.\n", Key_KeynumToString(key)); Com_Printf("%s is unbound, hit F4 to set.\n", Key_KeynumToString(key));
} }
/* While in attract loop all keys besides F1 to F12 (to /* While in attract loop all keys besides F1 to F12 (to
allow quick load and the like) are treated like escape. */ allow quick load and the like) are treated like escape. */
if (cl.attractloop && (cls.key_dest != key_menu) && if (cl.attractloop && (cls.key_dest != key_menu) &&
!((key >= K_F1) && (key <= K_F12))) !((key >= K_F1) && (key <= K_F12)))
@ -1122,10 +1124,11 @@ Key_Event(int key, qboolean down, qboolean special)
- moves one menu level up - moves one menu level up
- closes the menu - closes the menu
- closes the help computer - closes the help computer
- closes the chat window */ - closes the chat window
Fully same logic for K_JOY_BACK */
if (!cls.disable_screen) if (!cls.disable_screen)
{ {
if (key == K_ESCAPE) if (key == K_ESCAPE || key == K_JOY_BACK)
{ {
if (!down) if (!down)
{ {

View file

@ -152,6 +152,9 @@ enum QKEYS {
K_TRIG_LEFT, K_TRIG_LEFT,
K_TRIG_RIGHT, K_TRIG_RIGHT,
/* Can't be mapped to any action */
K_JOY_BACK,
K_AUX1, K_AUX1,
K_AUX2, K_AUX2,
K_AUX3, K_AUX3,

View file

@ -317,6 +317,10 @@ Key_GetMenuKey(int key)
case K_KP_ENTER: case K_KP_ENTER:
case K_ENTER: case K_ENTER:
return K_ENTER; return K_ENTER;
case K_ESCAPE:
case K_JOY_BACK:
return K_ESCAPE;
} }
return key; return key;
@ -4317,7 +4321,8 @@ M_Menu_PlayerConfig_f(void)
static const char * static const char *
M_Quit_Key(int key) M_Quit_Key(int key)
{ {
switch (key) int menu_key = Key_GetMenuKey(key);
switch (menu_key)
{ {
case K_ESCAPE: case K_ESCAPE:
case 'n': case 'n':
@ -4325,6 +4330,7 @@ M_Quit_Key(int key)
M_PopMenu(); M_PopMenu();
break; break;
case K_ENTER:
case 'Y': case 'Y':
case 'y': case 'y':
cls.key_dest = key_console; cls.key_dest = key_console;