Own Windows tablet path and thin legacy web fallback

This commit is contained in:
2026-06-17 09:55:13 +02:00
parent 4c91701e11
commit ea1845d924
7 changed files with 65 additions and 27 deletions

View File

@@ -70,6 +70,13 @@ What is already real:
- `pp_app_core` - `pp_app_core`
Latest slice: Latest slice:
- `src/platform_windows/windows_runtime_shell.cpp` now owns the Windows tablet
object directly; the composition edge no longer binds `&WacomTablet::I` into
the Windows runtime path.
- `src/platform_legacy/legacy_platform_state.*` now exposes narrow Web helper
functions for the touched publish/flush/default-canvas/prepared-file paths,
so less of the Web fallback behavior lives inline in the legacy platform
singleton implementation.
- `src/platform_windows/windows_runtime_shell.cpp` no longer keeps a separate - `src/platform_windows/windows_runtime_shell.cpp` no longer keeps a separate
retained `AppRuntime*` binding; the touched Windows shell and platform retained `AppRuntime*` binding; the touched Windows shell and platform
helpers now derive runtime ownership directly from the owned `App`. helpers now derive runtime ownership directly from the owned `App`.

View File

@@ -78,6 +78,13 @@ Completed, blocked, and superseded task history moved to
the queue is now ordered by code movement instead. the queue is now ordered by code movement instead.
Current slice: Current slice:
- `src/platform_windows/windows_runtime_shell.cpp` now owns the Windows tablet
object directly, removing the composition-edge `WacomTablet::I` binding from
the touched Windows runtime path.
- `src/platform_legacy/legacy_platform_state.*` now exposes narrow Web helper
functions for the touched publish/flush/default-canvas/prepared-file paths,
so less of that fallback behavior stays inline in the legacy platform
singleton.
- `src/platform_windows/windows_runtime_shell.cpp` no longer keeps a separate - `src/platform_windows/windows_runtime_shell.cpp` no longer keeps a separate
retained `AppRuntime*`; the touched Windows lifecycle and main-thread task retained `AppRuntime*`; the touched Windows lifecycle and main-thread task
dispatch paths now derive runtime ownership directly from the owned app. dispatch paths now derive runtime ownership directly from the owned app.

View File

