SDL: hotkey config system revamped. shouldn't be too difficult to write a GUI for defining hotkeys in the near future

This commit is contained in:
punkrockguy318 2010-02-27 20:05:42 +00:00
parent 88300c898e
commit c32e80286f
3 changed files with 120 additions and 143 deletions

View File

@ -32,18 +32,17 @@
int
LoadCPalette(const std::string &file)
{
printf("Loading custom palette from file...\n");
uint8 tmpp[192];
FILE *fp;
if(!(fp = FCEUD_UTF8fopen(file.c_str(), "rb"))) {
printf(" Error loading custom palette from file: %s\n", file.c_str());
return -1;
return 0;
}
fread(tmpp, 1, 192, fp);
FCEUI_SetPaletteArray(tmpp);
fclose(fp);
return 0;
return 1;
}
/**
@ -294,35 +293,49 @@ InitConfig()
DefaultFamilyKeyBoard[j]);
}
// Hotkeys
const int Hotkeys[HK_MAX] = {
SDLK_F1, // cheat menu
SDLK_F2, // bind state
SDLK_F3, // load lua
SDLK_F4, // toggleBG
SDLK_F5, // save state
SDLK_F6, // fds select
SDLK_F7, // load state
SDLK_F8, // fds eject
SDLK_F9, // toggle frame display
SDLK_F10, // toggle subtitle
SDLK_F11, // reset
SDLK_F12, // screenshot
SDLK_PAUSE, // pause
SDLK_MINUS, // speed++
SDLK_EQUALS, // speed--
SDLK_BACKSLASH, //frame advnace
SDLK_TAB, // turbo
SDLK_i, // toggle input display
SDLK_o, // toggle movie RW
SDLK_p, // toggle mute capture
0, // quit
SDLK_DELETE, // frame advance lag skip
SDLK_ESCAPE, // lag counter display
SDLK_0, SDLK_1, SDLK_2, SDLK_3, SDLK_4, SDLK_5,
SDLK_6, SDLK_7, SDLK_8, SDLK_9};
prefix = "SDL.Hotkeys.";
config->addOption(prefix + "CheatMenu", SDLK_F1);
config->addOption(prefix + "BindState", SDLK_F2);
#ifdef _S9XLUA_H
config->addOption(prefix + "LoadLua", SDLK_F3);
#endif
config->addOption(prefix + "RenderBG", SDLK_F4);
config->addOption(prefix + "SaveState", SDLK_F5);
config->addOption(prefix + "FrameAdvanceLagSkip", SDLK_LEFTBRACKET);
config->addOption(prefix + "LoadState", SDLK_F7);
config->addOption(prefix + "LagCounterDisplay", SDLK_RIGHTBRACKET);
config->addOption(prefix + "MovieToggleFrameDisplay", SDLK_F9);
config->addOption(prefix + "SubtitleDisplay", SDLK_F10);
config->addOption(prefix + "Reset", SDLK_F11);
config->addOption(prefix + "Screenshot", SDLK_F12);
for(int i=0; i < HK_MAX; i++)
config->addOption(prefix + HotkeyStrings[i], Hotkeys[i]);
/*
config->addOption(prefix + "Pause", SDLK_PAUSE);
config->addOption(prefix + "DecreaseSpeed", SDLK_MINUS);
config->addOption(prefix + "IncreaseSpeed", SDLK_EQUALS);
config->addOption(prefix + "FrameAdvance", SDLK_BACKSLASH);
config->addOption(prefix + "FastForward", SDLK_BACKQUOTE);
config->addOption(prefix + "FastForward", SDLK_TAB);
config->addOption(prefix + "InputDisplay", SDLK_i);
config->addOption(prefix + "MovieToggleReadWrite", SDLK_q);
#ifdef CREATE_AVI
config->addOption(prefix + "MuteCapture", SDLK_DELETE);
#endif
config->addOption(prefix + "Quit", SDLK_ESCAPE);
config->addOption(prefix + "FDSSelect", SDLK_F6);
config->addOption(prefix + "FDSEject", SDLK_F8);
//config->addOption(prefix + "Power", 0);
@ -339,7 +352,7 @@ InitConfig()
config->addOption(prefix + "SelectState8", SDLK_8);
config->addOption(prefix + "SelectState9", SDLK_9);
*/
// All mouse devices
config->addOption("SDL.OekaKids.0.DeviceType", "Mouse");

View File

