This commit is contained in:
2026-03-20 14:31:26 +01:00
115 changed files with 5715 additions and 3969 deletions

View File

@@ -53,7 +53,7 @@ lv_img_dsc_t *icon_lakka;
lv_img_dsc_t *hekate_bg;
lv_img_dsc_t *hekate_bg_etc;
lv_style_t btn_transp_rel, btn_transp_pr, btn_transp_tgl_rel, btn_transp_tgl_pr;
lv_style_t btn_transp_rel, btn_transp_pr, btn_transp_tgl_rel, btn_transp_tgl_pr, btn_transp_ina;
lv_style_t ddlist_transp_bg, ddlist_transp_sel;
lv_style_t tabview_btn_pr, tabview_btn_tgl_pr;
@@ -105,6 +105,7 @@ static void _nyx_disp_init()
// Rotate and copy the first frame.
vic_compose();
vic_wait_idle();
// Switch to new window configuration.
display_init_window_a_pitch_vic();
@@ -328,19 +329,19 @@ static void _disp_fb_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const
lv_flush_ready();
}
static touch_event touchpad;
static touch_event_t touchpad;
static bool touch_enabled;
static bool console_enabled = false;
static bool _fts_touch_read(lv_indev_data_t *data)
{
if (touch_enabled)
touch_poll(&touchpad);
else
if (!touch_enabled)
return false;
// Take a screenshot if 3 fingers.
if (touchpad.fingers > 2)
int res = touch_poll(&touchpad);
// Take a screenshot if 3rd finger.
if (touchpad.finger > 2)
{
_save_fb_to_bmp();
@@ -350,14 +351,18 @@ static bool _fts_touch_read(lv_indev_data_t *data)
if (console_enabled)
{
// If no event, keep last debug message.
if (res)
return false;
// Print input debugging in console.
gfx_con_getpos(&gfx_con.savedx, &gfx_con.savedy, &gfx_con.savedcol);
gfx_con_setpos(32, 638, GFX_COL_AUTO);
gfx_con.fntsz = 8;
gfx_printf("x: %4d, y: %4d | z: %3d | ", touchpad.x, touchpad.y, touchpad.z);
gfx_printf("1: %02X, 2: %02X, 3: %02X, ", touchpad.raw[1], touchpad.raw[2], touchpad.raw[3]);
gfx_printf("4: %02X, 5: %02X, 6: %02X, 7: %02X",
touchpad.raw[4], touchpad.raw[5], touchpad.raw[6], touchpad.raw[7]);
gfx_printf("0: %02X, 1: %02X, 2: %02X, ", touchpad.raw[0], touchpad.raw[1], touchpad.raw[2]);
gfx_printf("3: %02X, 4: %02X, 5: %02X, 6: %02X",
touchpad.raw[3], touchpad.raw[4], touchpad.raw[5], touchpad.raw[6]);
gfx_con_setpos(gfx_con.savedx, gfx_con.savedy, gfx_con.savedcol);
gfx_con.fntsz = 16;
@@ -369,23 +374,10 @@ static bool _fts_touch_read(lv_indev_data_t *data)
data->point.y = touchpad.y;
// Decide touch enable.
switch (touchpad.type & STMFTS_MASK_EVENT_ID)
{
case STMFTS_EV_MULTI_TOUCH_ENTER:
case STMFTS_EV_MULTI_TOUCH_MOTION:
if (touchpad.touch)
data->state = LV_INDEV_STATE_PR;
break;
case STMFTS_EV_MULTI_TOUCH_LEAVE:
else
data->state = LV_INDEV_STATE_REL;
break;
case STMFTS_EV_NO_EVENT:
default:
if (touchpad.touch)
data->state = LV_INDEV_STATE_PR;
else
data->state = LV_INDEV_STATE_REL;
break;
}
return false; // No buffering so no more data read.
}
@@ -702,7 +694,7 @@ lv_img_dsc_t *bmp_to_lvimg_obj(const char *path)
}
lv_img_dsc_t *img_desc = (lv_img_dsc_t *)bitmap;
u32 offset_copy = ALIGN((u32)bitmap + sizeof(lv_img_dsc_t), 0x10);
uptr offset_copy = ALIGN((uptr)bitmap + sizeof(lv_img_dsc_t), 0x10);
img_desc->header.always_zero = 0;
img_desc->header.w = bmpData.size_x;
@@ -782,7 +774,7 @@ lv_res_t nyx_generic_onoff_toggle(lv_obj_t *btn)
return LV_RES_OK;
}
lv_res_t mbox_action(lv_obj_t *btns, const char *txt)
lv_res_t nyx_mbox_action(lv_obj_t *btns, const char *txt)
{
lv_obj_t *mbox = lv_mbox_get_from_btn(btns);
lv_obj_t *dark_bg = lv_obj_get_parent(mbox);
@@ -817,7 +809,7 @@ bool nyx_emmc_check_battery_enough()
"#FFDD00 with selected operation!#\n\n"
"Charge to at least #C7EA46 3650 mV#, and try again!");
lv_mbox_add_btns(mbox, mbox_btn_map, mbox_action);
lv_mbox_add_btns(mbox, mbox_btn_map, nyx_mbox_action);
lv_obj_set_width(mbox, LV_HOR_RES / 9 * 5);
lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_top(mbox, true);
@@ -844,7 +836,7 @@ static void _nyx_sd_card_issues_warning(void *param)
"#FFDD00 This might mean detached or broken connector!#\n\n"
"You might want to check\n#C7EA46 Console Info# -> #C7EA46 microSD#");
lv_mbox_add_btns(mbox, mbox_btn_map, mbox_action);
lv_mbox_add_btns(mbox, mbox_btn_map, nyx_mbox_action);
lv_obj_set_width(mbox, LV_HOR_RES / 9 * 5);
lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_top(mbox, true);
@@ -879,14 +871,14 @@ void nyx_window_toggle_buttons(lv_obj_t *win, bool disable)
}
}
lv_res_t nyx_win_close_action_custom(lv_obj_t * btn)
lv_res_t nyx_win_close_action(lv_obj_t * btn)
{
close_btn = NULL;
return lv_win_close_action(btn);
}
lv_obj_t *nyx_create_standard_window(const char *win_title)
lv_obj_t *nyx_create_standard_window(const char *win_title, lv_action_t close_action)
{
static lv_style_t win_bg_style;
@@ -899,25 +891,10 @@ lv_obj_t *nyx_create_standard_window(const char *win_title)
lv_win_set_style(win, LV_WIN_STYLE_BG, &win_bg_style);
lv_obj_set_size(win, LV_HOR_RES, LV_VER_RES);
close_btn = lv_win_add_btn(win, NULL, SYMBOL_CLOSE" Close", nyx_win_close_action_custom);
return win;
}
lv_obj_t *nyx_create_window_custom_close_btn(const char *win_title, lv_action_t rel_action)
{
static lv_style_t win_bg_style;
lv_style_copy(&win_bg_style, &lv_style_plain);
win_bg_style.body.main_color = lv_theme_get_current()->bg->body.main_color;
win_bg_style.body.grad_color = win_bg_style.body.main_color;
lv_obj_t *win = lv_win_create(lv_scr_act(), NULL);
lv_win_set_title(win, win_title);
lv_win_set_style(win, LV_WIN_STYLE_BG, &win_bg_style);
lv_obj_set_size(win, LV_HOR_RES, LV_VER_RES);
close_btn = lv_win_add_btn(win, NULL, SYMBOL_CLOSE" Close", rel_action);
if (!close_action)
close_btn = lv_win_add_btn(win, NULL, SYMBOL_CLOSE" Close", nyx_win_close_action);
else
close_btn = lv_win_add_btn(win, NULL, SYMBOL_CLOSE" Close", close_action);
return win;
}
@@ -981,7 +958,7 @@ static lv_res_t reload_action(lv_obj_t *btns, const char *txt)
if (!lv_btnm_get_pressed(btns))
reload_nyx(NULL, false);
return mbox_action(btns, txt);
return nyx_mbox_action(btns, txt);
}
static lv_res_t _removed_sd_action(lv_obj_t *btns, const char *txt)
@@ -1005,7 +982,7 @@ static lv_res_t _removed_sd_action(lv_obj_t *btns, const char *txt)
break;
}
return mbox_action(btns, txt);
return nyx_mbox_action(btns, txt);
}
static void _check_sd_card_removed(void *params)
@@ -1063,7 +1040,7 @@ static void _nyx_emmc_issues_warning(void *params)
"#FFDD00 This might mean hardware issues!#\n\n"
"You might want to check\n#C7EA46 Console Info# -> #C7EA46 eMMC#");
lv_mbox_add_btns(mbox, mbox_btn_map, mbox_action);
lv_mbox_add_btns(mbox, mbox_btn_map, nyx_mbox_action);
lv_obj_set_width(mbox, LV_HOR_RES / 9 * 5);
lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_top(mbox, true);
@@ -1075,7 +1052,7 @@ static lv_res_t _reboot_ofw_action(lv_obj_t *btns, const char *txt)
if (!lv_btnm_get_pressed(btns))
power_set_state(REBOOT_BYPASS_FUSES);
return mbox_action(btns, txt);
return nyx_mbox_action(btns, txt);
}
static lv_res_t _create_mbox_reboot_ofw()
@@ -1133,7 +1110,7 @@ static lv_res_t _reboot_action(lv_obj_t *btns, const char *txt)
break;
}
return mbox_action(btns, txt);
return nyx_mbox_action(btns, txt);
}
static lv_res_t _poweroff_action(lv_obj_t *btns, const char *txt)
@@ -1141,7 +1118,7 @@ static lv_res_t _poweroff_action(lv_obj_t *btns, const char *txt)
if (!lv_btnm_get_pressed(btns))
power_set_state(POWER_OFF_RESET);
return mbox_action(btns, txt);
return nyx_mbox_action(btns, txt);
}
static lv_res_t _create_mbox_reload(lv_obj_t *btn)
@@ -1236,7 +1213,7 @@ void nyx_create_onoff_button(lv_theme_t *th, lv_obj_t *parent, lv_obj_t *btn, co
btn_onoff_pr_hos_style.body.opa = 35;
}
else
btn_onoff_pr_hos_style.body.main_color = LV_COLOR_HEX(theme_bg_color ? (theme_bg_color + 0x101010) : 0x2D2D2D);
btn_onoff_pr_hos_style.body.main_color = LV_COLOR_HEX(theme_bg_color ? (theme_bg_color + 0x101010) : 0x2D2D2D); // COLOR_HOS_BG_LIGHT.
btn_onoff_pr_hos_style.body.grad_color = btn_onoff_pr_hos_style.body.main_color;
btn_onoff_pr_hos_style.text.color = th->btn.pr->text.color;
btn_onoff_pr_hos_style.body.empty = 0;
@@ -1286,7 +1263,7 @@ static void _create_text_button(lv_theme_t *th, lv_obj_t *parent, lv_obj_t *btn,
btn_onoff_pr_hos_style.body.opa = 35;
}
else
btn_onoff_pr_hos_style.body.main_color = LV_COLOR_HEX(theme_bg_color ? (theme_bg_color + 0x101010) : 0x2D2D2D);
btn_onoff_pr_hos_style.body.main_color = LV_COLOR_HEX(theme_bg_color ? (theme_bg_color + 0x101010) : 0x2D2D2D); // COLOR_HOS_BG_LIGHT
btn_onoff_pr_hos_style.body.grad_color = btn_onoff_pr_hos_style.body.main_color;
btn_onoff_pr_hos_style.text.color = th->btn.pr->text.color;
btn_onoff_pr_hos_style.body.empty = 0;
@@ -1472,7 +1449,7 @@ static lv_res_t _create_mbox_payloads(lv_obj_t *btn)
lv_obj_set_size(list, LV_HOR_RES * 3 / 7, LV_VER_RES * 3 / 7);
lv_list_set_single_mode(list, true);
if (!sd_mount())
if (sd_mount())
{
lv_mbox_set_text(mbox, "#FFDD00 Failed to init SD!#");
@@ -1496,7 +1473,7 @@ static lv_res_t _create_mbox_payloads(lv_obj_t *btn)
}
out_end:
lv_mbox_add_btns(mbox, mbox_btn_map, mbox_action);
lv_mbox_add_btns(mbox, mbox_btn_map, nyx_mbox_action);
lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_top(mbox, true);
@@ -1736,7 +1713,7 @@ static lv_res_t _create_window_home_launch(lv_obj_t *btn)
lv_obj_t *boot_entry_label;
bool no_boot_entries = false;
// Create CFW buttons.
// Create Boot Entry buttons.
// Buttons are 200 x 200 with 4 pixel borders.
// Icons must be <= 192 x 192.
// Create first Button.
@@ -1776,7 +1753,7 @@ static lv_res_t _create_window_home_launch(lv_obj_t *btn)
// Create colorized icon style based on its parent style.
static lv_style_t img_style;
lv_style_copy(&img_style, &lv_style_plain);
img_style.image.color = lv_color_hsv_to_rgb(n_cfg.theme_color, 100, 100);
img_style.image.color = COLOR_HOS_TURQUOISE_EX(n_cfg.theme_color);
img_style.image.intense = LV_OPA_COVER;
// Parse ini boot entries and set buttons/icons.
@@ -1784,7 +1761,7 @@ static lv_res_t _create_window_home_launch(lv_obj_t *btn)
u32 curr_btn_idx = 0; // Active buttons.
LIST_INIT(ini_sections);
if (!sd_mount())
if (sd_mount())
goto failed_sd_mount;
// Check if we use custom system icons.
@@ -1794,15 +1771,15 @@ static lv_res_t _create_window_home_launch(lv_obj_t *btn)
// Choose what to parse.
bool ini_parse_success = false;
if (!more_cfg)
ini_parse_success = ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false);
ini_parse_success = !ini_parse(&ini_sections, "bootloader/hekate_ipl.ini", false);
else
ini_parse_success = ini_parse(&ini_sections, "bootloader/ini", true);
ini_parse_success = !ini_parse(&ini_sections, "bootloader/ini", true);
if (combined_cfg && !ini_parse_success)
{
ini_parsing:
list_init(&ini_sections);
ini_parse_success = ini_parse(&ini_sections, "bootloader/ini", true);
ini_parse_success = !ini_parse(&ini_sections, "bootloader/ini", true);
more_cfg = true;
}
@@ -1931,11 +1908,20 @@ ini_parsing:
btn_height = 200;
lv_btn_set_style(launch_ctxt.btn[curr_btn_idx], LV_BTN_STYLE_REL, &btn_home_noborder_rel);
lv_btn_set_style(launch_ctxt.btn[curr_btn_idx], LV_BTN_STYLE_PR, &btn_home_noborder_rel);
lv_btn_set_style(launch_ctxt.btn[curr_btn_idx], LV_BTN_STYLE_PR, &btn_home_noborder_rel);
}
lv_obj_set_size(btns, btn_width, btn_height);
lv_btn_set_style(btns, LV_BTN_STYLE_REL, img_noborder ? &btn_home_noborder_rel : &btn_home_transp_rel);
lv_btn_set_style(btns, LV_BTN_STYLE_PR, &btn_home_transp_pr);
// Button transparency if custom background, but loses color.
// if (!btn && hekate_bg && !img_noborder)
// {
// lv_btn_set_style(launch_ctxt.btn[curr_btn_idx], LV_BTN_STYLE_REL, &btn_transp_rel);
// lv_btn_set_style(launch_ctxt.btn[curr_btn_idx], LV_BTN_STYLE_PR, &btn_transp_pr);
// lv_btn_set_style(btns, LV_BTN_STYLE_REL, &btn_home_noborder_rel);
// }
if (img)
lv_obj_align(img, NULL, LV_ALIGN_CENTER, 0, 0);
if (img_noborder)
@@ -1957,9 +1943,13 @@ ini_parsing:
lv_label_set_text(launch_ctxt.label[curr_btn_idx], ini_sec->name);
lv_obj_set_opa_scale(launch_ctxt.label[curr_btn_idx], LV_OPA_COVER);
// Set rolling text if name is big.
if (strlen(ini_sec->name) > 22)
// Set rolling text if name is too big.
int max_label_size = 238 - (n_cfg.entries_5_col ? 12 : 0);
if (lv_obj_get_width(launch_ctxt.label[curr_btn_idx]) > max_label_size)
{
lv_label_set_long_mode(launch_ctxt.label[curr_btn_idx], LV_LABEL_LONG_ROLL);
lv_obj_set_width(launch_ctxt.label[curr_btn_idx], max_label_size);
}
entry_idx++;
curr_btn_idx++;
@@ -2115,6 +2105,12 @@ static void _create_tab_home(lv_theme_t *th, lv_obj_t *parent)
// lv_obj_set_width(btn_quick_launch, 256);
// lv_obj_set_pos(btn_quick_launch, 343, 448);
// lv_btn_set_action(btn_quick_launch, LV_BTN_ACTION_CLICK, NULL);
// if (hekate_bg)
// {
// lv_btn_set_style(btn_quick_launch, LV_BTN_STYLE_REL, &btn_transp_rel);
// lv_btn_set_style(btn_quick_launch, LV_BTN_STYLE_PR, &btn_transp_pr);
// lv_btn_set_style(btn_quick_launch, LV_BTN_STYLE_INA, &btn_transp_ina);
// }
lv_obj_t *btn_nyx_options = lv_btn_create(parent, NULL);
_create_text_button(th, NULL, btn_nyx_options, SYMBOL_SETTINGS" Nyx Settings", NULL);
@@ -2179,10 +2175,10 @@ static lv_res_t _save_options_action(lv_obj_t *btn)
int res = 0;
if (sd_mount())
res = !create_config_entry();
if (!sd_mount())
res = create_config_entry();
if (res)
if (!res)
lv_mbox_set_text(mbox, "#FF8000 hekate Configuration#\n\n#96FF00 The configuration was saved to sd card!#");
else
lv_mbox_set_text(mbox, "#FF8000 hekate Configuration#\n\n#FFDD00 Failed to save the configuration#\n#FFDD00 to sd card!#");
@@ -2250,7 +2246,7 @@ static void _create_status_bar(lv_theme_t * th)
lv_obj_t *btn_mid = lv_btn_create(status_bar_bg, NULL);
lv_obj_t *lbl_mid = lv_label_create(btn_mid, NULL);
lv_label_set_static_text(lbl_mid, "Save Options");
lv_obj_set_size(btn_mid, LV_DPI * 5 / 2, LV_DPI / 2);
lv_obj_set_size(btn_mid, LV_DPI * 17 / 8, LV_DPI / 2);
lv_obj_align(btn_mid, NULL, LV_ALIGN_CENTER, 0, 0);
status_bar.mid = btn_mid;
lv_obj_set_opa_scale(btn_mid, LV_OPA_0);
@@ -2263,7 +2259,7 @@ static lv_res_t _create_mbox_save_changes_action(lv_obj_t *btns, const char * tx
{
int btn_idx = lv_btnm_get_pressed(btns);
mbox_action(btns, txt);
nyx_mbox_action(btns, txt);
if (!btn_idx)
_save_options_action(NULL);
@@ -2342,9 +2338,9 @@ static void _nyx_set_default_styles(lv_theme_t * th)
hint_small_style_white.text.font = &interui_20;
lv_style_copy(&monospace_text, &lv_style_plain);
monospace_text.body.main_color = LV_COLOR_HEX(0x1B1B1B);
monospace_text.body.grad_color = LV_COLOR_HEX(0x1B1B1B);
monospace_text.body.border.color = LV_COLOR_HEX(0x1B1B1B);
monospace_text.body.main_color = COLOR_HOS_BG_DARKER;
monospace_text.body.grad_color = COLOR_HOS_BG_DARKER;
monospace_text.body.border.color = COLOR_HOS_BG_DARKER;
monospace_text.body.border.width = 0;
monospace_text.body.opa = LV_OPA_TRANSP;
monospace_text.text.color = LV_COLOR_HEX(0xD8D8D8);
@@ -2355,44 +2351,55 @@ static void _nyx_set_default_styles(lv_theme_t * th)
lv_style_copy(&btn_transp_rel, th->btn.rel);
btn_transp_rel.body.main_color = LV_COLOR_HEX(0x444444);
btn_transp_rel.body.grad_color = btn_transp_rel.body.main_color;
btn_transp_rel.body.shadow.color = LV_COLOR_HEX(0x0F0F0F);
btn_transp_rel.body.opa = LV_OPA_50;
lv_style_copy(&btn_transp_pr, th->btn.pr);
btn_transp_pr.body.main_color = LV_COLOR_HEX(0x888888);
btn_transp_pr.body.grad_color = btn_transp_pr.body.main_color;
btn_transp_pr.body.shadow.color = LV_COLOR_HEX(0x0F0F0F);
btn_transp_pr.body.opa = LV_OPA_50;
lv_style_copy(&btn_transp_tgl_rel, th->btn.tgl_rel);
btn_transp_tgl_rel.body.main_color = LV_COLOR_HEX(0x444444);
btn_transp_tgl_rel.body.grad_color = btn_transp_tgl_rel.body.main_color;
btn_transp_tgl_rel.body.shadow.color = LV_COLOR_HEX(0x0F0F0F);
btn_transp_tgl_rel.body.opa = LV_OPA_50;
lv_style_copy(&btn_transp_tgl_pr, th->btn.tgl_pr);
btn_transp_tgl_pr.body.main_color = LV_COLOR_HEX(0x888888);
btn_transp_tgl_pr.body.grad_color = btn_transp_tgl_pr.body.main_color;
btn_transp_tgl_pr.body.shadow.color = LV_COLOR_HEX(0x0F0F0F);
btn_transp_tgl_pr.body.opa = LV_OPA_50;
lv_style_copy(&btn_transp_ina, th->btn.ina);
btn_transp_ina.body.main_color = LV_COLOR_HEX(0x292929);
btn_transp_ina.body.grad_color = btn_transp_ina.body.main_color;
btn_transp_ina.body.border.color = LV_COLOR_HEX(0x444444);
btn_transp_ina.body.shadow.color = LV_COLOR_HEX(0x0F0F0F);
btn_transp_ina.body.opa = LV_OPA_50;
lv_style_copy(&ddlist_transp_bg, th->ddlist.bg);
ddlist_transp_bg.body.main_color = LV_COLOR_HEX(0x2D2D2D);
ddlist_transp_bg.body.grad_color = ddlist_transp_bg.body.main_color;
ddlist_transp_bg.body.opa = 180;
ddlist_transp_bg.body.opa = 180; // 70.6%.
lv_style_copy(&ddlist_transp_sel, th->ddlist.sel);
ddlist_transp_sel.body.main_color = LV_COLOR_HEX(0x4D4D4D);
ddlist_transp_sel.body.grad_color = ddlist_transp_sel.body.main_color;
ddlist_transp_sel.body.opa = 180;
ddlist_transp_sel.body.opa = 180; // 70.6%.
lv_style_copy(&tabview_btn_pr, th->tabview.btn.pr);
tabview_btn_pr.body.main_color = LV_COLOR_HEX(0xFFFFFF);
tabview_btn_pr.body.grad_color = tabview_btn_pr.body.main_color;
tabview_btn_pr.body.opa = 35;
tabview_btn_pr.body.opa = 35; // 13.7%.
lv_style_copy(&tabview_btn_tgl_pr, th->tabview.btn.tgl_pr);
tabview_btn_tgl_pr.body.main_color = LV_COLOR_HEX(0xFFFFFF);
tabview_btn_tgl_pr.body.grad_color = tabview_btn_tgl_pr.body.main_color;
tabview_btn_tgl_pr.body.opa = 35;
tabview_btn_tgl_pr.body.opa = 35; // 13.7%.
lv_color_t tmp_color = lv_color_hsv_to_rgb(n_cfg.theme_color, 100, 100);
lv_color_t tmp_color = COLOR_HOS_TURQUOISE_EX(n_cfg.theme_color);
text_color = malloc(32);
s_printf(text_color, "#%06X", (u32)(tmp_color.full & 0xFFFFFF));
}
@@ -2451,8 +2458,9 @@ static void _nyx_main_menu(lv_theme_t * th)
// Add all tabs content.
char version[32];
char rel = (nyx_str->version >> 24) & 0xFF;
s_printf(version, "hekate %s%d.%d.%d%c",
rel ? "v" : "", nyx_str->version & 0xFF, (nyx_str->version >> 8) & 0xFF, (nyx_str->version >> 16) & 0xFF, rel > 'A' ? rel : 0);
s_printf(version, "hekate %s%d.%d.%d%c%c",
rel ? "v" : "", nyx_str->version & 0xFF, (nyx_str->version >> 8) & 0xFF, (nyx_str->version >> 16) & 0xFF, rel > 'a' ? rel : 0,
(nyx_str->info_ex.rsvd_flags & RSVD_FLAG_DRAM_8GB) ? '*' : 0);
lv_obj_t *tab_about = lv_tabview_add_tab(tv, version);
lv_obj_t *tab_home = lv_tabview_add_tab(tv, SYMBOL_HOME" Home");
@@ -2561,7 +2569,7 @@ void nyx_load_and_run()
close_btn = NULL;
// Initialize touch.
touch_enabled = touch_power_on();
touch_enabled = !touch_power_on();
lv_indev_drv_t indev_drv_touch;
lv_indev_drv_init(&indev_drv_touch);
indev_drv_touch.type = LV_INDEV_TYPE_POINTER;