diff --git a/PanoPainter-OSX/main.cpp b/PanoPainter-OSX/main.cpp index bd48321f..9cac041f 100644 --- a/PanoPainter-OSX/main.cpp +++ b/PanoPainter-OSX/main.cpp @@ -582,10 +582,10 @@ NSString* keyCodeToString(NSUInteger keyCode, NSUInteger mods) { LOG("error creating rec path: %s", [[err localizedDescription] cStringUsingEncoding:NSASCIIStringEncoding]); } - App::I->data_path = [docpath cStringUsingEncoding:NSASCIIStringEncoding]; + const std::string data_path = [docpath cStringUsingEncoding:NSASCIIStringEncoding]; NSString* recpath = [docpath stringByAppendingString:@"/rec"]; - App::I->rec_path = [recpath cStringUsingEncoding:NSASCIIStringEncoding]; + const std::string recording_path = [recpath cStringUsingEncoding:NSASCIIStringEncoding]; if (![[NSFileManager defaultManager] createDirectoryAtPath:recpath withIntermediateDirectories:YES attributes:nil error:&err]) { LOG("error creating rec path: %s", [[err localizedDescription] cStringUsingEncoding:NSASCIIStringEncoding]); @@ -613,6 +613,13 @@ NSString* keyCodeToString(NSUInteger keyCode, NSUInteger mods) { LOG("error creating settings path: %s", [[err localizedDescription] cStringUsingEncoding:NSASCIIStringEncoding]); } + + pp::platform::legacy::set_legacy_storage_paths({ + data_path, + data_path, + recording_path, + {}, + }); } @end diff --git a/PanoPainter/GameViewController.m b/PanoPainter/GameViewController.m index 07baf8bd..75d8442a 100644 --- a/PanoPainter/GameViewController.m +++ b/PanoPainter/GameViewController.m @@ -112,19 +112,19 @@ std::recursive_mutex lock_mutex; { NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString* docpath = (NSString*)[paths objectAtIndex:0]; - App::I->data_path = [docpath cStringUsingEncoding:NSASCIIStringEncoding]; + const std::string data_path = [docpath cStringUsingEncoding:NSASCIIStringEncoding]; NSError* err = nil; NSString* recpath = [docpath stringByAppendingString:@"/rec"]; - App::I->rec_path = [recpath cStringUsingEncoding:NSASCIIStringEncoding]; + const std::string recording_path = [recpath cStringUsingEncoding:NSASCIIStringEncoding]; if (![[NSFileManager defaultManager] createDirectoryAtPath:recpath withIntermediateDirectories:YES attributes:nil error:&err]) { LOG("error creating rec path: %s", [[err localizedDescription] cStringUsingEncoding:NSASCIIStringEncoding]); } // tmp NSString* tmppath = [docpath stringByAppendingString:@"/tmp"]; - App::I->tmp_path = [tmppath cStringUsingEncoding:NSASCIIStringEncoding]; + const std::string temporary_path = [tmppath cStringUsingEncoding:NSASCIIStringEncoding]; if (![[NSFileManager defaultManager] createDirectoryAtPath:tmppath withIntermediateDirectories:YES attributes:nil error:&err]) { LOG("error creating rec path: %s", [[err localizedDescription] cStringUsingEncoding:NSASCIIStringEncoding]); @@ -152,6 +152,13 @@ std::recursive_mutex lock_mutex; { LOG("error creating settings path: %s", [[err localizedDescription] cStringUsingEncoding:NSASCIIStringEncoding]); } + + pp::platform::legacy::set_legacy_storage_paths({ + data_path, + data_path, + recording_path, + temporary_path, + }); } - (void)pick_photo:(std::function) callback diff --git a/android/src/cpp/main.cpp b/android/src/cpp/main.cpp index de6c35fc..e57d0c2a 100644 --- a/android/src/cpp/main.cpp +++ b/android/src/cpp/main.cpp @@ -31,6 +31,7 @@ #include "pch.h" #include "app.h" +#include "platform_legacy/legacy_platform_state.h" #include "asset.h" #include "keymap.h" #include "main.h" @@ -274,6 +275,12 @@ JNIEXPORT void JNICALL Java_com_omixlab_panopainter_MainActivity_pickExternalCal App::I->data_path = file_path; App::I->work_path = file_path; App::I->rec_path = file_path + "/frames"; + pp::platform::legacy::set_legacy_storage_paths({ + App::I->data_path, + App::I->work_path, + App::I->rec_path, + App::I->tmp_path, + }); App::I->initLog(); } @@ -605,7 +612,6 @@ static int engine_init_display(struct engine* engine) { if (resuming_context) { LOG("RESUME APP"); - App::I->and_app = engine->app; LOG("release egl context"); eglMakeCurrent(engine->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); mutex.unlock(); @@ -703,14 +709,18 @@ static int engine_init_display(struct engine* engine) { LOG("PROP Mode: %s", os_props["ro.product.model"].c_str()); Asset::set_android_asset_manager(engine->app->activity->assetManager); - App::I->and_app = engine->app; - App::I->and_engine = engine; //std::string base_path = engine->app->activity->externalDataPath ? // engine->app->activity->externalDataPath : get_data_path(engine->app); if (App::I->data_path.empty() || App::I->data_path == ".") App::I->data_path = get_data_path(); LOG("data_path %s", App::I->data_path.c_str()); + pp::platform::legacy::set_legacy_storage_paths({ + App::I->data_path, + App::I->work_path.empty() ? App::I->data_path : App::I->work_path, + App::I->rec_path, + App::I->tmp_path, + }); #ifdef __QUEST__ diff --git a/docs/modernization/roadmap.md b/docs/modernization/roadmap.md index ba77ee27..d6d181f6 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -92,6 +92,14 @@ Current hotspot files: Latest slice: +- `App` no longer owns `and_app` or `and_engine`; the retained Android + entrypoint now seeds only the explicit legacy platform storage snapshot + needed by touched platform services instead of storing Android-native + handles on the app singleton. +- `active_legacy_storage_paths()` no longer snapshots `App::I` lazily inside + `src/platform_legacy/legacy_platform_state.*`; storage roots are now seeded + explicitly from app startup plus the iOS, macOS, and Android entrypoints + through `set_legacy_storage_paths(...)`. - `pp_platform_api` no longer compiles `src/platform_linux/linux_platform_services.*`; Linux concrete platform code now lives in `pp_platform_linux`, which `pp_legacy_app` and @@ -215,9 +223,11 @@ Current architecture mismatches that must be treated as real blockers: the retained GLFW window hooks, Apple handle snapshots, and fallback storage-path return now also using local retained-state helpers instead of direct method-body reads, while Windows VR session snapshot state now also - lives behind platform-owned helpers instead of on `App`, and the + lives behind platform-owned helpers instead of on `App`, the `platform_legacy`-mirrored Apple/GLFW handle cluster is now seeded - explicitly from platform entrypoints instead of being copied out of `App`. + explicitly from platform entrypoints instead of being copied out of `App`, + and retained storage roots are now also seeded explicitly instead of being + lazily copied from `App::I` inside `active_legacy_storage_paths()`. - `src/platform_legacy/legacy_platform_services.*` is still part of the live app shell. - `pp_panopainter_ui` still depends on `pp_legacy_app`. diff --git a/docs/modernization/tasks.md b/docs/modernization/tasks.md index da532356..2877f2ab 100644 --- a/docs/modernization/tasks.md +++ b/docs/modernization/tasks.md @@ -1147,6 +1147,9 @@ Current slice: - retained storage-path state now also lives in `src/platform_legacy/legacy_platform_state.*` instead of staying inline in `src/platform_legacy/legacy_platform_services.cpp` +- `active_legacy_storage_paths()` now consumes storage roots seeded explicitly + through `set_legacy_storage_paths(...)` from app startup plus the iOS, + macOS, and Android entrypoints instead of lazily snapshotting `App::I` - retained GLFW window hooks/state and retained Apple UI/app handle state now also live in `src/platform_legacy/legacy_platform_state.*`, and `src/platform_legacy/legacy_platform_services.cpp` now consumes those @@ -1204,8 +1207,11 @@ Current slice: lives on `App`; retained Apple/GLFW platform state is now seeded explicitly from the iOS, macOS, Linux, and WebGL entrypoints through `src/platform_legacy/legacy_platform_state.*`. -- `App` still owns Android-native handles plus broader retained legacy - platform state, so this remains a live ownership task. +- `App` also no longer owns `and_app` or `and_engine`; the retained Android + entrypoint now seeds only the explicit legacy platform storage snapshot + needed by touched platform services. +- `App` still owns broader retained legacy platform state, so this remains a + live ownership task. Write scope: - `src/platform_legacy/legacy_platform_services.*` diff --git a/src/app.h b/src/app.h index 6de58710..046d5459 100644 --- a/src/app.h +++ b/src/app.h @@ -155,10 +155,6 @@ public: int idle_ms = 100; pp::platform::PlatformServices* platform_services_ = nullptr; -#ifdef __ANDROID__ - struct android_app* and_app; - struct engine* and_engine; -#endif std::string clipboard_get_text(); bool clipboard_set_text(const std::string& s); void pick_image(std::function callback); diff --git a/src/legacy_app_startup_services.cpp b/src/legacy_app_startup_services.cpp index 77e01e2e..37909d8b 100644 --- a/src/legacy_app_startup_services.cpp +++ b/src/legacy_app_startup_services.cpp @@ -7,6 +7,7 @@ #include "legacy_gl_runtime_dispatch.h" #include "legacy_preference_storage.h" #include "legacy_ui_gl_dispatch.h" +#include "platform_legacy/legacy_platform_state.h" #include "platform_api/platform_services.h" #include "renderer_gl/opengl_capabilities.h" @@ -134,6 +135,12 @@ void execute_legacy_app_init_log(App& app) // TODO: save this path somewhere in the settings, don't overwrite every start app.work_path = paths.work_path.empty() ? app.data_path : paths.work_path; + pp::platform::legacy::set_legacy_storage_paths({ + app.data_path, + app.work_path, + app.rec_path, + app.tmp_path, + }); //LogRemote::I.start(); LogRemote::I.file_init(); diff --git a/src/platform_legacy/legacy_platform_state.cpp b/src/platform_legacy/legacy_platform_state.cpp index 26f24266..d1f95e2d 100644 --- a/src/platform_legacy/legacy_platform_state.cpp +++ b/src/platform_legacy/legacy_platform_state.cpp @@ -1,8 +1,6 @@ #include "pch.h" #include "platform_legacy/legacy_platform_state.h" -#include "app.h" - #if defined(__LINUX__) || defined(__WEB__) #include #endif @@ -14,6 +12,12 @@ struct RetainedLegacyStoragePaths final { pp::platform::PlatformStoragePaths storage_paths; }; +[[nodiscard]] RetainedLegacyStoragePaths& retained_legacy_storage_paths() +{ + static RetainedLegacyStoragePaths state; + return state; +} + } #if defined(__LINUX__) || defined(__WEB__) @@ -78,17 +82,12 @@ void set_legacy_apple_state( [[nodiscard]] const pp::platform::PlatformStoragePaths& active_legacy_storage_paths() { - static RetainedLegacyStoragePaths state = [] { - RetainedLegacyStoragePaths retained; - retained.storage_paths = { - App::I->data_path, - App::I->work_path, - App::I->rec_path, - App::I->tmp_path, - }; - return retained; - }(); - return state.storage_paths; + return retained_legacy_storage_paths().storage_paths; +} + +void set_legacy_storage_paths(pp::platform::PlatformStoragePaths paths) +{ + retained_legacy_storage_paths().storage_paths = std::move(paths); } } diff --git a/src/platform_legacy/legacy_platform_state.h b/src/platform_legacy/legacy_platform_state.h index 9f5569e3..3501bcb6 100644 --- a/src/platform_legacy/legacy_platform_state.h +++ b/src/platform_legacy/legacy_platform_state.h @@ -59,5 +59,6 @@ void set_legacy_apple_state( #endif [[nodiscard]] const pp::platform::PlatformStoragePaths& active_legacy_storage_paths(); +void set_legacy_storage_paths(pp::platform::PlatformStoragePaths paths); }