GTK+: Relative save slots.

This commit is contained in:
Brandon Wright 2018-11-06 16:30:50 -06:00
parent 9f795150fc
commit cadffa0073
6 changed files with 332 additions and 8 deletions

View File

@ -158,6 +158,7 @@ int Snes9xConfig::load_defaults ()
netplay_last_port = 6096; netplay_last_port = 6096;
modal_dialogs = 1; modal_dialogs = 1;
use_headerbar = 0; use_headerbar = 0;
current_save_slot = 0;
S9xCheatsEnable (); S9xCheatsEnable ();
rewind_granularity = 5; rewind_granularity = 5;
@ -361,6 +362,7 @@ int Snes9xConfig::save_config_file ()
outbool (cf, z"UseModalDialogs", modal_dialogs); outbool (cf, z"UseModalDialogs", modal_dialogs);
cf.SetInt (z"RewindBufferSize", rewind_buffer_size, "Amount of memory (in MB) to use for rewinding"); cf.SetInt (z"RewindBufferSize", rewind_buffer_size, "Amount of memory (in MB) to use for rewinding");
cf.SetInt (z"RewindGranularity", rewind_granularity, "Only save rewind snapshots every N frames"); cf.SetInt (z"RewindGranularity", rewind_granularity, "Only save rewind snapshots every N frames");
cf.SetInt (z"CurrentSaveSlot", current_save_slot);
#undef z #undef z
#define z "Emulation::" #define z "Emulation::"
@ -562,6 +564,7 @@ int Snes9xConfig::load_config_file ()
inbool (z"UseModalDialogs", modal_dialogs); inbool (z"UseModalDialogs", modal_dialogs);
inint (z"RewindBufferSize", rewind_buffer_size); inint (z"RewindBufferSize", rewind_buffer_size);
inint (z"RewindGranularity", rewind_granularity); inint (z"RewindGranularity", rewind_granularity);
inint (z"CurrentSaveSlot", current_save_slot);
#undef z #undef z
#define z "Emulation::" #define z "Emulation::"

View File

@ -135,6 +135,8 @@ class Snes9xConfig
unsigned int rewind_granularity; unsigned int rewind_granularity;
unsigned int rewind_buffer_size; unsigned int rewind_buffer_size;
int current_save_slot;
XRRScreenResources *xrr_screen_resources; XRRScreenResources *xrr_screen_resources;
XRRCrtcInfo *xrr_crtc_info; XRRCrtcInfo *xrr_crtc_info;

View File

