From e98b8704212ddaa299aa1cfb4a286fb82a553464 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Wed, 23 Oct 2019 15:50:14 +0800 Subject: [PATCH] Allow skip/cancel gamepad button mapping using menu button. --- input.cpp | 49 +++++++++++++++++++++++++++++++++++++++---------- input.h | 1 + menu.cpp | 25 +++++++++++++++++++++---- 3 files changed, 61 insertions(+), 14 deletions(-) diff --git a/input.cpp b/input.cpp index e8c962d..1cfa808 100644 --- a/input.cpp +++ b/input.cpp @@ -1217,6 +1217,12 @@ int get_map_clear() return mapping_clear; } +static uint32_t osd_timer = 0; +int get_map_cancel() +{ + return (mapping && !is_menu_core() && osd_timer && CheckTimer(osd_timer)); +} + static char *get_map_name(int dev, int def) { static char name[128]; @@ -1767,15 +1773,41 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int } int osd_event = 0; - if (old_combo != 3 && input[dev].osd_combo == 3) osd_event = 1; - else if (old_combo == 3 && input[dev].osd_combo != 3) osd_event = 2; + if (old_combo != 3 && input[dev].osd_combo == 3) + { + osd_event = 1; + if (mapping && !is_menu_core()) osd_timer = GetTimer(1000); + } + else if (old_combo == 3 && input[dev].osd_combo != 3) + { + osd_event = 2; + if (mapping && !is_menu_core()) + { + if (CheckTimer(osd_timer)) + { + cancel = 1; + ev->code = KEY_ESC; + ev->value = 0; + } + else + { + map_skip = 1; + ev->value = 1; + } + } + osd_timer = 0; + } //mapping - if (mapping && (mapping_dev >=0 || ev->value) && !((mapping_type < 2 || !mapping_button) && (cancel || enter))) + if (mapping && (mapping_dev >= 0 || ev->value) && !((mapping_type < 2 || !mapping_button) && (cancel || enter))) { - if (is_menu_core()) spi_uio_cmd(UIO_KEYBOARD); //ping the Menu core to wakeup + if (is_menu_core()) + { + spi_uio_cmd(UIO_KEYBOARD); //ping the Menu core to wakeup + osd_event = 0; + } - if (ev->type == EV_KEY && mapping_button>=0) + if (ev->type == EV_KEY && mapping_button>=0 && !osd_event) { if (mapping_type == 2) { @@ -1830,10 +1862,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int mapping_clear = 0; if (mapping_dev >= 0 && (mapping_dev == dev || clear) && mapping_button < (is_menu_core() ? (SYS_BTN_OSD_KTGL+1) : mapping_count)) { - if (is_menu_core()) osd_event = 0; - if (osd_event) key_mapped = 0; - - if ((ev->value == 1 && !key_mapped) || osd_event == 1) + if (ev->value == 1 && !key_mapped) { if (is_menu_core()) { @@ -1868,7 +1897,7 @@ static void input_cb(struct input_event *ev, struct input_absinfo *absinfo, int } else { - if ((mapping_type && osd_event == 1) || clear) + if (clear) { memset(input[mapping_dev].map, 0, sizeof(input[mapping_dev].map)); mapping_button = 0; diff --git a/input.h b/input.h index 47b71b9..d6ea663 100644 --- a/input.h +++ b/input.h @@ -76,6 +76,7 @@ void start_map_setting(int cnt, int set = 0); int get_map_button(); int get_map_type(); int get_map_clear(); +int get_map_cancel(); void finish_map_setting(int dismiss); uint16_t get_map_vid(); uint16_t get_map_pid(); diff --git a/menu.cpp b/menu.cpp index a8e4bda..753a33f 100644 --- a/menu.cpp +++ b/menu.cpp @@ -2129,9 +2129,18 @@ void HandleUI(void) menustate = MENU_JOYDIGMAP1; parentstate = MENU_JOYDIGMAP; for (int i = 0; i < OsdGetSize(); i++) OsdWrite(i); - OsdWrite(7, " Esc \x16 Cancel"); - OsdWrite(8, " Enter \x16 Finish"); - OsdWrite(9, " Space \x16 Skip"); + if (is_menu_core()) + { + OsdWrite(7, " Space \x16 Skip"); + OsdWrite(8, " Esc \x16 Cancel"); + OsdWrite(9, " Enter \x16 Finish"); + } + else + { + OsdWrite(7, " Space/Menu \x16 Skip"); + OsdWrite(8, " Menu-hold \x16 Cancel"); + OsdWrite(9, " Enter \x16 Finish"); + } break; case MENU_JOYDIGMAP1: @@ -2146,6 +2155,14 @@ void HandleUI(void) break; } + if (get_map_cancel()) + { + OsdWrite(3); + OsdWrite(4, " Canceling"); + OsdWrite(5); + break; + } + const char* p = 0; if (get_map_button() < 0) { @@ -2221,7 +2238,7 @@ void HandleUI(void) if (!get_map_type()) OsdWrite(9); } OsdWrite(5, s); - if (!is_menu_core()) OsdWrite(10, " Menu/F12 \x16 Clear all"); + if (!is_menu_core()) OsdWrite(10, " F12 \x16 Clear all"); } }