Extend Button/Key remap to support chording (#1063)
* Extend Button/Key remap to support chording * Add saved autofire setting to 'advanced/chord' dialog
This commit is contained in:
532
menu.cpp
532
menu.cpp
@@ -64,6 +64,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#include "bootcore.h"
|
||||
#include "ide.h"
|
||||
#include "profiling.h"
|
||||
#include "str_util.h"
|
||||
#include "autofire.h"
|
||||
|
||||
/*menu states*/
|
||||
enum MENU
|
||||
@@ -110,7 +112,6 @@ enum MENU
|
||||
MENU_JOYRESET1,
|
||||
MENU_JOYKBDMAP,
|
||||
MENU_JOYKBDMAP1,
|
||||
MENU_JOYKBDMAP2,
|
||||
MENU_KBDMAP,
|
||||
MENU_KBDMAP1,
|
||||
MENU_KBDMAP2,
|
||||
@@ -204,6 +205,15 @@ enum MENU
|
||||
MENU_MT32PI_MAIN1,
|
||||
MENU_MT32PI_MAIN2,
|
||||
|
||||
//Advanced Button Map
|
||||
MENU_ADVANCED_MAP_LIST1,
|
||||
MENU_ADVANCED_MAP_LIST2,
|
||||
MENU_ADVANCED_MAP_EDIT1,
|
||||
MENU_ADVANCED_MAP_EDIT2,
|
||||
MENU_ADVANCED_MAP_EDIT3,
|
||||
MENU_ADVANCED_MAP_EDIT4,
|
||||
MENU_ADVANCED_MAP_CAPTURE1,
|
||||
MENU_ADVANCED_MAP_KEYCAPTURE1,
|
||||
// Atari 8bit cartridge type selection
|
||||
MENU_ATARI8BIT_CART1,
|
||||
MENU_ATARI8BIT_CART2,
|
||||
@@ -300,6 +310,10 @@ static uint32_t fs_Options;
|
||||
static uint32_t fs_MenuSelect;
|
||||
static uint32_t fs_MenuCancel;
|
||||
|
||||
static advancedButtonMap abm_edit_map = {};
|
||||
static advancedButtonMap *abm_edit_ptr = NULL;
|
||||
static int abm_dev_num = 0;
|
||||
|
||||
static char* GetExt(char *ext)
|
||||
{
|
||||
static char extlist[32];
|
||||
@@ -476,6 +490,38 @@ void SelectINI()
|
||||
select_ini = 1;
|
||||
}
|
||||
|
||||
void build_advanced_map_code_str(uint16_t *abm_codes, size_t abm_size, char *code_str, size_t code_size, int center_size = 0)
|
||||
{
|
||||
char str[128] = {};
|
||||
if(abm_codes[0])
|
||||
{
|
||||
strncat(str, "[", code_size);
|
||||
for (unsigned int i = 0; i < abm_size/sizeof(uint16_t); i++)
|
||||
{
|
||||
char cs[64] = {};
|
||||
if (!abm_codes[i]) break;
|
||||
if (abm_codes[i] < 256) //keyboard
|
||||
{
|
||||
sprintfz(cs, "k%X", abm_codes[i]);
|
||||
} else {
|
||||
get_button_name_for_code((abm_codes[i] & 0x7FFF), abm_dev_num, cs, sizeof(cs));
|
||||
}
|
||||
strncat(cs, ",", sizeof(cs)-1);
|
||||
strncat(str, cs, code_size);
|
||||
}
|
||||
int code_len = strlen(str);
|
||||
if (str[code_len-1] == ',') str[code_len-1] = 0;
|
||||
strcat(str, "]");
|
||||
}
|
||||
if (center_size)
|
||||
{
|
||||
snprintf(code_str, code_size, "%*s%*s", (int)(center_size+strlen(str)/2), str, (int)(center_size+strlen(str)/2), " ");
|
||||
} else {
|
||||
snprintf(code_str, code_size, "%s", str);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* the Atari core handles OSD keys competely inside the core */
|
||||
static uint32_t menu_key = 0;
|
||||
|
||||
@@ -933,6 +979,87 @@ static int gun_idx = 0;
|
||||
static int32_t gun_pos[4] = {};
|
||||
static int page = 0;
|
||||
|
||||
static void menu_button_name(int button, char *buf, size_t bsize)
|
||||
{
|
||||
switch(button)
|
||||
{
|
||||
case 0:
|
||||
strncpy(buf, "Right", bsize);
|
||||
break;
|
||||
case 1:
|
||||
strncpy(buf, "Left", bsize);
|
||||
break;
|
||||
case 2:
|
||||
strncpy(buf, "Down", bsize);
|
||||
break;
|
||||
case 3:
|
||||
strncpy(buf, "Up", bsize);
|
||||
break;
|
||||
case -1:
|
||||
strncpy(buf, "(None)", bsize);
|
||||
break;
|
||||
default:
|
||||
if ((button-4 < joy_bcount) && joy_bnames[button-4][0])
|
||||
{
|
||||
strncpy(buf, joy_bnames[button-4], bsize);
|
||||
} else {
|
||||
snprintf(buf, bsize, "%d", button-4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void menu_parse_buttons()
|
||||
{
|
||||
if (is_minimig())
|
||||
{
|
||||
joy_bcount = 7;
|
||||
strcpy(joy_bnames[0], "A(Red/Fire)");
|
||||
strcpy(joy_bnames[1], "B(Blue)");
|
||||
strcpy(joy_bnames[2], "C(Yellow)");
|
||||
strcpy(joy_bnames[3], "D(Green)");
|
||||
strcpy(joy_bnames[4], "RT");
|
||||
strcpy(joy_bnames[5], "LT");
|
||||
strcpy(joy_bnames[6], "Pause");
|
||||
}
|
||||
else
|
||||
{
|
||||
parse_buttons();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void build_advanced_map_core_btn_str(advancedButtonMap *abm, char *dest_str, size_t dest_size)
|
||||
{
|
||||
int first_btn = -1;
|
||||
int btn_count = 0;
|
||||
for(unsigned int i = 0; i < sizeof(abm->button_mask)*8; i++)
|
||||
{
|
||||
if (abm->button_mask & 1<<i)
|
||||
{
|
||||
btn_count++;
|
||||
if (first_btn == -1) first_btn = i;
|
||||
}
|
||||
}
|
||||
if (btn_count > 1) snprintf(dest_str, dest_size, "(%d)", btn_count);
|
||||
else menu_button_name(first_btn, dest_str, dest_size);
|
||||
}
|
||||
|
||||
|
||||
void build_advanced_map_summary(advancedButtonMap *abm, char *dest_str, size_t dest_size)
|
||||
{
|
||||
char input_str[128] = {};
|
||||
char output_str[128] = {};
|
||||
build_advanced_map_code_str(abm->input_codes, sizeof(abm->input_codes), input_str, sizeof(input_str));
|
||||
if (abm->output_codes[0])
|
||||
{
|
||||
build_advanced_map_code_str(abm->output_codes, sizeof(abm->output_codes), output_str, sizeof(output_str));
|
||||
} else {
|
||||
build_advanced_map_core_btn_str(abm, output_str, sizeof(output_str));
|
||||
}
|
||||
snprintf(dest_str, dest_size, "%s->%s", input_str, output_str);
|
||||
}
|
||||
|
||||
void HandleUI(void)
|
||||
{
|
||||
PROFILE_FUNCTION();
|
||||
@@ -997,6 +1124,7 @@ void HandleUI(void)
|
||||
static int old_volume = 0;
|
||||
static uint32_t lock_pass_timeout = 0;
|
||||
static uint32_t menu_timeout = 0;
|
||||
static bool ignore_osd_release = false;
|
||||
|
||||
static char cp_MenuCancel;
|
||||
|
||||
@@ -1138,8 +1266,16 @@ void HandleUI(void)
|
||||
switch (c)
|
||||
{
|
||||
case KEY_F12:
|
||||
menu = true;
|
||||
menu_key_set(KEY_F12 | UPSTROKE);
|
||||
if (user_io_osd_is_visible())
|
||||
{
|
||||
menu = true;
|
||||
ignore_osd_release = true;
|
||||
}
|
||||
break;
|
||||
case KEY_F12 | UPSTROKE:
|
||||
if (!user_io_osd_is_visible() && !ignore_osd_release)
|
||||
menu = true;
|
||||
ignore_osd_release = false;
|
||||
if(video_fb_state()) video_menu_bg(user_io_status_get("[3:1]"));
|
||||
video_fb_enable(0);
|
||||
break;
|
||||
@@ -2445,8 +2581,10 @@ void HandleUI(void)
|
||||
if (is_n64())
|
||||
{
|
||||
uint32_t n64_crc;
|
||||
if (!n64_rom_tx(selPath, idx, load_addr, n64_crc)) Info("failed to load ROM");
|
||||
else if (user_io_use_cheats() && !store_name) cheats_init(selPath, n64_crc);
|
||||
if (!n64_rom_tx(selPath, idx, load_addr, n64_crc))
|
||||
Info("failed to load ROM");
|
||||
else if (user_io_use_cheats() && !store_name)
|
||||
cheats_init(selPath, n64_crc);
|
||||
}
|
||||
else if (is_c64() || is_c128())
|
||||
{
|
||||
@@ -2752,7 +2890,6 @@ void HandleUI(void)
|
||||
break;
|
||||
|
||||
case 3:
|
||||
start_map_setting(-1);
|
||||
menustate = MENU_JOYKBDMAP;
|
||||
menusub = 0;
|
||||
break;
|
||||
@@ -4148,76 +4285,83 @@ void HandleUI(void)
|
||||
break;
|
||||
|
||||
case MENU_JOYKBDMAP:
|
||||
{
|
||||
helptext_idx = 0;
|
||||
menumask = 1;
|
||||
menustate = MENU_JOYKBDMAP1;
|
||||
parentstate = MENU_JOYKBDMAP;
|
||||
|
||||
memset(&abm_edit_map, 0, sizeof(abm_edit_map));
|
||||
start_map_setting(3, 0, &abm_edit_map);
|
||||
|
||||
OsdSetTitle("Button/Key remap", 0);
|
||||
for (int i = 0; i < 5; i++) OsdWrite(i, "", 0, 0);
|
||||
OsdWrite(5, info_top, 0, 0);
|
||||
infowrite(6, "Supported mapping:");
|
||||
infowrite( 7, "");
|
||||
infowrite( 8, "Button -> Key");
|
||||
infowrite( 9, "Button -> Button same pad");
|
||||
infowrite(10, "Key -> Key");
|
||||
infowrite(11, "");
|
||||
infowrite(12, " Menu \x16 Finish ");
|
||||
infowrite(13, "Menu-hold \x16 Clear ");
|
||||
infowrite( 8, " Button(s)/Key(s) -> Key(s)");
|
||||
infowrite( 9, "Button(s) -> Button(s)");
|
||||
infowrite(10, "");
|
||||
if (abm_edit_map.input_codes[0] && abm_edit_map.input_codes[0] <= 256)
|
||||
{
|
||||
infowrite(11, " F12 \x16 Advanced ");
|
||||
infowrite(12, " Esc \x16 Clear ");
|
||||
infowrite(13, "Enter \x16 Finish ");
|
||||
} else {
|
||||
infowrite(11, " OK-hold \x16 Advanced ");
|
||||
infowrite(12, " Menu \x16 Finish ");
|
||||
infowrite(13, "Menu-hold \x16 Clear ");
|
||||
}
|
||||
OsdWrite(14, info_bottom, 0, 0);
|
||||
OsdWrite(OsdGetSize() - 1, " Cancel", menusub == 0, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
case MENU_JOYKBDMAP1:
|
||||
if (!get_map_button())
|
||||
{
|
||||
OsdWrite(1, " Press button/key to change", 0, 0);
|
||||
if (get_map_vid())
|
||||
case MENU_JOYKBDMAP1:
|
||||
{
|
||||
OsdWrite(2, "", 0, 0);
|
||||
sprintf(s, " on device %04x:%04x", get_map_vid(), get_map_pid());
|
||||
OsdWrite(3, s, 0, 0);
|
||||
}
|
||||
OsdWrite(OsdGetSize() - 1, " Enter \x16 Finish, Esc \x16 Clear", menusub == 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (get_map_button() <= 256)
|
||||
{
|
||||
OsdWrite(1, " Press key to map to", 0, 0);
|
||||
OsdWrite(2, "", 0, 0);
|
||||
OsdWrite(3, " on a keyboard", 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
OsdWrite(1, " Press button to map to", 0, 0);
|
||||
OsdWrite(2, " on the same pad", 0, 0);
|
||||
OsdWrite(3, " or key on a keyboard", 0, 0);
|
||||
}
|
||||
OsdWrite(OsdGetSize() - 1);
|
||||
}
|
||||
|
||||
if (select || menu || get_map_finish() || get_map_cancel())
|
||||
{
|
||||
int clear = get_map_vid() && (menu || get_map_cancel());
|
||||
finish_map_setting(clear);
|
||||
menu_timeout = GetTimer(1000);
|
||||
OsdWrite(1);
|
||||
OsdWrite(2, clear ? " Clearing" : " Finishing");
|
||||
OsdWrite(3);
|
||||
OsdWrite(OsdGetSize() - 1);
|
||||
menustate = MENU_JOYKBDMAP2;
|
||||
}
|
||||
break;
|
||||
|
||||
case MENU_JOYKBDMAP2:
|
||||
if (CheckTimer(menu_timeout))
|
||||
{
|
||||
menustate = MENU_COMMON1;
|
||||
menusub = 3;
|
||||
}
|
||||
break;
|
||||
int map_clear = get_map_cancel();
|
||||
abm_dev_num = get_map_dev();
|
||||
|
||||
if (get_map_finish() || map_clear)
|
||||
{
|
||||
OsdWrite(1);
|
||||
OsdWrite(2, (map_clear) ? " Clearing" : " Finishing");
|
||||
OsdWrite(3);
|
||||
OsdWrite(OsdGetSize() - 1);
|
||||
OsdUpdate();
|
||||
finish_map_setting(map_clear);
|
||||
menustate = MENU_COMMON1;
|
||||
menusub = 3;
|
||||
sleep(1);
|
||||
} else if (get_map_advance()) {
|
||||
menustate = MENU_ADVANCED_MAP_LIST1;
|
||||
menusub = 0;
|
||||
finish_map_setting(0);
|
||||
} else if (get_map_set() == 2) {
|
||||
bool is_kbd = abm_edit_map.input_codes[0] && abm_edit_map.input_codes[0] <= 256;
|
||||
if (is_kbd)
|
||||
{
|
||||
OsdWrite(1, " Press key(s) to map to", 0, 0);
|
||||
OsdWrite(2, " on a keyboard", 0, 0);
|
||||
} else {
|
||||
OsdWrite(1, " Press button(s) to map to", 0, 0);
|
||||
OsdWrite(2, " on the same pad", 0, 0);
|
||||
OsdWrite(3, " or key(s) on a keyboard", 0, 0);
|
||||
}
|
||||
char str[128] = {};
|
||||
build_advanced_map_code_str(abm_edit_map.output_codes, sizeof(abm_edit_map.output_codes), str, sizeof(str), 14);
|
||||
OsdWrite(is_kbd ? 3 : 4, str, 0, 0);
|
||||
} else {
|
||||
char str[128] = {};
|
||||
build_advanced_map_code_str(abm_edit_map.input_codes, sizeof(abm_edit_map.input_codes), str, sizeof(str), 14);
|
||||
OsdWrite(1, " Press button(s) ", 0, 0);
|
||||
OsdWrite(2, " or key(s) to change", 0, 0);
|
||||
OsdWrite(3, str, 0, 0);
|
||||
OsdWrite(4, "", 0, 0);
|
||||
OsdWrite(OsdGetSize() - 1, " Esc \x16 Clear, Enter \x16 Finish", menusub == 0, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MENU_ABOUT1:
|
||||
OsdSetSize(16);
|
||||
menumask = 0;
|
||||
@@ -7034,6 +7178,274 @@ void HandleUI(void)
|
||||
SelectFile("", 0, SCANO_CORES, MENU_CORE_FILE_SELECTED1, cp_MenuCancel);
|
||||
break;
|
||||
|
||||
case MENU_ADVANCED_MAP_LIST1:
|
||||
{
|
||||
OsdSetTitle("Advanced");
|
||||
menu_parse_buttons();
|
||||
menustate = MENU_ADVANCED_MAP_LIST2;
|
||||
parentstate = MENU_ADVANCED_MAP_LIST1;
|
||||
while(1)
|
||||
{
|
||||
if (!menusub) firstmenu = 0;
|
||||
adjvisible = 0;
|
||||
|
||||
advancedButtonMap *abms = get_advanced_map_defs(abm_dev_num);
|
||||
menumask = 0x1;
|
||||
uint32_t menucnt = 1;
|
||||
MenuWrite(0, " New \x16", menusub == menucnt++, 0);
|
||||
|
||||
int n = 1;
|
||||
size_t map_cnt = 0;
|
||||
for(size_t i = 0; i < ADVANCED_MAP_MAX; i++)
|
||||
{
|
||||
advancedButtonMap *abm = abms+i;
|
||||
if (!abm->input_codes[0]) break;
|
||||
map_cnt++;
|
||||
build_advanced_map_summary(abm, s, sizeof(s));
|
||||
s[27] = '\x16';
|
||||
s[28] = 0;
|
||||
menumask |= 1<<(i+1);
|
||||
MenuWrite(n++, s, menusub == i+1, 0);
|
||||
}
|
||||
MenuWrite(0, " New \x16", menusub == 0, map_cnt >= ADVANCED_MAP_MAX);
|
||||
if (map_cnt >= ADVANCED_MAP_MAX)
|
||||
menumask &= ~0x1;
|
||||
for (; n < OsdGetSize(); n++) MenuWrite(n, "", 0, 0);
|
||||
if (!adjvisible) break;
|
||||
firstmenu += adjvisible;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case MENU_ADVANCED_MAP_LIST2:
|
||||
{
|
||||
if (select)
|
||||
{
|
||||
advancedButtonMap *abms = get_advanced_map_defs(abm_dev_num);
|
||||
memset(&abm_edit_map, 0, sizeof(abm_edit_map));
|
||||
menustate = MENU_ADVANCED_MAP_EDIT1;
|
||||
parentstate = MENU_ADVANCED_MAP_LIST1;
|
||||
if (menusub == 0) {
|
||||
abm_edit_ptr = &abm_edit_map;
|
||||
} else {
|
||||
abm_edit_ptr = &abms[menusub-1];
|
||||
}
|
||||
menusub = 0;
|
||||
}
|
||||
|
||||
if (left || back || menu)
|
||||
{
|
||||
menustate = MENU_COMMON1;
|
||||
input_advanced_save(abm_dev_num);
|
||||
parentstate = 0;
|
||||
menusub = 3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case MENU_ADVANCED_MAP_EDIT1:
|
||||
{
|
||||
menustate = MENU_ADVANCED_MAP_EDIT2;
|
||||
parentstate = MENU_ADVANCED_MAP_EDIT1;
|
||||
menumask = 0;
|
||||
firstmenu = 0;
|
||||
adjvisible = 0;
|
||||
bool dev_kbd = false;
|
||||
if (abm_edit_ptr->input_codes[0] && abm_edit_ptr->input_codes[0] <= 256)
|
||||
dev_kbd = true;
|
||||
menu_parse_buttons();
|
||||
|
||||
char bname[32] = {};
|
||||
build_advanced_map_core_btn_str(abm_edit_ptr, bname, sizeof(bname));
|
||||
bool keyboard_only = dev_kbd && (user_io_get_kbdemu() == EMU_NONE);
|
||||
|
||||
uint32_t n = 0;
|
||||
char code_str[256] = {};
|
||||
|
||||
build_advanced_map_code_str(abm_edit_ptr->input_codes, sizeof(abm_edit_ptr->input_codes), code_str, sizeof(code_str));
|
||||
snprintf(s, sizeof(s), " Input Hotkey(s) %-20s\x16",code_str);
|
||||
MenuWrite(n, s, menusub == n, 0);
|
||||
menumask |= 1 << n++;
|
||||
|
||||
code_str[0] = 0;
|
||||
snprintf(s, sizeof(s), " Core Button(s): %-17s\x10 \x11", bname);
|
||||
MenuWrite(n, s, keyboard_only ? 0 : menusub == n, keyboard_only );
|
||||
if(!keyboard_only) menumask |= 1 << n;
|
||||
n++;
|
||||
|
||||
build_advanced_map_code_str(abm_edit_ptr->output_codes, sizeof(abm_edit_ptr->output_codes), code_str, sizeof(code_str));
|
||||
snprintf(s, sizeof(s), " Output(s): %-20s\x16", code_str);
|
||||
MenuWrite(n, s, menusub == n, 0);
|
||||
menumask |= 1 << n++;
|
||||
|
||||
const char *af_label = get_autofire_rate_hz(abm_edit_ptr->autofire_idx);
|
||||
snprintf(s, sizeof(s), " Autofire : %-20s\x16", af_label);
|
||||
MenuWrite(n, s, menusub == n, 0);
|
||||
menumask |= 1 << n++;
|
||||
|
||||
|
||||
MenuWrite(n, " Delete", menusub == n, 0);
|
||||
menumask |= 1 << n++;
|
||||
MenuWrite(n, " Done", menusub == n, 0);
|
||||
menumask |= 1 << n++;
|
||||
for (int i = n; i < OsdGetSize(); i++) MenuWrite(i, "", 0, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
case MENU_ADVANCED_MAP_EDIT2:
|
||||
{
|
||||
if (select || left || right || plus || minus)
|
||||
{
|
||||
menustate = MENU_ADVANCED_MAP_EDIT1;
|
||||
char bname[32] = {0};
|
||||
switch(menusub)
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
int mapped_button_cnt = 0;
|
||||
int first_map_idx = -1;
|
||||
for (uint bn = 0; bn < sizeof(abm_edit_ptr->button_mask)*8; bn++)
|
||||
{
|
||||
if (abm_edit_ptr->button_mask & 1<<bn)
|
||||
{
|
||||
mapped_button_cnt++;
|
||||
if (first_map_idx == -1) first_map_idx = bn;
|
||||
}
|
||||
}
|
||||
if (select)
|
||||
{
|
||||
menustate = MENU_ADVANCED_MAP_EDIT3;
|
||||
menusub = 0;
|
||||
} else if (mapped_button_cnt <= 1 && (left || right)) {
|
||||
menu_button_name(first_map_idx, bname, sizeof(bname));
|
||||
do {
|
||||
if (right) first_map_idx++;
|
||||
if (left) first_map_idx--;
|
||||
if (first_map_idx < 0) first_map_idx = joy_bcount +3;
|
||||
if (first_map_idx-4 >= joy_bcount) first_map_idx = 0;
|
||||
menu_button_name(first_map_idx, bname, sizeof(bname));
|
||||
} while (!strncmp("-", bname, sizeof(bname) ));
|
||||
abm_edit_ptr->button_mask = 1<<first_map_idx;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0:
|
||||
case 2:
|
||||
if (select) {
|
||||
menustate = MENU_ADVANCED_MAP_CAPTURE1;
|
||||
start_map_setting(1, menusub ? 2 : 1, abm_edit_ptr);
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
if (select || plus)
|
||||
{
|
||||
abm_edit_ptr->autofire_idx++;
|
||||
} else if (minus) {
|
||||
abm_edit_ptr->autofire_idx--;
|
||||
}
|
||||
if (abm_edit_ptr->autofire_idx >= get_autofire_rate_count())
|
||||
abm_edit_ptr->autofire_idx = 0;
|
||||
if (abm_edit_ptr->autofire_idx < 0)
|
||||
abm_edit_ptr->autofire_idx = get_autofire_rate_count()-1;
|
||||
break;
|
||||
case 4:
|
||||
if (select)
|
||||
{
|
||||
menustate = MENU_ADVANCED_MAP_LIST1;
|
||||
menusub = 0;
|
||||
input_advanced_delete(abm_edit_ptr, abm_dev_num);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (back || menu || (menusub == 5 && select))
|
||||
{
|
||||
input_advanced_save_entry(abm_edit_ptr, abm_dev_num);
|
||||
menustate = MENU_ADVANCED_MAP_LIST1;
|
||||
menusub = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MENU_ADVANCED_MAP_EDIT3:
|
||||
{
|
||||
menustate = MENU_ADVANCED_MAP_EDIT4;
|
||||
parentstate = MENU_ADVANCED_MAP_EDIT3;
|
||||
while (1) {
|
||||
menumask = 0;
|
||||
uint32_t n = 0;
|
||||
if (!menusub) firstmenu = 0;
|
||||
adjvisible = 0;
|
||||
for (int i = 0; i < joy_bcount+4; i++)
|
||||
{
|
||||
char bname[32];
|
||||
menu_button_name(i, bname, sizeof(bname));
|
||||
if (!strcmp("-", bname)) continue;
|
||||
bool b_used = abm_edit_ptr->button_mask & 1<<i;
|
||||
sprintfz(s, "%s %s", b_used ? "*":" ", bname);
|
||||
MenuWrite(n, s, menusub == n, 0);
|
||||
menumask |= 1<<n;
|
||||
n++;
|
||||
}
|
||||
if (!adjvisible) break;
|
||||
firstmenu += adjvisible;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MENU_ADVANCED_MAP_EDIT4:
|
||||
{
|
||||
if (back || menu)
|
||||
{
|
||||
menustate = MENU_ADVANCED_MAP_EDIT1;
|
||||
menusub = 1;
|
||||
} else if (select) {
|
||||
menustate = MENU_ADVANCED_MAP_EDIT3;
|
||||
uint32_t btn_cnt = 0;
|
||||
for(int i = 0; i < joy_bcount+4; i++)
|
||||
{
|
||||
char bname[32];
|
||||
menu_button_name(i, bname, sizeof(bname));
|
||||
if (!strcmp("-", bname)) continue;
|
||||
if (menusub == btn_cnt)
|
||||
{
|
||||
abm_edit_ptr->button_mask ^= 1<<i;
|
||||
break;
|
||||
}
|
||||
btn_cnt++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case MENU_ADVANCED_MAP_CAPTURE1:
|
||||
{
|
||||
OsdSetTitle("Set Hotkey", 0);
|
||||
for (int i = 0; i < 4; i++) OsdWrite(i, "", 0, 0);
|
||||
OsdWrite(4, info_top, 0, 0);
|
||||
if (get_map_set() == 1 || abm_edit_ptr->input_codes[0] > 256)
|
||||
{
|
||||
infowrite(5, "Press button(s) on joypad");
|
||||
infowrite(6, "or key(s) on keyboard");
|
||||
} else {
|
||||
infowrite(5, "");
|
||||
infowrite(6, "Press Keyboard key(s)");
|
||||
}
|
||||
infowrite(7, "");
|
||||
infowrite(8, "Esc \x16 Clear");
|
||||
infowrite(9, "Menu-hold \x16 Clear");
|
||||
OsdWrite(10, info_bottom, 0, 0);
|
||||
char code_str[256] = {};
|
||||
build_advanced_map_code_str((get_map_set() == 2) ? abm_edit_ptr->output_codes : abm_edit_ptr->input_codes, sizeof(abm_edit_ptr->input_codes), code_str, sizeof(code_str), 14);
|
||||
OsdWrite(11, get_map_cancel() ? " Clearing" : code_str, 0, 0);
|
||||
|
||||
if (get_map_finish() || get_map_cancel())
|
||||
{
|
||||
menustate = MENU_ADVANCED_MAP_EDIT1;
|
||||
finish_map_setting(get_map_cancel());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MENU_ATARI8BIT_CART1:
|
||||
helptext_idx = 0;
|
||||
menumask = 0;
|
||||
|
||||
Reference in New Issue
Block a user