Annotation of hatari/src/gui-sdl/dlgJoystick.c, revision 1.1.1.12

1.1       root        1: /*
                      2:   Hatari - dlgJoystick.c
                      3: 
1.1.1.10  root        4:   This file is distributed under the GNU General Public License, version 2
                      5:   or at your option any later version. Read the file gpl.txt for details.
1.1       root        6: */
1.1.1.8   root        7: const char DlgJoystick_fileid[] = "Hatari dlgJoystick.c : " __DATE__ " " __TIME__;
1.1       root        8: 
                      9: #include "main.h"
                     10: #include "configuration.h"
                     11: #include "dialog.h"
                     12: #include "sdlgui.h"
1.1.1.11  root       13: #include "joy.h"
1.1       root       14: 
1.1.1.11  root       15: #define DLGJOY_STJOYNAME   3
                     16: #define DLGJOY_PREVSTJOY   4
                     17: #define DLGJOY_NEXTSTJOY   5
                     18: #define DLGJOY_DEFINEKEYS  7
                     19: #define DLGJOY_DISABLED    8
                     20: #define DLGJOY_USEKEYS     9
                     21: #define DLGJOY_USEREALJOY 10
                     22: #define DLGJOY_SDLJOYNAME 12
                     23: #define DLGJOY_PREVSDLJOY 13
                     24: #define DLGJOY_NEXTSDLJOY 14
                     25: #define DLGJOY_AUTOFIRE   15
1.1.1.3   root       26: #define DLGJOY_EXIT       16
1.1       root       27: 
                     28: /* The joysticks dialog: */
1.1.1.3   root       29: 
                     30: static char sSdlStickName[20];
                     31: 
                     32: static SGOBJ joydlg[] =
1.1       root       33: {
1.1.1.3   root       34:        { SGBOX, 0, 0, 0,0, 32,18, NULL },
                     35:        { SGTEXT, 0, 0, 8,1, 15,1, "Joysticks setup" },
                     36: 
1.1.1.11  root       37:        { SGBOX, 0, 0, 4,3, 24,1, NULL },
                     38:        { SGTEXT, 0, 0, 5,3, 22,1, NULL },
                     39:        { SGBUTTON, 0, 0,  1,3, 3,1, "\x04", SG_SHORTCUT_LEFT },
                     40:        { SGBUTTON, 0, 0, 28,3, 3,1, "\x03", SG_SHORTCUT_RIGHT },
                     41: 
1.1.1.3   root       42:        { SGBOX, 0, 0, 1,4, 30,11, NULL },
1.1.1.11  root       43:        { SGBUTTON,   0, 0, 19,7, 11,1, "D_efine keys" },
                     44: 
                     45:        { SGRADIOBUT, 0, 0, 2,5, 10,1, "_disabled" },
                     46:        { SGRADIOBUT, 0, 0, 2,7, 14,1, "use _keyboard" },
                     47:        { SGRADIOBUT, 0, 0, 2,9, 20,1, "use real _joystick:" },
1.1.1.3   root       48: 
                     49:        { SGBOX, 0, 0, 5,11, 22,1, NULL },
                     50:        { SGTEXT, 0, 0, 6,11, 20,1, sSdlStickName },
1.1.1.11  root       51:        { SGBUTTON, 0, 0,  4,11, 1,1, "\x04", SG_SHORTCUT_UP },
                     52:        { SGBUTTON, 0, 0, 27,11, 1,1, "\x03", SG_SHORTCUT_DOWN },
1.1.1.3   root       53: 
1.1.1.11  root       54:        { SGCHECKBOX, 0, 0, 2,13, 17,1, "Enable _autofire" },
1.1.1.3   root       55: 
1.1.1.5   root       56:        { SGBUTTON, SG_DEFAULT, 0, 6,16, 20,1, "Back to main menu" },
1.1.1.12! root       57:        { SGSTOP, 0, 0, 0,0, 0,0, NULL }
1.1.1.3   root       58: };
                     59: 
                     60: 
                     61: /* The joystick keys setup dialog: */
                     62: 
                     63: static char sKeyInstruction[24];
                     64: static char sKeyName[24];
                     65: 
                     66: static SGOBJ joykeysdlg[] =
                     67: {
                     68:        { SGBOX, 0, 0, 0,0, 28,5, NULL },
                     69:        { SGTEXT, 0, 0, 2,1, 24,1, sKeyInstruction },
                     70:        { SGTEXT, 0, 0, 2,3, 24,1, sKeyName },
1.1.1.12! root       71:        { SGSTOP, 0, 0, 0,0, 0,0, NULL }
1.1.1.3   root       72: };
                     73: 
                     74: 
