2022-05-23 16:25:55 +08:00
# include "flutter_window.h"
# include <optional>
2023-02-23 10:02:54 +08:00
# include <desktop_multi_window/desktop_multi_window_plugin.h>
# include <texture_rgba_renderer/texture_rgba_renderer_plugin_c_api.h>
2024-01-02 16:58:10 +08:00
# include <flutter_gpu_texture_renderer/flutter_gpu_texture_renderer_plugin_c_api.h>
2023-02-23 10:02:54 +08:00
2022-05-23 16:25:55 +08:00
# include "flutter/generated_plugin_registrant.h"
FlutterWindow : : FlutterWindow ( const flutter : : DartProject & project )
: project_ ( project ) { }
FlutterWindow : : ~ FlutterWindow ( ) { }
bool FlutterWindow : : OnCreate ( ) {
if ( ! Win32Window : : OnCreate ( ) ) {
return false ;
}
RECT frame = GetClientArea ( ) ;
// The size here must match the window dimensions to avoid unnecessary surface
// creation / destruction in the startup path.
flutter_controller_ = std : : make_unique < flutter : : FlutterViewController > (
frame . right - frame . left , frame . bottom - frame . top , project_ ) ;
// Ensure that basic setup of the controller was successful.
if ( ! flutter_controller_ - > engine ( ) | | ! flutter_controller_ - > view ( ) ) {
return false ;
}
RegisterPlugins ( flutter_controller_ - > engine ( ) ) ;
2023-02-23 10:02:54 +08:00
DesktopMultiWindowSetWindowCreatedCallback ( [ ] ( void * controller ) {
auto * flutter_view_controller =
reinterpret_cast < flutter : : FlutterViewController * > ( controller ) ;
auto * registry = flutter_view_controller - > engine ( ) ;
TextureRgbaRendererPluginCApiRegisterWithRegistrar (
registry - > GetRegistrarForPlugin ( " TextureRgbaRendererPlugin " ) ) ;
2024-01-02 16:58:10 +08:00
FlutterGpuTextureRendererPluginCApiRegisterWithRegistrar (
registry - > GetRegistrarForPlugin ( " FlutterGpuTextureRendererPluginCApi " ) ) ;
2023-02-23 10:02:54 +08:00
} ) ;
2022-05-23 16:25:55 +08:00
SetChildContent ( flutter_controller_ - > view ( ) - > GetNativeWindow ( ) ) ;
return true ;
}
void FlutterWindow : : OnDestroy ( ) {
if ( flutter_controller_ ) {
flutter_controller_ = nullptr ;
}
Win32Window : : OnDestroy ( ) ;
}
LRESULT
FlutterWindow : : MessageHandler ( HWND hwnd , UINT const message ,
WPARAM const wparam ,
LPARAM const lparam ) noexcept {
// Give Flutter, including plugins, an opportunity to handle window messages.
if ( flutter_controller_ ) {
std : : optional < LRESULT > result =
flutter_controller_ - > HandleTopLevelWindowProc ( hwnd , message , wparam ,
lparam ) ;
if ( result ) {
return * result ;
}
}
switch ( message ) {
case WM_FONTCHANGE :
flutter_controller_ - > engine ( ) - > ReloadSystemFonts ( ) ;
break ;
}
return Win32Window : : MessageHandler ( hwnd , message , wparam , lparam ) ;
}