winrt: Fix MessageDialog show on windows phone.
authorSamuel Nevala <samuel.nevala@intopalo.com>
Wed, 26 Aug 2015 12:11:39 +0000 (15:11 +0300)
committerSamuel Nevala <samuel.nevala@intopalo.com>
Thu, 27 Aug 2015 09:47:38 +0000 (09:47 +0000)
Run native dialog show on XAML thread.

Change-Id: I6273340e87d70aae21c838d9d7646a233c1f48be
Task-Id: QTBUG-47938
Reviewed-by: Andrew Knight <andrew.knight@intopalo.com>
src/plugins/platforms/winrt/qwinrtmessagedialoghelper.cpp

index 4fc1fea..68bf1fd 100644 (file)
@@ -38,7 +38,9 @@
 #include "qwinrttheme.h"
 
 #include <QtCore/qfunctions_winrt.h>
+#include <private/qeventdispatcher_winrt_p.h>
 
+#include <functional>
 #include <windows.ui.popups.h>
 #include <windows.foundation.h>
 #include <windows.foundation.collections.h>
@@ -168,16 +170,20 @@ bool QWinRTMessageDialogHelper::show(Qt::WindowFlags windowFlags, Qt::WindowModa
         }
     }
 
-    ComPtr<IAsyncOperation<IUICommand *>> op;
-    hr = dialog->ShowAsync(&op);
-    RETURN_FALSE_IF_FAILED("Failed to show dialog");
-    hr = op->put_Completed(Callback<DialogCompletedHandler>(this, &QWinRTMessageDialogHelper::onCompleted).Get());
-    RETURN_FALSE_IF_FAILED("Failed to set dialog callback");
-
-    d->shown = true;
-    hr = op.As(&d->info);
-    RETURN_FALSE_IF_FAILED("Failed to acquire AsyncInfo for MessageDialog");
-
+    hr = QEventDispatcherWinRT::runOnXamlThread([this, d, dialog]() {
+        HRESULT hr;
+        ComPtr<IAsyncOperation<IUICommand *>> op;
+        hr = dialog->ShowAsync(&op);
+        RETURN_HR_IF_FAILED("Failed to show dialog");
+        hr = op->put_Completed(Callback<DialogCompletedHandler>(this, &QWinRTMessageDialogHelper::onCompleted).Get());
+        RETURN_HR_IF_FAILED("Failed to set dialog callback");
+        d->shown = true;
+        hr = op.As(&d->info);
+        RETURN_HR_IF_FAILED("Failed to acquire AsyncInfo for MessageDialog");
+        return hr;
+    });
+
+    RETURN_FALSE_IF_FAILED("Failed to show dialog")
     return true;
 }