#include "flutter_window.h" #include #include #include #include "flutter/generated_plugin_registrant.h" // Helper: Read AppsUseLightTheme from registry (0 = dark mode, 1 = light mode) static BOOL IsDarkMode() { HKEY hKey; DWORD value = 1; // default: light DWORD size = sizeof(value); if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { RegQueryValueExW(hKey, L"AppsUseLightTheme", nullptr, nullptr, reinterpret_cast(&value), &size); RegCloseKey(hKey); } return (value == 0) ? TRUE : FALSE; } // Apply dark/light title bar based on current system setting static void ApplyDarkTitleBar(HWND hwnd) { BOOL dark = IsDarkMode(); DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &dark, sizeof(dark)); } 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()); SetChildContent(flutter_controller_->view()->GetNativeWindow()); // Apply dark/light title bar to match system theme ApplyDarkTitleBar(GetHandle()); 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; case WM_SETTINGCHANGE: if (lparam && wcscmp(reinterpret_cast(lparam), L"ImmersiveColorSet") == 0) { ApplyDarkTitleBar(hwnd); } break; } return Win32Window::MessageHandler(hwnd, message, wparam, lparam); }