@@ -259,9 +259,9 @@ public:
void publish_exported_image(std::string_view path) override void publish_exported_image(std::string_view path) override
{ {
const auto family = pp::platform::current_platform_family(); const auto family = pp::platform::current_platform_family();
if (family == pp::platform::PlatformFamily::webgl) if (pp::platform::legacy::handles_legacy_web_platform_family(family))
{ {
pp::platform::legacy::active_legacy_web_platform_services().publish_exported_image(path); pp::platform::legacy::publish_legacy_web_exported_image(path);
return; return;
} }
if (!pp::platform::platform_publishes_exported_images(family)) if (!pp::platform::platform_publishes_exported_images(family))
@@ -279,9 +279,9 @@ public:
void flush_persistent_storage() override void flush_persistent_storage() override
{ {
const auto family = pp::platform::current_platform_family(); const auto family = pp::platform::current_platform_family();
if (family == pp::platform::PlatformFamily::webgl) if (pp::platform::legacy::handles_legacy_web_platform_family(family))
{ {
pp::platform::legacy::active_legacy_web_platform_services().flush_persistent_storage(); pp::platform::legacy::flush_legacy_web_persistent_storage();
return; return;
} }
if (!pp::platform::platform_flushes_persistent_storage(family)) if (!pp::platform::platform_flushes_persistent_storage(family))
@@ -449,8 +449,8 @@ public:
[[nodiscard]] int default_canvas_resolution() override [[nodiscard]] int default_canvas_resolution() override
{ {
const auto family = pp::platform::current_platform_family(); const auto family = pp::platform::current_platform_family();
if (family == pp::platform::PlatformFamily::webgl) if (pp::platform::legacy::handles_legacy_web_platform_family(family))
return pp::platform::legacy::active_legacy_web_platform_services().default_canvas_resolution(); return pp::platform::legacy::default_legacy_web_canvas_resolution();
return pp::platform::platform_default_canvas_resolution(family); return pp::platform::platform_default_canvas_resolution(family);
} }
@@ -527,12 +527,9 @@ public:
pp::platform::PreparedFileCallback callback) override pp::platform::PreparedFileCallback callback) override
{ {
const auto family = pp::platform::current_platform_family(); const auto family = pp::platform::current_platform_family();
if (family == pp::platform::PlatformFamily::webgl) if (pp::platform::legacy::handles_legacy_web_platform_family(family))
{ {
pp::platform::legacy::active_legacy_web_platform_services().save_prepared_file( pp::platform::legacy::save_legacy_web_prepared_file(path, suggested_name, std::move(callback));
path,
suggested_name,
std::move(callback));
return; return;
} }

View File

@@ -98,6 +98,37 @@ void request_legacy_glfw_app_close()
return pp::platform::resolve_web_platform_services(services); return pp::platform::resolve_web_platform_services(services);
} }
[[nodiscard]] bool handles_legacy_web_platform_family(pp::platform::PlatformFamily family) noexcept
{
return family == pp::platform::PlatformFamily::webgl;
}
void publish_legacy_web_exported_image(std::string_view path)
{
active_legacy_web_platform_services().publish_exported_image(path);
}
void flush_legacy_web_persistent_storage()
{
active_legacy_web_platform_services().flush_persistent_storage();
}
[[nodiscard]] int default_legacy_web_canvas_resolution() noexcept
{
return active_legacy_web_platform_services().default_canvas_resolution();
}
void save_legacy_web_prepared_file(
std::string_view path,
std::string_view suggested_name,
pp::platform::PreparedFileCallback callback)
{
active_legacy_web_platform_services().save_prepared_file(
path,
suggested_name,
std::move(callback));
}
[[nodiscard]] const pp::platform::PlatformStoragePaths& active_legacy_storage_paths() [[nodiscard]] const pp::platform::PlatformStoragePaths& active_legacy_storage_paths()
{ {
return retained_legacy_storage_paths().storage_paths; return retained_legacy_storage_paths().storage_paths;

View File

@@ -1,5 +1,6 @@
#pragma once #pragma once
#include "platform_api/platform_policy.h"
#include "platform_api/platform_services.h" #include "platform_api/platform_services.h"
#if __LINUX__ || __WEB__ #if __LINUX__ || __WEB__
@@ -21,6 +22,14 @@ void request_legacy_glfw_app_close();
#endif #endif
[[nodiscard]] pp::platform::WebPlatformServices& active_legacy_web_platform_services(); [[nodiscard]] pp::platform::WebPlatformServices& active_legacy_web_platform_services();
[[nodiscard]] bool handles_legacy_web_platform_family(pp::platform::PlatformFamily family) noexcept;
void publish_legacy_web_exported_image(std::string_view path);
void flush_legacy_web_persistent_storage();
[[nodiscard]] int default_legacy_web_canvas_resolution() noexcept;
void save_legacy_web_prepared_file(
std::string_view path,
std::string_view suggested_name,
pp::platform::PreparedFileCallback callback);
[[nodiscard]] const pp::platform::PlatformStoragePaths& active_legacy_storage_paths(); [[nodiscard]] const pp::platform::PlatformStoragePaths& active_legacy_storage_paths();
void set_legacy_storage_paths(pp::platform::PlatformStoragePaths paths); void set_legacy_storage_paths(pp::platform::PlatformStoragePaths paths);

View File

@@ -19,7 +19,7 @@ namespace {
struct RetainedWindowsRuntimeState final { struct RetainedWindowsRuntimeState final {
std::unique_ptr<App> owned_app; std::unique_ptr<App> owned_app;
App* app = nullptr; App* app = nullptr;
WacomTablet* tablet = nullptr; WacomTablet tablet;
}; };
[[nodiscard]] RetainedWindowsRuntimeState& retained_runtime_state() [[nodiscard]] RetainedWindowsRuntimeState& retained_runtime_state()
@@ -56,7 +56,6 @@ void install_debug_gl_callbacks()
void initialize_wintab(HWND hWnd, bool sandboxed) void initialize_wintab(HWND hWnd, bool sandboxed)
{ {
auto* tablet = bound_wacom_tablet(); auto* tablet = bound_wacom_tablet();
assert(tablet);
if (!sandboxed) if (!sandboxed)
{ {
LOG("init WinTab"); LOG("init WinTab");
@@ -111,8 +110,7 @@ void run_main_message_loop()
void shutdown_main_window_runtime(const MainWindowStartupState& startup, HINSTANCE hInst) void shutdown_main_window_runtime(const MainWindowStartupState& startup, HINSTANCE hInst)
{ {
if (auto* tablet = retained_runtime_state().tablet) retained_runtime_state().tablet.terminate();
tablet->terminate();
UnregisterClass(startup.window_class.lpszClassName, hInst); UnregisterClass(startup.window_class.lpszClassName, hInst);
LogRemote::I.stop(); LogRemote::I.stop();
} }
@@ -137,14 +135,9 @@ void release_bound_app() noexcept
state.owned_app.reset(); state.owned_app.reset();
} }
void bind_wacom_tablet(WacomTablet* tablet) noexcept
{
retained_runtime_state().tablet = tablet;
}
WacomTablet* bound_wacom_tablet() noexcept WacomTablet* bound_wacom_tablet() noexcept
{ {
return retained_runtime_state().tablet; return &retained_runtime_state().tablet;
} }
HWND main_window_handle() noexcept HWND main_window_handle() noexcept
@@ -176,7 +169,6 @@ int run_main_application(int argc, char** argv)
runtime_state.owned_app = std::make_unique<App>(); runtime_state.owned_app = std::make_unique<App>();
auto* app = runtime_state.owned_app.get(); auto* app = runtime_state.owned_app.get();
bind_app(app); bind_app(app);
bind_wacom_tablet(&WacomTablet::I);
app->set_platform_services(&pp::platform::windows::platform_services()); app->set_platform_services(&pp::platform::windows::platform_services());
app->initLog(); app->initLog();
@@ -206,11 +198,9 @@ int run_main_application(int argc, char** argv)
break; break;
case pp::platform::windows::MainStartupResult::GladLoadFailure: case pp::platform::windows::MainStartupResult::GladLoadFailure:
release_bound_app(); release_bound_app();
bind_wacom_tablet(nullptr);
return 0; return 0;
case pp::platform::windows::MainStartupResult::MissingCoreContextSupport: case pp::platform::windows::MainStartupResult::MissingCoreContextSupport:
release_bound_app(); release_bound_app();
bind_wacom_tablet(nullptr);
return -1; return -1;
} }
@@ -225,7 +215,6 @@ int run_main_application(int argc, char** argv)
app->initShaders(); app->initShaders();
app->cmd_convert(argv[2], argv[3]); app->cmd_convert(argv[2], argv[3]);
release_bound_app(); release_bound_app();
bind_wacom_tablet(nullptr);
return 0; return 0;
case const_hash("-vrmode"): case const_hash("-vrmode"):
start_in_vr = true; start_in_vr = true;
@@ -237,7 +226,6 @@ int run_main_application(int argc, char** argv)
pp::platform::windows::run_main_window_runtime(startup, start_in_vr, splash); pp::platform::windows::run_main_window_runtime(startup, start_in_vr, splash);
release_bound_app(); release_bound_app();
bind_wacom_tablet(nullptr);
return 0; return 0;
} }

View File

@@ -13,7 +13,6 @@ void run_main_window_runtime(const MainWindowStartupState& startup, bool start_i
void bind_app(App* app) noexcept; void bind_app(App* app) noexcept;
[[nodiscard]] App* bound_app() noexcept; [[nodiscard]] App* bound_app() noexcept;
void release_bound_app() noexcept; void release_bound_app() noexcept;
void bind_wacom_tablet(WacomTablet* tablet) noexcept;
[[nodiscard]] WacomTablet* bound_wacom_tablet() noexcept; [[nodiscard]] WacomTablet* bound_wacom_tablet() noexcept;
[[nodiscard]] HWND main_window_handle() noexcept; [[nodiscard]] HWND main_window_handle() noexcept;
[[nodiscard]] const wchar_t* main_window_title() noexcept; [[nodiscard]] const wchar_t* main_window_title() noexcept;