mirror of
				https://gitlab.com/foxixus/neomovies_mobile.git
				synced 2025-10-29 11:58:50 +05:00 
			
		
		
		
	
		
			
	
	
		
			72 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | #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
 | ||
|  |   // 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()); | ||
|  |   SetChildContent(flutter_controller_->view()->GetNativeWindow()); | ||
|  | 
 | ||
|  |   flutter_controller_->engine()->SetNextFrameCallback([&]() { | ||
|  |     this->Show(); | ||
|  |   }); | ||
|  | 
 | ||
|  |   // Flutter can complete the first frame before the "show window" callback is
 | ||
|  |   // registered. The following call ensures a frame is pending to ensure the
 | ||
|  |   // window is shown. It is a no-op if the first frame hasn't completed yet.
 | ||
|  |   flutter_controller_->ForceRedraw(); | ||
|  | 
 | ||
|  |   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); | ||
|  | } |