diff --git a/command.c b/command.c index ca3be010ff..1021f5c2bb 100644 --- a/command.c +++ b/command.c @@ -209,6 +209,7 @@ static const struct cmd_map map[] = { { "OVERLAY_NEXT", RARCH_OVERLAY_NEXT }, { "DISK_EJECT_TOGGLE", RARCH_DISK_EJECT_TOGGLE }, { "DISK_NEXT", RARCH_DISK_NEXT }, + { "DISK_PREV", RARCH_DISK_PREV }, { "GRAB_MOUSE_TOGGLE", RARCH_GRAB_MOUSE_TOGGLE }, { "MENU_TOGGLE", RARCH_MENU_TOGGLE }, }; diff --git a/config.def.h b/config.def.h index daafe1679e..8fd8dfb990 100644 --- a/config.def.h +++ b/config.def.h @@ -687,6 +687,7 @@ static const struct retro_keybind retro_keybinds_1[] = { { true, RARCH_OVERLAY_NEXT, RETRO_LBL_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_DISK_EJECT_TOGGLE, RETRO_LBL_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_DISK_NEXT, RETRO_LBL_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, + { true, RARCH_DISK_PREV, RETRO_LBL_DISK_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE }, { true, RARCH_GRAB_MOUSE_TOGGLE, RETRO_LBL_GRAB_MOUSE_TOGGLE, RETROK_F11, NO_BTN, 0, AXIS_NONE }, { true, RARCH_MENU_TOGGLE, RETRO_LBL_MENU_TOGGLE, RETROK_F1, NO_BTN, 0, AXIS_NONE }, }; diff --git a/driver.h b/driver.h index 8a030251e8..89cee7c3a5 100644 --- a/driver.h +++ b/driver.h @@ -126,6 +126,7 @@ enum RARCH_OVERLAY_NEXT, RARCH_DISK_EJECT_TOGGLE, RARCH_DISK_NEXT, + RARCH_DISK_PREV, RARCH_GRAB_MOUSE_TOGGLE, RARCH_MENU_TOGGLE, diff --git a/general.h b/general.h index 8e0b5f1dc3..5b6980ba75 100644 --- a/general.h +++ b/general.h @@ -159,6 +159,7 @@ enum basic_event RARCH_CMD_LOG_FILE_DEINIT, RARCH_CMD_DISK_EJECT_TOGGLE, RARCH_CMD_DISK_NEXT, + RARCH_CMD_DISK_PREV, RARCH_CMD_RUMBLE_STOP, }; diff --git a/input/input_common.c b/input/input_common.c index c8738693da..eb55ef557b 100644 --- a/input/input_common.c +++ b/input/input_common.c @@ -1259,6 +1259,7 @@ const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL] = { DECLARE_META_BIND(2, overlay_next, RARCH_OVERLAY_NEXT, "Overlay next"), DECLARE_META_BIND(2, disk_eject_toggle, RARCH_DISK_EJECT_TOGGLE, "Disk eject toggle"), DECLARE_META_BIND(2, disk_next, RARCH_DISK_NEXT, "Disk next"), + DECLARE_META_BIND(2, disk_prev, RARCH_DISK_NEXT, "Disk prev"), DECLARE_META_BIND(2, grab_mouse_toggle, RARCH_GRAB_MOUSE_TOGGLE, "Grab mouse toggle"), #ifdef HAVE_MENU DECLARE_META_BIND(1, menu_toggle, RARCH_MENU_TOGGLE, "Menu toggle"), diff --git a/intl/english.h b/intl/english.h index 6a45f4538c..271286e989 100644 --- a/intl/english.h +++ b/intl/english.h @@ -72,6 +72,7 @@ #define RETRO_LBL_OVERLAY_NEXT "Next Overlay" #define RETRO_LBL_DISK_EJECT_TOGGLE "Disk Eject Toggle" #define RETRO_LBL_DISK_NEXT "Disk Swap Next" +#define RETRO_LBL_DISK_PREV "Disk Swap Previous" #define RETRO_LBL_GRAB_MOUSE_TOGGLE "Grab mouse toggle" #define RETRO_LBL_MENU_TOGGLE "Menu toggle" diff --git a/retroarch.c b/retroarch.c index 88dc25f702..5d2f4883f0 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1719,10 +1719,24 @@ static void check_disk_next( unsigned current = control->get_image_index(); if (num_disks && num_disks != UINT_MAX) { - /* Use "no disk" state when index == num_disks. */ - unsigned next_index = current >= num_disks ? - 0 : ((current + 1) % (num_disks + 1)); - rarch_disk_control_set_index(next_index); + unsigned new_index = current; + current < num_disks - 1 ? new_index++ : new_index; + rarch_disk_control_set_index(new_index); + } + else + RARCH_ERR("Got invalid disk index from libretro.\n"); +} + +static void check_disk_prev( + const struct retro_disk_control_callback *control) +{ + unsigned num_disks = control->get_num_images(); + unsigned current = control->get_image_index(); + if (num_disks && num_disks != UINT_MAX) + { + unsigned new_index = current; + current > 0 ? new_index-- : new_index; + rarch_disk_control_set_index(new_index); } else RARCH_ERR("Got invalid disk index from libretro.\n"); @@ -2602,10 +2616,21 @@ bool rarch_main_command(unsigned cmd) (const struct retro_disk_control_callback*) &g_extern.system.disk_control; - if (!control) + if (control->get_eject_state()) check_disk_next(control); } break; + case RARCH_CMD_DISK_PREV: + if (g_extern.system.disk_control.get_num_images) + { + const struct retro_disk_control_callback *control = + (const struct retro_disk_control_callback*) + &g_extern.system.disk_control; + + if (control->get_eject_state()) + check_disk_prev(control); + } + break; case RARCH_CMD_RUMBLE_STOP: { int i; diff --git a/runloop.c b/runloop.c index 6b964bc58f..dd5a052883 100644 --- a/runloop.c +++ b/runloop.c @@ -489,6 +489,8 @@ static int do_state_checks( rarch_main_command(RARCH_CMD_DISK_EJECT_TOGGLE); else if (BIT64_GET(trigger_input, RARCH_DISK_NEXT)) rarch_main_command(RARCH_CMD_DISK_NEXT); + else if (BIT64_GET(trigger_input, RARCH_DISK_PREV)) + rarch_main_command(RARCH_CMD_DISK_PREV); if (BIT64_GET(trigger_input, RARCH_RESET)) rarch_main_command(RARCH_CMD_RESET);