@ -7,4 +7,45 @@ Config *InitConfig(void);
void UpdateEMUCore(Config *);
int LoadCPalette(const std::string &file);
// hotkey definitions
const int HK_MAX = 33;
enum HOTKEY { HK_CHEAT_MENU, HK_BIND_STATE, HK_LOAD_LUA, HK_TOGGLE_BG,
HK_SAVE_STATE, HK_FDS_SELECT, HK_LOAD_STATE, HK_FDS_EJECT ,
HK_TOGGLE_FRAME_DISPLAY, HK_TOGGLE_SUBTITLE, HK_RESET, HK_SCREENSHOT,
HK_PAUSE, HK_DECREASE_SPEED, HK_INCREASE_SPEED, HK_FRAME_ADVANCE, HK_TURBO,
HK_TOGGLE_INPUT_DISPLAY, HK_MOVIE_TOGGLE_RW, HK_MUTE_CAPTURE, HK_QUIT, HK_FA_LAG_SKIP, HK_LAG_COUNTER_DISPLAY,
HK_SELECT_STATE_0, HK_SELECT_STATE_1, HK_SELECT_STATE_2, HK_SELECT_STATE_3,
HK_SELECT_STATE_4, HK_SELECT_STATE_5, HK_SELECT_STATE_6, HK_SELECT_STATE_7,
HK_SELECT_STATE_8, HK_SELECT_STATE_9};
static const char* HotkeyStrings[HK_MAX] = {
"CheatMenu",
"BindState",
"LoadLua",
"ToggleBG",
"SaveState",
"FDSSelect",
"FDSEject",
"LoadState",
"MovieToggleFrameDisplay",
"SubtitleDisplay",
"Reset",
"Screenshot",
"Pause",
"DecreaseSpeed",
"IncreaseSpeed",
"FrameAdvance",
"Turbo",
"ToggleInputDisplay",
"ToggleMovieRW",
"MuteCapture",
"Quit",
"FrameAdvanceLagSkip",
"LagCounterDisplay",
"SelectState0", "SelectState1", "SelectState2", "SelectState3",
"SelectState4", "SelectState5", "SelectState6", "SelectState7",
"SelectState8", "SelectState9" };
#endif

View File

