diff --git a/docs/modernization/roadmap.md b/docs/modernization/roadmap.md index d7779198..045bd86f 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -70,6 +70,9 @@ What is already real: - `pp_app_core` Latest slice: +- `src/platform_windows/windows_runtime_shell.cpp` no longer keeps a separate + retained `AppRuntime*` binding; the touched Windows shell and platform + helpers now derive runtime ownership directly from the owned `App`. - `src/platform_windows/windows_runtime_shell.cpp` now explicitly owns the Windows `App` lifetime through a retained `std::unique_ptr` instead of raw `new`/`delete` plus shutdown-side manual cleanup in the lifecycle shell. @@ -79,6 +82,10 @@ Latest slice: - `src/platform_windows/windows_window_shell.cpp` now routes the touched key-map and VR-state reads through narrow helpers instead of keeping the broader retained-state bundle live across the main window-proc body. +- `src/platform_legacy/legacy_platform_state.*` no longer exposes the mutable + retained GLFW hook bundle; Linux/Web fallback render-context/present/close + calls now go through narrow GLFW helper functions instead of an exported hook + struct. - `scripts/automation/quiet-validate.ps1` is now the bundled checkpoint path for Windows build/test plus optional platform and Apple remote validation, with one compact JSON summary under `out/logs/quiet-validation`. diff --git a/docs/modernization/tasks.md b/docs/modernization/tasks.md index c68808b0..f46bebb5 100644 --- a/docs/modernization/tasks.md +++ b/docs/modernization/tasks.md @@ -78,6 +78,9 @@ Completed, blocked, and superseded task history moved to the queue is now ordered by code movement instead. Current slice: +- `src/platform_windows/windows_runtime_shell.cpp` no longer keeps a separate + retained `AppRuntime*`; the touched Windows lifecycle and main-thread task + dispatch paths now derive runtime ownership directly from the owned app. - `src/platform_windows/windows_runtime_shell.cpp` now owns the Windows `App` through a retained `std::unique_ptr`, so startup/early-return/convert paths no longer manage raw `new`/`delete` app lifetime manually. @@ -87,6 +90,9 @@ Current slice: - `src/platform_windows/windows_window_shell.cpp` now routes the touched key-map synchronization and VR close state through narrow helpers instead of carrying the broader retained window bundle live across the window-proc path. +- `src/platform_legacy/legacy_platform_state.*` no longer exports the mutable + retained GLFW hook bundle; Linux/Web fallback render-context, present, and + app-close paths now route through narrow GLFW helper functions instead. - `scripts/automation/quiet-validate.ps1` now owns the recommended quiet checkpoint path and can bundle Windows build/test, Android/platform sweeps, and Apple remote compile gates into one compact JSON summary with diff --git a/src/platform_legacy/legacy_platform_services.cpp b/src/platform_legacy/legacy_platform_services.cpp index 0e7a67f9..2590d280 100644 --- a/src/platform_legacy/legacy_platform_services.cpp +++ b/src/platform_legacy/legacy_platform_services.cpp @@ -177,7 +177,7 @@ public: #elif __ANDROID__ android_async_lock(); #elif __LINUX__ || __WEB__ - pp::platform::legacy::active_legacy_glfw_window_hooks().acquire_render_context(); + pp::platform::legacy::acquire_legacy_glfw_render_context(); #endif } @@ -197,7 +197,7 @@ public: #elif __ANDROID__ android_async_swap(); #elif __LINUX__ || __WEB__ - pp::platform::legacy::active_legacy_glfw_window_hooks().present_render_context(); + pp::platform::legacy::present_legacy_glfw_render_context(); #endif } @@ -508,7 +508,7 @@ public: #ifdef __OSX__ pp::platform::apple::active_legacy_apple_document_platform_services().request_app_close(); #elif __LINUX__ - pp::platform::legacy::active_legacy_glfw_window_hooks().request_app_close(); + pp::platform::legacy::request_legacy_glfw_app_close(); #endif } diff --git a/src/platform_legacy/legacy_platform_state.cpp b/src/platform_legacy/legacy_platform_state.cpp index 24e35516..dd5945cb 100644 --- a/src/platform_legacy/legacy_platform_state.cpp +++ b/src/platform_legacy/legacy_platform_state.cpp @@ -71,24 +71,24 @@ public: return state; } -[[nodiscard]] RetainedLegacyGlfwWindowHooks& active_legacy_glfw_window_hooks() -{ - return active_legacy_glfw_window_state().hooks; -} - void set_legacy_glfw_window(GLFWwindow* window) { - auto& retained = active_legacy_glfw_window_state(); - retained.window = window; - retained.hooks.acquire_render_context = [window] { - glfwMakeContextCurrent(window); - }; - retained.hooks.present_render_context = [window] { - glfwSwapBuffers(window); - }; - retained.hooks.request_app_close = [window] { - glfwSetWindowShouldClose(window, GLFW_TRUE); - }; + active_legacy_glfw_window_state().window = window; +} + +void acquire_legacy_glfw_render_context() +{ + glfwMakeContextCurrent(active_legacy_glfw_window_state().window); +} + +void present_legacy_glfw_render_context() +{ + glfwSwapBuffers(active_legacy_glfw_window_state().window); +} + +void request_legacy_glfw_app_close() +{ + glfwSetWindowShouldClose(active_legacy_glfw_window_state().window, GLFW_TRUE); } #endif diff --git a/src/platform_legacy/legacy_platform_state.h b/src/platform_legacy/legacy_platform_state.h index 916e3bdb..1437b427 100644 --- a/src/platform_legacy/legacy_platform_state.h +++ b/src/platform_legacy/legacy_platform_state.h @@ -9,20 +9,15 @@ struct GLFWwindow; namespace pp::platform::legacy { #if defined(__LINUX__) || defined(__WEB__) -struct RetainedLegacyGlfwWindowHooks final { - std::function acquire_render_context; - std::function present_render_context; - std::function request_app_close; -}; - struct RetainedLegacyGlfwWindowState final { GLFWwindow* window = nullptr; - RetainedLegacyGlfwWindowHooks hooks; }; [[nodiscard]] RetainedLegacyGlfwWindowState& active_legacy_glfw_window_state(); -[[nodiscard]] RetainedLegacyGlfwWindowHooks& active_legacy_glfw_window_hooks(); void set_legacy_glfw_window(GLFWwindow* window); +void acquire_legacy_glfw_render_context(); +void present_legacy_glfw_render_context(); +void request_legacy_glfw_app_close(); #endif [[nodiscard]] pp::platform::WebPlatformServices& active_legacy_web_platform_services(); diff --git a/src/platform_windows/windows_lifecycle_shell.cpp b/src/platform_windows/windows_lifecycle_shell.cpp index 64717543..bf274053 100644 --- a/src/platform_windows/windows_lifecycle_shell.cpp +++ b/src/platform_windows/windows_lifecycle_shell.cpp @@ -47,11 +47,10 @@ void request_window_close(HWND hWnd) void handle_window_close_message(VrShellState& vr) { auto* app = bound_app(); - auto* runtime = bound_runtime(); mark_lifecycle_stopped(); request_stop_and_join_vr_thread(vr); - runtime->ui_thread_stop(); - runtime->render_thread_stop(); + app->runtime().ui_thread_stop(); + app->runtime().render_thread_stop(); app->terminate(); release_bound_app(); PostQuitMessage(0); diff --git a/src/platform_windows/windows_platform_services.cpp b/src/platform_windows/windows_platform_services.cpp index b7468ed4..73f51761 100644 --- a/src/platform_windows/windows_platform_services.cpp +++ b/src/platform_windows/windows_platform_services.cpp @@ -186,9 +186,9 @@ void swap_async_render_context() void enqueue_main_thread_task(std::packaged_task task) { - if (auto* runtime = bound_runtime()) + if (auto* app = bound_app()) { - runtime->main_thread_task(std::move(task)); + app->runtime().main_thread_task(std::move(task)); return; } @@ -200,9 +200,9 @@ void enqueue_main_thread_task(std::packaged_task task) void drain_main_thread_tasks() { - if (auto* runtime = bound_runtime()) + if (auto* app = bound_app()) { - runtime->drain_main_thread_tasks(); + app->runtime().drain_main_thread_tasks(); return; } } diff --git a/src/platform_windows/windows_runtime_shell.cpp b/src/platform_windows/windows_runtime_shell.cpp index 630732dc..e6d10c8e 100644 --- a/src/platform_windows/windows_runtime_shell.cpp +++ b/src/platform_windows/windows_runtime_shell.cpp @@ -3,7 +3,6 @@ #include "platform_windows/windows_runtime_shell.h" #include "app.h" -#include "app_runtime.h" #include "log.h" #include "platform_windows/windows_bootstrap_helpers.h" #include "platform_windows/windows_lifecycle_shell.h" @@ -20,7 +19,6 @@ namespace { struct RetainedWindowsRuntimeState final { std::unique_ptr owned_app; App* app = nullptr; - AppRuntime* runtime = nullptr; WacomTablet* tablet = nullptr; }; @@ -42,10 +40,9 @@ void register_touch_window(HWND hWnd) void initialize_runtime_threads() { auto* app = bound_app(); - auto* runtime = bound_runtime(); mark_lifecycle_running(); - runtime->render_thread_start(*app); - runtime->ui_thread_start(*app); + app->runtime().render_thread_start(*app); + app->runtime().ui_thread_start(*app); } void install_debug_gl_callbacks() @@ -136,21 +133,10 @@ App* bound_app() noexcept void release_bound_app() noexcept { auto& state = retained_runtime_state(); - bind_runtime(nullptr); bind_app(nullptr); state.owned_app.reset(); } -void bind_runtime(AppRuntime* runtime) noexcept -{ - retained_runtime_state().runtime = runtime; -} - -AppRuntime* bound_runtime() noexcept -{ - return retained_runtime_state().runtime; -} - void bind_wacom_tablet(WacomTablet* tablet) noexcept { retained_runtime_state().tablet = tablet; @@ -190,7 +176,6 @@ int run_main_application(int argc, char** argv) runtime_state.owned_app = std::make_unique(); auto* app = runtime_state.owned_app.get(); bind_app(app); - bind_runtime(&app->runtime()); bind_wacom_tablet(&WacomTablet::I); app->set_platform_services(&pp::platform::windows::platform_services()); app->initLog(); diff --git a/src/platform_windows/windows_runtime_shell.h b/src/platform_windows/windows_runtime_shell.h index e2e5c357..a0a99928 100644 --- a/src/platform_windows/windows_runtime_shell.h +++ b/src/platform_windows/windows_runtime_shell.h @@ -4,7 +4,6 @@ #include "platform_windows/windows_splash.h" class App; -class AppRuntime; class WacomTablet; namespace pp::platform::windows { @@ -14,8 +13,6 @@ void run_main_window_runtime(const MainWindowStartupState& startup, bool start_i void bind_app(App* app) noexcept; [[nodiscard]] App* bound_app() noexcept; void release_bound_app() noexcept; -void bind_runtime(AppRuntime* runtime) noexcept; -[[nodiscard]] AppRuntime* bound_runtime() noexcept; void bind_wacom_tablet(WacomTablet* tablet) noexcept; [[nodiscard]] WacomTablet* bound_wacom_tablet() noexcept; [[nodiscard]] HWND main_window_handle() noexcept;