Flutter Engine
 
Loading...
Searching...
No Matches
flutter_windows_engine.h
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
5#ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_FLUTTER_WINDOWS_ENGINE_H_
6#define FLUTTER_SHELL_PLATFORM_WINDOWS_FLUTTER_WINDOWS_ENGINE_H_
7
8#include <chrono>
9#include <map>
10#include <memory>
11#include <optional>
12#include <shared_mutex>
13#include <string>
14#include <string_view>
15#include <unordered_map>
16#include <vector>
17
18#include "flutter/fml/closure.h"
19#include "flutter/fml/macros.h"
48#include "third_party/rapidjson/include/rapidjson/document.h"
49
50namespace flutter {
51
52// The implicit view's ID.
53//
54// See:
55// https://api.flutter.dev/flutter/dart-ui/PlatformDispatcher/implicitView.html
57
60
61// Update the thread priority for the Windows engine.
63 FlutterThreadPriority priority) {
64 // TODO(99502): Add support for tracing to the windows embedding so we can
65 // mark thread priorities and success/failure.
66 switch (priority) {
68 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
69 break;
70 }
72 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
73 break;
74 }
76 SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
77 break;
78 }
80 // For normal or default priority we do not need to set the priority
81 // class.
82 break;
83 }
84 }
85}
86
87// Manages state associated with the underlying FlutterEngine that isn't
88// related to its display.
89//
90// In most cases this will be associated with a FlutterView, but if not will
91// run in headless mode.
93 public:
94 // Creates a new Flutter engine object configured to run |project|.
96 const FlutterProjectBundle& project,
97 std::shared_ptr<WindowsProcTable> windows_proc_table = nullptr);
98
99 virtual ~FlutterWindowsEngine();
100
101 // Returns the engine associated with the given identifier.
102 // The engine_id must be valid and for a running engine, otherwise
103 // the behavior is undefined.
104 // Must be called on the platform thread.
105 static FlutterWindowsEngine* GetEngineForId(int64_t engine_id);
106
107 // Starts running the entrypoint function specifed in the project bundle. If
108 // unspecified, defaults to main().
109 //
110 // Returns false if the engine couldn't be started.
111 bool Run();
112
113 // Starts running the engine with the given entrypoint. If the empty string
114 // is specified, defaults to the entrypoint function specified in the project
115 // bundle, or main() if both are unspecified.
116 //
117 // Returns false if the engine couldn't be started or if conflicting,
118 // non-default values are passed here and in the project bundle..
119 //
120 // DEPRECATED: Prefer setting the entrypoint in the FlutterProjectBundle
121 // passed to the constructor and calling the no-parameter overload.
122 bool Run(std::string_view entrypoint);
123
124 // Returns true if the engine is currently running.
125 virtual bool running() const { return engine_ != nullptr; }
126
127 // Stops the engine. This invalidates the pointer returned by engine().
128 //
129 // Returns false if stopping the engine fails, or if it was not running.
130 virtual bool Stop();
131
132 // Create a view that can display this engine's content.
133 //
134 // Returns null on failure.
135 std::unique_ptr<FlutterWindowsView> CreateView(
136 std::unique_ptr<WindowBindingHandler> window);
137
138 // Remove a view. The engine will no longer render into it.
139 virtual void RemoveView(FlutterViewId view_id);
140
141 // Get a view that displays this engine's content.
142 //
143 // Returns null if the view does not exist.
145
146 // Returns the currently configured Plugin Registrar.
148
149 // Registers |callback| to be called when the plugin registrar is destroyed.
153
154 // Sets switches member to the given switches.
155 void SetSwitches(const std::vector<std::string>& switches);
156
157 FlutterDesktopMessengerRef messenger() { return messenger_->ToRef(); }
158
160 return message_dispatcher_.get();
161 }
162
163 std::shared_ptr<DisplayManagerWin32> display_manager() {
164 return display_manager_;
165 }
166
167 // Notifies the engine about a display update.
168 void UpdateDisplay(const std::vector<FlutterEngineDisplay>& displays);
169
170 TaskRunner* task_runner() { return task_runner_.get(); }
171
172 BinaryMessenger* messenger_wrapper() { return messenger_wrapper_.get(); }
173
175 return texture_registrar_.get();
176 }
177
178 // The EGL manager object. If this is nullptr, then we are
179 // rendering using software instead of OpenGL.
180 egl::Manager* egl_manager() const { return egl_manager_.get(); }
181
183 return window_proc_delegate_manager_.get();
184 }
185
186 // Informs the engine that the window metrics have changed.
188
189 // Informs the engine of an incoming pointer event.
190 void SendPointerEvent(const FlutterPointerEvent& event);
191
192 // Informs the engine of an incoming key event.
193 void SendKeyEvent(const FlutterKeyEvent& event,
195 void* user_data);
196
197 // Informs the engine of an incoming focus event.
198 void SendViewFocusEvent(const FlutterViewFocusEvent& event);
199
201 return keyboard_key_handler_.get();
202 }
203 TextInputPlugin* text_input_plugin() { return text_input_plugin_.get(); }
204
205 // Sends the given message to the engine, calling |reply| with |user_data|
206 // when a response is received from the engine if they are non-null.
207 bool SendPlatformMessage(const char* channel,
208 const uint8_t* message,
209 const size_t message_size,
210 const FlutterDesktopBinaryReply reply,
211 void* user_data);
212
213 // Sends the given data as the response to an earlier platform message.
216 const uint8_t* data,
217 size_t data_length);
218
219 // Callback passed to Flutter engine for notifying window of platform
220 // messages.
222
223 // Informs the engine that the system font list has changed.
224 void ReloadSystemFonts();
225
226 // Informs the engine that a new frame is needed to redraw the content.
227 void ScheduleFrame();
228
229 // Set the callback that is called when the next frame is drawn.
231
232 // Attempts to register the texture with the given |texture_id|.
234
235 // Attempts to unregister the texture with the given |texture_id|.
237
238 // Notifies the engine about a new frame being available for the
239 // given |texture_id|.
241
242 // Posts the given callback onto the raster thread.
243 virtual bool PostRasterThreadTask(fml::closure callback) const;
244
245 // Invoke on the embedder's vsync callback to schedule a frame.
246 void OnVsync(intptr_t baton);
247
248 // Dispatches a semantics action to the specified semantics node.
250 uint64_t node_id,
253
254 // Informs the engine that the semantics enabled state has changed.
255 void UpdateSemanticsEnabled(bool enabled);
256
257 // Returns true if the semantics tree is enabled.
258 bool semantics_enabled() const { return semantics_enabled_; }
259
260 // Refresh accessibility features and send them to the engine.
262
263 // Refresh high contrast accessibility mode and notify the engine.
265
266 // Returns true if the high contrast feature is enabled.
267 bool high_contrast_enabled() const { return high_contrast_enabled_; }
268
269 // Register a root isolate create callback.
270 //
271 // The root isolate create callback is invoked at creation of the root Dart
272 // isolate in the app. This may be used to be notified that execution of the
273 // main Dart entrypoint is about to begin, and is used by test infrastructure
274 // to register a native function resolver that can register and resolve
275 // functions marked as native in the Dart code.
276 //
277 // This must be called before calling |Run|.
279 root_isolate_create_callback_ = callback;
280 }
281
282 // Returns the executable name for this process or "Flutter" if unknown.
283 std::string GetExecutableName() const;
284
285 // Called when the application quits in response to a quit request.
286 void OnQuit(std::optional<HWND> hwnd,
287 std::optional<WPARAM> wparam,
288 std::optional<LPARAM> lparam,
289 UINT exit_code);
290
291 // Called when a WM_CLOSE message is received.
292 void RequestApplicationQuit(HWND hwnd,
293 WPARAM wparam,
294 LPARAM lparam,
295 AppExitType exit_type);
296
297 // Called when a WM_DWMCOMPOSITIONCHANGED message is received.
299
300 // Called when a Window receives an event that may alter the application
301 // lifecycle state.
302 void OnWindowStateEvent(HWND hwnd, WindowStateEvent event);
303
304 // Handle a message from a non-Flutter window in the same application.
305 // Returns a result when the message is consumed and should not be processed
306 // further.
307 std::optional<LRESULT> ProcessExternalWindowMessage(HWND hwnd,
309 WPARAM wparam,
310 LPARAM lparam);
311
313 return lifecycle_manager_.get();
314 }
315
316 std::shared_ptr<WindowsProcTable> windows_proc_table() {
317 return windows_proc_table_;
318 }
319
320 // Sets the cursor that should be used when the mouse is over the Flutter
321 // content. See mouse_cursor.dart for the values and meanings of cursor_name.
322 void UpdateFlutterCursor(const std::string& cursor_name) const;
323
324 // Sets the cursor directly from a cursor handle.
325 void SetFlutterCursor(HCURSOR cursor) const;
326
327 WindowManager* window_manager() { return window_manager_.get(); }
328
329 // Returns the root view associated with the top-level window with |hwnd| as
330 // the window handle or nullptr if no such view could be found.
332
333 protected:
334 // Creates the keyboard key handler.
335 //
336 // Exposing this method allows unit tests to override in order to
337 // capture information.
338 virtual std::unique_ptr<KeyboardHandlerBase> CreateKeyboardKeyHandler(
342
343 // Creates the text input plugin.
344 //
345 // Exposing this method allows unit tests to override in order to
346 // capture information.
347 virtual std::unique_ptr<TextInputPlugin> CreateTextInputPlugin(
349
350 // Invoked by the engine right before the engine is restarted.
351 //
352 // This should reset necessary states to as if the engine has just been
353 // created. This is typically caused by a hot restart (Shift-R in CLI.)
354 void OnPreEngineRestart();
355
356 // Invoked by the engine when a listener is set or cleared on a platform
357 // channel.
358 virtual void OnChannelUpdate(std::string name, bool listening);
359
360 virtual void OnViewFocusChangeRequest(
361 const FlutterViewFocusChangeRequest* request);
362
363 private:
364 // Allows swapping out embedder_api_ calls in tests.
365 friend class EngineModifier;
366
367 // Maps a Flutter cursor name to an HCURSOR.
368 //
369 // Returns the arrow cursor for unknown constants.
370 //
371 // This map must be kept in sync with Flutter framework's
372 // services/mouse_cursor.dart.
373 HCURSOR GetCursorByName(const std::string& cursor_name) const;
374
375 // Sends system locales to the engine.
376 //
377 // Should be called just after the engine is run, and after any relevant
378 // system changes.
379 void SendSystemLocales();
380
381 // Create the keyboard & text input sub-systems.
382 //
383 // This requires that a view is attached to the engine.
384 // Calling this method again resets the keyboard state.
385 void InitializeKeyboard();
386
387 // Send the currently enabled accessibility features to the engine.
388 void SendAccessibilityFeatures();
389
390 // Present content to a view. Returns true if the content was presented.
391 //
392 // This is invoked on the raster thread.
393 bool Present(const FlutterPresentViewInfo* info);
394
395 // The handle to the embedder.h engine instance.
396 FLUTTER_API_SYMBOL(FlutterEngine) engine_ = nullptr;
397
398 FlutterEngineProcTable embedder_api_ = {};
399
400 std::unique_ptr<FlutterProjectBundle> project_;
401
402 // AOT data, if any.
403 UniqueAotDataPtr aot_data_;
404
405 // The ID that the next view will have.
406 FlutterViewId next_view_id_ = kImplicitViewId;
407
408 // The views displaying the content running in this engine, if any.
409 //
410 // This is read and mutated by the platform thread. This is read by the raster
411 // thread to present content to a view.
412 //
413 // Reads to this object on non-platform threads must be protected
414 // by acquiring a shared lock on |views_mutex_|.
415 //
416 // Writes to this object must only happen on the platform thread
417 // and must be protected by acquiring an exclusive lock on |views_mutex_|.
418 std::unordered_map<FlutterViewId, FlutterWindowsView*> views_;
419
420 // The mutex that protects the |views_| map.
421 //
422 // The raster thread acquires a shared lock to present to a view.
423 //
424 // The platform thread acquires a shared lock to access the view.
425 // The platform thread acquires an exclusive lock before adding
426 // a view to the engine or after removing a view from the engine.
427 mutable std::shared_mutex views_mutex_;
428
429 // The display monitor.
430 std::shared_ptr<DisplayManagerWin32> display_manager_;
431
432 // Task runner for tasks posted from the engine.
433 std::unique_ptr<TaskRunner> task_runner_;
434
435 // The plugin messenger handle given to API clients.
437
438 // A wrapper around messenger_ for interacting with client_wrapper-level APIs.
439 std::unique_ptr<BinaryMessengerImpl> messenger_wrapper_;
440
441 // Message dispatch manager for messages from engine_.
442 std::unique_ptr<IncomingMessageDispatcher> message_dispatcher_;
443
444 // The plugin registrar handle given to API clients.
445 std::unique_ptr<FlutterDesktopPluginRegistrar> plugin_registrar_;
446
447 // The texture registrar.
448 std::unique_ptr<FlutterWindowsTextureRegistrar> texture_registrar_;
449
450 // An object used for intializing ANGLE and creating / destroying render
451 // surfaces. If nullptr, ANGLE failed to initialize and software rendering
452 // should be used instead.
453 std::unique_ptr<egl::Manager> egl_manager_;
454
455 // The compositor that creates backing stores for the engine to render into
456 // and then presents them onto views.
457 std::unique_ptr<Compositor> compositor_;
458
459 // The plugin registrar managing internal plugins.
460 std::unique_ptr<PluginRegistrar> internal_plugin_registrar_;
461
462 // Handler for accessibility events.
463 std::unique_ptr<AccessibilityPlugin> accessibility_plugin_;
464
465 // Handler for cursor events.
466 std::unique_ptr<CursorHandler> cursor_handler_;
467
468 // Handler for the flutter/platform channel.
469 std::unique_ptr<PlatformHandler> platform_handler_;
470
471 // Handlers for keyboard events from Windows.
472 std::unique_ptr<KeyboardHandlerBase> keyboard_key_handler_;
473
474 // The manager that manages the lifecycle of |HostWindow|s, native
475 // Win32 windows hosting a Flutter view in their client area.
476 std::unique_ptr<WindowManager> window_manager_;
477
478 // Handlers for text events from Windows.
479 std::unique_ptr<TextInputPlugin> text_input_plugin_;
480
481 // The settings plugin.
482 std::unique_ptr<SettingsPlugin> settings_plugin_;
483
484 // Callbacks to be called when the engine (and thus the plugin registrar) is
485 // being destroyed.
488 plugin_registrar_destruction_callbacks_;
489
490 // The approximate time between vblank events.
491 std::chrono::nanoseconds FrameInterval();
492
493 // The start time used to align frames.
494 std::chrono::nanoseconds start_time_ = std::chrono::nanoseconds::zero();
495
496 // An override of the frame interval used by EngineModifier for testing.
497 std::optional<std::chrono::nanoseconds> frame_interval_override_ =
498 std::nullopt;
499
500 bool semantics_enabled_ = false;
501
502 bool high_contrast_enabled_ = false;
503
504 bool enable_impeller_ = false;
505
506 // The manager for WindowProc delegate registration and callbacks.
507 std::unique_ptr<WindowProcDelegateManager> window_proc_delegate_manager_;
508
509 // The root isolate creation callback.
510 fml::closure root_isolate_create_callback_;
511
512 // The on frame drawn callback.
513 fml::closure next_frame_callback_;
514
515 // Handler for top level window messages.
516 std::unique_ptr<WindowsLifecycleManager> lifecycle_manager_;
517
518 std::shared_ptr<WindowsProcTable> windows_proc_table_;
519
520 std::shared_ptr<egl::ProcTable> gl_;
521
522 std::unique_ptr<PlatformViewPlugin> platform_view_plugin_;
523
524 // Handles display-related window messages.
525 bool HandleDisplayMonitorMessage(HWND hwnd,
527 WPARAM wparam,
528 LPARAM lparam,
529 LRESULT* result);
530
532};
533
534} // namespace flutter
535
536#endif // FLUTTER_SHELL_PLATFORM_WINDOWS_FLUTTER_WINDOWS_ENGINE_H_
FlutterDesktopMessengerRef ToRef()
Convert to FlutterDesktopMessengerRef.
FlutterDesktopMessengerRef messenger()
void OnWindowStateEvent(HWND hwnd, WindowStateEvent event)
void RequestApplicationQuit(HWND hwnd, WPARAM wparam, LPARAM lparam, AppExitType exit_type)
void SendViewFocusEvent(const FlutterViewFocusEvent &event)
bool SendPlatformMessage(const char *channel, const uint8_t *message, const size_t message_size, const FlutterDesktopBinaryReply reply, void *user_data)
virtual void OnViewFocusChangeRequest(const FlutterViewFocusChangeRequest *request)
std::optional< LRESULT > ProcessExternalWindowMessage(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
void AddPluginRegistrarDestructionCallback(FlutterDesktopOnPluginRegistrarDestroyed callback, FlutterDesktopPluginRegistrarRef registrar)
std::shared_ptr< WindowsProcTable > windows_proc_table()
bool RegisterExternalTexture(int64_t texture_id)
void UpdateDisplay(const std::vector< FlutterEngineDisplay > &displays)
IncomingMessageDispatcher * message_dispatcher()
void SendPlatformMessageResponse(const FlutterDesktopMessageResponseHandle *handle, const uint8_t *data, size_t data_length)
void SetRootIsolateCreateCallback(const fml::closure &callback)
static FlutterWindowsEngine * GetEngineForId(int64_t engine_id)
virtual void OnChannelUpdate(std::string name, bool listening)
virtual std::unique_ptr< KeyboardHandlerBase > CreateKeyboardKeyHandler(BinaryMessenger *messenger, KeyboardKeyEmbedderHandler::GetKeyStateHandler get_key_state, KeyboardKeyEmbedderHandler::MapVirtualKeyToScanCode map_vk_to_scan)
bool DispatchSemanticsAction(FlutterViewId view_id, uint64_t node_id, FlutterSemanticsAction action, fml::MallocMapping data)
std::shared_ptr< DisplayManagerWin32 > display_manager()
bool MarkExternalTextureFrameAvailable(int64_t texture_id)
FlutterWindowsView * GetViewFromTopLevelWindow(HWND hwnd) const
WindowProcDelegateManager * window_proc_delegate_manager()
std::unique_ptr< FlutterWindowsView > CreateView(std::unique_ptr< WindowBindingHandler > window)
virtual bool PostRasterThreadTask(fml::closure callback) const
FlutterWindowsTextureRegistrar * texture_registrar()
bool UnregisterExternalTexture(int64_t texture_id)
void SetNextFrameCallback(fml::closure callback)
void HandlePlatformMessage(const FlutterPlatformMessage *)
virtual void RemoveView(FlutterViewId view_id)
FlutterDesktopPluginRegistrarRef GetRegistrar()
virtual std::unique_ptr< TextInputPlugin > CreateTextInputPlugin(BinaryMessenger *messenger)
void UpdateFlutterCursor(const std::string &cursor_name) const
void SetFlutterCursor(HCURSOR cursor) const
WindowsLifecycleManager * lifecycle_manager()
void SendPointerEvent(const FlutterPointerEvent &event)
void SendWindowMetricsEvent(const FlutterWindowMetricsEvent &event)
KeyboardHandlerBase * keyboard_key_handler()
void SetSwitches(const std::vector< std::string > &switches)
void SendKeyEvent(const FlutterKeyEvent &event, FlutterKeyEventCallback callback, void *user_data)
void OnQuit(std::optional< HWND > hwnd, std::optional< WPARAM > wparam, std::optional< LPARAM > lparam, UINT exit_code)
std::function< SHORT(UINT, bool)> MapVirtualKeyToScanCode
A Mapping like NonOwnedMapping, but uses Free as its release proc.
Definition mapping.h:144
#define FLUTTER_API_SYMBOL(symbol)
Definition embedder.h:67
FlutterThreadPriority
Valid values for priority of Thread.
Definition embedder.h:369
@ kBackground
Suitable for threads that shouldn't disrupt high priority work.
Definition embedder.h:371
@ kDisplay
Suitable for threads which generate data for the display.
Definition embedder.h:375
@ kNormal
Default priority level.
Definition embedder.h:373
@ kRaster
Suitable for thread which raster data.
Definition embedder.h:377
FlutterSemanticsAction
Definition embedder.h:115
void(* FlutterKeyEventCallback)(bool, void *)
Definition embedder.h:1427
GLFWwindow * window
Definition main.cc:60
FlView * view
const gchar * channel
G_BEGIN_DECLS GBytes * message
G_BEGIN_DECLS FlutterViewId view_id
void(* FlutterDesktopBinaryReply)(const uint8_t *data, size_t data_size, void *user_data)
void(* FlutterDesktopOnPluginRegistrarDestroyed)(FlutterDesktopPluginRegistrarRef)
FlutterDesktopBinaryReply callback
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition macros.h:27
WindowStateEvent
An event representing a change in window state that may update the.
DEF_SWITCHES_START aot vmservice shared library name
Definition switch_defs.h:27
constexpr FlutterViewId kImplicitViewId
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switch_defs.h:36
int64_t FlutterViewId
static void WindowsPlatformThreadPrioritySetter(FlutterThreadPriority priority)
std::unique_ptr< _FlutterEngineAOTData, FlutterEngineCollectAOTDataFnPtr > UniqueAotDataPtr
std::function< void()> closure
Definition closure.h:14
std::vector< FlutterEngineDisplay > * displays
Function-pointer-based versions of the APIs above.
Definition embedder.h:3704
int64_t texture_id
LONG_PTR LRESULT
unsigned int UINT
LONG_PTR LPARAM
UINT_PTR WPARAM