mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
100 lines
3.1 KiB
C++
100 lines
3.1 KiB
C++
// 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 <io.h>
|
|
|
|
#include <algorithm>
|
|
#include <cassert>
|
|
#include <chrono>
|
|
#include <cstdlib>
|
|
#include <filesystem>
|
|
#include <iostream>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#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<flutter::FlutterWindowsEngine*>(ref);
|
|
}
|
|
|
|
FlutterDesktopViewControllerRef FlutterDesktopViewControllerCreate(
|
|
int width,
|
|
int height,
|
|
FlutterDesktopEngineRef engine) {
|
|
std::unique_ptr<flutter::WindowBindingHandler> window_wrapper =
|
|
std::make_unique<flutter::Win32FlutterWindow>(width, height);
|
|
|
|
auto state = std::make_unique<FlutterDesktopViewControllerState>();
|
|
state->view =
|
|
std::make_unique<flutter::FlutterWindowsView>(std::move(window_wrapper));
|
|
state->view->CreateRenderSurface();
|
|
|
|
// Take ownership of the engine, starting it if necessary.
|
|
state->view->SetEngine(
|
|
std::unique_ptr<flutter::FlutterWindowsEngine>(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<LRESULT> 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<flutter::TaskRunnerWin32*>(
|
|
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);
|
|
}
|