Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
flutter_windows.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_PUBLIC_FLUTTER_WINDOWS_H_
6#define FLUTTER_SHELL_PLATFORM_WINDOWS_PUBLIC_FLUTTER_WINDOWS_H_
7
8#include <dxgi.h>
9#include <stddef.h>
10#include <stdint.h>
11#include <windows.h>
12
13#include "flutter_export.h"
14#include "flutter_messenger.h"
16
17#if defined(__cplusplus)
18extern "C" {
19#endif
20
21typedef void (*VoidCallback)(void* /* user data */);
22
23// Opaque reference to a Flutter view controller.
24struct FlutterDesktopViewController;
25typedef struct FlutterDesktopViewController* FlutterDesktopViewControllerRef;
26
27// Opaque reference to a Flutter window.
28struct FlutterDesktopView;
29typedef struct FlutterDesktopView* FlutterDesktopViewRef;
30
31// Opaque reference to a Flutter engine instance.
32struct FlutterDesktopEngine;
33typedef struct FlutterDesktopEngine* FlutterDesktopEngineRef;
34
35// The unique identifier for a view.
36typedef int64_t FlutterDesktopViewId;
37
38// Configures how the Flutter engine selects a GPU.
39typedef enum {
40 // No preference.
42 // Prefer energy efficiency over performance, such as an integrated GPU.
43 // This falls back to a high performance GPU if no low power GPU is
44 // available.
46 // Prefer performance over energy efficiency, such as a discrete GPU or
47 // dedicated GPU.
48 // This falls back to a low power GPU if no high performance GPU is available.
51
52// Configures the thread policy for running the UI isolate.
53typedef enum {
54 // Default value. Currently will run the UI isolate on separate thread,
55 // later will be changed to running the UI isolate on platform thread.
57 // Run the UI isolate on platform thread.
59 // Run the UI isolate on a separate thread.
62
63// Configures the accessibility implementation used by Flutter.
64typedef enum {
65 // Default value. Flutter will automatically select the best available
66 // implementation.
68 // Use the IAccessible implementation.
70 // Use the experimental IAccessibleEx implementation.
73
74// Configures the Impeller enablement switch.
75typedef enum {
76 // Use the default Impeller enablement behavior.
78 // Enable Impeller.
80 // Disable Impeller.
83
84// Properties for configuring a Flutter engine instance.
85typedef struct {
86 // The path to the flutter_assets folder for the application to be run.
87 // This can either be an absolute path or a path relative to the directory
88 // containing the executable.
89 const wchar_t* assets_path;
90
91 // The path to the icudtl.dat file for the version of Flutter you are using.
92 // This can either be an absolute path or a path relative to the directory
93 // containing the executable.
94 const wchar_t* icu_data_path;
95
96 // The path to the AOT library file for your application, if any.
97 // This can either be an absolute path or a path relative to the directory
98 // containing the executable. This can be nullptr for a non-AOT build, as
99 // it will be ignored in that case.
100 const wchar_t* aot_library_path;
101
102 // The name of the top-level Dart entrypoint function. If null or the empty
103 // string, 'main' is assumed. If a custom entrypoint is used, this parameter
104 // must specifiy the name of a top-level function in the same Dart library as
105 // the app's main() function. Custom entrypoint functions must be decorated
106 // with `@pragma('vm:entry-point')` to ensure the method is not tree-shaken
107 // by the Dart compiler.
108 const char* dart_entrypoint;
109
110 // Number of elements in the array passed in as dart_entrypoint_argv.
112
113 // Array of Dart entrypoint arguments. This is deep copied during the call
114 // to FlutterDesktopEngineCreate.
116
117 // GPU choice preference
118 // If not set defaults to NoPreference;
120
121 // Policy for the thread that runs UI isolate.
122 // If not set defaults to Default;
124
125 // The accessibility mode.
126 // This can be used to enable the experimental IAccessibleEx implementation.
128
129 // Policy for enabling the Impeller renderer.
132
133// ========== View Controller ==========
134
135// Creates a view that hosts and displays the given engine instance.
136//
137// This takes ownership of |engine|, so FlutterDesktopEngineDestroy should no
138// longer be called on it, as it will be called internally when the view
139// controller is destroyed. If creating the view controller fails, the engine
140// will be destroyed immediately.
141//
142// If |engine| is not already running, the view controller will start running
143// it automatically before displaying the window.
144//
145// The caller owns the returned reference, and is responsible for calling
146// FlutterDesktopViewControllerDestroy. Returns a null pointer in the event of
147// an error.
148//
149// The Win32 implementation accepts width, height with view hookup explicitly
150// performed using the caller using HWND parenting.
153 int height,
155
156// Shuts down the engine instance associated with |controller|, and cleans up
157// associated state.
158//
159// |controller| is no longer valid after this call.
162
163// Returns the view controller's view ID.
165 FlutterDesktopViewControllerRef view_controller);
166
167// Returns the handle for the engine running in FlutterDesktopViewControllerRef.
168//
169// Its lifetime is the same as the |controller|'s.
172
173// Returns the view managed by the given controller.
176
177// Requests new frame from the engine and repaints the view.
180
181// Allows the Flutter engine and any interested plugins an opportunity to
182// handle the given message.
183//
184// If the WindowProc was handled and further handling should stop, this returns
185// true and |result| will be populated. |result| is not set if returning false.
188 HWND hwnd,
190 WPARAM wparam,
191 LPARAM lparam,
192 LRESULT* result);
193
194// ========== Engine ==========
195
196// Creates a Flutter engine with the given properties.
197//
198// The caller owns the returned reference, and is responsible for calling
199// FlutterDesktopEngineDestroy. The lifetime of |engine_properties| is required
200// to extend only until the end of this call.
202 const FlutterDesktopEngineProperties* engine_properties);
203
204// Shuts down and destroys the given engine instance. Returns true if the
205// shutdown was successful, or if the engine was not running.
206//
207// |engine| is no longer valid after this call.
209
210// Starts running the given engine instance.
211//
212// The entry_point parameter is deprecated but preserved for
213// backward-compatibility. If desired, a custom Dart entrypoint function can be
214// set in the dart_entrypoint field of the FlutterDesktopEngineProperties
215// struct passed to FlutterDesktopEngineCreate.
216//
217// If specified, entry_point must be the name of a top-level function from the
218// same Dart library that contains the app's main() function, and must be
219// decorated with `@pragma(vm:entry-point)` to ensure the method is not
220// tree-shaken by the Dart compiler. If conflicting non-null values are passed
221// to this function and via the FlutterDesktopEngineProperties struct, the run
222// will fail.
223//
224// Returns false if running the engine failed.
226 const char* entry_point);
227
228// DEPRECATED: This is no longer necessary to call, Flutter will take care of
229// processing engine messages transparently through DispatchMessage.
230//
231// Processes any pending events in the Flutter engine, and returns the
232// number of nanoseconds until the next scheduled event (or max, if none).
233//
234// This should be called on every run of the application-level runloop, and
235// a wait for native events in the runloop should never be longer than the
236// last return value from this function.
237FLUTTER_EXPORT uint64_t
239
242
243// Returns the plugin registrar handle for the plugin with the given name.
244//
245// The name must be unique across the application.
248 const char* plugin_name);
249
250// Returns the messenger associated with the engine.
251//
252// This does not provide an owning reference, so should *not* be balanced with a
253// call to |FlutterDesktopMessengerRelease|.
254//
255// Callers should use |FlutterDesktopMessengerAddRef| if the returned pointer
256// will potentially outlive 'engine', such as when passing it to another thread.
259
260// Returns the texture registrar associated with the engine.
263
264// Schedule a callback to be called after the next frame is drawn.
265//
266// This must be called from the platform thread. The callback is executed only
267// once on the platform thread.
271 void* user_data);
272
273// Returns true if the current thread is the platform thread.
274// This can be called on any thread.
277
278// Schedule a callback to be called on the platform thread.
279//
280// This can be called on any thread. The callback is executed only
281// once on the platform thread.
282//
283// If the task is discarded without being executed (e.g. during engine
284// shutdown), |on_cancel| is called on the platform thread so the caller can
285// cleanup allocations. |on_cancel| can be nullptr if no cleanup is needed.
289 VoidCallback on_cancel,
290 void* user_data);
291
292// ========== View ==========
293
294// Returns the backing HWND for manipulation in host application.
296
297// Returns the DXGI adapter used for rendering or nullptr in case of error.
298// The caller must release the adapter.
299// DEPRECATED: Use |FlutterDesktopEngineGetGraphicsAdapter| instead.
302
303// Retrieves the DXGI adapter used for rendering. Returns true if the adapter
304// was successfully retrieved, or false if an error occured.
305// The caller must provide a valid pointer to an IDXGIAdapter* and is
306// responsible for releasing the adapter.
309 IDXGIAdapter** adapter_out);
310
311// Called to pass an external window message to the engine for lifecycle
312// state updates. Non-Flutter windows must call this method in their WndProc
313// in order to be included in the logic for application lifecycle state
314// updates. Returns a result if the message should be consumed.
317 HWND hwnd,
319 WPARAM wparam,
320 LPARAM lparam,
321 LRESULT* result);
322
323// ========== Plugin Registrar (extensions) ==========
324// These are Windows-specific extensions to flutter_plugin_registrar.h
325
326// Function pointer type for top level WindowProc delegate registration.
327//
328// The user data will be whatever was passed to
329// FlutterDesktopRegisterTopLevelWindowProcHandler.
330//
331// Implementations should populate |result| and return true if the WindowProc
332// was handled and further handling should stop. |result| is ignored if the
333// function returns false.
334typedef bool (*FlutterDesktopWindowProcCallback)(HWND /* hwnd */,
335 UINT /* uMsg */,
336 WPARAM /*wParam*/,
337 LPARAM /* lParam*/,
338 void* /* user data */,
339 LRESULT* result);
340
341// Returns the implicit view associated with this registrar's engine instance,
342// or null if there is no implicit view.
343//
344// See:
345// https://api.flutter.dev/flutter/dart-ui/PlatformDispatcher/implicitView.html
346//
347// DEPRECATED: Use |FlutterDesktopPluginRegistrarGetViewById| instead.
350
351// Returns the view associated with the registrar's engine instance, or null if
352// the view does not exist.
356
361 void* user_data);
362
367
368// Retrieves the DXGI adapter used for rendering. Returns true if the adapter
369// was successfully retrieved, or false if an error occured.
370// The caller must provide a valid pointer to an IDXGIAdapter* and is
371// responsible for releasing the adapter.
374 IDXGIAdapter** adapter_out);
375
376// ========== Freestanding Utilities ==========
377
378// Gets the DPI for a given |hwnd|, depending on the supported APIs per
379// windows version and DPI awareness mode. If nullptr is passed, returns the DPI
380// of the primary monitor.
381//
382// This uses the same logic and fallback for older Windows versions that is used
383// internally by Flutter to determine the DPI to use for displaying Flutter
384// content, so should be used by any code (e.g., in plugins) that translates
385// between Windows and Dart sizes/offsets.
387
388// Gets the DPI for a given |monitor|. If the API is not available, a default
389// DPI of 96 is returned.
390//
391// See FlutterDesktopGetDpiForHWND for more information.
393
394// Reopens stdout and stderr and resysncs the standard library output streams.
395// Should be called if output is being directed somewhere in the runner process
396// (e.g., after an AllocConsole call).
398
399#if defined(__cplusplus)
400} // extern "C"
401#endif
402
403#endif // FLUTTER_SHELL_PLATFORM_WINDOWS_PUBLIC_FLUTTER_WINDOWS_H_
FlutterEngine engine
Definition main.cc:84
const char * message
G_BEGIN_DECLS FlutterViewId view_id
#define FLUTTER_EXPORT
struct FlutterDesktopTextureRegistrar * FlutterDesktopTextureRegistrarRef
FLUTTER_EXPORT bool FlutterDesktopPluginRegistrarGetGraphicsAdapter(FlutterDesktopPluginRegistrarRef registrar, IDXGIAdapter **adapter_out)
FLUTTER_EXPORT void FlutterDesktopResyncOutputStreams()
FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopViewControllerGetView(FlutterDesktopViewControllerRef controller)
FLUTTER_EXPORT FlutterDesktopTextureRegistrarRef FlutterDesktopEngineGetTextureRegistrar(FlutterDesktopEngineRef engine)
struct FlutterDesktopViewController * FlutterDesktopViewControllerRef
FLUTTER_EXPORT void FlutterDesktopViewControllerDestroy(FlutterDesktopViewControllerRef controller)
bool(* FlutterDesktopWindowProcCallback)(HWND, UINT, WPARAM, LPARAM, void *, LRESULT *result)
struct FlutterDesktopEngine * FlutterDesktopEngineRef
FLUTTER_EXPORT bool FlutterDesktopEngineRun(FlutterDesktopEngineRef engine, const char *entry_point)
FLUTTER_EXPORT bool FlutterDesktopEngineIsPlatformThread(FlutterDesktopEngineRef engine)
FlutterDesktopUIThreadPolicy
@ RunOnPlatformThread
@ RunOnSeparateThread
@ Default
FLUTTER_EXPORT bool FlutterDesktopEngineProcessExternalWindowMessage(FlutterDesktopEngineRef engine, HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, LRESULT *result)
int64_t FlutterDesktopViewId
FLUTTER_EXPORT HWND FlutterDesktopViewGetHWND(FlutterDesktopViewRef view)
FLUTTER_EXPORT void FlutterDesktopViewControllerForceRedraw(FlutterDesktopViewControllerRef controller)
FLUTTER_EXPORT FlutterDesktopMessengerRef FlutterDesktopEngineGetMessenger(FlutterDesktopEngineRef engine)
struct FlutterDesktopView * FlutterDesktopViewRef
FlutterDesktopGpuPreference
@ LowPowerPreference
@ HighPerformancePreference
@ NoPreference
FLUTTER_EXPORT void FlutterDesktopPluginRegistrarRegisterTopLevelWindowProcDelegate(FlutterDesktopPluginRegistrarRef registrar, FlutterDesktopWindowProcCallback delegate, void *user_data)
void(* VoidCallback)(void *)
FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopPluginRegistrarGetViewById(FlutterDesktopPluginRegistrarRef registrar, FlutterDesktopViewId view_id)
FLUTTER_EXPORT bool FlutterDesktopEngineDestroy(FlutterDesktopEngineRef engine)
FLUTTER_EXPORT FlutterDesktopEngineRef FlutterDesktopViewControllerGetEngine(FlutterDesktopViewControllerRef controller)
FLUTTER_EXPORT UINT FlutterDesktopGetDpiForHWND(HWND hwnd)
FLUTTER_EXPORT void FlutterDesktopEnginePostPlatformThreadTask(FlutterDesktopEngineRef engine, VoidCallback callback, VoidCallback on_cancel, void *user_data)
FLUTTER_EXPORT FlutterDesktopPluginRegistrarRef FlutterDesktopEngineGetPluginRegistrar(FlutterDesktopEngineRef engine, const char *plugin_name)
FlutterDesktopImpellerSwitch
@ DefaultImpeller
@ EnabledImpeller
@ DisabledImpeller
FlutterDesktopAccessibilityMode
@ IAccessibleMode
@ IAccessibleExMode
@ DefaultAccessibilityMode
FLUTTER_EXPORT bool FlutterDesktopEngineGetGraphicsAdapter(FlutterDesktopEngineRef engine, IDXGIAdapter **adapter_out)
FLUTTER_EXPORT void FlutterDesktopPluginRegistrarUnregisterTopLevelWindowProcDelegate(FlutterDesktopPluginRegistrarRef registrar, FlutterDesktopWindowProcCallback delegate)
FLUTTER_EXPORT UINT FlutterDesktopGetDpiForMonitor(HMONITOR monitor)
FLUTTER_EXPORT IDXGIAdapter * FlutterDesktopViewGetGraphicsAdapter(FlutterDesktopViewRef view)
FLUTTER_EXPORT void FlutterDesktopEngineReloadSystemFonts(FlutterDesktopEngineRef engine)
FLUTTER_EXPORT FlutterDesktopViewId FlutterDesktopViewControllerGetViewId(FlutterDesktopViewControllerRef view_controller)
FLUTTER_EXPORT FlutterDesktopEngineRef FlutterDesktopEngineCreate(const FlutterDesktopEngineProperties *engine_properties)
FLUTTER_EXPORT FlutterDesktopViewControllerRef FlutterDesktopViewControllerCreate(int width, int height, FlutterDesktopEngineRef engine)
FLUTTER_EXPORT bool FlutterDesktopViewControllerHandleTopLevelWindowProc(FlutterDesktopViewControllerRef controller, HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, LRESULT *result)
FLUTTER_EXPORT void FlutterDesktopEngineSetNextFrameCallback(FlutterDesktopEngineRef engine, VoidCallback callback, void *user_data)
FLUTTER_EXPORT uint64_t FlutterDesktopEngineProcessMessages(FlutterDesktopEngineRef engine)
FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopPluginRegistrarGetView(FlutterDesktopPluginRegistrarRef registrar)
FlutterDesktopBinaryReply callback
int32_t height
int32_t width
FlutterDesktopAccessibilityMode accessibility_mode
FlutterDesktopImpellerSwitch impeller_switch
FlutterDesktopUIThreadPolicy ui_thread_policy
FlutterDesktopGpuPreference gpu_preference
LONG_PTR LRESULT
unsigned int UINT
LONG_PTR LPARAM
UINT_PTR WPARAM