Browse Source

Merge pull request #73126 from akien-mga/uwp-clipboard-fix

UWP: Fix app crash when `managed_object->update_clipboard()` is called
Rémi Verschelde 2 years ago
parent
commit
bd177bb1cd
4 changed files with 14 additions and 2 deletions
  1. 7 0
      platform/uwp/app.cpp
  2. 1 0
      platform/uwp/app.h
  3. 5 2
      platform/uwp/os_uwp.cpp
  4. 1 0
      platform/uwp/os_uwp.h

+ 7 - 0
platform/uwp/app.cpp

@@ -108,6 +108,9 @@ void App::SetWindow(CoreWindow ^ p_window) {
 	window->VisibilityChanged +=
 			ref new TypedEventHandler<CoreWindow ^, VisibilityChangedEventArgs ^>(this, &App::OnVisibilityChanged);
 
+	window->Activated +=
+			ref new TypedEventHandler<CoreWindow ^, WindowActivatedEventArgs ^>(this, &App::OnWindowActivated);
+
 	window->Closed +=
 			ref new TypedEventHandler<CoreWindow ^, CoreWindowEventArgs ^>(this, &App::OnWindowClosed);
 
@@ -447,6 +450,10 @@ void App::OnVisibilityChanged(CoreWindow ^ sender, VisibilityChangedEventArgs ^
 	mWindowVisible = args->Visible;
 }
 
+void App::OnWindowActivated(CoreWindow ^ sender, WindowActivatedEventArgs ^ args) {
+	os->update_clipboard();
+}
+
 void App::OnWindowClosed(CoreWindow ^ sender, CoreWindowEventArgs ^ args) {
 	mWindowClosed = true;
 }

+ 1 - 0
platform/uwp/app.h

@@ -69,6 +69,7 @@ namespace GodotUWP
 		// Window event handlers.
 		void OnWindowSizeChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::WindowSizeChangedEventArgs^ args);
 		void OnVisibilityChanged(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::VisibilityChangedEventArgs^ args);
+		void OnWindowActivated(CoreWindow ^ sender, WindowActivatedEventArgs ^ args);
 		void OnWindowClosed(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::CoreWindowEventArgs^ args);
 
 		void pointer_event(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args, bool p_pressed, bool p_is_wheel = false);

+ 5 - 2
platform/uwp/os_uwp.cpp

@@ -284,8 +284,6 @@ Error OS_UWP::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
 
 	power_manager = memnew(PowerUWP);
 
-	managed_object->update_clipboard();
-
 	Clipboard::ContentChanged += ref new EventHandler<Platform::Object ^>(managed_object, &ManagedType::on_clipboard_changed);
 
 	accelerometer = Accelerometer::GetDefault();
@@ -387,6 +385,11 @@ void OS_UWP::alert(const String &p_alert, const String &p_title) {
 	msg->ShowAsync();
 }
 
+void OS_UWP::update_clipboard() {
+	// See https://stackoverflow.com/questions/58660743/uwp-app-crashes-when-clipboard-getcontent-is-called-from-inside-onnavigatedto
+	managed_object->update_clipboard();
+}
+
 void OS_UWP::ManagedType::alert_close(IUICommand ^ command) {
 	alert_close_handle = false;
 }

+ 1 - 0
platform/uwp/os_uwp.h

@@ -226,6 +226,7 @@ public:
 
 	virtual bool _check_internal_feature_support(const String &p_feature);
 
+	void update_clipboard();
 	void set_window(Windows::UI::Core::CoreWindow ^ p_window);
 	void screen_size_changed();