Loader: shrink reboot relaunch code

This commit is contained in:
apfxtech
2026-09-20 21:28:59 +03:00
parent 279d2cc13a
commit 0f0c75252e
4 changed files with 24 additions and 52 deletions
@@ -115,19 +115,11 @@ void desktop_scene_main_on_enter(void* context) {
if(!desktop->pending_launch_done) {
desktop->pending_launch_done = true;
FuriString* pending_name = furi_string_alloc();
FuriString* pending_args = furi_string_alloc();
if(loader_pending_launch_take(pending_name, pending_args)) {
FURI_LOG_I(TAG, "Starting pending app: %s", furi_string_get_cstr(pending_name));
LoaderPendingLaunch pending;
if(loader_pending_launch_take(&pending)) {
loader_start_detached_with_gui_error(
desktop->loader,
furi_string_get_cstr(pending_name),
furi_string_empty(pending_args) ? NULL : furi_string_get_cstr(pending_args));
desktop->loader, pending.name_or_path, pending.args[0] ? pending.args : NULL);
}
furi_string_free(pending_args);
furi_string_free(pending_name);
}
}
+3 -12
View File
@@ -148,15 +148,9 @@ static void loader_show_gui_error(
loader_dialog_prepare_and_show(dialogs, &err_outdated_firmware);
break;*/
case LoaderStatusErrorOutOfMemory:
dialog_message_set_header(
message, "Error: Out of Memory", 64, 0, AlignCenter, AlignTop);
dialog_message_set_header(message, "Out of memory", 64, 0, AlignCenter, AlignTop);
dialog_message_set_text(
message,
"Not enough free RAM.\nReboot and run the app?",
64,
13,
AlignCenter,
AlignTop);
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);
@@ -640,10 +634,7 @@ static LoaderMessageLoaderStatusResult loader_start_external_app(
flipper_application_get_manifest(loader->app.fap);
if(memmgr_heap_get_max_free_block() < ((size_t)run_manifest->stack_size + 1024)) {
result.value = loader_make_status_error(
LoaderStatusErrorInternal,
error_message,
"Load failed, %s: no memory for stack",
path);
LoaderStatusErrorInternal, error_message, "No memory for stack");
result.error = LoaderStatusErrorOutOfMemory;
break;
}
+12 -28
View File
@@ -5,17 +5,10 @@
#include <saved_struct.h>
#include <storage/storage.h>
#define TAG "LoaderPending"
#define LOADER_PENDING_PATH INT_PATH(".loader.pending")
#define LOADER_PENDING_MAGIC (0x4C)
#define LOADER_PENDING_VERSION (1)
typedef struct {
char name_or_path[128];
char args[128];
} LoaderPendingLaunch;
bool loader_pending_launch_save(const char* name_or_path, const char* args) {
furi_check(name_or_path);
@@ -23,12 +16,10 @@ bool loader_pending_launch_save(const char* name_or_path, const char* args) {
if(strlcpy(pending.name_or_path, name_or_path, sizeof(pending.name_or_path)) >=
sizeof(pending.name_or_path)) {
FURI_LOG_E(TAG, "Name does not fit: %s", name_or_path);
return false;
}
if(args && strlcpy(pending.args, args, sizeof(pending.args)) >= sizeof(pending.args)) {
FURI_LOG_E(TAG, "Args do not fit: %s", args);
return false;
}
@@ -40,36 +31,29 @@ bool loader_pending_launch_save(const char* name_or_path, const char* args) {
LOADER_PENDING_VERSION);
}
bool loader_pending_launch_take(FuriString* name_or_path, FuriString* args) {
furi_check(name_or_path);
furi_check(args);
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)) {
LoaderPendingLaunch pending;
bool loaded = saved_struct_load(
taken = saved_struct_load(
LOADER_PENDING_PATH,
&pending,
sizeof(pending),
pending,
sizeof(*pending),
LOADER_PENDING_MAGIC,
LOADER_PENDING_VERSION);
storage_simply_remove(storage, LOADER_PENDING_PATH);
if(loaded) {
pending.name_or_path[sizeof(pending.name_or_path) - 1] = '\0';
pending.args[sizeof(pending.args) - 1] = '\0';
if(pending.name_or_path[0] != '\0') {
furi_string_set_str(name_or_path, pending.name_or_path);
furi_string_set_str(args, pending.args);
taken = true;
}
}
}
furi_record_close(RECORD_STORAGE);
return taken;
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';
}
@@ -2,6 +2,11 @@
#include <furi.h>
typedef struct {
char name_or_path[96];
char args[96];
} LoaderPendingLaunch;
bool loader_pending_launch_save(const char* name_or_path, const char* args);
bool loader_pending_launch_take(FuriString* name_or_path, FuriString* args);
bool loader_pending_launch_take(LoaderPendingLaunch* pending);