Share one selection menu; drop dead variant detection and TegraExplorer filter
The variant menu in main.c and the RAM / Hekate-AMS menus in install.c were three copies of the same input loop; install_menu_select() replaces them with identical behaviour (D-pad/Vol to move, A/Power to confirm, Vol+ and Vol- to abort, Capture for screenshots).
This commit is contained in:
1 parent
664216fa11
commit
5241cccbe9
6 files changed
+99
-278
No files matched your search
+91
-180
@@ -582,8 +582,10 @@ static void install_joycon_reconnect(void)
|
||||
msleep(100);
|
||||
}
|
||||
|
||||
/* Same navigation as main.c multi-variant menu; returns false if user aborts (payload/reboot). */
|
||||
static bool install_ram_config_menu(bool *use_8gb)
|
||||
/* Selection menu shared by main.c and the extras menus: draws the labels at the
|
||||
* current cursor plus the key hints and returns the chosen index, or -1 when
|
||||
* Vol+ and Vol- are pressed together. Only the two changed lines are redrawn. */
|
||||
int install_menu_select(const char *const *labels, int n)
|
||||
{
|
||||
jc_init_hw();
|
||||
while (btn_read() & BTN_POWER)
|
||||
@@ -591,9 +593,86 @@ static bool install_ram_config_menu(bool *use_8gb)
|
||||
|
||||
int selected = 0;
|
||||
int prev_selected = 0;
|
||||
bool confirmed = false;
|
||||
const int n = 2;
|
||||
const char *labels[2] = {
|
||||
u32 menu_x, menu_y;
|
||||
gfx_con_getpos(&menu_x, &menu_y);
|
||||
for (int i = 0; i < n; i++) {
|
||||
install_set_color(i == selected ? COLOR_GREEN : COLOR_WHITE);
|
||||
gfx_printf(i == selected ? " > %s\n" : " %s\n", labels[i]);
|
||||
}
|
||||
gfx_printf("\n");
|
||||
install_set_color(COLOR_CYAN);
|
||||
gfx_printf("D-Pad / Vol+/-: Auswahl | A oder Power: Bestaetigen\n");
|
||||
gfx_printf("Vol+ und Vol- gleichzeitig: Abbrechen (Hekate)\n");
|
||||
install_set_color(COLOR_WHITE);
|
||||
|
||||
bool prev_up = false, prev_down = false;
|
||||
while (1) {
|
||||
if (selected != prev_selected) {
|
||||
gfx_con_setpos(menu_x, menu_y + (u32)prev_selected * 16);
|
||||
install_set_color(COLOR_WHITE);
|
||||
gfx_printf(" %s\n", labels[prev_selected]);
|
||||
gfx_con_setpos(menu_x, menu_y + (u32)selected * 16);
|
||||
install_set_color(COLOR_GREEN);
|
||||
gfx_printf(" > %s\n", labels[selected]);
|
||||
install_set_color(COLOR_WHITE);
|
||||
prev_selected = selected;
|
||||
}
|
||||
|
||||
jc_gamepad_rpt_t *jc = joycon_poll();
|
||||
u8 btn = btn_read();
|
||||
|
||||
if (jc && jc->cap)
|
||||
take_screenshot();
|
||||
if (cancel_combo_pressed(btn))
|
||||
return -1;
|
||||
|
||||
bool cur_up = false, cur_down = false;
|
||||
if (jc) {
|
||||
cur_up = (jc->up != 0) && !jc->down;
|
||||
cur_down = (jc->down != 0) && !jc->up;
|
||||
}
|
||||
if (btn & BTN_VOL_UP)
|
||||
cur_up = true;
|
||||
if (btn & BTN_VOL_DOWN)
|
||||
cur_down = true;
|
||||
|
||||
if (cur_up && !prev_up)
|
||||
selected = (selected - 1 + n) % n;
|
||||
else if (cur_down && !prev_down)
|
||||
selected = (selected + 1) % n;
|
||||
else if ((jc && jc->a) || (btn & BTN_POWER))
|
||||
return selected;
|
||||
|
||||
prev_up = cur_up;
|
||||
prev_down = cur_down;
|
||||
msleep(50);
|
||||
}
|
||||
}
|
||||
|
||||
/* Extras menu wrapper: abort launches Hekate. */
|
||||
static bool install_extras_choice(const char *const *labels, int n, int *choice)
|
||||
{
|
||||
int sel = install_menu_select(labels, n);
|
||||
if (sel < 0) {
|
||||
gfx_printf("\n");
|
||||
install_set_color(COLOR_YELLOW);
|
||||
gfx_printf("Abgebrochen. Starte Hekate...\n");
|
||||
install_set_color(COLOR_WHITE);
|
||||
msleep(500);
|
||||
installer_launch_hekate_payload();
|
||||
return false;
|
||||
}
|
||||
|
||||
*choice = sel;
|
||||
gfx_clear_grey(0x1B);
|
||||
gfx_con_setpos(0, 0);
|
||||
install_print_main_header();
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool install_ram_config_menu(bool *use_8gb)
|
||||
{
|
||||
static const char *const labels[] = {
|
||||
"4GB Konsole (Standard)",
|
||||
"8GB Konsole",
|
||||
};
|
||||
@@ -612,104 +691,16 @@ static bool install_ram_config_menu(bool *use_8gb)
|
||||
gfx_printf("Fall 8GB aus, da du sonst Boot Probleme bekommst!!!\n\n");
|
||||
install_set_color(COLOR_WHITE);
|
||||
|
||||
u32 menu_x, menu_y;
|
||||
gfx_con_getpos(&menu_x, &menu_y);
|
||||
for (int i = 0; i < n; i++) {
|
||||
if (i == selected) {
|
||||
install_set_color(COLOR_GREEN);
|
||||
gfx_printf(" > %s\n", labels[i]);
|
||||
install_set_color(COLOR_WHITE);
|
||||
} else {
|
||||
gfx_printf(" %s\n", labels[i]);
|
||||
}
|
||||
}
|
||||
gfx_printf("\n");
|
||||
install_set_color(COLOR_CYAN);
|
||||
gfx_printf("D-Pad / Vol+/-: Auswahl | A oder Power: Bestaetigen\n");
|
||||
gfx_printf("Vol+ und Vol- gleichzeitig: Abbrechen (Hekate)\n");
|
||||
install_set_color(COLOR_WHITE);
|
||||
|
||||
bool prev_up = false, prev_down = false;
|
||||
bool menu_aborted = false;
|
||||
|
||||
while (!confirmed && !menu_aborted) {
|
||||
if (selected != prev_selected) {
|
||||
gfx_con_setpos(menu_x, menu_y + (u32)prev_selected * 16);
|
||||
install_set_color(COLOR_WHITE);
|
||||
gfx_printf(" %s\n", labels[prev_selected]);
|
||||
gfx_con_setpos(menu_x, menu_y + (u32)selected * 16);
|
||||
install_set_color(COLOR_GREEN);
|
||||
gfx_printf(" > %s\n", labels[selected]);
|
||||
install_set_color(COLOR_WHITE);
|
||||
prev_selected = selected;
|
||||
}
|
||||
|
||||
jc_gamepad_rpt_t *jc = joycon_poll();
|
||||
u8 btn = btn_read();
|
||||
|
||||
if (jc && jc->cap)
|
||||
take_screenshot();
|
||||
|
||||
if (cancel_combo_pressed(btn)) {
|
||||
menu_aborted = true;
|
||||
break;
|
||||
}
|
||||
|
||||
bool cur_up = false, cur_down = false;
|
||||
if (jc) {
|
||||
cur_up = (jc->up != 0) && !jc->down;
|
||||
cur_down = (jc->down != 0) && !jc->up;
|
||||
}
|
||||
if (btn & BTN_VOL_UP)
|
||||
cur_up = true;
|
||||
if (btn & BTN_VOL_DOWN)
|
||||
cur_down = true;
|
||||
|
||||
if (cur_up && !prev_up)
|
||||
selected = (selected - 1 + n) % n;
|
||||
else if (cur_down && !prev_down)
|
||||
selected = (selected + 1) % n;
|
||||
else if (jc && jc->a)
|
||||
confirmed = true;
|
||||
|
||||
prev_up = cur_up;
|
||||
prev_down = cur_down;
|
||||
|
||||
if (btn & BTN_POWER)
|
||||
confirmed = true;
|
||||
|
||||
msleep(50);
|
||||
}
|
||||
|
||||
if (menu_aborted) {
|
||||
gfx_printf("\n");
|
||||
install_set_color(COLOR_YELLOW);
|
||||
gfx_printf("Abgebrochen. Starte Hekate...\n");
|
||||
install_set_color(COLOR_WHITE);
|
||||
msleep(500);
|
||||
installer_launch_hekate_payload();
|
||||
int choice;
|
||||
if (!install_extras_choice(labels, 2, &choice))
|
||||
return false;
|
||||
}
|
||||
|
||||
*use_8gb = (selected == 1);
|
||||
|
||||
gfx_clear_grey(0x1B);
|
||||
gfx_con_setpos(0, 0);
|
||||
install_print_main_header();
|
||||
*use_8gb = (choice == 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool install_hekate_ams_menu(bool *use_pro)
|
||||
{
|
||||
jc_init_hw();
|
||||
while (btn_read() & BTN_POWER)
|
||||
msleep(50);
|
||||
|
||||
int selected = 0;
|
||||
int prev_selected = 0;
|
||||
bool confirmed = false;
|
||||
const int n = 2;
|
||||
const char *labels[2] = {
|
||||
static const char *const labels[] = {
|
||||
"Hekate / Atmosphere (Standard)",
|
||||
"Hekate-Pro / Atmosphere-Pro",
|
||||
};
|
||||
@@ -724,90 +715,10 @@ static bool install_hekate_ams_menu(bool *use_pro)
|
||||
gfx_printf("Waehle Hekate / Atmosphere (Standard) sofern du nicht weisst, was du tust.\n\n");
|
||||
install_set_color(COLOR_WHITE);
|
||||
|
||||
u32 menu_x, menu_y;
|
||||
gfx_con_getpos(&menu_x, &menu_y);
|
||||
for (int i = 0; i < n; i++) {
|
||||
if (i == selected) {
|
||||
install_set_color(COLOR_GREEN);
|
||||
gfx_printf(" > %s\n", labels[i]);
|
||||
install_set_color(COLOR_WHITE);
|
||||
} else {
|
||||
gfx_printf(" %s\n", labels[i]);
|
||||
}
|
||||
}
|
||||
gfx_printf("\n");
|
||||
install_set_color(COLOR_CYAN);
|
||||
gfx_printf("D-Pad / Vol+/-: Auswahl | A oder Power: Bestaetigen\n");
|
||||
gfx_printf("Vol+ und Vol- gleichzeitig: Abbrechen (Hekate)\n");
|
||||
install_set_color(COLOR_WHITE);
|
||||
|
||||
bool prev_up = false, prev_down = false;
|
||||
bool menu_aborted = false;
|
||||
|
||||
while (!confirmed && !menu_aborted) {
|
||||
if (selected != prev_selected) {
|
||||
gfx_con_setpos(menu_x, menu_y + (u32)prev_selected * 16);
|
||||
install_set_color(COLOR_WHITE);
|
||||
gfx_printf(" %s\n", labels[prev_selected]);
|
||||
gfx_con_setpos(menu_x, menu_y + (u32)selected * 16);
|
||||
install_set_color(COLOR_GREEN);
|
||||
gfx_printf(" > %s\n", labels[selected]);
|
||||
install_set_color(COLOR_WHITE);
|
||||
prev_selected = selected;
|
||||
}
|
||||
|
||||
jc_gamepad_rpt_t *jc = joycon_poll();
|
||||
u8 btn = btn_read();
|
||||
|
||||
if (jc && jc->cap)
|
||||
take_screenshot();
|
||||
|
||||
if (cancel_combo_pressed(btn)) {
|
||||
menu_aborted = true;
|
||||
break;
|
||||
}
|
||||
|
||||
bool cur_up = false, cur_down = false;
|
||||
if (jc) {
|
||||
cur_up = (jc->up != 0) && !jc->down;
|
||||
cur_down = (jc->down != 0) && !jc->up;
|
||||
}
|
||||
if (btn & BTN_VOL_UP)
|
||||
cur_up = true;
|
||||
if (btn & BTN_VOL_DOWN)
|
||||
cur_down = true;
|
||||
|
||||
if (cur_up && !prev_up)
|
||||
selected = (selected - 1 + n) % n;
|
||||
else if (cur_down && !prev_down)
|
||||
selected = (selected + 1) % n;
|
||||
else if (jc && jc->a)
|
||||
confirmed = true;
|
||||
|
||||
prev_up = cur_up;
|
||||
prev_down = cur_down;
|
||||
|
||||
if (btn & BTN_POWER)
|
||||
confirmed = true;
|
||||
|
||||
msleep(50);
|
||||
}
|
||||
|
||||
if (menu_aborted) {
|
||||
gfx_printf("\n");
|
||||
install_set_color(COLOR_YELLOW);
|
||||
gfx_printf("Abgebrochen. Starte Hekate...\n");
|
||||
install_set_color(COLOR_WHITE);
|
||||
msleep(500);
|
||||
installer_launch_hekate_payload();
|
||||
int choice;
|
||||
if (!install_extras_choice(labels, 2, &choice))
|
||||
return false;
|
||||
}
|
||||
|
||||
*use_pro = (selected == 1);
|
||||
|
||||
gfx_clear_grey(0x1B);
|
||||
gfx_con_setpos(0, 0);
|
||||
install_print_main_header();
|
||||
*use_pro = (choice == 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user