| 
									
										
										
										
											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); | 
					
						
							|  |  |  | } |