/ windows / runner / flutter_window.cpp
flutter_window.cpp
 1  #include "flutter_window.h"
 2  
 3  #include <optional>
 4  
 5  #include "flutter/generated_plugin_registrant.h"
 6  
 7  FlutterWindow::FlutterWindow(const flutter::DartProject& project)
 8      : project_(project) {}
 9  
10  FlutterWindow::~FlutterWindow() {}
11  
12  bool FlutterWindow::OnCreate() {
13    if (!Win32Window::OnCreate()) {
14      return false;
15    }
16  
17    RECT frame = GetClientArea();
18  
19    // The size here must match the window dimensions to avoid unnecessary surface
20    // creation / destruction in the startup path.
21    flutter_controller_ = std::make_unique<flutter::FlutterViewController>(
22        frame.right - frame.left, frame.bottom - frame.top, project_);
23    // Ensure that basic setup of the controller was successful.
24    if (!flutter_controller_->engine() || !flutter_controller_->view()) {
25      return false;
26    }
27    RegisterPlugins(flutter_controller_->engine());
28    SetChildContent(flutter_controller_->view()->GetNativeWindow());
29  
30    flutter_controller_->engine()->SetNextFrameCallback([&]() {
31      this->Show();
32    });
33  
34    // Flutter can complete the first frame before the "show window" callback is
35    // registered. The following call ensures a frame is pending to ensure the
36    // window is shown. It is a no-op if the first frame hasn't completed yet.
37    flutter_controller_->ForceRedraw();
38  
39    return true;
40  }
41  
42  void FlutterWindow::OnDestroy() {
43    if (flutter_controller_) {
44      flutter_controller_ = nullptr;
45    }
46  
47    Win32Window::OnDestroy();
48  }
49  
50  LRESULT
51  FlutterWindow::MessageHandler(HWND hwnd, UINT const message,
52                                WPARAM const wparam,
53                                LPARAM const lparam) noexcept {
54    // Give Flutter, including plugins, an opportunity to handle window messages.
55    if (flutter_controller_) {
56      std::optional<LRESULT> result =
57          flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,
58                                                        lparam);
59      if (result) {
60        return *result;
61      }
62    }
63  
64    switch (message) {
65      case WM_FONTCHANGE:
66        flutter_controller_->engine()->ReloadSystemFonts();
67        break;
68    }
69  
70    return Win32Window::MessageHandler(hwnd, message, wparam, lparam);
71  }