| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_PUBLIC_FLUTTER_H_ |
| #define FLUTTER_SHELL_PLATFORM_WINDOWS_PUBLIC_FLUTTER_H_ |
| |
| #include <dxgi.h> |
| #include <stddef.h> |
| #include <stdint.h> |
| #include <windows.h> |
| |
| #include "flutter_export.h" |
| #include "flutter_messenger.h" |
| #include "flutter_plugin_registrar.h" |
| |
| #if defined(__cplusplus) |
| extern "C" { |
| #endif |
| |
| typedef void (*VoidCallback)(void* /* user data */); |
| |
| // Opaque reference to a Flutter window controller. |
| typedef struct FlutterDesktopViewControllerState* |
| FlutterDesktopViewControllerRef; |
| |
| // Opaque reference to a Flutter window. |
| struct FlutterDesktopView; |
| typedef struct FlutterDesktopView* FlutterDesktopViewRef; |
| |
| // Opaque reference to a Flutter engine instance. |
| struct FlutterDesktopEngine; |
| typedef struct FlutterDesktopEngine* FlutterDesktopEngineRef; |
| |
| // Properties for configuring a Flutter engine instance. |
| typedef struct { |
| // The path to the flutter_assets folder for the application to be run. |
| // This can either be an absolute path or a path relative to the directory |
| // containing the executable. |
| const wchar_t* assets_path; |
| |
| // The path to the icudtl.dat file for the version of Flutter you are using. |
| // This can either be an absolute path or a path relative to the directory |
| // containing the executable. |
| const wchar_t* icu_data_path; |
| |
| // The path to the AOT library file for your application, if any. |
| // This can either be an absolute path or a path relative to the directory |
| // containing the executable. This can be nullptr for a non-AOT build, as |
| // it will be ignored in that case. |
| const wchar_t* aot_library_path; |
| |
| // The name of the top-level Dart entrypoint function. If null or the empty |
| // string, 'main' is assumed. If a custom entrypoint is used, this parameter |
| // must specifiy the name of a top-level function in the same Dart library as |
| // the app's main() function. Custom entrypoint functions must be decorated |
| // with `@pragma('vm:entry-point')` to ensure the method is not tree-shaken |
| // by the Dart compiler. |
| const char* dart_entrypoint; |
| |
| // Number of elements in the array passed in as dart_entrypoint_argv. |
| int dart_entrypoint_argc; |
| |
| // Array of Dart entrypoint arguments. This is deep copied during the call |
| // to FlutterDesktopEngineCreate. |
| const char** dart_entrypoint_argv; |
| |
| } FlutterDesktopEngineProperties; |
| |
| // ========== View Controller ========== |
| |
| // Creates a view that hosts and displays the given engine instance. |
| // |
| // This takes ownership of |engine|, so FlutterDesktopEngineDestroy should no |
| // longer be called on it, as it will be called internally when the view |
| // controller is destroyed. If creating the view controller fails, the engine |
| // will be destroyed immediately. |
| // |
| // If |engine| is not already running, the view controller will start running |
| // it automatically before displaying the window. |
| // |
| // The caller owns the returned reference, and is responsible for calling |
| // FlutterDesktopViewControllerDestroy. Returns a null pointer in the event of |
| // an error. |
| // |
| // The Win32 implementation accepts width, height with view hookup explicitly |
| // performed using the caller using HWND parenting. |
| FLUTTER_EXPORT FlutterDesktopViewControllerRef |
| FlutterDesktopViewControllerCreate(int width, |
| int height, |
| FlutterDesktopEngineRef engine); |
| |
| // Shuts down the engine instance associated with |controller|, and cleans up |
| // associated state. |
| // |
| // |controller| is no longer valid after this call. |
| FLUTTER_EXPORT void FlutterDesktopViewControllerDestroy( |
| FlutterDesktopViewControllerRef controller); |
| |
| // Returns the handle for the engine running in FlutterDesktopViewControllerRef. |
| // |
| // Its lifetime is the same as the |controller|'s. |
| FLUTTER_EXPORT FlutterDesktopEngineRef FlutterDesktopViewControllerGetEngine( |
| FlutterDesktopViewControllerRef controller); |
| // Returns the view managed by the given controller. |
| |
| FLUTTER_EXPORT FlutterDesktopViewRef |
| FlutterDesktopViewControllerGetView(FlutterDesktopViewControllerRef controller); |
| |
| // Requests new frame from engine and repaints the view |
| FLUTTER_EXPORT void FlutterDesktopViewControllerForceRedraw( |
| FlutterDesktopViewControllerRef controller); |
| |
| // Allows the Flutter engine and any interested plugins an opportunity to |
| // handle the given message. |
| // |
| // If the WindowProc was handled and further handling should stop, this returns |
| // true and |result| will be populated. |result| is not set if returning false. |
| FLUTTER_EXPORT bool FlutterDesktopViewControllerHandleTopLevelWindowProc( |
| FlutterDesktopViewControllerRef controller, |
| HWND hwnd, |
| UINT message, |
| WPARAM wparam, |
| LPARAM lparam, |
| LRESULT* result); |
| |
| // ========== Engine ========== |
| |
| // Creates a Flutter engine with the given properties. |
| // |
| // The caller owns the returned reference, and is responsible for calling |
| // FlutterDesktopEngineDestroy. The lifetime of |engine_properties| is required |
| // to extend only until the end of this call. |
| FLUTTER_EXPORT FlutterDesktopEngineRef FlutterDesktopEngineCreate( |
| const FlutterDesktopEngineProperties* engine_properties); |
| |
| // Shuts down and destroys the given engine instance. Returns true if the |
| // shutdown was successful, or if the engine was not running. |
| // |
| // |engine| is no longer valid after this call. |
| FLUTTER_EXPORT bool FlutterDesktopEngineDestroy(FlutterDesktopEngineRef engine); |
| |
| // Starts running the given engine instance. |
| // |
| // The entry_point parameter is deprecated but preserved for |
| // backward-compatibility. If desired, a custom Dart entrypoint function can be |
| // set in the dart_entrypoint field of the FlutterDesktopEngineProperties |
| // struct passed to FlutterDesktopEngineCreate. |
| // |
| // If sprecified, entry_point must be the name of a top-level function from the |
| // same Dart library that contains the app's main() function, and must be |
| // decorated with `@pragma(vm:entry-point)` to ensure the method is not |
| // tree-shaken by the Dart compiler. If conflicting non-null values are passed |
| // to this function and via the FlutterDesktopEngineProperties struct, the run |
| // will fail. |
| // |
| // Returns false if running the engine failed. |
| FLUTTER_EXPORT bool FlutterDesktopEngineRun(FlutterDesktopEngineRef engine, |
| const char* entry_point); |
| |
| // DEPRECATED: This is no longer necessary to call, Flutter will take care of |
| // processing engine messages transparently through DispatchMessage. |
| // |
| // Processes any pending events in the Flutter engine, and returns the |
| // number of nanoseconds until the next scheduled event (or max, if none). |
| // |
| // This should be called on every run of the application-level runloop, and |
| // a wait for native events in the runloop should never be longer than the |
| // last return value from this function. |
| FLUTTER_EXPORT uint64_t |
| FlutterDesktopEngineProcessMessages(FlutterDesktopEngineRef engine); |
| |
| FLUTTER_EXPORT void FlutterDesktopEngineReloadSystemFonts( |
| FlutterDesktopEngineRef engine); |
| |
| // Returns the plugin registrar handle for the plugin with the given name. |
| // |
| // The name must be unique across the application. |
| FLUTTER_EXPORT FlutterDesktopPluginRegistrarRef |
| FlutterDesktopEngineGetPluginRegistrar(FlutterDesktopEngineRef engine, |
| const char* plugin_name); |
| |
| // Returns the messenger associated with the engine. |
| // |
| // This does not provide an owning reference, so should *not* be balanced with a |
| // call to |FlutterDesktopMessengerRelease|. |
| // |
| // Callers should use |FlutterDesktopMessengerAddRef| if the returned pointer |
| // will potentially outlive 'engine', such as when passing it to another thread. |
| FLUTTER_EXPORT FlutterDesktopMessengerRef |
| FlutterDesktopEngineGetMessenger(FlutterDesktopEngineRef engine); |
| |
| // Returns the texture registrar associated with the engine. |
| FLUTTER_EXPORT FlutterDesktopTextureRegistrarRef |
| FlutterDesktopEngineGetTextureRegistrar(FlutterDesktopEngineRef engine); |
| |
| // Schedule a callback to be called after the next frame is drawn. |
| // |
| // This must be called from the platform thread. The callback is executed only |
| // once on the platform thread. |
| FLUTTER_EXPORT void FlutterDesktopEngineSetNextFrameCallback( |
| FlutterDesktopEngineRef engine, |
| VoidCallback callback, |
| void* user_data); |
| |
| // ========== View ========== |
| |
| // Return backing HWND for manipulation in host application. |
| FLUTTER_EXPORT HWND FlutterDesktopViewGetHWND(FlutterDesktopViewRef view); |
| |
| // Returns the DXGI adapter used for rendering or nullptr in case of error. |
| FLUTTER_EXPORT IDXGIAdapter* FlutterDesktopViewGetGraphicsAdapter( |
| FlutterDesktopViewRef view); |
| |
| // ========== Plugin Registrar (extensions) ========== |
| // These are Windows-specific extensions to flutter_plugin_registrar.h |
| |
| // Function pointer type for top level WindowProc delegate registration. |
| // |
| // The user data will be whatever was passed to |
| // FlutterDesktopRegisterTopLevelWindowProcHandler. |
| // |
| // Implementations should populate |result| and return true if the WindowProc |
| // was handled and further handling should stop. |result| is ignored if the |
| // function returns false. |
| typedef bool (*FlutterDesktopWindowProcCallback)(HWND /* hwnd */, |
| UINT /* uMsg */, |
| WPARAM /*wParam*/, |
| LPARAM /* lParam*/, |
| void* /* user data */, |
| LRESULT* result); |
| |
| // Returns the view associated with this registrar's engine instance. |
| FLUTTER_EXPORT FlutterDesktopViewRef FlutterDesktopPluginRegistrarGetView( |
| FlutterDesktopPluginRegistrarRef registrar); |
| |
| FLUTTER_EXPORT void |
| FlutterDesktopPluginRegistrarRegisterTopLevelWindowProcDelegate( |
| FlutterDesktopPluginRegistrarRef registrar, |
| FlutterDesktopWindowProcCallback delegate, |
| void* user_data); |
| |
| FLUTTER_EXPORT void |
| FlutterDesktopPluginRegistrarUnregisterTopLevelWindowProcDelegate( |
| FlutterDesktopPluginRegistrarRef registrar, |
| FlutterDesktopWindowProcCallback delegate); |
| |
| // ========== Freestanding Utilities ========== |
| |
| // Gets the DPI for a given |hwnd|, depending on the supported APIs per |
| // windows version and DPI awareness mode. If nullptr is passed, returns the DPI |
| // of the primary monitor. |
| // |
| // This uses the same logic and fallback for older Windows versions that is used |
| // internally by Flutter to determine the DPI to use for displaying Flutter |
| // content, so should be used by any code (e.g., in plugins) that translates |
| // between Windows and Dart sizes/offsets. |
| FLUTTER_EXPORT UINT FlutterDesktopGetDpiForHWND(HWND hwnd); |
| |
| // Gets the DPI for a given |monitor|. If the API is not available, a default |
| // DPI of 96 is returned. |
| // |
| // See FlutterDesktopGetDpiForHWND for more information. |
| FLUTTER_EXPORT UINT FlutterDesktopGetDpiForMonitor(HMONITOR monitor); |
| |
| // Reopens stdout and stderr and resysncs the standard library output streams. |
| // Should be called if output is being directed somewhere in the runner process |
| // (e.g., after an AllocConsole call). |
| FLUTTER_EXPORT void FlutterDesktopResyncOutputStreams(); |
| |
| #if defined(__cplusplus) |
| } // extern "C" |
| #endif |
| |
| #endif // FLUTTER_SHELL_PLATFORM_WINDOWS_PUBLIC_FLUTTER_WINDOWS_H_ |