From f0ebe2bce83c378df166957028a706864a065618 Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 26 Oct 2023 12:58:01 -0700 Subject: [PATCH] cleaned up clipboard support --- .efrocachemap | 56 ++++++------ CHANGELOG.md | 2 +- src/assets/ba_data/python/baenv.py | 2 +- .../python/bauiv1lib/gather/privatetab.py | 4 +- .../ba_data/python/bauiv1lib/mainmenu.py | 2 +- .../base/app_adapter/app_adapter.cc | 54 ++++++++++++ src/ballistica/base/app_adapter/app_adapter.h | 26 +++++- .../base/app_adapter/app_adapter_apple.cc | 37 ++++++++ .../base/app_adapter/app_adapter_apple.h | 4 + .../base/app_adapter/app_adapter_sdl.cc | 22 +++++ .../base/app_adapter/app_adapter_sdl.h | 4 + src/ballistica/base/input/input.cc | 9 ++ src/ballistica/base/platform/base_platform.h | 3 +- .../python/methods/python_methods_misc.cc | 9 +- .../platform/apple/core_platform_apple.cc | 32 ------- .../core/platform/apple/core_platform_apple.h | 6 -- src/ballistica/core/platform/core_platform.cc | 86 ------------------- src/ballistica/core/platform/core_platform.h | 39 ++------- src/ballistica/shared/ballistica.cc | 2 +- src/ballistica/ui_v1/widget/text_widget.cc | 7 +- 20 files changed, 207 insertions(+), 199 deletions(-) diff --git a/.efrocachemap b/.efrocachemap index bb57bebf8..374386c9b 100644 --- a/.efrocachemap +++ b/.efrocachemap @@ -4056,26 +4056,26 @@ "build/assets/windows/Win32/ucrtbased.dll": "2def5335207d41b21b9823f6805997f1", "build/assets/windows/Win32/vc_redist.x86.exe": "b08a55e2e77623fe657bea24f223a3ae", "build/assets/windows/Win32/vcruntime140d.dll": "865b2af4d1e26a1a8073c89acb06e599", - "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "b3aaa8011f040ba38b1abcff978e3c85", - "build/prefab/full/linux_arm64_gui/release/ballisticakit": "f5623a29f71cf5363ff72fe4436340b1", - "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "9f5ec716df130f92e9b055e9fca4bbc8", - "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "327f6b0da02ecf72006ff88dd37b31ac", - "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "ede687d69269225dc788851fc4515ccf", - "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "16029a78e585822f78fe4619beba456c", - "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "8f091556ac938da89cab226d9bb59dec", - "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "08ea82e016ce2d7ac8d687a795e7a179", - "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "91d4f5cb9b13eb6f2964187fd7ff9cc5", - "build/prefab/full/mac_arm64_gui/release/ballisticakit": "ed93c1d02f14dc147d2d84c8f919568c", - "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "5e3eb1b9195fcbf3ec477392b15bff23", - "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "b6cf7d6cf47f8bbf1b3c4f28ba9c7854", - "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "f044e3d1d94751272c02f864ddafbe6b", - "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "aa56b6e21eb82ca8af11a248bde876d1", - "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "4ee8ff4b9d37bbc3d7a7db73168f8888", - "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "dc62f105598c866680a0fd150b83ea0a", - "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "a04e0837368e5eae80ec084a898b79d8", - "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "cd5b75cfa4cf0bfd478092ef812006c4", - "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "4decefaeffa74fb89f39834960c8fd5f", - "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "73087f5f43a6e9d4b10529824d671d6b", + "build/prefab/full/linux_arm64_gui/debug/ballisticakit": "671499f10be5561b64b7c1e8551f71bc", + "build/prefab/full/linux_arm64_gui/release/ballisticakit": "8834461aaef9d915828b460426bb16b6", + "build/prefab/full/linux_arm64_server/debug/dist/ballisticakit_headless": "9be5746f3cdb8fdbeb01c3fba0f3cd04", + "build/prefab/full/linux_arm64_server/release/dist/ballisticakit_headless": "1a4e1fb4230ffe937bc11890943bab67", + "build/prefab/full/linux_x86_64_gui/debug/ballisticakit": "809fd63da80c54076100f18c8cde6ba8", + "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "bb3574370f0d601abb9443dc2285689b", + "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "2b1d99684649040257bfe95b0c5a21d9", + "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "3a4eaac355dc1ed691aa946f9470fd80", + "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "0cdebb143458f5248efb0227e875d5d4", + "build/prefab/full/mac_arm64_gui/release/ballisticakit": "a4eae535e631ac6d0aaa3fa9203656cf", + "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "d2dcb9d5f1201e98ba83b547fb7a317e", + "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "6cf3c416280b71e5b16516cfb063b198", + "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "a01e3ef9ec790c0bc385995e598c18dd", + "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "427e518fd557950c4f8fec0b8fca3c86", + "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "b6a2f1c128e3b1c035eff76f38100566", + "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "deb872ab495ab8e713ba564b7bc4f169", + "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "c647c1e19b2c3a2bee028ef8215945d5", + "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "ce133f1e838b8b6d3b9b4fd7c516d5d8", + "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "f41eb8f74e5cf7a36cc8bbda1eef1933", + "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "00ae0c9d9351140edc42ed18b719a2bf", "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "becf7a70c7c0d7bb5bfe731dde5e0249", "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "c9ef036408f0832cd068a34365485e0b", "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "becf7a70c7c0d7bb5bfe731dde5e0249", @@ -4092,14 +4092,14 @@ "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "2b57cf28eeadf43d09b1d780a5db1423", "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "3314d791a9ab37ea81be824460c63d14", "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "2b57cf28eeadf43d09b1d780a5db1423", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "bd63402d48fce829f16d59c6c1f87977", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "de24c4e6f661f6201b933af3343084cc", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "84904f537e435d09c06b4b6c10abea7d", - "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "22a32d161e85baa6c6459412a368bf82", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "f43972d496e1953fdc30ff094a22a0d1", - "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "c069093fb4773f3feac13236d474ecf1", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "4d745c03bbeab02c5f69bed1ae376933", - "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "c1e1321bb0d5bb74211377e0f5cae45c", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "eda80e0bcb2332fb400e4487aa821fda", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "ae70908e8821b275a7c62541288761c3", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "4dcc80f1087a342df7f0e13225c6a0d8", + "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "e83c284f0ee5c9bf9e02bdd5e83de604", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "92bbe105f7bbff92ebe621710bb13629", + "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "f3c9b10ab0dbc35214b20c3323255ea1", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "df9efe46d688a585157edfe5d3b9e912", + "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "3c76a27db96c7c277682430ec980d9ce", "src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c", "src/assets/ba_data/python/babase/_mgen/enums.py": "28323912b56ec07701eda3d41a6a4101", "src/ballistica/base/mgen/pyembed/binding_base.inc": "6df0f34207346d89a72924249ddd4706", diff --git a/CHANGELOG.md b/CHANGELOG.md index 829ff6169..c69fd5fd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### 1.7.28 (build 21512, api 8, 2023-10-26) +### 1.7.28 (build 21516, api 8, 2023-10-26) - Massively cleaned up code related to rendering and window systems (OpenGL, SDL, etc). This code had been growing into a nasty tangle for 15 years diff --git a/src/assets/ba_data/python/baenv.py b/src/assets/ba_data/python/baenv.py index 1c6f98c81..e58e986c8 100644 --- a/src/assets/ba_data/python/baenv.py +++ b/src/assets/ba_data/python/baenv.py @@ -52,7 +52,7 @@ # Build number and version of the ballistica binary we expect to be # using. -TARGET_BALLISTICA_BUILD = 21512 +TARGET_BALLISTICA_BUILD = 21516 TARGET_BALLISTICA_VERSION = '1.7.28' diff --git a/src/assets/ba_data/python/bauiv1lib/gather/privatetab.py b/src/assets/ba_data/python/bauiv1lib/gather/privatetab.py index 1cf4e43ac..952b862c0 100644 --- a/src/assets/ba_data/python/bauiv1lib/gather/privatetab.py +++ b/src/assets/ba_data/python/bauiv1lib/gather/privatetab.py @@ -458,9 +458,9 @@ def _build_join_tab(self) -> None: scale=1.5, size=(300, 50), editable=True, + max_chars=20, description=bui.Lstr(resource='gatherWindow.partyCodeText'), autoselect=True, - maxwidth=250, h_align='left', v_align='center', text='', @@ -962,7 +962,7 @@ def _join_connect_press(self) -> None: code = cast(str, bui.textwidget(query=self._join_party_code_text)) if not code: bui.screenmessage( - bui.Lstr(resource='internal.invalidAddressErrorText'), + bui.Lstr(translate=('serverResponses', 'Invalid code.')), color=(1, 0, 0), ) bui.getsound('error').play() diff --git a/src/assets/ba_data/python/bauiv1lib/mainmenu.py b/src/assets/ba_data/python/bauiv1lib/mainmenu.py index d1a003322..cacb3fdf1 100644 --- a/src/assets/ba_data/python/bauiv1lib/mainmenu.py +++ b/src/assets/ba_data/python/bauiv1lib/mainmenu.py @@ -1318,7 +1318,7 @@ def _resume(self) -> None: bui.app.classic.resume() if self._root_widget: bui.containerwidget(edit=self._root_widget, transition='out_right') - bui.app.ui_v1.clear_main_menu_window() + bui.app.ui_v1.clear_main_menu_window(transition='out_right') # If there's callbacks waiting for this window to go away, call them. for call in bui.app.ui_v1.main_menu_resume_callbacks: diff --git a/src/ballistica/base/app_adapter/app_adapter.cc b/src/ballistica/base/app_adapter/app_adapter.cc index ee84b3191..bb89794fa 100644 --- a/src/ballistica/base/app_adapter/app_adapter.cc +++ b/src/ballistica/base/app_adapter/app_adapter.cc @@ -318,4 +318,58 @@ auto AppAdapter::GetGraphicsClientContext() -> GraphicsClientContext* { auto AppAdapter::GetKeyRepeatDelay() -> float { return 0.3f; } auto AppAdapter::GetKeyRepeatInterval() -> float { return 0.08f; } +auto AppAdapter::ClipboardIsSupported() -> bool { + // We only call our actual virtual function once. + if (!have_clipboard_is_supported_) { + clipboard_is_supported_ = DoClipboardIsSupported(); + have_clipboard_is_supported_ = true; + } + return clipboard_is_supported_; +} + +auto AppAdapter::ClipboardHasText() -> bool { + // If subplatform says they don't support clipboards, don't even ask. + if (!ClipboardIsSupported()) { + return false; + } + return DoClipboardHasText(); +} + +void AppAdapter::ClipboardSetText(const std::string& text) { + // If subplatform says they don't support clipboards, this is an error. + if (!ClipboardIsSupported()) { + throw Exception("ClipboardSetText called with no clipboard support.", + PyExcType::kRuntime); + } + DoClipboardSetText(text); +} + +auto AppAdapter::ClipboardGetText() -> std::string { + // If subplatform says they don't support clipboards, this is an error. + if (!ClipboardIsSupported()) { + throw Exception("ClipboardGetText called with no clipboard support.", + PyExcType::kRuntime); + } + return DoClipboardGetText(); +} + +auto AppAdapter::DoClipboardIsSupported() -> bool { return false; } + +auto AppAdapter::DoClipboardHasText() -> bool { + // Shouldn't get here since we default to no clipboard support. + FatalError("Shouldn't get here."); + return false; +} + +void AppAdapter::DoClipboardSetText(const std::string& text) { + // Shouldn't get here since we default to no clipboard support. + FatalError("Shouldn't get here."); +} + +auto AppAdapter::DoClipboardGetText() -> std::string { + // Shouldn't get here since we default to no clipboard support. + FatalError("Shouldn't get here."); + return ""; +} + } // namespace ballistica::base diff --git a/src/ballistica/base/app_adapter/app_adapter.h b/src/ballistica/base/app_adapter/app_adapter.h index 829c236d9..e32864bb6 100644 --- a/src/ballistica/base/app_adapter/app_adapter.h +++ b/src/ballistica/base/app_adapter/app_adapter.h @@ -207,6 +207,22 @@ class AppAdapter { virtual auto GetKeyRepeatDelay() -> float; virtual auto GetKeyRepeatInterval() -> float; + /// Return whether clipboard operations are supported at all. This gets + /// called when determining whether to display clipboard related UI + /// elements/etc. + auto ClipboardIsSupported() -> bool; + + /// Return whether there is currently text on the clipboard. + auto ClipboardHasText() -> bool; + + /// Set current clipboard text. Raises an Exception if clipboard is + /// unsupported. + void ClipboardSetText(const std::string& text); + + /// Return current text from the clipboard. Raises an Exception if + /// clipboard is unsupported or if there's no text on the clipboard. + auto ClipboardGetText() -> std::string; + protected: AppAdapter(); virtual ~AppAdapter(); @@ -219,10 +235,18 @@ class AppAdapter { /// context. By default this is simply the main thread. virtual void DoPushGraphicsContextRunnable(Runnable* runnable); + virtual auto DoClipboardIsSupported() -> bool; + virtual auto DoClipboardHasText() -> bool; + virtual void DoClipboardSetText(const std::string& text); + virtual auto DoClipboardGetText() -> std::string; + private: void OnAppSuspend_(); void OnAppUnsuspend_(); - bool app_suspended_{}; + + bool app_suspended_ : 1 {}; + bool have_clipboard_is_supported_ : 1 {}; + bool clipboard_is_supported_ : 1 {}; }; } // namespace ballistica::base diff --git a/src/ballistica/base/app_adapter/app_adapter_apple.cc b/src/ballistica/base/app_adapter/app_adapter_apple.cc index 737b89bfa..17ac5c8ab 100644 --- a/src/ballistica/base/app_adapter/app_adapter_apple.cc +++ b/src/ballistica/base/app_adapter/app_adapter_apple.cc @@ -7,6 +7,7 @@ #include "ballistica/base/graphics/graphics.h" #include "ballistica/base/graphics/graphics_server.h" #include "ballistica/base/logic/logic.h" +#include "ballistica/base/platform/apple/apple_utils.h" #include "ballistica/base/platform/apple/from_swift.h" #include "ballistica/base/support/app_config.h" #include "ballistica/shared/ballistica.h" @@ -245,6 +246,42 @@ auto AppAdapterApple::GetKeyRepeatInterval() -> float { #endif } +auto AppAdapterApple::DoClipboardIsSupported() -> bool { +#if BA_XCODE_BUILD + return BallisticaKit::CocoaFromCpp::ClipboardIsSupported(); +#else + return CorePlatform::DoClipboardIsSupported(); +#endif +} + +auto AppAdapterApple::DoClipboardHasText() -> bool { +#if BA_XCODE_BUILD + return BallisticaKit::CocoaFromCpp::ClipboardHasText(); +#else + return CorePlatform::DoClipboardHasText(); +#endif +} + +void AppAdapterApple::DoClipboardSetText(const std::string& text) { +#if BA_XCODE_BUILD + BallisticaKit::CocoaFromCpp::ClipboardSetText(text); +#else + CorePlatform::DoClipboardSetText(text); +#endif +} + +auto AppAdapterApple::DoClipboardGetText() -> std::string { +#if BA_XCODE_BUILD + auto contents = BallisticaKit::CocoaFromCpp::ClipboardGetText(); + if (contents) { + return std::string(contents.get()); + } + throw Exception("No text on clipboard."); +#else + return CorePlatform::DoClipboardGetText(); +#endif +} + } // namespace ballistica::base #endif // BA_XCODE_BUILD diff --git a/src/ballistica/base/app_adapter/app_adapter_apple.h b/src/ballistica/base/app_adapter/app_adapter_apple.h index d1c9823d7..c86f081fe 100644 --- a/src/ballistica/base/app_adapter/app_adapter_apple.h +++ b/src/ballistica/base/app_adapter/app_adapter_apple.h @@ -53,6 +53,10 @@ class AppAdapterApple : public AppAdapter { void SetHardwareCursorVisible(bool visible) override; void TerminateApp() override; void ApplyGraphicsSettings(const GraphicsSettings* settings) override; + auto DoClipboardIsSupported() -> bool override; + auto DoClipboardHasText() -> bool override; + void DoClipboardSetText(const std::string& text) override; + auto DoClipboardGetText() -> std::string override; private: class ScopedAllowGraphics_; diff --git a/src/ballistica/base/app_adapter/app_adapter_sdl.cc b/src/ballistica/base/app_adapter/app_adapter_sdl.cc index 6def0c9fc..3d7e8ca0c 100644 --- a/src/ballistica/base/app_adapter/app_adapter_sdl.cc +++ b/src/ballistica/base/app_adapter/app_adapter_sdl.cc @@ -834,6 +834,28 @@ auto AppAdapterSDL::HasDirectKeyboardInput() -> bool { return true; } +auto AppAdapterSDL::DoClipboardIsSupported() -> bool { return true; } + +auto AppAdapterSDL::DoClipboardHasText() -> bool { + return SDL_HasClipboardText(); +} + +void AppAdapterSDL::DoClipboardSetText(const std::string& text) { + SDL_SetClipboardText(text.c_str()); +} + +auto AppAdapterSDL::DoClipboardGetText() -> std::string { + // Go through SDL functionality on SDL based platforms; + // otherwise default to no clipboard. + char* out = SDL_GetClipboardText(); + if (out == nullptr) { + throw Exception("Error fetching clipboard contents.", PyExcType::kRuntime); + } + std::string out_s{out}; + SDL_free(out); + return out_s; +} + } // namespace ballistica::base #endif // BA_SDL_BUILD diff --git a/src/ballistica/base/app_adapter/app_adapter_sdl.h b/src/ballistica/base/app_adapter/app_adapter_sdl.h index 585c29f1a..49be24f7a 100644 --- a/src/ballistica/base/app_adapter/app_adapter_sdl.h +++ b/src/ballistica/base/app_adapter/app_adapter_sdl.h @@ -52,6 +52,10 @@ class AppAdapterSDL : public AppAdapter { auto InGraphicsContext() -> bool override; void DoPushGraphicsContextRunnable(Runnable* runnable) override; void CursorPositionForDraw(float* x, float* y) override; + auto DoClipboardIsSupported() -> bool override; + auto DoClipboardHasText() -> bool override; + void DoClipboardSetText(const std::string& text) override; + auto DoClipboardGetText() -> std::string override; private: class ScopedAllowGraphics_; diff --git a/src/ballistica/base/input/input.cc b/src/ballistica/base/input/input.cc index e1a591dad..bbde01f1e 100644 --- a/src/ballistica/base/input/input.cc +++ b/src/ballistica/base/input/input.cc @@ -829,6 +829,15 @@ void Input::PushTextInputEvent(const std::string& text) { return; } + // Also ignore if there are any mod keys being held. + // We process some of our own keyboard shortcuts and don't + // want text input to come through at the same time. + if (keys_held_.contains(SDLK_LCTRL) || keys_held_.contains(SDLK_RCTRL) + || keys_held_.contains(SDLK_LALT) || keys_held_.contains(SDLK_RALT) + || keys_held_.contains(SDLK_LGUI) || keys_held_.contains(SDLK_RGUI)) { + return; + } + // We try to handle char filtering here (to keep it consistent across // platforms) but make a stink if they sent us something that we can't // at least translate to unicode. diff --git a/src/ballistica/base/platform/base_platform.h b/src/ballistica/base/platform/base_platform.h index 82f386791..85d19b397 100644 --- a/src/ballistica/base/platform/base_platform.h +++ b/src/ballistica/base/platform/base_platform.h @@ -71,6 +71,7 @@ class BasePlatform { /// active/inactive. virtual void LoginAdapterBackEndActiveChange(const std::string& login_type, bool active); + #pragma mark MISC -------------------------------------------------------------- /// Do we define a platform-specific string editor? This is something like @@ -115,8 +116,8 @@ class BasePlatform { /// class versions can go here. virtual void PostInit(); + bool ran_base_post_init_ : 1 {}; PythonRef string_edit_adapter_{}; - bool ran_base_post_init_{}; std::string public_device_uuid_; }; diff --git a/src/ballistica/base/python/methods/python_methods_misc.cc b/src/ballistica/base/python/methods/python_methods_misc.cc index b7d1f2a96..e6391281a 100644 --- a/src/ballistica/base/python/methods/python_methods_misc.cc +++ b/src/ballistica/base/python/methods/python_methods_misc.cc @@ -5,6 +5,7 @@ #include #include +#include "ballistica/base/app_adapter/app_adapter.h" #include "ballistica/base/assets/sound_asset.h" #include "ballistica/base/input/input.h" #include "ballistica/base/platform/base_platform.h" @@ -128,7 +129,7 @@ static PyMethodDef PyHasTouchScreenDef = { static auto PyClipboardIsSupported(PyObject* self) -> PyObject* { BA_PYTHON_TRY; - if (g_core->platform->ClipboardIsSupported()) { + if (g_base->app_adapter->ClipboardIsSupported()) { Py_RETURN_TRUE; } Py_RETURN_FALSE; @@ -154,7 +155,7 @@ static PyMethodDef PyClipboardIsSupportedDef = { static auto PyClipboardHasText(PyObject* self) -> PyObject* { BA_PYTHON_TRY; - if (g_core->platform->ClipboardHasText()) { + if (g_base->app_adapter->ClipboardHasText()) { Py_RETURN_TRUE; } Py_RETURN_FALSE; @@ -187,7 +188,7 @@ static auto PyClipboardSetText(PyObject* self, PyObject* args, PyObject* keywds) const_cast(kwlist), &value)) { return nullptr; } - g_core->platform->ClipboardSetText(value); + g_base->app_adapter->ClipboardSetText(value); Py_RETURN_NONE; BA_PYTHON_CATCH; } @@ -211,7 +212,7 @@ static PyMethodDef PyClipboardSetTextDef = { static auto PyClipboardGetText(PyObject* self) -> PyObject* { BA_PYTHON_TRY; - return PyUnicode_FromString(g_core->platform->ClipboardGetText().c_str()); + return PyUnicode_FromString(g_base->app_adapter->ClipboardGetText().c_str()); Py_RETURN_FALSE; BA_PYTHON_CATCH; } diff --git a/src/ballistica/core/platform/apple/core_platform_apple.cc b/src/ballistica/core/platform/apple/core_platform_apple.cc index c864f3ade..ac64502f2 100644 --- a/src/ballistica/core/platform/apple/core_platform_apple.cc +++ b/src/ballistica/core/platform/apple/core_platform_apple.cc @@ -400,38 +400,6 @@ auto CorePlatformApple::GetSubplatformName() -> std::string { #endif } -auto CorePlatformApple::DoClipboardIsSupported() -> bool { -#if BA_XCODE_BUILD - return base::AppleUtils::ClipboardIsSupported(); -#else - return CorePlatform::DoClipboardIsSupported(); -#endif -} - -auto CorePlatformApple::DoClipboardHasText() -> bool { -#if BA_XCODE_BUILD - return base::AppleUtils::ClipboardHasText(); -#else - return CorePlatform::DoClipboardHasText(); -#endif -} - -void CorePlatformApple::DoClipboardSetText(const std::string& text) { -#if BA_XCODE_BUILD - base::AppleUtils::ClipboardSetText(text); -#else - CorePlatform::DoClipboardSetText(text); -#endif -} - -auto CorePlatformApple::DoClipboardGetText() -> std::string { -#if BA_XCODE_BUILD - return base::AppleUtils::ClipboardGetText(); -#else - return CorePlatform::DoClipboardGetText(); -#endif -} - } // namespace ballistica::core #endif // BA_OSTYPE_MACOS || BA_OSTYPE_IOS_TVOS diff --git a/src/ballistica/core/platform/apple/core_platform_apple.h b/src/ballistica/core/platform/apple/core_platform_apple.h index 93923c0a8..215cb74ae 100644 --- a/src/ballistica/core/platform/apple/core_platform_apple.h +++ b/src/ballistica/core/platform/apple/core_platform_apple.h @@ -21,8 +21,6 @@ class CorePlatformApple : public CorePlatform { auto GenerateUUID() -> std::string override; auto DoGetConfigDirectoryMonolithicDefault() -> std::optional override; - // auto GetLocale() -> std::string override; - // auto DoGetDeviceName() -> std::string override; auto DoHasTouchScreen() -> bool override; auto GetDefaultUIScale() -> UIScale override; auto IsRunningOnDesktop() -> bool override; @@ -61,10 +59,6 @@ class CorePlatformApple : public CorePlatform { auto GetPlatformName() -> std::string override; auto GetSubplatformName() -> std::string override; - auto DoClipboardIsSupported() -> bool override; - auto DoClipboardHasText() -> bool override; - void DoClipboardSetText(const std::string& text) override; - auto DoClipboardGetText() -> std::string override; auto GetDeviceUUIDInputs() -> std::list override; protected: diff --git a/src/ballistica/core/platform/core_platform.cc b/src/ballistica/core/platform/core_platform.cc index 35a9e4e12..929731466 100644 --- a/src/ballistica/core/platform/core_platform.cc +++ b/src/ballistica/core/platform/core_platform.cc @@ -1053,92 +1053,6 @@ auto CorePlatform::GetCurrentWholeSeconds() -> int64_t { .count(); } -auto CorePlatform::ClipboardIsSupported() -> bool { - // We only call our actual virtual function once. - if (!have_clipboard_is_supported_) { - clipboard_is_supported_ = DoClipboardIsSupported(); - have_clipboard_is_supported_ = true; - } - return clipboard_is_supported_; -} - -auto CorePlatform::ClipboardHasText() -> bool { - // If subplatform says they don't support clipboards, don't even ask. - if (!ClipboardIsSupported()) { - return false; - } - return DoClipboardHasText(); -} - -void CorePlatform::ClipboardSetText(const std::string& text) { - // If subplatform says they don't support clipboards, this is an error. - if (!ClipboardIsSupported()) { - throw Exception("ClipboardSetText called with no clipboard support.", - PyExcType::kRuntime); - } - DoClipboardSetText(text); -} - -auto CorePlatform::ClipboardGetText() -> std::string { - // If subplatform says they don't support clipboards, this is an error. - if (!ClipboardIsSupported()) { - throw Exception("ClipboardGetText called with no clipboard support.", - PyExcType::kRuntime); - } - return DoClipboardGetText(); -} - -auto CorePlatform::DoClipboardIsSupported() -> bool { - // Go through SDL functionality on SDL based platforms; - // otherwise default to no clipboard. -#if BA_SDL_BUILD - return true; -#else - return false; -#endif -} - -auto CorePlatform::DoClipboardHasText() -> bool { - // Go through SDL functionality on SDL based platforms; - // otherwise default to no clipboard. -#if BA_SDL_BUILD - return SDL_HasClipboardText(); -#else - // Shouldn't get here since we default to no clipboard support. - FatalError("Shouldn't get here."); - return false; -#endif -} - -void CorePlatform::DoClipboardSetText(const std::string& text) { - // Go through SDL functionality on SDL based platforms; - // otherwise default to no clipboard. -#if BA_SDL_BUILD - SDL_SetClipboardText(text.c_str()); -#else - // Shouldn't get here since we default to no clipboard support. - FatalError("Shouldn't get here."); -#endif -} - -auto CorePlatform::DoClipboardGetText() -> std::string { - // Go through SDL functionality on SDL based platforms; - // otherwise default to no clipboard. -#if BA_SDL_BUILD - char* out = SDL_GetClipboardText(); - if (out == nullptr) { - throw Exception("Error fetching clipboard contents.", PyExcType::kRuntime); - } - std::string out_s{out}; - SDL_free(out); - return out_s; -#else - // Shouldn't get here since we default to no clipboard support. - FatalError("Shouldn't get here."); - return ""; -#endif -} - auto CorePlatform::System(const char* cmd) -> int { // By default can support this everywhere outside of Apple's more // sandboxed platforms (iOS and equivalent). Actually should check diff --git a/src/ballistica/core/platform/core_platform.h b/src/ballistica/core/platform/core_platform.h index 23fd4fae2..b3890170a 100644 --- a/src/ballistica/core/platform/core_platform.h +++ b/src/ballistica/core/platform/core_platform.h @@ -76,24 +76,6 @@ class CorePlatform { /// requires the path to already exist. auto AbsPath(const std::string& path, std::string* outpath) -> bool; -#pragma mark CLIPBOARD --------------------------------------------------------- - - /// Return whether clipboard operations are supported at all. This gets - /// called when determining whether to display clipboard related UI - /// elements/etc. - auto ClipboardIsSupported() -> bool; - - /// Return whether there is currently text on the clipboard. - auto ClipboardHasText() -> bool; - - /// Set current clipboard text. Raises an Exception if clipboard is - /// unsupported. - void ClipboardSetText(const std::string& text); - - /// Return current text from the clipboard. Raises an Exception if - /// clipboard is unsupported or if there's no text on the clipboard. - auto ClipboardGetText() -> std::string; - #pragma mark PRINTING/LOGGING -------------------------------------------------- /// Display a message to any default log for the platform (android log, @@ -456,11 +438,6 @@ class CorePlatform { /// Generate a random UUID string. virtual auto GenerateUUID() -> std::string; - virtual auto DoClipboardIsSupported() -> bool; - virtual auto DoClipboardHasText() -> bool; - virtual void DoClipboardSetText(const std::string& text); - virtual auto DoClipboardGetText() -> std::string; - /// Print a log message to be included in crash logs or other debug /// mechanisms (example: Crashlytics). V1-cloud-log messages get forwarded /// to here as well. It can be useful to call this directly to report extra @@ -473,15 +450,13 @@ class CorePlatform { virtual ~CorePlatform(); private: - bool is_stdin_a_terminal_{}; - bool have_has_touchscreen_value_{}; - bool have_touchscreen_{}; - bool is_tegra_k1_{}; - bool have_clipboard_is_supported_{}; - bool clipboard_is_supported_{}; - bool made_volatile_data_dir_{}; - bool have_device_uuid_{}; - bool ran_base_post_init_{}; + bool is_stdin_a_terminal_ : 1 {}; + bool have_has_touchscreen_value_ : 1 {}; + bool have_touchscreen_ : 1 {}; + bool is_tegra_k1_ : 1 {}; + bool made_volatile_data_dir_ : 1 {}; + bool have_device_uuid_ : 1 {}; + bool ran_base_post_init_ : 1 {}; millisecs_t start_time_millisecs_{}; std::string device_name_; std::string legacy_device_uuid_; diff --git a/src/ballistica/shared/ballistica.cc b/src/ballistica/shared/ballistica.cc index d34c69ce8..047ad453b 100644 --- a/src/ballistica/shared/ballistica.cc +++ b/src/ballistica/shared/ballistica.cc @@ -39,7 +39,7 @@ auto main(int argc, char** argv) -> int { namespace ballistica { // These are set automatically via script; don't modify them here. -const int kEngineBuildNumber = 21512; +const int kEngineBuildNumber = 21516; const char* kEngineVersion = "1.7.28"; const int kEngineApiVersion = 8; diff --git a/src/ballistica/ui_v1/widget/text_widget.cc b/src/ballistica/ui_v1/widget/text_widget.cc index f6957b82c..c6b020192 100644 --- a/src/ballistica/ui_v1/widget/text_widget.cc +++ b/src/ballistica/ui_v1/widget/text_widget.cc @@ -2,6 +2,7 @@ #include "ballistica/ui_v1/widget/text_widget.h" +#include "ballistica/base/app_adapter/app_adapter.h" #include "ballistica/base/audio/audio.h" #include "ballistica/base/graphics/component/empty_component.h" #include "ballistica/base/graphics/component/simple_component.h" @@ -648,10 +649,10 @@ auto TextWidget::HandleMessage(const base::WidgetMessage& m) -> bool { // If we're doing inline editing, handle clipboard paste. if (editable() && !ShouldUseStringEditor_() && m.type == base::WidgetMessage::Type::kPaste) { - if (g_core->platform->ClipboardIsSupported()) { - if (g_core->platform->ClipboardHasText()) { + if (g_base->app_adapter->ClipboardIsSupported()) { + if (g_base->app_adapter->ClipboardHasText()) { // Just enter it char by char as if we had typed it... - AddCharsToText_(g_core->platform->ClipboardGetText()); + AddCharsToText_(g_base->app_adapter->ClipboardGetText()); } } }