#include "flutter_window.h" #include #include #include #include "flutter/generated_plugin_registrant.h" #include #include #include #include #include #include #include #include #include "win32_desktop.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( 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()); flutter::MethodChannel<> channel( flutter_controller_->engine()->messenger(), "org.rustdesk.rustdesk/host", &flutter::StandardMethodCodec::GetInstance()); channel.SetMethodCallHandler( [](const flutter::MethodCall<>& call, std::unique_ptr> result) { if (call.method_name() == "bumpMouse") { auto arguments = call.arguments(); int dx = 0, dy = 0; if (std::holds_alternative(*arguments)) { auto argsMap = std::get(*arguments); auto dxIt = argsMap.find(flutter::EncodableValue("dx")); auto dyIt = argsMap.find(flutter::EncodableValue("dy")); if ((dxIt != argsMap.end()) && std::holds_alternative(dxIt->second)) { dx = std::get(dxIt->second); } if ((dyIt != argsMap.end()) && std::holds_alternative(dyIt->second)) { dy = std::get(dyIt->second); } } else if (std::holds_alternative(*arguments)) { auto argsList = std::get(*arguments); if ((argsList.size() >= 1) && std::holds_alternative(argsList[0])) { dx = std::get(argsList[0]); } if ((argsList.size() >= 2) && std::holds_alternative(argsList[1])) { dy = std::get(argsList[1]); } } bool succeeded = Win32Desktop::BumpMouse(dx, dy); result->Success(succeeded); } }); DesktopMultiWindowSetWindowCreatedCallback([](void *controller) { auto *flutter_view_controller = reinterpret_cast(controller); auto *registry = flutter_view_controller->engine(); TextureRgbaRendererPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("TextureRgbaRendererPlugin")); FlutterGpuTextureRendererPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterGpuTextureRendererPluginCApi")); }); 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 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); }