Retain Apple bridge services and bind Win32 runtime

This commit is contained in:
2026-06-17 01:44:20 +02:00
parent fd462dc406
commit 3cbc88fe78
9 changed files with 311 additions and 203 deletions

View File

@@ -23,13 +23,6 @@ std::string android_get_clipboard();
bool android_set_clipboard(const std::string& s);
#elif __APPLE__
#include <Foundation/Foundation.h>
#include "objc_utils.h"
#ifdef __IOS__
#include "AppDelegate.h"
#include "GameViewController.h"
#elif defined(__OSX__)
#include "main.h"
#endif
void delete_all_files_in_path(const std::string& source_path);
#ifdef __IOS__
void save_image_library(const std::string& path);
@@ -93,16 +86,6 @@ public:
}
#if defined(__IOS__) || defined(__OSX__)
[[nodiscard]] NSMutableArray<NSString*>* apple_file_types_array(const std::vector<std::string>& file_types)
{
NSMutableArray<NSString*>* types = [NSMutableArray arrayWithCapacity:file_types.size()];
for (const auto& type : file_types)
{
[types addObject:[NSString stringWithCString:type.c_str() encoding:NSUTF8StringEncoding]];
}
return types;
}
[[nodiscard]] pp::platform::PlatformStoragePaths prepare_legacy_apple_storage_paths()
{
const auto& apple_state = pp::platform::legacy::active_legacy_apple_state();
@@ -113,161 +96,6 @@ public:
#endif
return pp::platform::legacy::active_legacy_storage_paths();
}
[[nodiscard]] pp::platform::apple::AppleDocumentPlatformServices& active_apple_document_platform_services()
{
#ifdef __IOS__
const auto& apple_state = pp::platform::legacy::active_legacy_apple_state();
auto* const ios_view = apple_state.ios_view;
auto* const ios_app = apple_state.ios_app;
static pp::platform::apple::AppleDocumentPlatformServices services(
pp::platform::PlatformFamily::ios,
[ios_view] {
pp::platform::apple::AppleDocumentPickerBridge bridge;
bridge.clipboard_text = [ios_view] {
return [ios_view clipboard_get_string];
};
bridge.set_clipboard_text = [ios_view](std::string_view text) {
const std::string value(text);
return [ios_view clipboard_set_string:value];
};
bridge.set_virtual_keyboard_visible = [ios_view](bool visible) {
dispatch_async(dispatch_get_main_queue(), ^{
if (visible)
[ios_view show_keyboard];
else
[ios_view hide_keyboard];
});
};
bridge.trigger_crash_test = [ios_view] {
[ios_view crash];
};
bridge.start_sonarpen = [ios_app] {
[ios_app sonarpen_start];
};
bridge.acquire_render_context = [ios_view] {
[ios_view async_lock];
};
bridge.release_render_context = [ios_view] {
[ios_view async_unlock];
};
bridge.present_render_context = [ios_view] {
[ios_view async_swap];
};
bridge.bind_main_render_target = [ios_view] {
[ios_view->glview bindDrawable];
};
bridge.display_file = [ios_view](std::string path) {
dispatch_async(dispatch_get_main_queue(), ^{
[ios_view display_file:path];
});
};
bridge.share_file = [ios_view](std::string path) {
dispatch_async(dispatch_get_main_queue(), ^{
[ios_view share_file:[NSString stringWithUTF8String:path.c_str()]];
});
};
bridge.pick_image = [ios_view](pp::platform::PickedPathCallback callback) {
dispatch_async(dispatch_get_main_queue(), ^{
[ios_view pick_photo:callback];
});
};
bridge.pick_file = [ios_view](
std::vector<std::string> file_types,
pp::platform::PickedPathCallback callback) {
dispatch_async(dispatch_get_main_queue(), ^{
[ios_view pick_file:apple_file_types_array(file_types) then:callback];
});
};
bridge.save_prepared_file = [ios_view](
std::string path,
std::string suggested_name,
pp::platform::PreparedFileCallback callback) {
(void)suggested_name;
dispatch_async(dispatch_get_main_queue(), ^{
[ios_view pick_file_save:path];
});
callback(path, true);
};
return bridge;
}());
return services;
#else
const auto& apple_state = pp::platform::legacy::active_legacy_apple_state();
auto* const osx_view = apple_state.osx_view;
auto* const osx_app = apple_state.osx_app;
static pp::platform::apple::AppleDocumentPlatformServices services(
pp::platform::PlatformFamily::macos,
[osx_view, osx_app] {
pp::platform::apple::AppleDocumentPickerBridge bridge;
bridge.clipboard_text = [osx_view] {
return [osx_view clipboard_get_string];
};
bridge.set_clipboard_text = [osx_view](std::string_view text) {
const std::string value(text);
return [osx_view clipboard_set_string:value];
};
bridge.share_file = [osx_view](std::string path) {
dispatch_async(dispatch_get_main_queue(), ^{
[osx_view share_file:[NSString stringWithUTF8String:path.c_str()]];
});
};
bridge.trigger_crash_test = [osx_view] {
[osx_view hockeyapp_crash];
};
bridge.request_app_close = [osx_view] {
dispatch_async(dispatch_get_main_queue(), ^{
[osx_view close];
});
};
bridge.acquire_render_context = [osx_view] {
[osx_view async_lock];
};
bridge.release_render_context = [osx_view] {
[osx_view async_unlock];
};
bridge.present_render_context = [osx_view] {
[osx_view async_swap];
};
bridge.set_cursor_visible = [osx_view](bool visible) {
[osx_view show_cursor:visible];
};
bridge.save_ui_state = [osx_app] {
[osx_app save_ui_state];
};
bridge.pick_file = [osx_view](
std::vector<std::string> file_types,
pp::platform::PickedPathCallback callback) {
dispatch_async(dispatch_get_main_queue(), ^{
const std::string path = [osx_view pick_file:apple_file_types_array(file_types)];
callback(path);
});
};
bridge.pick_save_file = [osx_view](
std::vector<std::string> file_types,
pp::platform::PickedPathCallback callback) {
dispatch_async(dispatch_get_main_queue(), ^{
const std::string path = [osx_view pick_file_save:apple_file_types_array(file_types)];
callback(path);
});
};
bridge.pick_directory = [osx_view](pp::platform::PickedPathCallback callback) {
dispatch_async(dispatch_get_main_queue(), ^{
const std::string path = [osx_view pick_dir];
callback(path);
});
};
bridge.format_working_directory_path = [](std::string_view path) {
char path_buffer[4096] = {};
if (realpath(std::string(path).c_str(), path_buffer))
return std::string(path_buffer);
return std::string(path);
};
return bridge;
}());
return services;
#endif
}
#endif
// DEBT-0017: fallback for platforms that do not inject PlatformServices yet.
@@ -324,9 +152,9 @@ public:
void trigger_crash_test() override
{
#ifdef __IOS__
active_apple_document_platform_services().trigger_crash_test();
pp::platform::legacy::active_legacy_apple_document_platform_services().trigger_crash_test();
#elif __OSX__
active_apple_document_platform_services().trigger_crash_test();
pp::platform::legacy::active_legacy_apple_document_platform_services().trigger_crash_test();
#elif defined(__ANDROID__)
int *x = nullptr; *x = 42;
LOG("%d", *x);
@@ -338,7 +166,7 @@ public:
#if defined(__IOS__) || defined(__OSX__)
const auto family = pp::platform::current_platform_family();
if (family == pp::platform::PlatformFamily::ios || family == pp::platform::PlatformFamily::macos)
return active_apple_document_platform_services().clipboard_text();
return pp::platform::legacy::active_legacy_apple_document_platform_services().clipboard_text();
#endif
#ifdef __ANDROID__
return android_get_clipboard();
@@ -352,7 +180,7 @@ public:
#if defined(__IOS__) || defined(__OSX__)
const auto family = pp::platform::current_platform_family();
if (family == pp::platform::PlatformFamily::ios || family == pp::platform::PlatformFamily::macos)
return active_apple_document_platform_services().set_clipboard_text(text);
return pp::platform::legacy::active_legacy_apple_document_platform_services().set_clipboard_text(text);
#endif
const std::string value(text);
#ifdef __ANDROID__
@@ -366,7 +194,7 @@ public:
void set_cursor_visible(bool visible) override
{
#if defined(__IOS__) || defined(__OSX__)
active_apple_document_platform_services().set_cursor_visible(visible);
pp::platform::legacy::active_legacy_apple_document_platform_services().set_cursor_visible(visible);
#else
(void)visible;
#endif
@@ -375,7 +203,7 @@ public:
void set_virtual_keyboard_visible(bool visible) override
{
#ifdef __IOS__
active_apple_document_platform_services().set_virtual_keyboard_visible(visible);
pp::platform::legacy::active_legacy_apple_document_platform_services().set_virtual_keyboard_visible(visible);
#elif __ANDROID__
displayKeyboard(visible);
#else
@@ -400,7 +228,7 @@ public:
void acquire_render_context() override
{
#if defined(__IOS__) || defined(__OSX__)
active_apple_document_platform_services().acquire_render_context();
pp::platform::legacy::active_legacy_apple_document_platform_services().acquire_render_context();
#elif __ANDROID__
android_async_lock();
#elif __LINUX__ || __WEB__
@@ -411,7 +239,7 @@ public:
void release_render_context() override
{
#if defined(__IOS__) || defined(__OSX__)
active_apple_document_platform_services().release_render_context();
pp::platform::legacy::active_legacy_apple_document_platform_services().release_render_context();
#elif __ANDROID__
android_async_unlock();
#endif
@@ -420,7 +248,7 @@ public:
void present_render_context() override
{
#if defined(__IOS__) || defined(__OSX__)
active_apple_document_platform_services().present_render_context();
pp::platform::legacy::active_legacy_apple_document_platform_services().present_render_context();
#elif __ANDROID__
android_async_swap();
#elif __LINUX__ || __WEB__
@@ -438,7 +266,7 @@ public:
void bind_main_render_target() override
{
#if __IOS__
active_apple_document_platform_services().bind_main_render_target();
pp::platform::legacy::active_legacy_apple_document_platform_services().bind_main_render_target();
#else
bind_default_render_target();
#endif
@@ -520,7 +348,7 @@ public:
std::string_view data_path) override
{
#if defined(__IOS__) || defined(__OSX__)
return active_apple_document_platform_services().document_browse_roots(work_path, data_path);
return pp::platform::legacy::active_legacy_apple_document_platform_services().document_browse_roots(work_path, data_path);
#else
return pp::platform::platform_document_browse_roots(
pp::platform::current_platform_family(),
@@ -534,7 +362,7 @@ public:
if (!pp::platform::platform_saves_native_ui_state(pp::platform::current_platform_family()))
return;
#if defined(__IOS__) || defined(__OSX__)
active_apple_document_platform_services().save_ui_state();
pp::platform::legacy::active_legacy_apple_document_platform_services().save_ui_state();
#endif
}
@@ -561,9 +389,9 @@ public:
void pick_image(pp::platform::PickedPathCallback callback) override
{
#ifdef __IOS__
active_apple_document_platform_services().pick_image(std::move(callback));
pp::platform::legacy::active_legacy_apple_document_platform_services().pick_image(std::move(callback));
#elif __OSX__
active_apple_document_platform_services().pick_image(std::move(callback));
pp::platform::legacy::active_legacy_apple_document_platform_services().pick_image(std::move(callback));
#elif __ANDROID__
android_pick_file(callback);
#elif __LINUX__
@@ -579,9 +407,9 @@ public:
void pick_file(std::vector<std::string> file_types, pp::platform::PickedPathCallback callback) override
{
#ifdef __IOS__
active_apple_document_platform_services().pick_file(std::move(file_types), std::move(callback));
pp::platform::legacy::active_legacy_apple_document_platform_services().pick_file(std::move(file_types), std::move(callback));
#elif __OSX__
active_apple_document_platform_services().pick_file(std::move(file_types), std::move(callback));
pp::platform::legacy::active_legacy_apple_document_platform_services().pick_file(std::move(file_types), std::move(callback));
#elif __ANDROID__
android_pick_file(callback);
#elif __LINUX__
@@ -598,7 +426,7 @@ public:
void pick_save_file(std::vector<std::string> file_types, pp::platform::PickedPathCallback callback) override
{
#if __OSX__
active_apple_document_platform_services().pick_save_file(std::move(file_types), std::move(callback));
pp::platform::legacy::active_legacy_apple_document_platform_services().pick_save_file(std::move(file_types), std::move(callback));
#elif __ANDROID__
android_pick_file_save(callback);
#else
@@ -612,7 +440,7 @@ public:
#ifdef __IOS__
(void)callback;
#elif __OSX__
active_apple_document_platform_services().pick_directory(std::move(callback));
pp::platform::legacy::active_legacy_apple_document_platform_services().pick_directory(std::move(callback));
#elif __ANDROID__
(void)callback;
#else
@@ -623,7 +451,7 @@ public:
[[nodiscard]] bool supports_working_directory_picker() override
{
#if defined(__IOS__) || defined(__OSX__)
return active_apple_document_platform_services().supports_working_directory_picker();
return pp::platform::legacy::active_legacy_apple_document_platform_services().supports_working_directory_picker();
#else
return pp::platform::platform_supports_working_directory_picker(
pp::platform::current_platform_family());
@@ -633,7 +461,7 @@ public:
[[nodiscard]] std::string format_working_directory_path(std::string_view path) override
{
#if defined(__IOS__) || defined(__OSX__)
return active_apple_document_platform_services().format_working_directory_path(path);
return pp::platform::legacy::active_legacy_apple_document_platform_services().format_working_directory_path(path);
#endif
return std::string(path);
}
@@ -669,7 +497,7 @@ public:
void start_sonarpen() override
{
#if __IOS__
active_apple_document_platform_services().start_sonarpen();
pp::platform::legacy::active_legacy_apple_document_platform_services().start_sonarpen();
#endif
}
@@ -715,7 +543,7 @@ public:
void display_file(std::string_view path) override
{
#if defined(__IOS__) || defined(__OSX__)
active_apple_document_platform_services().display_file(path);
pp::platform::legacy::active_legacy_apple_document_platform_services().display_file(path);
#else
(void)path;
#endif
@@ -724,7 +552,7 @@ public:
void share_file(std::string_view path) override
{
#if defined(__IOS__) || defined(__OSX__)
active_apple_document_platform_services().share_file(path);
pp::platform::legacy::active_legacy_apple_document_platform_services().share_file(path);
#else
(void)path;
#endif
@@ -733,7 +561,7 @@ public:
void request_app_close() override
{
#ifdef __OSX__
active_apple_document_platform_services().request_app_close();
pp::platform::legacy::active_legacy_apple_document_platform_services().request_app_close();
#elif __LINUX__
pp::platform::legacy::active_legacy_glfw_window_hooks().request_app_close();
#endif
@@ -766,7 +594,7 @@ public:
const std::string value(path);
const std::string name(suggested_name);
#ifdef __IOS__
active_apple_document_platform_services().save_prepared_file(
pp::platform::legacy::active_legacy_apple_document_platform_services().save_prepared_file(
value,
name,
std::move(callback));