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

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.3   root       57:        { -1, 0, 0, 0,0, 0,0, NULL }
                     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 },
                     71:        { -1, 0, 0, 0,0, 0,0, NULL }
                     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.