|
|
1.1 ! root 1: /* ! 2: Hatari - dialog.c ! 3: ! 4: This file is distributed under the GNU Public License, version 2 or at ! 5: your option any later version. Read the file gpl.txt for details. ! 6: ! 7: This is normal 'C' code to handle our options dialog. We keep all our configuration details ! 8: in a variable 'ConfigureParams'. When we open our dialog we copy this and then when we 'OK' ! 9: or 'Cancel' the dialog we can compare and makes the necessary changes. ! 10: */ ! 11: ! 12: #include <unistd.h> ! 13: ! 14: #include "main.h" ! 15: #include "configuration.h" ! 16: #include "audio.h" ! 17: #include "dialog.h" ! 18: #include "file.h" ! 19: #include "keymap.h" ! 20: #include "m68000.h" ! 21: #include "memAlloc.h" ! 22: #include "misc.h" ! 23: #include "reset.h" ! 24: #include "screen.h" ! 25: #include "video.h" ! 26: #include "sdlgui.h" ! 27: #include "../cpu/hatari-glue.h" ! 28: ! 29: extern void Screen_DidResolutionChange(void); ! 30: ! 31: ! 32: /* The main dialog: */ ! 33: #define MAINDLG_ABOUT 2 ! 34: #define MAINDLG_SCREEN 3 ! 35: #define MAINDLG_KEYBD 4 ! 36: #define MAINDLG_OK 5 ! 37: #define MAINDLG_CANCEL 6 ! 38: #define MAINDLG_QUIT 7 ! 39: SGOBJ maindlg[] = ! 40: { ! 41: { SGBOX, 0, 0, 0,0, 24,18, NULL }, ! 42: { SGTEXT, 0, 0, 2,1, 16,1, "Virtual Machine Menu" }, ! 43: { SGBUTTON, 0, 0, 6,4, 12,1, "About" }, ! 44: { SGBUTTON, 0, 0, 6,6, 12,1, "Screen" }, ! 45: { SGBUTTON, 0, 0, 6,8, 12,1, "Keyboard" }, ! 46: { SGBUTTON, 0, 0, 3,13, 8,1, "Okay" }, ! 47: { SGBUTTON, 0, 0, 3,15, 8,1, "Cancel" }, ! 48: { SGBUTTON, 0, 0, 13,13, 8,3, "Quit" }, ! 49: { -1, 0, 0, 0,0, 0,0, NULL } ! 50: }; ! 51: ! 52: ! 53: /* The "About"-dialog: */ ! 54: SGOBJ aboutdlg[] = ! 55: { ! 56: { SGBOX, 0, 0, 0,0, 40,21, NULL }, ! 57: { SGTEXT, 0, 0, 12,1, 12,1, "Frontier: Elite 2" }, ! 58: { SGTEXT, 0, 0, 12,2, 12,1, "=================" }, ! 59: { SGTEXT, 0, 0, 1,4, 38,1, "This Frontier virtual machine is based" }, ! 60: { SGTEXT, 0, 0, 1,5, 38,1, "on Hatari, by T. Huth, S. Marothy," }, ! 61: { SGTEXT, 0, 0, 1,6, 38,1, "S. Berndtsson, P. Bates, B.Schmidt and" }, ! 62: { SGTEXT, 0, 0, 1,7, 38,1, "many others."}, ! 63: { SGTEXT, 0, 0, 1,8, 38,1, "Hatari code and all additions to it"}, ! 64: { SGTEXT, 0, 0, 1,9, 38,1, "are licensed under the terms of the"}, ! 65: { SGTEXT, 0, 0, 1,10,38,1, "GNU General Public License version 2."}, ! 66: { SGTEXT, 0, 0, 1,11,38,1, "FE2.S and FE2.BIN are reverse-"}, ! 67: { SGTEXT, 0, 0, 1,12,38,1, "engineered source and binary of"}, ! 68: { SGTEXT, 0, 0, 1,13,38,1, "Frontier: Elite 2, by David Braben."}, ! 69: { SGTEXT, 0, 0, 1,14,38,1, "They are probably not legal in many"}, ! 70: { SGTEXT, 0, 0, 1,15,38,1, "countries even if you own a copy of"}, ! 71: { SGTEXT, 0, 0, 1,16,38,1, "Atari ST Frontier (which they are"}, ! 72: { SGTEXT, 0, 0, 1,17,38,1, "based on,) so play quietly."}, ! 73: { SGBUTTON, 0, 0, 17,19, 7,1, "YES" }, ! 74: { -1, 0, 0, 0,0, 0,0, NULL } ! 75: }; ! 76: ! 77: ! 78: ! 79: /* The screen dialog: */ ! 80: #define DLGSCRN_FULLSCRN 3 ! 81: #define DLGSCRN_1X 5 ! 82: #define DLGSCRN_2X 6 ! 83: #define DLGSCRN_SCALE2X 7 ! 84: #define DLGSCRN_EXIT 8 ! 85: ! 86: SGOBJ screendlg[] = ! 87: { ! 88: { SGBOX, 0, 0, 0,0, 24,20, NULL }, ! 89: { SGBOX, 0, 0, 1,1, 21,15, NULL }, ! 90: { SGTEXT, 0, 0, 5,2, 14,1, "Screen options" }, ! 91: { SGCHECKBOX, 0, 0, 4,6, 12,1, "Fullscreen" }, ! 92: { SGTEXT, 0, 0, 2,8, 12,1, "Screen size:" }, ! 93: { SGRADIOBUT, 0, 0, 4,10, 8,1, "Normal" }, ! 94: { SGRADIOBUT, 0, 0, 4,12, 8,1, "Zoomed" }, ! 95: { SGRADIOBUT, 0, 0, 4,14, 8,1, "Scale2x" }, ! 96: { SGBUTTON, 0, 0, 2,17, 20,1, "Back to main menu" }, ! 97: { -1, 0, 0, 0,0, 0,0, NULL } ! 98: }; ! 99: ! 100: ! 101: /* The keyboard dialog: */ ! 102: #define DLGKEY_SYMBOLIC 3 ! 103: #define DLGKEY_SCANCODE 4 ! 104: #define DLGKEY_FROMFILE 5 ! 105: #define DLGKEY_MAPNAME 7 ! 106: #define DLGKEY_MAPBROWSE 8 ! 107: #define DLGKEY_EXIT 9 ! 108: SGOBJ keyboarddlg[] = ! 109: { ! 110: { SGBOX, 0, 0, 0,0, 40,12, NULL }, ! 111: { SGTEXT, 0, 0, 13,1, 14,1, "Keyboard setup" }, ! 112: { SGTEXT, 0, 0, 2,3, 17,1, "Keyboard mapping:" }, ! 113: { SGRADIOBUT, 0, 0, 3,5, 10,1, "Symbolic" }, ! 114: { SGRADIOBUT, 0, 0, 15,5, 10,1, "Scancode" }, ! 115: { SGRADIOBUT, 0, 0, 27,5, 11,1, "From file" }, ! 116: { SGTEXT, 0, 0, 2,7, 13,1, "Mapping file:" }, ! 117: { SGTEXT, 0, 0, 2,8, 36,1, NULL }, ! 118: { SGBUTTON, 0, 0, 32,7, 6,1, "Browse" }, ! 119: { SGBUTTON, 0, 0, 10,10, 20,1, "Back to main menu" }, ! 120: { -1, 0, 0, 0,0, 0,0, NULL } ! 121: }; ! 122: ! 123: ! 124: ! 125: ! 126: CNF_PARAMS DialogParams; /* List of configuration for dialogs (so the user can also choose 'Cancel') */ ! 127: ! 128: ! 129: ! 130: /*-----------------------------------------------------------------------*/ ! 131: /* ! 132: Copy details back to configuration and perform reset ! 133: */ ! 134: void Dialog_CopyDialogParamsToConfiguration(BOOL bForceReset) ! 135: { ! 136: BOOL NeedReset; ! 137: ! 138: /* Do we need to warn user of that changes will only take effect after reset? */ ! 139: if (bForceReset) ! 140: NeedReset = bForceReset; ! 141: else ! 142: NeedReset = FALSE; ! 143: ! 144: /* Copy details to configuration, so can be saved out or set on reset */ ! 145: ConfigureParams = DialogParams; ! 146: ! 147: /* Set keyboard remap file */ ! 148: if(ConfigureParams.Keyboard.nKeymapType == KEYMAP_LOADED) ! 149: Keymap_LoadRemapFile(ConfigureParams.Keyboard.szMappingFileName); ! 150: ! 151: /* Do we need to perform reset? */ ! 152: if (NeedReset) ! 153: { ! 154: Reset_VM(); ! 155: /*FM View_ToggleWindowsMouse(MOUSE_ST);*/ ! 156: } ! 157: ! 158: /* Go into/return from full screen if flagged */ ! 159: if ( (!bInFullScreen) && (DialogParams.Screen.bFullScreen) ) ! 160: Screen_EnterFullScreen(); ! 161: else if ( bInFullScreen && (!DialogParams.Screen.bFullScreen) ) ! 162: Screen_ReturnFromFullScreen(); ! 163: } ! 164: ! 165: ! 166: ! 167: /*-----------------------------------------------------------------------*/ ! 168: /* ! 169: Show and process the screen dialog. ! 170: */ ! 171: void Dialog_ScreenDlg(void) ! 172: { ! 173: int but, i; ! 174: ! 175: SDLGui_CenterDlg(screendlg); ! 176: ! 177: /* Set up dialog from actual values: */ ! 178: ! 179: if( DialogParams.Screen.bFullScreen ) ! 180: screendlg[DLGSCRN_FULLSCRN].state |= SG_SELECTED; ! 181: else ! 182: screendlg[DLGSCRN_FULLSCRN].state &= ~SG_SELECTED; ! 183: ! 184: for(i=0; i<3; i++) ! 185: screendlg[DLGSCRN_1X + i].state &= ~SG_SELECTED; ! 186: ! 187: switch (ConfigureParams.Screen.ChosenDisplayMode) { ! 188: case DISPLAYMODE_HICOL_1X: ! 189: screendlg[DLGSCRN_1X].state |= SG_SELECTED; ! 190: break; ! 191: case DISPLAYMODE_HICOL_2X: ! 192: screendlg[DLGSCRN_2X].state |= SG_SELECTED; ! 193: break; ! 194: default: ! 195: screendlg[DLGSCRN_SCALE2X].state |= SG_SELECTED; ! 196: break; ! 197: } ! 198: ! 199: /* The screen dialog main loop */ ! 200: do ! 201: { ! 202: but = SDLGui_DoDialog(screendlg); ! 203: } ! 204: while( but!=DLGSCRN_EXIT && !bQuitProgram ); ! 205: ! 206: /* Read values from dialog */ ! 207: DialogParams.Screen.bFullScreen = (screendlg[DLGSCRN_FULLSCRN].state & SG_SELECTED); ! 208: ! 209: for(i=0; i<3; i++) ! 210: { ! 211: if(screendlg[DLGSCRN_1X + i].state & SG_SELECTED) ! 212: { ! 213: DialogParams.Screen.ChosenDisplayMode = i; ! 214: break; ! 215: } ! 216: } ! 217: } ! 218: ! 219: ! 220: /*-----------------------------------------------------------------------*/ ! 221: /* ! 222: Show and process the "Keyboard" dialog. ! 223: */ ! 224: void Dialog_KeyboardDlg(void) ! 225: { ! 226: int i, but; ! 227: char dlgmapfile[40]; ! 228: char tmpname[MAX_FILENAME_LENGTH]; ! 229: ! 230: SDLGui_CenterDlg(keyboarddlg); ! 231: ! 232: /* Set up dialog from actual values: */ ! 233: for(i = DLGKEY_SYMBOLIC; i <= DLGKEY_FROMFILE; i++) ! 234: { ! 235: keyboarddlg[i].state &= ~SG_SELECTED; ! 236: } ! 237: keyboarddlg[DLGKEY_SYMBOLIC+DialogParams.Keyboard.nKeymapType].state |= SG_SELECTED; ! 238: ! 239: File_ShrinkName(dlgmapfile, DialogParams.Keyboard.szMappingFileName, keyboarddlg[DLGKEY_MAPNAME].w); ! 240: keyboarddlg[DLGKEY_MAPNAME].txt = dlgmapfile; ! 241: ! 242: /* Show the dialog: */ ! 243: do ! 244: { ! 245: but = SDLGui_DoDialog(keyboarddlg); ! 246: ! 247: if(but == DLGKEY_MAPBROWSE) ! 248: { ! 249: strcpy(tmpname, DialogParams.Keyboard.szMappingFileName); ! 250: if(!tmpname[0]) ! 251: { ! 252: getcwd(tmpname, MAX_FILENAME_LENGTH); ! 253: File_AddSlashToEndFileName(tmpname); ! 254: } ! 255: if( SDLGui_FileSelect(tmpname, NULL) ) ! 256: { ! 257: strcpy(DialogParams.Keyboard.szMappingFileName, tmpname); ! 258: if( !File_DoesFileNameEndWithSlash(tmpname) && File_Exists(tmpname) ) ! 259: File_ShrinkName(dlgmapfile, tmpname, keyboarddlg[DLGKEY_MAPNAME].w); ! 260: else ! 261: dlgmapfile[0] = 0; ! 262: } ! 263: Screen_Draw(0); ! 264: } ! 265: ! 266: } ! 267: while(but != DLGKEY_EXIT && !bQuitProgram); ! 268: ! 269: /* Read values from dialog: */ ! 270: if(keyboarddlg[DLGKEY_SYMBOLIC].state & SG_SELECTED) ! 271: DialogParams.Keyboard.nKeymapType = KEYMAP_SYMBOLIC; ! 272: else if(keyboarddlg[DLGKEY_SCANCODE].state & SG_SELECTED) ! 273: DialogParams.Keyboard.nKeymapType = KEYMAP_SCANCODE; ! 274: else ! 275: DialogParams.Keyboard.nKeymapType = KEYMAP_LOADED; ! 276: } ! 277: ! 278: ! 279: ! 280: /*-----------------------------------------------------------------------*/ ! 281: /* ! 282: This functions sets up the actual font and then displays the main dialog. ! 283: */ ! 284: int Dialog_MainDlg(BOOL *bReset) ! 285: { ! 286: int retbut; ! 287: ! 288: if(SDLGui_PrepareFont()) ! 289: return FALSE; ! 290: ! 291: SDLGui_CenterDlg(maindlg); ! 292: SDL_ShowCursor(SDL_ENABLE); ! 293: ! 294: do ! 295: { ! 296: retbut = SDLGui_DoDialog(maindlg); ! 297: switch(retbut) ! 298: { ! 299: case MAINDLG_ABOUT: ! 300: SDLGui_CenterDlg(aboutdlg); ! 301: SDLGui_DoDialog(aboutdlg); ! 302: break; ! 303: case MAINDLG_SCREEN: ! 304: Dialog_ScreenDlg(); ! 305: break; ! 306: case MAINDLG_KEYBD: ! 307: SDLGui_CenterDlg(keyboarddlg); ! 308: Dialog_KeyboardDlg(); ! 309: break; ! 310: case MAINDLG_QUIT: ! 311: bQuitProgram = TRUE; ! 312: break; ! 313: } ! 314: Screen_Draw(0); ! 315: } ! 316: while(retbut!=MAINDLG_OK && retbut!=MAINDLG_CANCEL && !bQuitProgram); ! 317: ! 318: SDL_ShowCursor(SDL_DISABLE); ! 319: ! 320: return(retbut==MAINDLG_OK); ! 321: } ! 322: ! 323: ! 324: /*-----------------------------------------------------------------------*/ ! 325: /* ! 326: Open Property sheet Options dialog ! 327: Return TRUE if user choses OK, or FALSE if cancel! ! 328: */ ! 329: BOOL Dialog_DoProperty(void) ! 330: { ! 331: BOOL bOKDialog; /* Did user 'OK' dialog? */ ! 332: BOOL bForceReset; ! 333: ! 334: Main_PauseEmulation(); ! 335: ! 336: /* Copy details to DialogParams (this is so can restore if 'Cancel' dialog) */ ! 337: ConfigureParams.Screen.bFullScreen = bInFullScreen; ! 338: DialogParams = ConfigureParams; ! 339: ! 340: bForceReset = FALSE; ! 341: ! 342: bOKDialog = Dialog_MainDlg(&bForceReset); ! 343: ! 344: if (bOKDialog) ! 345: Dialog_CopyDialogParamsToConfiguration (bForceReset); ! 346: ! 347: /* Did want to save/restore memory save? If did, need to re-enter emulation mode so can save in 'safe-zone' */ ! 348: Main_UnPauseEmulation(); ! 349: ! 350: return(bOKDialog); ! 351: } ! 352:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.