1.1.1.4   root       75: static char *sJoystickNames[JOYSTICK_COUNT] =
1.1.1.3   root       76: {
                     77:        "ST Joystick 0",
                     78:        "ST Joystick 1",
                     79:        "STE Joypad A",
                     80:        "STE Joypad B",
                     81:        "Parallel port stick 1",
                     82:        "Parallel port stick 2"
1.1       root       83: };
                     84: 
                     85: 
                     86: /*-----------------------------------------------------------------------*/
1.1.1.9   root       87: /**
                     88:  * Show dialogs for defining joystick keys and wait for a key press.
                     89:  */
1.1.1.3   root       90: static void DlgJoystick_DefineOneKey(char *pType, int *pKey)
                     91: {
                     92:        SDL_Event sdlEvent;
                     93: 
                     94:        if (bQuitProgram)
                     95:                return;
                     96: 
                     97:        snprintf(sKeyInstruction, sizeof(sKeyInstruction), "Press key for '%s'...", pType);
                     98:        snprintf(sKeyName, sizeof(sKeyName), "(was: '%s')", SDL_GetKeyName(*pKey));
                     99: 
                    100:        SDLGui_DrawDialog(joykeysdlg);
                    101: 
1.1.1.11  root      102:        /* drain buffered key events */
                    103:        SDL_Delay(200);
                    104:        while (SDL_PollEvent(&sdlEvent))
                    105:        {
                    106:                if (sdlEvent.type == SDL_KEYUP || sdlEvent.type == SDL_KEYDOWN)
                    107:                        break;
                    108:        }
                    109: 
                    110:        /* get the real key */
1.1.1.3   root      111:        do
                    112:        {
                    113:                SDL_WaitEvent(&sdlEvent);
                    114:                if (sdlEvent.type == SDL_KEYDOWN)
                    115:                {
                    116:                        *pKey = sdlEvent.key.keysym.sym;
                    117:                        snprintf(sKeyName, sizeof(sKeyName), "(now: '%s')", SDL_GetKeyName(*pKey));
                    118:                        SDLGui_DrawDialog(joykeysdlg);
                    119:                }
                    120:                else if (sdlEvent.type == SDL_QUIT)
                    121:                {
1.1.1.8   root      122:                        bQuitProgram = true;
1.1.1.3   root      123:                        return;
                    124:                }
                    125:        } while (sdlEvent.type != SDL_KEYUP);
                    126: }
                    127: 
                    128: 
                    129: /*-----------------------------------------------------------------------*/
1.1.1.9   root      130: /**
                    131:  * Let the user define joystick keys.
                    132:  */
1.1.1.3   root      133: static void DlgJoystick_DefineKeys(int nActJoy)
1.1       root      134: {
                    135: 
1.1.1.3   root      136:        SDLGui_CenterDlg(joykeysdlg);
1.1.1.6   root      137:        DlgJoystick_DefineOneKey("up", &ConfigureParams.Joysticks.Joy[nActJoy].nKeyCodeUp);
                    138:        DlgJoystick_DefineOneKey("down", &ConfigureParams.Joysticks.Joy[nActJoy].nKeyCodeDown);
                    139:        DlgJoystick_DefineOneKey("left", &ConfigureParams.Joysticks.Joy[nActJoy].nKeyCodeLeft);
                    140:        DlgJoystick_DefineOneKey("right", &ConfigureParams.Joysticks.Joy[nActJoy].nKeyCodeRight);
                    141:        DlgJoystick_DefineOneKey("fire", &ConfigureParams.Joysticks.Joy[nActJoy].nKeyCodeFire);
1.1.1.3   root      142: }
                    143: 
