Flutter Windows Embedder
window_manager.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
6 
7 #include <dwmapi.h>
8 #include <optional>
9 #include <vector>
10 
11 #include "embedder.h"
16 #include "fml/logging.h"
20 
21 namespace flutter {
22 
24 
26  on_message_ = request->on_message;
27  isolate_ = Isolate::Current();
28 }
29 
31  return !active_windows_.empty();
32 }
33 
35  const WindowCreationRequest* request) {
36  auto window = HostWindow::CreateRegularWindow(
37  this, engine_, request->preferred_size, request->preferred_constraints,
38  request->title);
39  if (!window || !window->GetWindowHandle()) {
40  FML_LOG(ERROR) << "Failed to create host window";
41  return -1;
42  }
43  FlutterViewId const view_id = window->view_controller_->view()->view_id();
44  active_windows_[window->GetWindowHandle()] = std::move(window);
45  return view_id;
46 }
47 
49  // Don't send any more messages to isolate.
50  on_message_ = nullptr;
51  std::vector<HWND> active_handles;
52  active_handles.reserve(active_windows_.size());
53  for (auto& [hwnd, window] : active_windows_) {
54  active_handles.push_back(hwnd);
55  }
56  for (auto hwnd : active_handles) {
57  // This will destroy the window, which will in turn remove the
58  // HostWindow from map when handling WM_NCDESTROY inside
59  // HandleMessage.
60  DestroyWindow(hwnd);
61  }
62 }
63 
64 std::optional<LRESULT> WindowManager::HandleMessage(HWND hwnd,
65  UINT message,
66  WPARAM wparam,
67  LPARAM lparam) {
68  if (message == WM_NCDESTROY) {
69  active_windows_.erase(hwnd);
70  }
71 
72  FlutterWindowsView* view = engine_->GetViewFromTopLevelWindow(hwnd);
73  if (!view) {
74  FML_LOG(WARNING) << "Received message for unknown view";
75  return std::nullopt;
76  }
77 
78  WindowsMessage message_struct = {.view_id = view->view_id(),
79  .hwnd = hwnd,
80  .message = message,
81  .wParam = wparam,
82  .lParam = lparam,
83  .result = 0,
84  .handled = false};
85 
86  // Not initialized yet.
87  if (!isolate_) {
88  return std::nullopt;
89  }
90 
91  IsolateScope scope(*isolate_);
92  on_message_(&message_struct);
93  if (message_struct.handled) {
94  return message_struct.result;
95  } else {
96  return std::nullopt;
97  }
98 }
99 
100 } // namespace flutter
101 
103  int64_t engine_id,
104  const flutter::WindowingInitRequest* request) {
107  engine->window_manager()->Initialize(request);
108 }
109 
111  int64_t engine_id) {
114  return engine->window_manager()->HasTopLevelWindows();
115 }
116 
118  int64_t engine_id,
119  const flutter::WindowCreationRequest* request) {
122  return engine->window_manager()->CreateRegularWindow(request);
123 }
124 
126  int64_t engine_id,
127  FlutterViewId view_id) {
130  flutter::FlutterWindowsView* view = engine->view(view_id);
131  if (view == nullptr) {
132  return nullptr;
133  } else {
134  return GetAncestor(view->GetWindowHandle(), GA_ROOT);
135  }
136 }
137 
141 }
142 
144  HWND hwnd,
145  const flutter::WindowSizeRequest* size) {
147  if (window) {
148  window->SetContentSize(*size);
149  }
150 }
151 
153  HWND hwnd,
154  const flutter::WindowConstraints* constraints) {
156  if (window) {
157  window->SetConstraints(*constraints);
158  }
159 }
160 
162  HWND hwnd,
163  const flutter::FullscreenRequest* request) {
165  const std::optional<FlutterEngineDisplayId> display_id =
166  request->has_display_id
167  ? std::optional<FlutterEngineDisplayId>(request->display_id)
168  : std::nullopt;
169  if (window) {
170  window->SetFullscreen(request->fullscreen, display_id);
171  }
172 }
173 
176  if (window) {
177  return window->GetFullscreen();
178  }
179 
180  return false;
181 }
FlutterWindowsView * view(FlutterViewId view_id) const
static FlutterWindowsEngine * GetEngineForId(int64_t engine_id)
FlutterWindowsView * GetViewFromTopLevelWindow(HWND hwnd) const
virtual HWND GetWindowHandle() const
static std::unique_ptr< HostWindow > CreateRegularWindow(WindowManager *controller, FlutterWindowsEngine *engine, const WindowSizeRequest &preferred_size, const WindowConstraints &preferred_constraints, LPCWSTR title)
Definition: host_window.cc:257
static ActualWindowSize GetWindowContentSize(HWND hwnd)
Definition: host_window.cc:752
void SetContentSize(const WindowSizeRequest &size)
Definition: host_window.cc:519
static HostWindow * GetThisFromHandle(HWND hwnd)
Definition: host_window.cc:396
bool GetFullscreen() const
Definition: host_window.cc:748
void SetConstraints(const WindowConstraints &constraints)
Definition: host_window.cc:561
void SetFullscreen(bool fullscreen, std::optional< FlutterEngineDisplayId > display_id)
Definition: host_window.cc:602
static Isolate Current()
Definition: isolate_scope.cc:9
std::optional< LRESULT > HandleMessage(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
void Initialize(const WindowingInitRequest *request)
WindowManager(FlutterWindowsEngine *engine)
FlutterViewId CreateRegularWindow(const WindowCreationRequest *request)
bool HasTopLevelWindows() const
Win32Message message
int64_t FlutterViewId
FlutterEngineDisplayId display_id
WindowConstraints preferred_constraints
WindowSizeRequest preferred_size
void(* on_message)(WindowsMessage *)
void InternalFlutterWindows_WindowManager_Initialize(int64_t engine_id, const flutter::WindowingInitRequest *request)
void InternalFlutterWindows_WindowManager_SetWindowConstraints(HWND hwnd, const flutter::WindowConstraints *constraints)
bool InternalFlutterWindows_WindowManager_GetFullscreen(HWND hwnd)
void InternalFlutterWindows_WindowManager_SetWindowSize(HWND hwnd, const flutter::WindowSizeRequest *size)
void InternalFlutterWindows_WindowManager_SetFullscreen(HWND hwnd, const flutter::FullscreenRequest *request)
flutter::ActualWindowSize InternalFlutterWindows_WindowManager_GetWindowContentSize(HWND hwnd)
bool InternalFlutterWindows_WindowManager_HasTopLevelWindows(int64_t engine_id)
FlutterViewId InternalFlutterWindows_WindowManager_CreateRegularWindow(int64_t engine_id, const flutter::WindowCreationRequest *request)
HWND InternalFlutterWindows_WindowManager_GetTopLevelWindowHandle(int64_t engine_id, FlutterViewId view_id)