@ -57,6 +57,12 @@ const BindingLink b_links[] =
{ "b_bg_layering_hack", "BGLayeringHack" }, { "b_bg_layering_hack", "BGLayeringHack" },
{ "b_screenshot", "Screenshot" }, { "b_screenshot", "Screenshot" },
{ "b_fullscreen", "GTK_fullscreen" }, { "b_fullscreen", "GTK_fullscreen" },
{ "b_state_save_current", "GTK_state_save_current" },
{ "b_state_load_current", "GTK_state_load_current" },
{ "b_state_increment_save","GTK_state_increment_save" },
{ "b_state_decrement_load","GTK_state_decrement_load" },
{ "b_state_increment", "GTK_state_increment" },
{ "b_state_decrement", "GTK_state_decrement" },
{ "b_save_0", "QuickSave000" }, { "b_save_0", "QuickSave000" },
{ "b_save_1", "QuickSave001" }, { "b_save_1", "QuickSave001" },
{ "b_save_2", "QuickSave002" }, { "b_save_2", "QuickSave002" },
@ -104,9 +110,9 @@ const int b_breaks[] =
24, /* End of turbo/sticky buttons */ 24, /* End of turbo/sticky buttons */
35, /* End of base emulator buttons */ 35, /* End of base emulator buttons */
43, /* End of Graphic options */ 43, /* End of Graphic options */
63, /* End of save/load states */ 69, /* End of save/load states */
72, /* End of sound buttons */ 78, /* End of sound buttons */
79, /* End of miscellaneous buttons */ 85, /* End of miscellaneous buttons */
-1 -1
}; };
@ -171,6 +177,19 @@ static void swap_controllers_1_2 ()
gui_config->rebind_keys (); gui_config->rebind_keys ();
} }
static void change_slot (int difference)
{
static char buf[256];
gui_config->current_save_slot += difference;
gui_config->current_save_slot %= 1000;
if (gui_config->current_save_slot < 0)
gui_config->current_save_slot += 1000;
snprintf (buf, 256, "Slot %d", gui_config->current_save_slot);
S9xSetInfoString (buf);
GFX.InfoStringTimeout = 60;
}
void S9xHandlePortCommand (s9xcommand_t cmd, int16 data1, int16 data2) void S9xHandlePortCommand (s9xcommand_t cmd, int16 data1, int16 data2)
{ {
static bool quit_binding_down = FALSE; static bool quit_binding_down = FALSE;
@ -238,6 +257,38 @@ void S9xHandlePortCommand (s9xcommand_t cmd, int16 data1, int16 data2)
{ {
S9xQuickLoadSlot (cmd.port[0] - PORT_QUICKLOAD0); S9xQuickLoadSlot (cmd.port[0] - PORT_QUICKLOAD0);
} }
else if (cmd.port[0] == PORT_SAVESLOT)
{
S9xQuickSaveSlot (gui_config->current_save_slot);
}
else if (cmd.port[0] == PORT_LOADSLOT)
{
S9xQuickLoadSlot (gui_config->current_save_slot);
}
else if (cmd.port[0] == PORT_INCREMENTSAVESLOT)
{
change_slot (1);
S9xQuickSaveSlot (gui_config->current_save_slot);
}
else if (cmd.port[0] == PORT_DECREMENTLOADSLOT)
{
change_slot (-1);
S9xQuickLoadSlot (gui_config->current_save_slot);
}
else if (cmd.port[0] == PORT_INCREMENTSLOT)
{
change_slot (1);
}
else if (cmd.port[0] == PORT_DECREMENTSLOT)
{
change_slot (-1);
}
} }
} }
@ -356,6 +407,37 @@ s9xcommand_t S9xGetPortCommandT (const char *name)
cmd.port[0] = PORT_QUICKLOAD9; cmd.port[0] = PORT_QUICKLOAD9;
} }
else if (strstr (name, "GTK_state_save_current"))
{
cmd.port[0] = PORT_SAVESLOT;
}
else if (strstr (name, "GTK_state_load_current"))
{
cmd.port[0] = PORT_LOADSLOT;
}
else if (strstr (name, "GTK_state_increment_save"))
{
cmd.port[0] = PORT_INCREMENTSAVESLOT;
}
else if (strstr (name, "GTK_state_decrement_load"))
{
cmd.port[0] = PORT_DECREMENTLOADSLOT;
}
else if (strstr (name, "GTK_state_increment"))
{
cmd.port[0] = PORT_INCREMENTSLOT;
}
else if (strstr (name, "GTK_state_decrement"))
{
cmd.port[0] = PORT_DECREMENTSLOT;
}
else else
{ {
cmd = S9xGetCommandT (name); cmd = S9xGetCommandT (name);

View File

@ -42,7 +42,13 @@ enum
PORT_QUICKLOAD6 = 15, PORT_QUICKLOAD6 = 15,
PORT_QUICKLOAD7 = 16, PORT_QUICKLOAD7 = 16,
PORT_QUICKLOAD8 = 17, PORT_QUICKLOAD8 = 17,
PORT_QUICKLOAD9 = 18 PORT_QUICKLOAD9 = 18,
PORT_SAVESLOT = 19,
PORT_LOADSLOT = 20,
PORT_INCREMENTSAVESLOT = 21,
PORT_DECREMENTLOADSLOT = 22,
PORT_INCREMENTSLOT = 23,
PORT_DECREMENTSLOT = 24,
}; };
typedef struct BindingLink typedef struct BindingLink
@ -55,7 +61,7 @@ typedef struct BindingLink
extern const BindingLink b_links[]; extern const BindingLink b_links[];
extern const int b_breaks[]; extern const int b_breaks[];
const int NUM_JOYPAD_LINKS = 24; const int NUM_JOYPAD_LINKS = 24;
const int NUM_EMU_LINKS = 55; const int NUM_EMU_LINKS = 61;
typedef struct JoypadBinding typedef struct JoypadBinding
{ {

View File

@ -489,6 +489,9 @@ S9xQuickSaveSlot (int slot)
char dir[_MAX_DIR]; char dir[_MAX_DIR];
char ext[_MAX_EXT]; char ext[_MAX_EXT];
if (!gui_config->rom_loaded)
return;
_splitpath (Memory.ROMFilename, drive, dir, def, ext); _splitpath (Memory.ROMFilename, drive, dir, def, ext);
snprintf (filename, PATH_MAX, "%s%s%s.%03d", snprintf (filename, PATH_MAX, "%s%s%s.%03d",
@ -503,8 +506,7 @@ S9xQuickSaveSlot (int slot)
} }
} }
void void S9xQuickLoadSlot (int slot)
S9xQuickLoadSlot (int slot)
{ {
char def[PATH_MAX]; char def[PATH_MAX];
char filename[PATH_MAX]; char filename[PATH_MAX];
@ -512,6 +514,9 @@ S9xQuickLoadSlot (int slot)
char dir[_MAX_DIR]; char dir[_MAX_DIR];
char ext[_MAX_EXT]; char ext[_MAX_EXT];
if (!gui_config->rom_loaded)
return;
_splitpath (Memory.ROMFilename, drive, dir, def, ext); _splitpath (Memory.ROMFilename, drive, dir, def, ext);
snprintf (filename, PATH_MAX, "%s%s%s.%03d", snprintf (filename, PATH_MAX, "%s%s%s.%03d",

View File

@ -7425,12 +7425,236 @@
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="resize_mode">queue</property> <property name="resize_mode">queue</property>
<property name="shadow_type">none</property> <property name="shadow_type">none</property>
<child>
<object class="GtkVBox">
<property name="visible">True</property>
<property name="spacing">5</property>
<child>
<object class="GtkTable">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">10</property>
<property name="n_rows">8</property>
<property name="n_columns">2</property>
<property name="column_spacing">10</property>
<property name="row_spacing">5</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Save current slot</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="b_state_save_current">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">0</property>
<property name="bottom_attach">1</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Load current slot</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="b_state_load_current">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Increment and save</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="b_state_increment_save">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Decrement and load</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="b_state_decrement_load">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Increment slot</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="b_state_increment">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Decrement slot</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="right_attach">1</property>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="b_state_decrement">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
</object>
</child>
<child> <child>
<object class="GtkTable" id="table10"> <object class="GtkTable" id="table10">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="border_width">10</property> <property name="border_width">10</property>
<property name="n_rows">11</property> <property name="n_rows">14</property>
<property name="n_columns">4</property> <property name="n_columns">4</property>
<property name="column_spacing">10</property> <property name="column_spacing">10</property>
<property name="row_spacing">5</property> <property name="row_spacing">5</property>
@ -8146,6 +8370,8 @@
</child> </child>
</object> </object>
</child> </child>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>