1.1       root      144: 
1.1.1.3   root      145: /*-----------------------------------------------------------------------*/
1.1.1.9   root      146: /**
                    147:  * Adapt dialog using the values from the configration structure.
                    148:  */
1.1.1.11  root      149: static void DlgJoystick_ReadValuesFromConf(int nActJoy)
1.1.1.3   root      150: {
                    151:        int i;
                    152: 
                    153:        /* Check if joystick ID is available */
                    154:        if (SDL_NumJoysticks() == 0)
                    155:        {
                    156:                strcpy(sSdlStickName, "0: (none available)");
                    157:        }
1.1.1.11  root      158:        else if (Joy_ValidateJoyId(nActJoy))
1.1.1.3   root      159:        {
1.1.1.6   root      160:                snprintf(sSdlStickName, 20, "%i: %s", ConfigureParams.Joysticks.Joy[nActJoy].nJoyId,
1.1.1.11  root      161:                         Joy_GetName(ConfigureParams.Joysticks.Joy[nActJoy].nJoyId));
1.1.1.3   root      162:        }
                    163:        else
                    164:        {
1.1.1.11  root      165:                snprintf(sSdlStickName, 20, "0: %s", Joy_GetName(0));
1.1.1.3   root      166:        }
                    167: 
1.1.1.11  root      168:        for (i = DLGJOY_DISABLED; i <= DLGJOY_USEREALJOY; i++)
1.1.1.3   root      169:                joydlg[i].state &= ~SG_SELECTED;
1.1.1.11  root      170:        switch (ConfigureParams.Joysticks.Joy[nActJoy].nJoystickMode)
                    171:        {
                    172:         case JOYSTICK_DISABLED:
                    173:                joydlg[DLGJOY_DISABLED].state |= SG_SELECTED;
                    174:                break;
                    175:         case JOYSTICK_KEYBOARD:
                    176:                joydlg[DLGJOY_USEKEYS].state |= SG_SELECTED;
                    177:                break;
                    178:         case JOYSTICK_REALSTICK:
                    179:                joydlg[DLGJOY_USEREALJOY].state |= SG_SELECTED;
                    180:                break;
                    181:        }
1.1.1.3   root      182: 
1.1.1.6   root      183:        if (ConfigureParams.Joysticks.Joy[nActJoy].bEnableAutoFire)
1.1.1.3   root      184:                joydlg[DLGJOY_AUTOFIRE].state |= SG_SELECTED;
                    185:        else
                    186:                joydlg[DLGJOY_AUTOFIRE].state &= ~SG_SELECTED;
                    187: }
                    188: 
                    189: 
                    190: /*-----------------------------------------------------------------------*/
1.1.1.9   root      191: /**
                    192:  * Read values from dialog and write them to the configuration structure.
                    193:  */
1.1.1.3   root      194: static void DlgJoystick_WriteValuesToConf(int nActJoy)
                    195: {
1.1.1.11  root      196:        if (joydlg[DLGJOY_DISABLED].state & SG_SELECTED)
                    197:                ConfigureParams.Joysticks.Joy[nActJoy].nJoystickMode = JOYSTICK_DISABLED;
                    198:        else if (joydlg[DLGJOY_USEKEYS].state & SG_SELECTED)
                    199:                ConfigureParams.Joysticks.Joy[nActJoy].nJoystickMode = JOYSTICK_KEYBOARD;
                    200:        else
                    201:                ConfigureParams.Joysticks.Joy[nActJoy].nJoystickMode = JOYSTICK_REALSTICK;
1.1.1.3   root      202: 
1.1.1.6   root      203:        ConfigureParams.Joysticks.Joy[nActJoy].bEnableAutoFire = (joydlg[DLGJOY_AUTOFIRE].state & SG_SELECTED);
                    204:        ConfigureParams.Joysticks.Joy[nActJoy].nJoyId = joydlg[DLGJOY_SDLJOYNAME].txt[0] - '0';
1.1.1.3   root      205: }
                    206: 
                    207: 
                    208: /*-----------------------------------------------------------------------*/
1.1.1.9   root      209: /**
                    210:  * Show and process the joystick dialog.
                    211:  */
