156 lines
5.5 KiB
C++
156 lines
5.5 KiB
C++
![]() |
#include "winrt/Windows.ApplicationModel.Core.h"
|
||
|
#include "winrt/Windows.Foundation.h"
|
||
|
#include "winrt/Windows.System.Profile.h"
|
||
|
#include "winrt/Windows.System.Threading.h"
|
||
|
#include "winrt/Windows.UI.Core.h"
|
||
|
#include <winrt/Windows.Foundation.Collections.h>
|
||
|
#include <winrt/Windows.Graphics.Display.h>
|
||
|
#include <winrt/Windows.Storage.h>
|
||
|
#include <winrt/Windows.UI.Popups.h>
|
||
|
#include <winrt/Windows.UI.ViewManagement.Core.h>
|
||
|
#include <winrt/Windows.UI.ViewManagement.h>
|
||
|
|
||
|
#include <chrono>
|
||
|
#include <memory>
|
||
|
#include <thread>
|
||
|
|
||
|
#include <flutter/flutter_view_controller.h>
|
||
|
#include <flutter/flutter_windows.h>
|
||
|
#include <flutter/generated_plugin_registrant.h>
|
||
|
#include <flutter/plugin_registry.h>
|
||
|
|
||
|
struct FlutterFrameworkView
|
||
|
: winrt::implements<
|
||
|
FlutterFrameworkView,
|
||
|
winrt::Windows::ApplicationModel::Core::IFrameworkView> {
|
||
|
// |winrt::Windows::ApplicationModel::Core::IFrameworkView|
|
||
|
void
|
||
|
Initialize(winrt::Windows::ApplicationModel::Core::CoreApplicationView const
|
||
|
&applicationView) {
|
||
|
|
||
|
// Layout scaling must be disabled in the appinitialization phase in order
|
||
|
// to take effect correctly.
|
||
|
if (winrt::Windows::System::Profile::AnalyticsInfo::VersionInfo()
|
||
|
.DeviceFamily() == L"Windows.Xbox") {
|
||
|
|
||
|
bool result = winrt::Windows::UI::ViewManagement::ApplicationViewScaling::
|
||
|
TrySetDisableLayoutScaling(true);
|
||
|
if (!result) {
|
||
|
OutputDebugString(L"Couldn't disable layout scaling");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
main_view_ = applicationView;
|
||
|
main_view_.Activated({this, &FlutterFrameworkView::OnActivated});
|
||
|
}
|
||
|
|
||
|
// |winrt::Windows::ApplicationModel::Core::IFrameworkView|
|
||
|
void Uninitialize() {
|
||
|
main_view_.Activated(nullptr);
|
||
|
main_view_ = nullptr;
|
||
|
}
|
||
|
|
||
|
// |winrt::Windows::ApplicationModel::Core::IFrameworkView|
|
||
|
void Load(winrt::hstring const &) {}
|
||
|
|
||
|
// |winrt::Windows::ApplicationModel::Core::IFrameworkView|
|
||
|
void Run() {
|
||
|
winrt::Windows::UI::Core::CoreWindow window =
|
||
|
winrt::Windows::UI::Core::CoreWindow::GetForCurrentThread();
|
||
|
|
||
|
winrt::Windows::UI::Core::CoreDispatcher dispatcher = window.Dispatcher();
|
||
|
dispatcher.ProcessEvents(
|
||
|
winrt::Windows::UI::Core::CoreProcessEventsOption::ProcessUntilQuit);
|
||
|
}
|
||
|
|
||
|
// |winrt::Windows::ApplicationModel::Core::IFrameworkView|
|
||
|
winrt::Windows::Foundation::IAsyncAction
|
||
|
SetWindow(winrt::Windows::UI::Core::CoreWindow const &window) {
|
||
|
|
||
|
// Capture reference to window.
|
||
|
window_ = window;
|
||
|
|
||
|
// Lay out the window's content within the region occupied by the
|
||
|
// CoreWindow.
|
||
|
auto appView = winrt::Windows::UI::ViewManagement::ApplicationView::
|
||
|
GetForCurrentView();
|
||
|
|
||
|
appView.SetDesiredBoundsMode(winrt::Windows::UI::ViewManagement::
|
||
|
ApplicationViewBoundsMode::UseCoreWindow);
|
||
|
|
||
|
// Configure folder paths.
|
||
|
try {
|
||
|
winrt::Windows::Storage::StorageFolder folder =
|
||
|
winrt::Windows::ApplicationModel::Package::Current()
|
||
|
.InstalledLocation();
|
||
|
|
||
|
winrt::Windows::Storage::StorageFolder assets =
|
||
|
co_await folder.GetFolderAsync(L"Assets");
|
||
|
winrt::Windows::Storage::StorageFolder data =
|
||
|
co_await assets.GetFolderAsync(L"data");
|
||
|
winrt::Windows::Storage::StorageFolder flutter_assets =
|
||
|
co_await data.GetFolderAsync(L"flutter_assets");
|
||
|
winrt::Windows::Storage::StorageFile icu_data =
|
||
|
co_await data.GetFileAsync(L"icudtl.dat");
|
||
|
|
||
|
#if NDEBUG
|
||
|
winrt::Windows::Storage::StorageFile aot_data =
|
||
|
co_await data.GetFileAsync(L"app.so");
|
||
|
#endif
|
||
|
|
||
|
std::wstring flutter_assets_path{flutter_assets.Path()};
|
||
|
std::wstring icu_data_path{icu_data.Path()};
|
||
|
std::wstring aot_data_path {
|
||
|
#if NDEBUG
|
||
|
aot_data.Path()
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
flutter::DartProject project(flutter_assets_path, icu_data_path,
|
||
|
aot_data_path);
|
||
|
|
||
|
// Construct viewcontroller using the Window and project
|
||
|
flutter_view_controller_ = std::make_unique<flutter::FlutterViewController>(
|
||
|
static_cast<ABI::Windows::ApplicationModel::Core::CoreApplicationView*>(winrt::get_abi(main_view_)),
|
||
|
static_cast<ABI::Windows::ApplicationModel::Activation::IActivatedEventArgs*>(winrt::get_abi(launch_args_)),
|
||
|
project);
|
||
|
|
||
|
// If plugins present, register them.
|
||
|
RegisterPlugins(flutter_view_controller_.get()->engine());
|
||
|
} catch (winrt::hresult_error &err) {
|
||
|
winrt::Windows::UI::Popups::MessageDialog md =
|
||
|
winrt::Windows::UI::Popups::MessageDialog::MessageDialog(
|
||
|
L"There was a problem starting the engine: " + err.message());
|
||
|
md.ShowAsync();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void OnActivated(
|
||
|
winrt::Windows::ApplicationModel::Core::CoreApplicationView const
|
||
|
&applicationView,
|
||
|
winrt::Windows::ApplicationModel::Activation::IActivatedEventArgs const
|
||
|
&args) {
|
||
|
// Activate the application window, making it visible and enabling it to
|
||
|
// receive events.
|
||
|
applicationView.CoreWindow().Activate();
|
||
|
|
||
|
// Capture launch args to later pass to Flutter.
|
||
|
launch_args_ = args;
|
||
|
}
|
||
|
|
||
|
// Current CoreApplicationView.
|
||
|
winrt::Windows::ApplicationModel::Core::CoreApplicationView main_view_{
|
||
|
nullptr};
|
||
|
|
||
|
// Current CoreWindow.
|
||
|
winrt::Windows::UI::Core::CoreWindow window_{nullptr};
|
||
|
|
||
|
// Current FlutterViewController.
|
||
|
std::unique_ptr<flutter::FlutterViewController> flutter_view_controller_{
|
||
|
nullptr};
|
||
|
|
||
|
// Launch args that were passed in on activation.
|
||
|
winrt::Windows::ApplicationModel::Activation::IActivatedEventArgs
|
||
|
launch_args_;
|
||
|
};
|