| 
									
										
										
										
											2021-07-17 00:37:47 +08:00
										 |  |  | #include "flutter_window.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <optional>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #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
 | 
					
						
							| 
									
										
										
										
											2024-06-05 17:32:30 +08:00
										 |  |  | // creation / destruction in the startup path.
 | 
					
						
							| 
									
										
										
										
											2021-07-17 00:37:47 +08:00
										 |  |  |   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()); | 
					
						
							|  |  |  |   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); | 
					
						
							|  |  |  | } |