mirror of
https://github.com/Wiimpathy/HatariWii.git
synced 2024-06-02 16:48:43 +02:00
431 lines
11 KiB
C
431 lines
11 KiB
C
/*
|
|
Hatari - dlgMain.c
|
|
|
|
This file is distributed under the GNU General Public License, version 2
|
|
or at your option any later version. Read the file gpl.txt for details.
|
|
|
|
The main dialog.
|
|
*/
|
|
const char DlgMain_fileid[] = "Hatari dlgMain.c : " __DATE__ " " __TIME__;
|
|
|
|
#include "main.h"
|
|
#include "configuration.h"
|
|
#include "dialog.h"
|
|
#include "sdlgui.h"
|
|
#include "screen.h"
|
|
|
|
#ifdef GEKKO
|
|
/* Wii Main menu */
|
|
#define MAINDLG_FLOPPYA 2
|
|
#define MAINDLG_FLOPPYB 3
|
|
#define MAINDLG_LOAD_SAVE 4
|
|
#define MAINDLG_SETTINGS 5
|
|
#define MAINDLG_RESET 6
|
|
#define MAINDLG_QUIT 7
|
|
#define MAINDLG_SPEED 8
|
|
#define MAINDLG_OK 9
|
|
#define MAINDLG_CANCEL 10
|
|
/* Wii Settings menu */
|
|
#define OPTIONSDLG_ABOUT 2
|
|
#define OPTIONSDLG_SYSTEM 3
|
|
#define OPTIONSDLG_ROM 4
|
|
#define OPTIONSDLG_MEMORY 5
|
|
#define OPTIONSDLG_FLOPPYS 6
|
|
#define OPTIONSDLG_HARDDISK 7
|
|
#define OPTIONSDLG_MONITOR 8
|
|
#define OPTIONSDLG_WINDOW 9
|
|
#define OPTIONSDLG_JOY 10
|
|
#define OPTIONSDLG_KEYBD 11
|
|
#define OPTIONSDLG_DEVICES 12
|
|
#define OPTIONSDLG_SOUND 13
|
|
#define OPTIONSDLG_LOADCFG 14
|
|
#define OPTIONSDLG_SAVECFG 15
|
|
#define OPTIONSDLG_EXIT 16
|
|
#define OPTIONSDLG_BACK 17
|
|
#else
|
|
#define MAINDLG_ABOUT 2
|
|
#define MAINDLG_SYSTEM 3
|
|
#define MAINDLG_ROM 4
|
|
#define MAINDLG_MEMORY 5
|
|
#define MAINDLG_FLOPPYS 6
|
|
#define MAINDLG_HARDDISK 7
|
|
#define MAINDLG_MONITOR 8
|
|
#define MAINDLG_WINDOW 9
|
|
#define MAINDLG_JOY 10
|
|
#define MAINDLG_KEYBD 11
|
|
#define MAINDLG_DEVICES 12
|
|
#define MAINDLG_SOUND 13
|
|
#define MAINDLG_LOADCFG 14
|
|
#define MAINDLG_SAVECFG 15
|
|
#define MAINDLG_NORESET 16
|
|
#define MAINDLG_RESET 17
|
|
#define MAINDLG_OK 18
|
|
#define MAINDLG_QUIT 19
|
|
#define MAINDLG_CANCEL 20
|
|
#endif
|
|
|
|
char dlgname[MAX_FLOPPYDRIVES][64];
|
|
void DlgDisk_BrowseDisk(char *dlgname, int drive, int diskid);
|
|
int floppyeject = -1;
|
|
static int speed = 1;
|
|
|
|
/* The main dialog: */
|
|
static SGOBJ maindlg[] =
|
|
{
|
|
#ifdef GEKKO
|
|
{ SGBOX, 0, 0, 0,0, 55,25, NULL },
|
|
{ SGTEXT, 0, 0, 17,1, 16,1, "Hatari main menu" },
|
|
{ SGFLOPPYA, SG_EXIT, 0, 4,3, 12,7, "" },
|
|
{ SGFLOPPYB, SG_EXIT, 0, 22,3, 12,7, "" },
|
|
{ SGLOAD_SAVE, SG_EXIT, 0, 40,3, 12,7, "" },
|
|
{ SGSETTINGS, SG_EXIT, 0, 4,12, 12,7, "" },
|
|
{ SGRESET, SG_EXIT, 0, 22,12, 12,7, "" },
|
|
{ SGQUIT, SG_EXIT, 0, 40,12, 12,7, "" },
|
|
{ SGBUTTON, 0, 0, 3,22, 15,1, "Speed: Normal" },
|
|
{ SGBUTTON, SG_DEFAULT, 0, 35,21, 8,3, "OK" },
|
|
{ SGBUTTON, SG_CANCEL, 0, 44,21, 8,3, "Cancel" },
|
|
{ -1, 0, 0, 0,0, 0,0, NULL }
|
|
#else
|
|
{ SGBOX, 0, 0, 0,0, 50,19, NULL },
|
|
{ SGTEXT, 0, 0, 17,2, 16,1, "Hatari main menu" },
|
|
{ SGBUTTON, 0, 0, 2, 4, 13,1, "A_bout" },
|
|
{ SGBUTTON, 0, 0, 2, 6, 13,1, "S_ystem" },
|
|
{ SGBUTTON, 0, 0, 2, 8, 13,1, "_ROM" },
|
|
{ SGBUTTON, 0, 0, 2,10, 13,1, "_Memory" },
|
|
{ SGBUTTON, 0, 0, 17, 4, 16,1, "_Floppy disks" },
|
|
{ SGBUTTON, 0, 0, 17, 6, 16,1, "Hard _disks" },
|
|
{ SGBUTTON, 0, 0, 17, 8, 16,1, "_Atari screen" },
|
|
{ SGBUTTON, 0, 0, 17,10, 16,1, "_Hatari screen" },
|
|
{ SGBUTTON, 0, 0, 35, 4, 13,1, "_Joysticks" },
|
|
{ SGBUTTON, 0, 0, 35, 6, 13,1, "_Keyboard" },
|
|
{ SGBUTTON, 0, 0, 35, 8, 13,1, "D_evices" },
|
|
{ SGBUTTON, 0, 0, 35,10, 13,1, "S_ound" },
|
|
{ SGBUTTON, 0, 0, 7,13, 16,1, "_Load config." },
|
|
{ SGBUTTON, 0, 0, 27,13, 16,1, "_Save config." },
|
|
{ SGRADIOBUT, 0, 0, 3,15, 10,1, "_No Reset" },
|
|
{ SGRADIOBUT, 0, 0, 3,17, 15,1, "Reset ma_chine" },
|
|
{ SGBUTTON, SG_DEFAULT, 0, 21,15, 8,3, "OK" },
|
|
{ SGBUTTON, 0, 0, 36,15, 10,1, "_Quit" },
|
|
{ SGBUTTON, SG_CANCEL, 0, 36,17, 10,1, "Cancel" },
|
|
{ -1, 0, 0, 0,0, 0,0, NULL }
|
|
#endif
|
|
};
|
|
|
|
#ifdef GEKKO
|
|
/* The main dialog: */
|
|
static SGOBJ settingsdlg[] =
|
|
{
|
|
{ SGBOX, 0, 0, 0,0, 50,23, NULL },
|
|
{ SGTEXT, 0, 0, 17,1, 16,1, "Hatari settings" },
|
|
{ SGBUTTON, 0, 0, 2, 4, 13,1, "A_bout" },
|
|
{ SGBUTTON, 0, 0, 2, 6, 13,1, "S_ystem" },
|
|
{ SGBUTTON, 0, 0, 2, 8, 13,1, "_ROM" },
|
|
{ SGBUTTON, 0, 0, 2,10, 13,1, "_Memory" },
|
|
{ SGBUTTON, 0, 0, 17, 4, 16,1, "_Floppy disks" },
|
|
{ SGBUTTON, 0, 0, 17, 6, 16,1, "Hard _disks" },
|
|
{ SGBUTTON, 0, 0, 17, 8, 16,1, "_Atari screen" },
|
|
{ SGBUTTON, 0, 0, 17,10, 16,1, "_Hatari screen" },
|
|
{ SGBUTTON, 0, 0, 35, 4, 13,1, "_Joysticks" },
|
|
{ SGBUTTON, 0, 0, 35, 6, 13,1, "_Keyboard" },
|
|
{ SGBUTTON, 0, 0, 35, 8, 13,1, "D_evices" },
|
|
{ SGBUTTON, 0, 0, 35,10, 13,1, "S_ound" },
|
|
{ SGBUTTON, 0, 0, 7,13, 16,1, "_Load config." },
|
|
{ SGBUTTON, 0, 0, 27,13, 16,1, "_Save config." },
|
|
{ SGBUTTON, SG_DEFAULT, 0, 15,18, 20,1, "Back to main menu" },
|
|
{ SGTEXT, SG_CANCEL, 0, 800,23, 2,1, "B" }, // hidden, back with B button
|
|
{ -1, 0, 0, 0,0, 0,0, NULL }
|
|
};
|
|
#endif
|
|
|
|
|
|
/**
|
|
* Show and process the floppy disk image dialog.
|
|
*/
|
|
void DlgSettings_Main(void)
|
|
{
|
|
int but;
|
|
char *psNewCfg;
|
|
|
|
SDLGui_CenterDlg(settingsdlg);
|
|
|
|
/* Clear the screen */
|
|
SDL_FillRect(sdlscrn, NULL, SDL_MapRGB(sdlscrn->format, 0, 0, 0));
|
|
|
|
/* Draw and process the dialog */
|
|
do
|
|
{
|
|
but = SDLGui_DoDialog(settingsdlg, NULL, false);
|
|
switch (but)
|
|
{
|
|
case OPTIONSDLG_SYSTEM:
|
|
Dialog_SystemDlg();
|
|
break;
|
|
case OPTIONSDLG_ROM:
|
|
DlgRom_Main();
|
|
break;
|
|
case OPTIONSDLG_MEMORY:
|
|
Dialog_MemDlg();
|
|
break;
|
|
case OPTIONSDLG_FLOPPYS:
|
|
DlgFloppy_Main();
|
|
break;
|
|
case OPTIONSDLG_HARDDISK:
|
|
DlgHardDisk_Main();
|
|
break;
|
|
case OPTIONSDLG_MONITOR:
|
|
Dialog_MonitorDlg();
|
|
break;
|
|
case OPTIONSDLG_WINDOW:
|
|
Dialog_WindowDlg();
|
|
break;
|
|
case OPTIONSDLG_JOY:
|
|
Dialog_JoyDlg();
|
|
break;
|
|
case OPTIONSDLG_KEYBD:
|
|
Dialog_KeyboardDlg();
|
|
break;
|
|
case OPTIONSDLG_DEVICES:
|
|
Dialog_DeviceDlg();
|
|
break;
|
|
case OPTIONSDLG_SOUND:
|
|
Dialog_SoundDlg();
|
|
break;
|
|
case OPTIONSDLG_ABOUT:
|
|
Dialog_AboutDlg();
|
|
break;
|
|
case OPTIONSDLG_LOADCFG:
|
|
psNewCfg = SDLGui_FileSelect("Load configuration:", sConfigFileName, NULL, false);
|
|
if (psNewCfg)
|
|
{
|
|
strcpy(sConfigFileName, psNewCfg);
|
|
Configuration_Load(NULL);
|
|
free(psNewCfg);
|
|
}
|
|
break;
|
|
case OPTIONSDLG_SAVECFG:
|
|
psNewCfg = SDLGui_FileSelect("Save configuration:", sConfigFileName, NULL, true);
|
|
if (psNewCfg)
|
|
{
|
|
strcpy(sConfigFileName, psNewCfg);
|
|
Configuration_Save();
|
|
free(psNewCfg);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
while (but != OPTIONSDLG_EXIT && but != SDLGUI_QUIT && but != OPTIONSDLG_BACK
|
|
&& but != SDLGUI_ERROR && !bQuitProgram);
|
|
}
|
|
|
|
|
|
/**
|
|
* This functions sets up the actual font and then displays the main dialog.
|
|
*/
|
|
int Dialog_MainDlg(bool *bReset, bool *bLoadedSnapshot)
|
|
{
|
|
int retbut;
|
|
bool bOldMouseVisibility;
|
|
int nOldMouseX, nOldMouseY;
|
|
#ifndef GEKKO
|
|
char *psNewCfg;
|
|
#endif
|
|
|
|
floppyeject = -1;
|
|
*bReset = false;
|
|
*bLoadedSnapshot = false;
|
|
|
|
#ifdef GEKKO
|
|
/* Copy screen for snapshots */
|
|
|
|
if (ConfigureParams.Screen.nMonitorType == MONITOR_TYPE_TV)
|
|
{
|
|
/* Disable TV mode before copying the screen. The snapshot wouldn't be visible otherwise. */
|
|
ConfigureParams.Screen.nMonitorType = MONITOR_TYPE_VGA;
|
|
Screen_ModeChanged(true);
|
|
Screen_Draw();
|
|
lastscreen = SDL_DisplayFormat(sdlscrn);
|
|
ConfigureParams.Screen.nMonitorType = MONITOR_TYPE_TV;
|
|
}
|
|
else
|
|
{
|
|
lastscreen = SDL_DisplayFormat(sdlscrn);
|
|
}
|
|
#endif
|
|
|
|
if (SDLGui_SetScreen(sdlscrn))
|
|
return false;
|
|
|
|
SDL_GetMouseState(&nOldMouseX, &nOldMouseY);
|
|
bOldMouseVisibility = SDL_ShowCursor(SDL_QUERY);
|
|
SDL_ShowCursor(SDL_ENABLE);
|
|
|
|
SDLGui_CenterDlg(maindlg);
|
|
|
|
#ifndef GEKKO
|
|
maindlg[MAINDLG_NORESET].state |= SG_SELECTED;
|
|
maindlg[MAINDLG_RESET].state &= ~SG_SELECTED;
|
|
#endif
|
|
|
|
#ifdef GEKKO
|
|
/* Disable 'Turbo mode' in mouse mode or else no double click. */
|
|
if (ConfigureParams.Joysticks.Joy[1].nJoystickMode == 0 && ConfigureParams.System.bFastForward)
|
|
{
|
|
ConfigureParams.System.bFastForward = false;
|
|
}
|
|
|
|
if (ConfigureParams.System.bFastForward)
|
|
maindlg[MAINDLG_SPEED].txt = "Speed: Turbo";
|
|
else
|
|
maindlg[MAINDLG_SPEED].txt = "Speed: Normal";
|
|
#endif
|
|
|
|
do
|
|
{
|
|
retbut = SDLGui_DoDialog(maindlg, NULL, false);
|
|
switch (retbut)
|
|
{
|
|
#ifdef GEKKO
|
|
case MAINDLG_FLOPPYA:
|
|
floppyeject = 0;
|
|
maindlg[MAINDLG_FLOPPYA].type = 15;
|
|
DlgDisk_BrowseDisk(dlgname[0], 0, 7);
|
|
Floppy_InsertDiskIntoDrive(0);
|
|
break;
|
|
case MAINDLG_FLOPPYB:
|
|
floppyeject = 1;
|
|
maindlg[MAINDLG_FLOPPYB].type = 16;
|
|
DlgDisk_BrowseDisk(dlgname[1], 1, 13);
|
|
Floppy_InsertDiskIntoDrive(1);
|
|
break;
|
|
case MAINDLG_LOAD_SAVE:
|
|
maindlg[MAINDLG_LOAD_SAVE].type = 17;
|
|
|
|
if (Dialog_SaveDlg())
|
|
{
|
|
SDL_ShowCursor(SDL_DISABLE);
|
|
/* Memory snapshot has been loaded - leave GUI immediately */
|
|
*bLoadedSnapshot = true;
|
|
return true;
|
|
}
|
|
break;
|
|
case MAINDLG_SETTINGS:
|
|
maindlg[MAINDLG_SETTINGS].type = 18;
|
|
DlgSettings_Main();
|
|
break;
|
|
case MAINDLG_RESET:
|
|
maindlg[MAINDLG_RESET].type = 19;
|
|
*bReset = true;
|
|
SDL_ShowCursor(SDL_DISABLE);
|
|
Reset_Cold();
|
|
return true;
|
|
case MAINDLG_QUIT:
|
|
maindlg[MAINDLG_QUIT].type = 20;
|
|
bQuitProgram = true;
|
|
break;
|
|
case MAINDLG_SPEED:
|
|
speed += 1;
|
|
|
|
if (speed > 2)
|
|
speed = 1;
|
|
|
|
if (speed == 1)
|
|
{
|
|
maindlg[MAINDLG_SPEED].txt = "Speed: Normal";
|
|
ConfigureParams.System.bFastForward = false;
|
|
}
|
|
else if (speed == 2)
|
|
{
|
|
maindlg[MAINDLG_SPEED].txt = "Speed: Turbo";
|
|
ConfigureParams.System.bFastForward = true;
|
|
}
|
|
break;
|
|
#else
|
|
case MAINDLG_ABOUT:
|
|
Dialog_AboutDlg();
|
|
break;
|
|
case MAINDLG_FLOPPYS:
|
|
DlgFloppy_Main();
|
|
break;
|
|
case MAINDLG_HARDDISK:
|
|
DlgHardDisk_Main();
|
|
break;
|
|
case MAINDLG_ROM:
|
|
DlgRom_Main();
|
|
break;
|
|
case MAINDLG_MONITOR:
|
|
Dialog_MonitorDlg();
|
|
break;
|
|
case MAINDLG_WINDOW:
|
|
Dialog_WindowDlg();
|
|
break;
|
|
case MAINDLG_SYSTEM:
|
|
Dialog_SystemDlg();
|
|
break;
|
|
case MAINDLG_MEMORY:
|
|
if (Dialog_MemDlg())
|
|
{
|
|
/* Memory snapshot has been loaded - leave GUI immediately */
|
|
*bLoadedSnapshot = true;
|
|
SDL_ShowCursor(bOldMouseVisibility);
|
|
Main_WarpMouse(nOldMouseX, nOldMouseY, true);
|
|
return true;
|
|
}
|
|
break;
|
|
case MAINDLG_JOY:
|
|
Dialog_JoyDlg();
|
|
break;
|
|
case MAINDLG_KEYBD:
|
|
Dialog_KeyboardDlg();
|
|
break;
|
|
case MAINDLG_DEVICES:
|
|
Dialog_DeviceDlg();
|
|
break;
|
|
case MAINDLG_SOUND:
|
|
Dialog_SoundDlg();
|
|
break;
|
|
case MAINDLG_LOADCFG:
|
|
psNewCfg = SDLGui_FileSelect("Load configuration:", sConfigFileName, NULL, false);
|
|
if (psNewCfg)
|
|
{
|
|
strcpy(sConfigFileName, psNewCfg);
|
|
Configuration_Load(NULL);
|
|
free(psNewCfg);
|
|
}
|
|
break;
|
|
case MAINDLG_SAVECFG:
|
|
psNewCfg = SDLGui_FileSelect("Save configuration:", sConfigFileName, NULL, true);
|
|
if (psNewCfg)
|
|
{
|
|
strcpy(sConfigFileName, psNewCfg);
|
|
Configuration_Save();
|
|
free(psNewCfg);
|
|
}
|
|
break;
|
|
case MAINDLG_QUIT:
|
|
bQuitProgram = true;
|
|
break;
|
|
#endif
|
|
}
|
|
}
|
|
while (retbut != MAINDLG_OK && retbut != MAINDLG_CANCEL && retbut != SDLGUI_QUIT
|
|
&& retbut != SDLGUI_ERROR && !bQuitProgram);
|
|
|
|
if (maindlg[MAINDLG_RESET].state & SG_SELECTED)
|
|
*bReset = true;
|
|
#ifdef GEKKO
|
|
/* Disable 'Turbo mode' in mouse mode or else no double click. */
|
|
if (ConfigureParams.Joysticks.Joy[1].nJoystickMode == 0 && ConfigureParams.System.bFastForward)
|
|
{
|
|
DlgAlert_Notice("Turbo is disabled in mouse mode! Double click is impossible if enabled.\n Enable Joy mode in the virtual keyboard to use Turbo.");
|
|
ConfigureParams.System.bFastForward = false;
|
|
}
|
|
|
|
SDL_FreeSurface(lastscreen);
|
|
#endif
|
|
|
|
SDL_ShowCursor(bOldMouseVisibility);
|
|
Main_WarpMouse(nOldMouseX, nOldMouseY, true);
|
|
|
|
return (retbut == MAINDLG_OK);
|
|
}
|