1.1.1.3   root      212: void Dialog_JoyDlg(void)
                    213: {
                    214:        int but;
                    215:        static int nActJoy = 1;
1.1.1.11  root      216:        int nMaxId;
1.1.1.3   root      217: 
                    218:        SDLGui_CenterDlg(joydlg);
                    219: 
                    220:        joydlg[DLGJOY_STJOYNAME].txt = sJoystickNames[nActJoy];
                    221: 
1.1.1.11  root      222:        nMaxId = Joy_GetMaxId();
1.1.1.3   root      223: 
                    224:        /* Set up dialog from actual values: */
1.1.1.11  root      225:        DlgJoystick_ReadValuesFromConf(nActJoy);
1.1.1.3   root      226: 
                    227:        do
                    228:        {
1.1.1.11  root      229:                but = SDLGui_DoDialog(joydlg, NULL, false);
1.1.1.3   root      230:                switch (but)
                    231:                {
                    232:                 case DLGJOY_PREVSDLJOY:        // Select the previous SDL joystick
1.1.1.6   root      233:                        if (ConfigureParams.Joysticks.Joy[nActJoy].nJoyId > 0)
1.1.1.3   root      234:                        {
1.1.1.6   root      235:                                ConfigureParams.Joysticks.Joy[nActJoy].nJoyId -= 1;
                    236:                                snprintf(sSdlStickName, 20, "%i: %s", ConfigureParams.Joysticks.Joy[nActJoy].nJoyId,
1.1.1.11  root      237:                                         Joy_GetName(ConfigureParams.Joysticks.Joy[nActJoy].nJoyId));
1.1.1.3   root      238:                        }
                    239:                        break;
                    240:                 case DLGJOY_NEXTSDLJOY:        // Select the next SDL joystick
1.1.1.11  root      241:                        if (ConfigureParams.Joysticks.Joy[nActJoy].nJoyId < nMaxId)
1.1.1.3   root      242:                        {
1.1.1.6   root      243:                                ConfigureParams.Joysticks.Joy[nActJoy].nJoyId += 1;
                    244:                                snprintf(sSdlStickName, 20, "%i: %s", ConfigureParams.Joysticks.Joy[nActJoy].nJoyId,
1.1.1.11  root      245:                                         Joy_GetName(ConfigureParams.Joysticks.Joy[nActJoy].nJoyId));
1.1.1.3   root      246:                        }
                    247:                        break;
                    248:                 case DLGJOY_DEFINEKEYS:        // Define new keys for keyboard emulation
                    249:                        DlgJoystick_DefineKeys(nActJoy);
                    250:                        break;
                    251:                 case DLGJOY_PREVSTJOY:         // Switch to the previous ST joystick setup tab
                    252:                        if (nActJoy > 0)
                    253:                        {
                    254:                                DlgJoystick_WriteValuesToConf(nActJoy);
                    255:                                nActJoy -= 1;
1.1.1.11  root      256:                                DlgJoystick_ReadValuesFromConf(nActJoy);
1.1.1.3   root      257:                                joydlg[DLGJOY_STJOYNAME].txt = sJoystickNames[nActJoy];
                    258:                        }
                    259:                        break;
                    260:                 case DLGJOY_NEXTSTJOY:         // Switch to the next ST joystick setup tab
                    261:                        if (nActJoy < 5)
                    262:                        {
                    263:                                DlgJoystick_WriteValuesToConf(nActJoy);
                    264:                                nActJoy += 1;
1.1.1.11  root      265:                                DlgJoystick_ReadValuesFromConf(nActJoy);
1.1.1.3   root      266:                                joydlg[DLGJOY_STJOYNAME].txt = sJoystickNames[nActJoy];
                    267:                        }
                    268:                        break;
                    269:                }
                    270:        }
1.1.1.5   root      271:        while (but != DLGJOY_EXIT && but != SDLGUI_QUIT
                    272:               && but != SDLGUI_ERROR && !bQuitProgram);
1.1       root      273: 
1.1.1.3   root      274:        DlgJoystick_WriteValuesToConf(nActJoy);
1.1       root      275: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.