|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.