--- hatari/src/gui-sdl/dlgJoystick.c 2019/04/09 08:53:28 1.1.1.10 +++ hatari/src/gui-sdl/dlgJoystick.c 2019/04/09 08:55:54 1.1.1.11 @@ -10,22 +10,21 @@ const char DlgJoystick_fileid[] = "Hatar #include "configuration.h" #include "dialog.h" #include "sdlgui.h" +#include "joy.h" - -#define DLGJOY_DISABLED 3 -#define DLGJOY_USEREALJOY 4 -#define DLGJOY_USEKEYS 5 -#define DLGJOY_DEFINEKEYS 6 -#define DLGJOY_SDLJOYNAME 8 -#define DLGJOY_PREVSDLJOY 9 -#define DLGJOY_NEXTSDLJOY 10 -#define DLGJOY_AUTOFIRE 11 -#define DLGJOY_STJOYNAME 13 -#define DLGJOY_PREVSTJOY 14 -#define DLGJOY_NEXTSTJOY 15 +#define DLGJOY_STJOYNAME 3 +#define DLGJOY_PREVSTJOY 4 +#define DLGJOY_NEXTSTJOY 5 +#define DLGJOY_DEFINEKEYS 7 +#define DLGJOY_DISABLED 8 +#define DLGJOY_USEKEYS 9 +#define DLGJOY_USEREALJOY 10 +#define DLGJOY_SDLJOYNAME 12 +#define DLGJOY_PREVSDLJOY 13 +#define DLGJOY_NEXTSDLJOY 14 +#define DLGJOY_AUTOFIRE 15 #define DLGJOY_EXIT 16 - /* The joysticks dialog: */ static char sSdlStickName[20]; @@ -35,23 +34,24 @@ static SGOBJ joydlg[] = { SGBOX, 0, 0, 0,0, 32,18, NULL }, { SGTEXT, 0, 0, 8,1, 15,1, "Joysticks setup" }, + { SGBOX, 0, 0, 4,3, 24,1, NULL }, + { SGTEXT, 0, 0, 5,3, 22,1, NULL }, + { SGBUTTON, 0, 0, 1,3, 3,1, "\x04", SG_SHORTCUT_LEFT }, + { SGBUTTON, 0, 0, 28,3, 3,1, "\x03", SG_SHORTCUT_RIGHT }, + { SGBOX, 0, 0, 1,4, 30,11, NULL }, - { SGRADIOBUT, 0, 0, 2,5, 10,1, "disabled" }, - { SGRADIOBUT, 0, 0, 2,9, 20,1, "use real joystick:" }, - { SGRADIOBUT, 0, 0, 2,7, 14,1, "use keyboard" }, + { SGBUTTON, 0, 0, 19,7, 11,1, "D_efine keys" }, + + { SGRADIOBUT, 0, 0, 2,5, 10,1, "_disabled" }, + { SGRADIOBUT, 0, 0, 2,7, 14,1, "use _keyboard" }, + { SGRADIOBUT, 0, 0, 2,9, 20,1, "use real _joystick:" }, - { SGBUTTON, 0, 0, 19,7, 11,1, "Define keys" }, { SGBOX, 0, 0, 5,11, 22,1, NULL }, { SGTEXT, 0, 0, 6,11, 20,1, sSdlStickName }, - { SGBUTTON, 0, 0, 4,11, 1,1, "\x04" }, /* Arrow left */ - { SGBUTTON, 0, 0, 27,11, 1,1, "\x03" }, /* Arrow right */ + { SGBUTTON, 0, 0, 4,11, 1,1, "\x04", SG_SHORTCUT_UP }, + { SGBUTTON, 0, 0, 27,11, 1,1, "\x03", SG_SHORTCUT_DOWN }, - { SGCHECKBOX, 0, 0, 2,13, 17,1, "Enable autofire" }, - - { SGBOX, 0, 0, 4,3, 24,1, NULL }, - { SGTEXT, 0, 0, 5,3, 22,1, NULL }, - { SGBUTTON, 0, 0, 1,3, 3,1, "\x04" }, /* Arrow left */ - { SGBUTTON, 0, 0, 28,3, 3,1, "\x03" }, /* Arrow right */ + { SGCHECKBOX, 0, 0, 2,13, 17,1, "Enable _autofire" }, { SGBUTTON, SG_DEFAULT, 0, 6,16, 20,1, "Back to main menu" }, { -1, 0, 0, 0,0, 0,0, NULL } @@ -99,6 +99,15 @@ static void DlgJoystick_DefineOneKey(cha SDLGui_DrawDialog(joykeysdlg); + /* drain buffered key events */ + SDL_Delay(200); + while (SDL_PollEvent(&sdlEvent)) + { + if (sdlEvent.type == SDL_KEYUP || sdlEvent.type == SDL_KEYDOWN) + break; + } + + /* get the real key */ do { SDL_WaitEvent(&sdlEvent); @@ -114,7 +123,6 @@ static void DlgJoystick_DefineOneKey(cha return; } } while (sdlEvent.type != SDL_KEYUP); - SDL_Delay(200); } @@ -138,7 +146,7 @@ static void DlgJoystick_DefineKeys(int n /** * Adapt dialog using the values from the configration structure. */ -static void DlgJoystick_ReadValuesFromConf(int nActJoy, int nMaxId) +static void DlgJoystick_ReadValuesFromConf(int nActJoy) { int i; @@ -147,22 +155,30 @@ static void DlgJoystick_ReadValuesFromCo { strcpy(sSdlStickName, "0: (none available)"); } - else if (ConfigureParams.Joysticks.Joy[nActJoy].nJoyId <= nMaxId) + else if (Joy_ValidateJoyId(nActJoy)) { snprintf(sSdlStickName, 20, "%i: %s", ConfigureParams.Joysticks.Joy[nActJoy].nJoyId, - SDL_JoystickName(ConfigureParams.Joysticks.Joy[nActJoy].nJoyId)); + Joy_GetName(ConfigureParams.Joysticks.Joy[nActJoy].nJoyId)); } else { - snprintf(sSdlStickName, 20, "0: %s", SDL_JoystickName(0)); - /* Unavailable joystick ID -> disable it if necessary*/ - if (ConfigureParams.Joysticks.Joy[nActJoy].nJoystickMode == JOYSTICK_REALSTICK) - ConfigureParams.Joysticks.Joy[nActJoy].nJoystickMode = JOYSTICK_DISABLED; + snprintf(sSdlStickName, 20, "0: %s", Joy_GetName(0)); } - for (i = DLGJOY_DISABLED; i <= DLGJOY_USEKEYS; i++) + for (i = DLGJOY_DISABLED; i <= DLGJOY_USEREALJOY; i++) joydlg[i].state &= ~SG_SELECTED; - joydlg[DLGJOY_DISABLED + ConfigureParams.Joysticks.Joy[nActJoy].nJoystickMode].state |= SG_SELECTED; + switch (ConfigureParams.Joysticks.Joy[nActJoy].nJoystickMode) + { + case JOYSTICK_DISABLED: + joydlg[DLGJOY_DISABLED].state |= SG_SELECTED; + break; + case JOYSTICK_KEYBOARD: + joydlg[DLGJOY_USEKEYS].state |= SG_SELECTED; + break; + case JOYSTICK_REALSTICK: + joydlg[DLGJOY_USEREALJOY].state |= SG_SELECTED; + break; + } if (ConfigureParams.Joysticks.Joy[nActJoy].bEnableAutoFire) joydlg[DLGJOY_AUTOFIRE].state |= SG_SELECTED; @@ -177,15 +193,12 @@ static void DlgJoystick_ReadValuesFromCo */ static void DlgJoystick_WriteValuesToConf(int nActJoy) { - JOYSTICKMODE jmi; - for (jmi = JOYSTICK_DISABLED; jmi <= JOYSTICK_KEYBOARD; jmi++) - { - if (joydlg[jmi + DLGJOY_DISABLED].state & SG_SELECTED) - { - ConfigureParams.Joysticks.Joy[nActJoy].nJoystickMode = jmi; - break; - } - } + if (joydlg[DLGJOY_DISABLED].state & SG_SELECTED) + ConfigureParams.Joysticks.Joy[nActJoy].nJoystickMode = JOYSTICK_DISABLED; + else if (joydlg[DLGJOY_USEKEYS].state & SG_SELECTED) + ConfigureParams.Joysticks.Joy[nActJoy].nJoystickMode = JOYSTICK_KEYBOARD; + else + ConfigureParams.Joysticks.Joy[nActJoy].nJoystickMode = JOYSTICK_REALSTICK; ConfigureParams.Joysticks.Joy[nActJoy].bEnableAutoFire = (joydlg[DLGJOY_AUTOFIRE].state & SG_SELECTED); ConfigureParams.Joysticks.Joy[nActJoy].nJoyId = joydlg[DLGJOY_SDLJOYNAME].txt[0] - '0'; @@ -200,22 +213,20 @@ void Dialog_JoyDlg(void) { int but; static int nActJoy = 1; - int nMaxJoyId; + int nMaxId; SDLGui_CenterDlg(joydlg); joydlg[DLGJOY_STJOYNAME].txt = sJoystickNames[nActJoy]; - nMaxJoyId = SDL_NumJoysticks() - 1; - if (nMaxJoyId > 5) - nMaxJoyId = 5; + nMaxId = Joy_GetMaxId(); /* Set up dialog from actual values: */ - DlgJoystick_ReadValuesFromConf(nActJoy, nMaxJoyId); + DlgJoystick_ReadValuesFromConf(nActJoy); do { - but = SDLGui_DoDialog(joydlg, NULL); + but = SDLGui_DoDialog(joydlg, NULL, false); switch (but) { case DLGJOY_PREVSDLJOY: // Select the previous SDL joystick @@ -223,15 +234,15 @@ void Dialog_JoyDlg(void) { ConfigureParams.Joysticks.Joy[nActJoy].nJoyId -= 1; snprintf(sSdlStickName, 20, "%i: %s", ConfigureParams.Joysticks.Joy[nActJoy].nJoyId, - SDL_JoystickName(ConfigureParams.Joysticks.Joy[nActJoy].nJoyId)); + Joy_GetName(ConfigureParams.Joysticks.Joy[nActJoy].nJoyId)); } break; case DLGJOY_NEXTSDLJOY: // Select the next SDL joystick - if (ConfigureParams.Joysticks.Joy[nActJoy].nJoyId < nMaxJoyId) + if (ConfigureParams.Joysticks.Joy[nActJoy].nJoyId < nMaxId) { ConfigureParams.Joysticks.Joy[nActJoy].nJoyId += 1; snprintf(sSdlStickName, 20, "%i: %s", ConfigureParams.Joysticks.Joy[nActJoy].nJoyId, - SDL_JoystickName(ConfigureParams.Joysticks.Joy[nActJoy].nJoyId)); + Joy_GetName(ConfigureParams.Joysticks.Joy[nActJoy].nJoyId)); } break; case DLGJOY_DEFINEKEYS: // Define new keys for keyboard emulation @@ -242,7 +253,7 @@ void Dialog_JoyDlg(void) { DlgJoystick_WriteValuesToConf(nActJoy); nActJoy -= 1; - DlgJoystick_ReadValuesFromConf(nActJoy, nMaxJoyId); + DlgJoystick_ReadValuesFromConf(nActJoy); joydlg[DLGJOY_STJOYNAME].txt = sJoystickNames[nActJoy]; } break; @@ -251,7 +262,7 @@ void Dialog_JoyDlg(void) { DlgJoystick_WriteValuesToConf(nActJoy); nActJoy += 1; - DlgJoystick_ReadValuesFromConf(nActJoy, nMaxJoyId); + DlgJoystick_ReadValuesFromConf(nActJoy); joydlg[DLGJOY_STJOYNAME].txt = sJoystickNames[nActJoy]; } break;