From e9bcdc5f3f7bc51ebc86916655c623d1b05932ef Mon Sep 17 00:00:00 2001 From: Siyuan Miao Date: Thu, 25 Sep 2025 13:00:29 +0000 Subject: [PATCH] minor ui fixes --- display.go | 2 ++ internal/native/display.go | 10 +++++++++ internal/native/eez/jetkvm.eez-project | 28 ++++++++++++++++++++++--- internal/native/eez/src/ui/actions.c | 28 +++++++++++++++++++++++-- internal/native/eez/src/ui/screens.c | 2 ++ internal/native/eez/src/ui/vars.c | 12 ++++++++++- internal/native/eez/src/ui/vars.h | 5 ++++- internal/native/lib/libjknative.a | Bin 3117266 -> 3118596 bytes 8 files changed, 80 insertions(+), 7 deletions(-) diff --git a/display.go b/display.go index 495505e8..f236d906 100644 --- a/display.go +++ b/display.go @@ -53,8 +53,10 @@ func updateDisplay() { nativeInstance.UpdateLabelIfChanged("cloud_status_label", fmt.Sprintf("%d active", actionSessions)) if networkState.IsUp() { + nativeInstance.UISetVar("main_screen", "home_screen") nativeInstance.SwitchToScreenIf("home_screen", []string{"no_network_screen", "boot_screen"}) } else { + nativeInstance.UISetVar("main_screen", "no_network_screen") nativeInstance.SwitchToScreenIf("no_network_screen", []string{"home_screen", "boot_screen"}) } diff --git a/internal/native/display.go b/internal/native/display.go index b92b8731..925a0a10 100644 --- a/internal/native/display.go +++ b/internal/native/display.go @@ -37,6 +37,16 @@ func (n *Native) UIObjShow(objName string) (bool, error) { return uiObjShow(objName) } +// UISetVar sets the variable +func (n *Native) UISetVar(name string, value string) { + uiSetVar(name, value) +} + +// UIGetVar gets the variable +func (n *Native) UIGetVar(name string) string { + return uiGetVar(name) +} + // UIObjSetState clears the state then adds the new state func (n *Native) UIObjSetState(objName string, state string) (bool, error) { return uiObjSetState(objName, state) diff --git a/internal/native/eez/jetkvm.eez-project b/internal/native/eez/jetkvm.eez-project index 81231dec..058410c1 100644 --- a/internal/native/eez/jetkvm.eez-project +++ b/internal/native/eez/jetkvm.eez-project @@ -48,7 +48,7 @@ { "objID": "58af3ebb-96b3-494c-f4e3-9c23852e3e42", "fileName": "actions.c", - "template": "#include \"actions.h\"\n#include \"screens.h\"\n#include \"ui.h\"\n#include \n\nint handle_gesture_screen_switch(lv_event_t *e, lv_dir_t direction, int screenId) {\n lv_event_code_t event_code = lv_event_get_code(e);\n if (event_code != LV_EVENT_GESTURE) {\n return 0;\n }\n\n if (lv_indev_get_gesture_dir(lv_indev_get_act()) != direction) {\n return 0;\n }\n lv_indev_wait_release(lv_indev_get_act());\n loadScreen(screenId);\n return 1;\n}\n\nvoid action_switch_to_menu(lv_event_t *e) {\n loadScreen(SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_switch_to_advanced_menu(lv_event_t *e) {\n loadScreen(SCREEN_ID_MENU_ADVANCED_SCREEN);\n}\n\nvoid action_switch_to_status(lv_event_t *e) {\n loadScreen(SCREEN_ID_STATUS_SCREEN);\n}\n\nvoid action_switch_to_about(lv_event_t *e) {\n loadScreen(SCREEN_ID_ABOUT_SCREEN);\n}\n\nvoid action_switch_to_reset_config(lv_event_t *e) {\n loadScreen(SCREEN_ID_RESET_CONFIG_SCREEN);\n}\n\nvoid action_switch_to_reboot(lv_event_t *e) {\n loadScreen(SCREEN_ID_REBOOT_SCREEN);\n}\n\nvoid action_menu_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_HOME_SCREEN);\n}\n\nvoid action_menu_advanced_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_reset_config_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_home_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_LEFT, SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_about_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_MENU_SCREEN);\n}\n\n// user_data doesn't seem to be working, so we use a global variable here\nstatic uint32_t t_reset_config;\nstatic uint32_t t_reboot;\nconst int RESET_CONFIG_HOLD_TIME = 10;\nconst int REBOOT_HOLD_TIME = 5;\n\nvoid action_reset_config(lv_event_t * e) {\n lv_event_code_t event_code = lv_event_get_code(e);\n lv_obj_t *obj = lv_event_get_target(e);\n \n if (event_code == LV_EVENT_PRESSED) {\n t_reset_config = lv_tick_get();\n }\n else if (event_code == LV_EVENT_PRESSING) {\n int remaining_time = RESET_CONFIG_HOLD_TIME * 1000 - lv_tick_elaps(t_reset_config);\n if (remaining_time <= 0) { \n lv_obj_add_flag(objects.reset_config_button, LV_OBJ_FLAG_HIDDEN);\n lv_obj_clear_flag(objects.reset_config_spinner, LV_OBJ_FLAG_HIDDEN); \n ui_call_rpc_handler(\"resetConfig\", NULL);\n } else {\n char buf[100];\n int remaining_time_seconds = remaining_time / 1000;\n if (remaining_time_seconds <= 1) {\n remaining_time_seconds = 1;\n }\n sprintf(buf, \"Press and hold for %d seconds\", remaining_time_seconds);\n lv_label_set_text(objects.reset_config_label, buf);\n }\n }\n}\n\nvoid action_reboot(lv_event_t * e) {\n lv_event_code_t event_code = lv_event_get_code(e);\n lv_obj_t *obj = lv_event_get_target(e);\n \n if (event_code == LV_EVENT_PRESSED) {\n t_reboot = lv_tick_get();\n }\n else if (event_code == LV_EVENT_PRESSING) {\n int remaining_time = REBOOT_HOLD_TIME * 1000 - lv_tick_elaps(t_reboot);\n if (remaining_time <= 0) {\n ui_call_rpc_handler(\"reboot\", NULL);\n } else {\n char buf[100];\n int remaining_time_seconds = remaining_time / 1000;\n if (remaining_time_seconds <= 1) {\n remaining_time_seconds = 1;\n }\n sprintf(buf, \"Press and hold for %d seconds\", remaining_time_seconds);\n lv_label_set_text(objects.reboot_label, buf);\n }\n }\n}" + "template": "#include \"actions.h\"\n#include \"screens.h\"\n#include \n#include \"ui.h\"\n#include \"vars.h\"\n\nint handle_gesture_screen_switch(lv_event_t *e, lv_dir_t direction, int screenId) {\n lv_event_code_t event_code = lv_event_get_code(e);\n if (event_code != LV_EVENT_GESTURE) {\n return 0;\n }\n\n if (lv_indev_get_gesture_dir(lv_indev_get_act()) != direction) {\n return 0;\n }\n lv_indev_wait_release(lv_indev_get_act());\n loadScreen(screenId);\n return 1;\n}\n\nvoid handle_gesture_main_screen_switch(lv_event_t *e, lv_dir_t direction) {\n const char *main_screen = get_var_main_screen();\n if (strcmp(main_screen, \"home_screen\") == 0) { \n loadScreen(SCREEN_ID_HOME_SCREEN);\n } else if (strcmp(main_screen, \"no_network_screen\") == 0) {\n loadScreen(SCREEN_ID_NO_NETWORK_SCREEN);\n }\n}\n\nvoid action_switch_to_menu(lv_event_t *e) {\n loadScreen(SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_switch_to_advanced_menu(lv_event_t *e) {\n loadScreen(SCREEN_ID_MENU_ADVANCED_SCREEN);\n}\n\nvoid action_switch_to_status(lv_event_t *e) {\n loadScreen(SCREEN_ID_STATUS_SCREEN);\n}\n\nvoid action_switch_to_about(lv_event_t *e) {\n loadScreen(SCREEN_ID_ABOUT_SCREEN);\n}\n\nvoid action_switch_to_reset_config(lv_event_t *e) {\n loadScreen(SCREEN_ID_RESET_CONFIG_SCREEN);\n}\n\nvoid action_switch_to_reboot(lv_event_t *e) {\n loadScreen(SCREEN_ID_REBOOT_SCREEN);\n}\n\nvoid action_menu_screen_gesture(lv_event_t * e) {\n handle_gesture_main_screen_switch(e, LV_DIR_RIGHT);\n}\n\nvoid action_menu_advanced_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_reset_config_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_home_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_LEFT, SCREEN_ID_MENU_SCREEN);\n}\n\nvoid action_about_screen_gesture(lv_event_t * e) {\n handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_MENU_SCREEN);\n}\n\n// user_data doesn't seem to be working, so we use a global variable here\nstatic uint32_t t_reset_config;\nstatic uint32_t t_reboot;\nstatic bool b_reboot = false;\nstatic bool b_reset_config = false;\nconst int RESET_CONFIG_HOLD_TIME = 10;\nconst int REBOOT_HOLD_TIME = 5;\n\nvoid action_reset_config(lv_event_t * e) {\n lv_event_code_t event_code = lv_event_get_code(e);\n lv_obj_t *obj = lv_event_get_target(e);\n \n if (event_code == LV_EVENT_PRESSED) {\n t_reset_config = lv_tick_get();\n }\n else if (event_code == LV_EVENT_PRESSING) {\n int remaining_time = RESET_CONFIG_HOLD_TIME * 1000 - lv_tick_elaps(t_reset_config);\n if (remaining_time <= 0) { \n lv_obj_add_flag(objects.reset_config_button, LV_OBJ_FLAG_HIDDEN);\n lv_obj_clear_flag(objects.reset_config_spinner, LV_OBJ_FLAG_HIDDEN); \n ui_call_rpc_handler(\"resetConfig\", NULL);\n b_reset_config = true;\n } else {\n b_reset_config = false;\n char buf[100];\n int remaining_time_seconds = remaining_time / 1000;\n if (remaining_time_seconds <= 1) {\n remaining_time_seconds = 1;\n }\n sprintf(buf, \"Press and hold for %d seconds\", remaining_time_seconds);\n lv_label_set_text(objects.reset_config_label, buf);\n }\n } else if (event_code == LV_EVENT_RELEASED) {\n if (!b_reset_config) {\n lv_label_set_text(objects.reset_config_label, \"Press and hold for 10 seconds\");\n }\n }\n}\n\nvoid action_reboot(lv_event_t * e) {\n lv_event_code_t event_code = lv_event_get_code(e);\n lv_obj_t *obj = lv_event_get_target(e);\n \n if (event_code == LV_EVENT_PRESSED) {\n t_reboot = lv_tick_get();\n }\n else if (event_code == LV_EVENT_PRESSING) {\n int remaining_time = REBOOT_HOLD_TIME * 1000 - lv_tick_elaps(t_reboot);\n if (remaining_time <= 0) {\n ui_call_rpc_handler(\"reboot\", NULL);\n b_reboot = false;\n } else {\n b_reboot = false;\n char buf[100];\n int remaining_time_seconds = remaining_time / 1000;\n if (remaining_time_seconds <= 1) {\n remaining_time_seconds = 1;\n }\n sprintf(buf, \"Press and hold for %d seconds\", remaining_time_seconds);\n lv_label_set_text(objects.reboot_label, buf);\n }\n } else if (event_code == LV_EVENT_RELEASED) {\n if (!b_reboot) {\n lv_label_set_text(objects.reboot_label, \"Press and hold for 5 seconds\");\n }\n }\n}" }, { "objID": "1dbd1b7e-7270-47f0-ee02-e80bdae287cf", @@ -58,7 +58,7 @@ { "objID": "316b04e4-a7de-4afc-c413-31f5f36d3843", "fileName": "vars.c", - "template": "#include \n//${eez-studio LVGL_INCLUDE}\n#include \"vars.h\"\n\nchar app_version[100] = { 0 };\nchar system_version[100] = { 0 };\nchar lvgl_version[32] = { 0 };\n\nconst char *get_var_app_version() {\n return app_version;\n}\n\nconst char *get_var_system_version() {\n return system_version;\n}\n\nconst char *get_var_lvgl_version() {\n if (lvgl_version[0] == '\\0') {\n char buf[32];\n sprintf(buf, \"%d.%d.%d\", LVGL_VERSION_MAJOR, LVGL_VERSION_MINOR, LVGL_VERSION_PATCH);\n \n \n strncpy(lvgl_version, buf, sizeof(lvgl_version) / sizeof(char));\n app_version[sizeof(lvgl_version) / sizeof(char) - 1] = 0;\n }\n return lvgl_version;\n}\n\nvoid set_var_app_version(const char *value) {\n strncpy(app_version, value, sizeof(app_version) / sizeof(char));\n app_version[sizeof(app_version) / sizeof(char) - 1] = 0;\n}\n\nvoid set_var_system_version(const char *value) {\n strncpy(system_version, value, sizeof(system_version) / sizeof(char));\n system_version[sizeof(system_version) / sizeof(char) - 1] = 0;\n}\n\nvoid set_var_lvgl_version(const char *value) {}" + "template": "#include \n//${eez-studio LVGL_INCLUDE}\n#include \"vars.h\"\n\nchar app_version[100] = { 0 };\nchar system_version[100] = { 0 };\nchar lvgl_version[32] = { 0 };\nchar main_screen[32] = \"home_screen\";\n\nconst char *get_var_app_version() {\n return app_version;\n}\n\nconst char *get_var_system_version() {\n return system_version;\n}\n\nconst char *get_var_lvgl_version() {\n if (lvgl_version[0] == '\\0') {\n char buf[32];\n sprintf(buf, \"%d.%d.%d\", LVGL_VERSION_MAJOR, LVGL_VERSION_MINOR, LVGL_VERSION_PATCH);\n \n \n strncpy(lvgl_version, buf, sizeof(lvgl_version) / sizeof(char));\n app_version[sizeof(lvgl_version) / sizeof(char) - 1] = 0;\n }\n return lvgl_version;\n}\n\nvoid set_var_app_version(const char *value) {\n strncpy(app_version, value, sizeof(app_version) / sizeof(char));\n app_version[sizeof(app_version) / sizeof(char) - 1] = 0;\n}\n\nvoid set_var_system_version(const char *value) {\n strncpy(system_version, value, sizeof(system_version) / sizeof(char));\n system_version[sizeof(system_version) / sizeof(char) - 1] = 0;\n}\n\nvoid set_var_lvgl_version(const char *value) {}\n\nvoid set_var_main_screen(const char *value) {\n strncpy(main_screen, value, sizeof(main_screen) / sizeof(char));\n main_screen[sizeof(main_screen) / sizeof(char) - 1] = 0;\n}\n\nconst char *get_var_main_screen() {\n return main_screen;\n}" }, { "objID": "cbe7cde1-8920-476a-b2a2-1761ae7451b0", @@ -140,6 +140,14 @@ "defaultValue": "\"\"", "persistent": false, "native": false + }, + { + "objID": "8a98241b-8720-417c-9ffe-6237387dd2fd", + "name": "mainScreen", + "type": "string", + "defaultValue": "false", + "persistent": false, + "native": false } ], "structures": [], @@ -6968,6 +6976,13 @@ "handlerType": "action", "action": "ResetConfig", "userData": 0 + }, + { + "objID": "1db00129-3a48-4fe9-8de4-8fb694a779ee", + "eventName": "RELEASED", + "handlerType": "action", + "action": "ResetConfig", + "userData": 0 } ], "leftUnit": "px", @@ -7608,11 +7623,18 @@ "userData": 0 }, { - "objID": "35cd8033-6cd0-4359-c995-e627dac3815c", + "objID": "3c264f23-8262-4045-f48a-724205f112ca", "eventName": "PRESSING", "handlerType": "action", "action": "Reboot", "userData": 0 + }, + { + "objID": "35cd8033-6cd0-4359-c995-e627dac3815c", + "eventName": "RELEASED", + "handlerType": "action", + "action": "Reboot", + "userData": 0 } ], "leftUnit": "px", diff --git a/internal/native/eez/src/ui/actions.c b/internal/native/eez/src/ui/actions.c index 3deb1f1c..dc30de4d 100644 --- a/internal/native/eez/src/ui/actions.c +++ b/internal/native/eez/src/ui/actions.c @@ -1,7 +1,8 @@ #include "actions.h" #include "screens.h" -#include "ui.h" #include +#include "ui.h" +#include "vars.h" int handle_gesture_screen_switch(lv_event_t *e, lv_dir_t direction, int screenId) { lv_event_code_t event_code = lv_event_get_code(e); @@ -17,6 +18,15 @@ int handle_gesture_screen_switch(lv_event_t *e, lv_dir_t direction, int screenId return 1; } +void handle_gesture_main_screen_switch(lv_event_t *e, lv_dir_t direction) { + const char *main_screen = get_var_main_screen(); + if (strcmp(main_screen, "home_screen") == 0) { + loadScreen(SCREEN_ID_HOME_SCREEN); + } else if (strcmp(main_screen, "no_network_screen") == 0) { + loadScreen(SCREEN_ID_NO_NETWORK_SCREEN); + } +} + void action_switch_to_menu(lv_event_t *e) { loadScreen(SCREEN_ID_MENU_SCREEN); } @@ -42,7 +52,7 @@ void action_switch_to_reboot(lv_event_t *e) { } void action_menu_screen_gesture(lv_event_t * e) { - handle_gesture_screen_switch(e, LV_DIR_RIGHT, SCREEN_ID_HOME_SCREEN); + handle_gesture_main_screen_switch(e, LV_DIR_RIGHT); } void action_menu_advanced_screen_gesture(lv_event_t * e) { @@ -64,6 +74,8 @@ void action_about_screen_gesture(lv_event_t * e) { // user_data doesn't seem to be working, so we use a global variable here static uint32_t t_reset_config; static uint32_t t_reboot; +static bool b_reboot = false; +static bool b_reset_config = false; const int RESET_CONFIG_HOLD_TIME = 10; const int REBOOT_HOLD_TIME = 5; @@ -80,7 +92,9 @@ void action_reset_config(lv_event_t * e) { lv_obj_add_flag(objects.reset_config_button, LV_OBJ_FLAG_HIDDEN); lv_obj_clear_flag(objects.reset_config_spinner, LV_OBJ_FLAG_HIDDEN); ui_call_rpc_handler("resetConfig", NULL); + b_reset_config = true; } else { + b_reset_config = false; char buf[100]; int remaining_time_seconds = remaining_time / 1000; if (remaining_time_seconds <= 1) { @@ -89,6 +103,10 @@ void action_reset_config(lv_event_t * e) { sprintf(buf, "Press and hold for %d seconds", remaining_time_seconds); lv_label_set_text(objects.reset_config_label, buf); } + } else if (event_code == LV_EVENT_RELEASED) { + if (!b_reset_config) { + lv_label_set_text(objects.reset_config_label, "Press and hold for 10 seconds"); + } } } @@ -103,7 +121,9 @@ void action_reboot(lv_event_t * e) { int remaining_time = REBOOT_HOLD_TIME * 1000 - lv_tick_elaps(t_reboot); if (remaining_time <= 0) { ui_call_rpc_handler("reboot", NULL); + b_reboot = false; } else { + b_reboot = false; char buf[100]; int remaining_time_seconds = remaining_time / 1000; if (remaining_time_seconds <= 1) { @@ -112,5 +132,9 @@ void action_reboot(lv_event_t * e) { sprintf(buf, "Press and hold for %d seconds", remaining_time_seconds); lv_label_set_text(objects.reboot_label, buf); } + } else if (event_code == LV_EVENT_RELEASED) { + if (!b_reboot) { + lv_label_set_text(objects.reboot_label, "Press and hold for 5 seconds"); + } } } \ No newline at end of file diff --git a/internal/native/eez/src/ui/screens.c b/internal/native/eez/src/ui/screens.c index 9ee7fc60..ce9809ce 100644 --- a/internal/native/eez/src/ui/screens.c +++ b/internal/native/eez/src/ui/screens.c @@ -1905,6 +1905,7 @@ void create_screen_reset_config_screen() { lv_obj_set_size(obj, LV_PCT(100), 50); lv_obj_add_event_cb(obj, action_reset_config, LV_EVENT_PRESSED, (void *)0); lv_obj_add_event_cb(obj, action_reset_config, LV_EVENT_PRESSING, (void *)0); + lv_obj_add_event_cb(obj, action_reset_config, LV_EVENT_RELEASED, (void *)0); lv_obj_set_style_bg_color(obj, lv_color_hex(0xffdc2626), LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_text_align(obj, LV_TEXT_ALIGN_LEFT, LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_pad_right(obj, 13, LV_PART_MAIN | LV_STATE_DEFAULT); @@ -2088,6 +2089,7 @@ void create_screen_reboot_screen() { lv_obj_set_size(obj, LV_PCT(100), 50); lv_obj_add_event_cb(obj, action_reboot, LV_EVENT_PRESSED, (void *)0); lv_obj_add_event_cb(obj, action_reboot, LV_EVENT_PRESSING, (void *)0); + lv_obj_add_event_cb(obj, action_reboot, LV_EVENT_RELEASED, (void *)0); lv_obj_set_style_bg_color(obj, lv_color_hex(0xffdc2626), LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_text_align(obj, LV_TEXT_ALIGN_LEFT, LV_PART_MAIN | LV_STATE_DEFAULT); lv_obj_set_style_pad_right(obj, 13, LV_PART_MAIN | LV_STATE_DEFAULT); diff --git a/internal/native/eez/src/ui/vars.c b/internal/native/eez/src/ui/vars.c index 7305622a..7d22d7a2 100644 --- a/internal/native/eez/src/ui/vars.c +++ b/internal/native/eez/src/ui/vars.c @@ -5,6 +5,7 @@ char app_version[100] = { 0 }; char system_version[100] = { 0 }; char lvgl_version[32] = { 0 }; +char main_screen[32] = "home_screen"; const char *get_var_app_version() { return app_version; @@ -36,4 +37,13 @@ void set_var_system_version(const char *value) { system_version[sizeof(system_version) / sizeof(char) - 1] = 0; } -void set_var_lvgl_version(const char *value) {} \ No newline at end of file +void set_var_lvgl_version(const char *value) {} + +void set_var_main_screen(const char *value) { + strncpy(main_screen, value, sizeof(main_screen) / sizeof(char)); + main_screen[sizeof(main_screen) / sizeof(char) - 1] = 0; +} + +const char *get_var_main_screen() { + return main_screen; +} \ No newline at end of file diff --git a/internal/native/eez/src/ui/vars.h b/internal/native/eez/src/ui/vars.h index 66be603d..7d9d5890 100644 --- a/internal/native/eez/src/ui/vars.h +++ b/internal/native/eez/src/ui/vars.h @@ -17,7 +17,8 @@ extern "C" { enum FlowGlobalVariables { FLOW_GLOBAL_VARIABLE_APP_VERSION = 0, FLOW_GLOBAL_VARIABLE_SYSTEM_VERSION = 1, - FLOW_GLOBAL_VARIABLE_LVGL_VERSION = 2 + FLOW_GLOBAL_VARIABLE_LVGL_VERSION = 2, + FLOW_GLOBAL_VARIABLE_MAIN_SCREEN = 3 }; // Native global variables @@ -28,6 +29,8 @@ extern const char *get_var_system_version(); extern void set_var_system_version(const char *value); extern const char *get_var_lvgl_version(); extern void set_var_lvgl_version(const char *value); +extern const char *get_var_main_screen(); +extern void set_var_main_screen(const char *value); #ifdef __cplusplus diff --git a/internal/native/lib/libjknative.a b/internal/native/lib/libjknative.a index 2c8a4dde97f84c4779920b70202a82fc0827a282..d3d42118e58d33941d28b9d0d0ca901c92bc0aa7 100644 GIT binary patch delta 17454 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 U-vPy