// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "flutter/shell/platform/windows/public/flutter_windows.h" #include #include #include #include #include #include #include #include #include #include "flutter/shell/platform/windows/task_runner_win32.h" #include "flutter/shell/platform/windows/win32_dpi_utils.h" #include "flutter/shell/platform/windows/win32_flutter_window.h" // Returns the engine corresponding to the given opaque API handle. static flutter::FlutterWindowsEngine* EngineFromHandle( FlutterDesktopEngineRef ref) { return reinterpret_cast(ref); } FlutterDesktopViewControllerRef FlutterDesktopViewControllerCreate( int width, int height, FlutterDesktopEngineRef engine) { std::unique_ptr window_wrapper = std::make_unique(width, height); auto state = std::make_unique(); state->view = std::make_unique(std::move(window_wrapper)); state->view->CreateRenderSurface(); // Take ownership of the engine, starting it if necessary. state->view->SetEngine( std::unique_ptr(EngineFromHandle(engine))); if (!state->view->GetEngine()->running()) { if (!state->view->GetEngine()->RunWithEntrypoint(nullptr)) { return nullptr; } } // Must happen after engine is running. state->view->SendInitialBounds(); return state.release(); } bool FlutterDesktopViewControllerHandleTopLevelWindowProc( FlutterDesktopViewControllerRef controller, HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, LRESULT* result) { std::optional delegate_result = controller->view->GetEngine() ->window_proc_delegate_manager() ->OnTopLevelWindowProc(hwnd, message, wparam, lparam); if (delegate_result) { *result = *delegate_result; } return delegate_result.has_value(); } uint64_t FlutterDesktopEngineProcessMessages(FlutterDesktopEngineRef engine) { return static_cast( EngineFromHandle(engine)->task_runner()) ->ProcessTasks() .count(); } void FlutterDesktopPluginRegistrarRegisterTopLevelWindowProcDelegate( FlutterDesktopPluginRegistrarRef registrar, FlutterDesktopWindowProcCallback delegate, void* user_data) { registrar->engine->window_proc_delegate_manager() ->RegisterTopLevelWindowProcDelegate(delegate, user_data); } void FlutterDesktopPluginRegistrarUnregisterTopLevelWindowProcDelegate( FlutterDesktopPluginRegistrarRef registrar, FlutterDesktopWindowProcCallback delegate) { registrar->engine->window_proc_delegate_manager() ->UnregisterTopLevelWindowProcDelegate(delegate); } UINT FlutterDesktopGetDpiForHWND(HWND hwnd) { return flutter::GetDpiForHWND(hwnd); } UINT FlutterDesktopGetDpiForMonitor(HMONITOR monitor) { return flutter::GetDpiForMonitor(monitor); }