Loader: simplify pending launch

This commit is contained in:
apfxtech
2026-09-20 21:28:59 +03:00
parent 0f0c75252e
commit 9b2edccc25
4 changed files with 54 additions and 39 deletions
@@ -115,10 +115,11 @@ void desktop_scene_main_on_enter(void* context) {
if(!desktop->pending_launch_done) {
desktop->pending_launch_done = true;
LoaderPendingLaunch pending;
if(loader_pending_launch_take(&pending)) {
LoaderPendingLaunch* pending = loader_pending_launch_take();
if(pending) {
loader_start_detached_with_gui_error(
desktop->loader, pending.name_or_path, pending.args[0] ? pending.args : NULL);
desktop->loader, pending->name_or_path, pending->args[0] ? pending->args : NULL);
free(pending);
}
}
}
+5 -1
View File
@@ -153,7 +153,11 @@ static void loader_show_gui_error(
message, "Reboot and run the app?", 64, 24, AlignCenter, AlignTop);
dialog_message_set_buttons(message, NULL, NULL, "Reboot");
if(dialog_message_show(dialogs, message) == DialogMessageButtonRight) {
loader_pending_launch_save(name, args);
if(!loader_pending_launch_save(name, args)) {
dialog_message_set_text(
message, "App will not reopen", 64, 24, AlignCenter, AlignTop);
dialog_message_show(dialogs, message);
}
furi_hal_power_reset();
}
break;
+40 -32
View File
@@ -12,48 +12,56 @@
bool loader_pending_launch_save(const char* name_or_path, const char* args) {
furi_check(name_or_path);
LoaderPendingLaunch pending = {0};
LoaderPendingLaunch* pending = malloc(sizeof(LoaderPendingLaunch));
bool success = false;
if(strlcpy(pending.name_or_path, name_or_path, sizeof(pending.name_or_path)) >=
sizeof(pending.name_or_path)) {
return false;
}
do {
if(strlcpy(pending->name_or_path, name_or_path, sizeof(pending->name_or_path)) >=
sizeof(pending->name_or_path)) {
break;
}
if(args && strlcpy(pending.args, args, sizeof(pending.args)) >= sizeof(pending.args)) {
return false;
}
if(args && strlcpy(pending->args, args, sizeof(pending->args)) >= sizeof(pending->args)) {
break;
}
return saved_struct_save(
LOADER_PENDING_PATH,
&pending,
sizeof(pending),
LOADER_PENDING_MAGIC,
LOADER_PENDING_VERSION);
}
bool loader_pending_launch_take(LoaderPendingLaunch* pending) {
furi_check(pending);
Storage* storage = furi_record_open(RECORD_STORAGE);
bool taken = false;
if(storage_file_exists(storage, LOADER_PENDING_PATH)) {
taken = saved_struct_load(
success = saved_struct_save(
LOADER_PENDING_PATH,
pending,
sizeof(*pending),
sizeof(LoaderPendingLaunch),
LOADER_PENDING_MAGIC,
LOADER_PENDING_VERSION);
} while(false);
free(pending);
return success;
}
LoaderPendingLaunch* loader_pending_launch_take(void) {
Storage* storage = furi_record_open(RECORD_STORAGE);
LoaderPendingLaunch* pending = NULL;
if(storage_common_stat(storage, LOADER_PENDING_PATH, NULL) == FSE_OK) {
pending = malloc(sizeof(LoaderPendingLaunch));
bool loaded = saved_struct_load(
LOADER_PENDING_PATH,
pending,
sizeof(LoaderPendingLaunch),
LOADER_PENDING_MAGIC,
LOADER_PENDING_VERSION);
storage_simply_remove(storage, LOADER_PENDING_PATH);
pending->name_or_path[sizeof(pending->name_or_path) - 1] = '\0';
pending->args[sizeof(pending->args) - 1] = '\0';
if(!loaded || (pending->name_or_path[0] == '\0')) {
free(pending);
pending = NULL;
}
}
furi_record_close(RECORD_STORAGE);
if(!taken) return false;
pending->name_or_path[sizeof(pending->name_or_path) - 1] = '\0';
pending->args[sizeof(pending->args) - 1] = '\0';
return pending->name_or_path[0] != '\0';
return pending;
}
@@ -2,11 +2,13 @@
#include <furi.h>
#define LOADER_PENDING_MAX_PATH_LEN 255u
typedef struct {
char name_or_path[96];
char args[96];
char name_or_path[LOADER_PENDING_MAX_PATH_LEN];
char args[LOADER_PENDING_MAX_PATH_LEN];
} LoaderPendingLaunch;
bool loader_pending_launch_save(const char* name_or_path, const char* args);
bool loader_pending_launch_take(LoaderPendingLaunch* pending);
LoaderPendingLaunch* loader_pending_launch_take(void);