@ -162,97 +162,19 @@ _keyonly(int a)
static int g_fkbEnabled = 0;
// key definitions
int cheatMenuKey;
#ifdef _S9XLUA_H
int loadLuaKey;
#endif
int renderBgKey;
int saveStateKey;
int loadStateKey;
int resetKey;
int screenshotKey;
int pauseKey;
int decreaseSpeedKey;
int increaseSpeedKey;
int frameAdvanceKey;
int ffKey;
int powerKey;
int bindStateKey;
int frameAdvanceLagSkipKey;
int quitKey;
int stateKey[10];
int movieToggleFrameDisplayKey;
int lagCounterDisplayKey;
int SubtitleDisplayKey;
int InputDisplayKey;
int movieToggleReadWriteKey;
#ifdef CREATE_AVI
int MuteCaptureKey;
#endif
int fdsSelectDiskKey;
int fdsEjectKey;
// this function loads the sdl hotkeys from the config file into the
// global scope. this elimates the need for accessing the config file
int Hotkeys[HK_MAX] = {0};
// on every cycle of keyboardinput()
void setHotKeys()
{
g_config->getOption("SDL.Hotkeys.CheatMenu", &cheatMenuKey);
#ifdef _S9XLUA_H
g_config->getOption("SDL.Hotkeys.LoadLua", &loadLuaKey);
#endif
g_config->getOption("SDL.Hotkeys.RenderBG", &renderBgKey);
g_config->getOption("SDL.Hotkeys.SaveState", &saveStateKey);
g_config->getOption("SDL.Hotkeys.LoadState", &loadStateKey);
g_config->getOption("SDL.Hotkeys.Reset", &resetKey);
g_config->getOption("SDL.Hotkeys.Screenshot", &screenshotKey);
g_config->getOption("SDL.Hotkeys.Pause", &pauseKey);
g_config->getOption("SDL.Hotkeys.IncreaseSpeed", &increaseSpeedKey);
g_config->getOption("SDL.Hotkeys.DecreaseSpeed", &decreaseSpeedKey);
g_config->getOption("SDL.Hotkeys.FrameAdvance", &frameAdvanceKey);
g_config->getOption("SDL.Hotkeys.FastForward", &ffKey);
g_config->getOption("SDL.Hotkeys.Power", &powerKey);
g_config->getOption("SDL.Hotkeys.Pause", &bindStateKey);
g_config->getOption("SDL.Hotkeys.FrameAdvanceLagSkip", &frameAdvanceLagSkipKey);
g_config->getOption("SDL.Hotkeys.Quit", &quitKey);
g_config->getOption("SDL.Hotkeys.SelectState0", &stateKey[0]);
g_config->getOption("SDL.Hotkeys.SelectState1", &stateKey[1]);
g_config->getOption("SDL.Hotkeys.SelectState2", &stateKey[2]);
g_config->getOption("SDL.Hotkeys.SelectState3", &stateKey[3]);
g_config->getOption("SDL.Hotkeys.SelectState4", &stateKey[4]);
g_config->getOption("SDL.Hotkeys.SelectState5", &stateKey[5]);
g_config->getOption("SDL.Hotkeys.SelectState6", &stateKey[6]);
g_config->getOption("SDL.Hotkeys.SelectState7", &stateKey[7]);
g_config->getOption("SDL.Hotkeys.SelectState8", &stateKey[8]);
g_config->getOption("SDL.Hotkeys.SelectState9", &stateKey[9]);
g_config->getOption("SDL.Hotkeys.LagCounterDisplay", &lagCounterDisplayKey);
g_config->getOption("SDL.Hotkeys.MovieToggleFrameDisplay", &movieToggleFrameDisplayKey);
g_config->getOption("SDL.Hotkeys.SubtitleDisplay", &SubtitleDisplayKey);
g_config->getOption("SDL.Hotkeys.InputDisplay", &InputDisplayKey);
g_config->getOption("SDL.Hotkeys.MovieToggleReadWrite", &movieToggleReadWriteKey);
#ifdef CREATE_AVI
g_config->getOption("SDL.Hotkeys.MuteCapture", &MuteCaptureKey);
#endif
g_config->getOption("SDL.Hotkeys.FDSSelect", &fdsSelectDiskKey);
g_config->getOption("SDL.Hotkeys.FDSEject", &fdsEjectKey);
/*
config->addOption(prefix + "FrameAdvance", SDLK_BACKSLASH);
config->addOption(prefix + "Power", 0);
config->addOption(prefix + "BindState", SDLK_F2);
config->addOption(prefix + "FrameAdvanceLagSkip", SDLK_F6);
config->addOption(prefix + "LagCounterDisplay", SDLK_F8);
config->addOption(prefix + "SelectState0", SDLK_0);
config->addOption(prefix + "SelectState1", SDLK_1);
config->addOption(prefix + "SelectState2", SDLK_2);
config->addOption(prefix + "SelectState3", SDLK_3);
config->addOption(prefix + "SelectState4", SDLK_4);
config->addOption(prefix + "SelectState5", SDLK_5);
config->addOption(prefix + "SelectState6", SDLK_6);
config->addOption(prefix + "SelectState7", SDLK_7);
config->addOption(prefix + "SelectState8", SDLK_8);
config->addOption(prefix + "SelectState9", SDLK_9);
*/
std::string prefix = "SDL.Hotkeys.";
for(int i=0; i<HK_MAX; i++)
{
g_config->getOption(prefix + HotkeyStrings[i], &Hotkeys[i]);
}
return;
}
@ -508,7 +430,7 @@ KeyboardCommands()
is_alt = 0;
if(_keyonly(renderBgKey)) {
if(_keyonly(Hotkeys[HK_TOGGLE_BG])) {
if(is_shift) {
FCEUI_SetRenderPlanes(true, false);
} else {
@ -548,26 +470,26 @@ KeyboardCommands()
// Famicom disk-system games
if(gametype==GIT_FDS)
{
if(_keyonly(fdsSelectDiskKey)) {
if(_keyonly(Hotkeys[HK_FDS_SELECT])) {
FCEUI_FDSSelect();
}
if(_keyonly(fdsEjectKey)) {
if(_keyonly(Hotkeys[HK_FDS_EJECT])) {
FCEUI_FDSInsert();
}
}
if(_keyonly(screenshotKey)) {
if(_keyonly(Hotkeys[HK_SCREENSHOT])) {
FCEUI_SaveSnapshot();
}
// if not NES Sound Format
if(gametype != GIT_NSF) {
if(_keyonly(cheatMenuKey)) {
if(_keyonly(Hotkeys[HK_CHEAT_MENU])) {
DoCheatSeq();
}
// f5 (default) save key, hold shift to save movie
if(_keyonly(saveStateKey)) {
if(_keyonly(Hotkeys[HK_SAVE_STATE])) {
if(is_shift) {
movie_fname = const_cast<char*>(FCEU_MakeFName(FCEUMKF_MOVIE, 0, 0).c_str());
FCEUI_printf("Recording movie to %s\n", movie_fname);
@ -578,7 +500,7 @@ KeyboardCommands()
}
// f7 to load state, Shift-f7 to load movie
if(_keyonly(loadStateKey)) {
if(_keyonly(Hotkeys[HK_LOAD_STATE])) {
if(is_shift) {
FCEUI_StopMovie();
std::string fname;
@ -602,47 +524,47 @@ KeyboardCommands()
}
if(_keyonly(decreaseSpeedKey)) {
if(_keyonly(Hotkeys[HK_DECREASE_SPEED])) {
DecreaseEmulationSpeed();
}
if(_keyonly(increaseSpeedKey)) {
if(_keyonly(Hotkeys[HK_INCREASE_SPEED])) {
IncreaseEmulationSpeed();
}
if(_keyonly(movieToggleFrameDisplayKey)) {
if(_keyonly(Hotkeys[HK_TOGGLE_FRAME_DISPLAY])) {
FCEUI_MovieToggleFrameDisplay();
}
if(_keyonly(InputDisplayKey)) {
if(_keyonly(Hotkeys[HK_TOGGLE_INPUT_DISPLAY])) {
FCEUI_ToggleInputDisplay();
extern int input_display;
g_config->setOption("SDL.InputDisplay", input_display);
}
if(_keyonly(movieToggleReadWriteKey)) {
if(_keyonly(Hotkeys[HK_MOVIE_TOGGLE_RW])) {
FCEUI_SetMovieToggleReadOnly(!FCEUI_GetMovieToggleReadOnly());
}
#ifdef CREATE_AVI
if(_keyonly(MuteCaptureKey)) {
if(_keyonly(Hotkeys[HK_MUTE_CAPTURE])) {
extern int mutecapture;
mutecapture ^= 1;
}
#endif
if(_keyonly(pauseKey)) {
if(_keyonly(Hotkeys[HK_PAUSE])) {
FCEUI_ToggleEmulationPause();
}
// Toggle throttling
NoWaiting &= ~1;
if(g_keyState[ffKey]) {
if(g_keyState[Hotkeys[HK_TURBO]]) {
NoWaiting |= 1;
}
static bool frameAdvancing = false;
if(g_keyState[frameAdvanceKey])
if(g_keyState[Hotkeys[HK_FRAME_ADVANCE]])
{
if(frameAdvancing == false)
{
@ -659,18 +581,18 @@ KeyboardCommands()
}
}
if(_keyonly(resetKey)) {
if(_keyonly(Hotkeys[HK_RESET])) {
FCEUI_ResetNES();
}
if(_keyonly(powerKey)) {
FCEUI_PowerNES();
}
//if(_keyonly(Hotkeys[HK_POWER])) {
// FCEUI_PowerNES();
//}
if(_keyonly(quitKey)) {
if(_keyonly(Hotkeys[HK_QUIT])) {
CloseGame();
}
#ifdef _S9XLUA_H
if(_keyonly(loadLuaKey)) {
if(_keyonly(Hotkeys[HK_LOAD_LUA])) {
std::string fname;
fname = GetFilename("Open LUA script...", false, "Lua scripts|*.lua");
if(fname != "")
@ -679,26 +601,26 @@ KeyboardCommands()
#endif
for(int i=0; i<10; i++)
if(_keyonly(stateKey[i]))
if(_keyonly(Hotkeys[HK_SELECT_STATE_0 + i]))
FCEUI_SelectState(i, 1);
if(_keyonly(bindStateKey)) {
if(_keyonly(Hotkeys[HK_BIND_STATE])) {
bindSavestate ^= 1;
FCEUI_DispMessage("Savestate binding to movie %sabled.",
bindSavestate ? "en" : "dis");
}
if(_keyonly(frameAdvanceLagSkipKey)) {
if(_keyonly(Hotkeys[HK_FA_LAG_SKIP])) {
frameAdvanceLagSkip ^= 1;
FCEUI_DispMessage("Skipping lag in Frame Advance %sabled.",
frameAdvanceLagSkip ? "en" : "dis");
}
if(_keyonly(lagCounterDisplayKey)) {
if(_keyonly(Hotkeys[HK_LAG_COUNTER_DISPLAY])) {
lagCounterDisplay ^= 1;
}
if (_keyonly(SubtitleDisplayKey)) {
if (_keyonly(Hotkeys[HK_TOGGLE_SUBTITLE])) {
extern int movieSubtitles;
movieSubtitles ^= 1;
FCEUI_DispMessage("Movie subtitles o%s.",
@ -736,12 +658,13 @@ KeyboardCommands()
#if SDL_VERSION_ATLEAST(1,3,0)
// TODO: clean this shit up and make it work for 1.3
#else
if(KEY(KP_MINUS) || KEY(MINUS)) FCEUI_NTSCDEC();
if(KEY(KP_PLUS) || KEY(EQUAL)) FCEUI_NTSCINC();
#endif
if (_keyonly(Hotkeys[HK_DECREASE_SPEED]))
FCEUI_NTSCDEC();
if (_keyonly(Hotkeys[HK_INCREASE_SPEED]))
FCEUI_NTSCINC();
if((InputType[2] == SIFC_BWORLD) || (cspec == SIS_DATACH)) {
if(keyonly(F8)) {