From 61da3dffd15f990ea45a13af86ae34683d47a6f7 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 14 Oct 2017 18:58:19 +0300 Subject: [PATCH] Add support for use back button as ESC, as example first button in SDL_GAMECONTROLLERCONFIG --- src/backends/sdl/input.c | 56 +++++++++++++++++++++++++++++------- src/client/cl_keyboard.c | 13 +++++---- src/client/header/keyboard.h | 3 ++ src/client/menu/menu.c | 8 +++++- 4 files changed, 63 insertions(+), 17 deletions(-) diff --git a/src/backends/sdl/input.c b/src/backends/sdl/input.c index 7086896f..da53aa63 100644 --- a/src/backends/sdl/input.c +++ b/src/backends/sdl/input.c @@ -73,6 +73,7 @@ static qboolean mlooking; static int joystick_yaw, joystick_pitch; static int joystick_forwardmove, joystick_sidemove; static int joystick_up; +static int back_button_id = -1; static char last_hat = SDL_HAT_CENTERED; static qboolean left_trigger = false; static qboolean right_trigger = false; @@ -523,6 +524,15 @@ IN_Update(void) #endif break; #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 */ { char* direction_type; @@ -635,6 +645,9 @@ IN_Update(void) case 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)) { Key_Event(event.jbutton.button + K_JOY1, down, true); } @@ -824,6 +837,11 @@ IN_MLookUp(void) } #if SDL_VERSION_ATLEAST(2, 0, 0) +/* + * Shutdown haptic functionality + */ +static void IN_Haptic_Shutdown(void); + /* ------------------------------------------------------------------ */ /* * 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); 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; } @@ -1006,7 +1026,7 @@ IN_Haptic_Effect_Shutdown(int * effect_id) } static void -IN_Haptic_Effects_Shotdown(void) +IN_Haptic_Effects_Shutdown(void) { for (int i=0; ivalue * 255)) { - IN_Haptic_Effects_Shotdown(); + IN_Haptic_Effects_Shutdown(); IN_Haptic_Effects_Init(); } last_haptic_volume = joy_haptic_magnitude->value * 255; @@ -1217,6 +1237,7 @@ IN_Init(void) if(SDL_IsGameController(i)) { + SDL_GameControllerButtonBind backBind; controller = SDL_GameControllerOpen(i); Com_Printf ("Controller settings: %s\n", SDL_GameControllerMapping(controller)); Com_Printf ("Controller axis: \n"); @@ -1235,6 +1256,12 @@ IN_Init(void) Com_Printf (" * triggerleft = %f\n", joy_axis_triggerleft_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; } else @@ -1244,7 +1271,7 @@ IN_Init(void) guid = SDL_JoystickGetDeviceGUID(i); SDL_JoystickGetGUIDString(guid, joystick_guid, 255); 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 */ +static void +IN_Haptic_Shutdown(void) +{ + if (joystick_haptic) + { + IN_Haptic_Effects_Shutdown(); + + SDL_HapticClose(joystick_haptic); + joystick_haptic = NULL; + } +} + void IN_Shutdown(void) { @@ -1276,16 +1315,11 @@ IN_Shutdown(void) Com_Printf("Shutting down input.\n"); #if SDL_VERSION_ATLEAST(2, 0, 0) - if (joystick_haptic) - { - IN_Haptic_Effects_Shotdown(); - - SDL_HapticClose(joystick_haptic); - joystick_haptic = NULL; - } + IN_Haptic_Shutdown(); if (controller) { + back_button_id = -1; SDL_GameControllerClose(controller); controller = NULL; } diff --git a/src/client/cl_keyboard.c b/src/client/cl_keyboard.c index 2eb0a08d..3e612b3b 100644 --- a/src/client/cl_keyboard.c +++ b/src/client/cl_keyboard.c @@ -147,6 +147,8 @@ keyname_t keynames[] = { {"TRIG_LEFT", K_TRIG_LEFT}, {"TRIG_RIGHT", K_TRIG_RIGHT}, + {"JOY_BACK", K_JOY_BACK}, + {"AUX1", K_AUX1}, {"AUX2", K_AUX2}, {"AUX3", K_AUX3}, @@ -756,7 +758,7 @@ Key_Bind_f(void) } /* 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) { @@ -1102,12 +1104,12 @@ Key_Event(int key, qboolean down, qboolean special) } /* 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)); } - /* 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. */ if (cl.attractloop && (cls.key_dest != key_menu) && !((key >= K_F1) && (key <= K_F12))) @@ -1122,10 +1124,11 @@ Key_Event(int key, qboolean down, qboolean special) - moves one menu level up - closes the menu - closes the help computer - - closes the chat window */ + - closes the chat window + Fully same logic for K_JOY_BACK */ if (!cls.disable_screen) { - if (key == K_ESCAPE) + if (key == K_ESCAPE || key == K_JOY_BACK) { if (!down) { diff --git a/src/client/header/keyboard.h b/src/client/header/keyboard.h index 2da519a0..668606b1 100644 --- a/src/client/header/keyboard.h +++ b/src/client/header/keyboard.h @@ -152,6 +152,9 @@ enum QKEYS { K_TRIG_LEFT, K_TRIG_RIGHT, + /* Can't be mapped to any action */ + K_JOY_BACK, + K_AUX1, K_AUX2, K_AUX3, diff --git a/src/client/menu/menu.c b/src/client/menu/menu.c index 3013aef8..2dc4405c 100644 --- a/src/client/menu/menu.c +++ b/src/client/menu/menu.c @@ -317,6 +317,10 @@ Key_GetMenuKey(int key) case K_KP_ENTER: case K_ENTER: return K_ENTER; + + case K_ESCAPE: + case K_JOY_BACK: + return K_ESCAPE; } return key; @@ -4317,7 +4321,8 @@ M_Menu_PlayerConfig_f(void) static const char * M_Quit_Key(int key) { - switch (key) + int menu_key = Key_GetMenuKey(key); + switch (menu_key) { case K_ESCAPE: case 'n': @@ -4325,6 +4330,7 @@ M_Quit_Key(int key) M_PopMenu(); break; + case K_ENTER: case 'Y': case 'y': cls.key_dest = key_console;