// 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 #include #include #include "flutter_export.h" #include "flutter_messenger.h" #include "flutter_plugin_registrar.h" #ifdef WINUWP #include #include #endif #if defined(__cplusplus) extern "C" { #endif // 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; // 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. #ifdef WINUWP // The CoreApplicationView implementation accepts a pointer to the host // CoreApplicationView and view hookup is performed in the construction path. FLUTTER_EXPORT FlutterDesktopViewControllerRef FlutterDesktopViewControllerCreateFromCoreApplicationView( ABI::Windows::ApplicationModel::Core::CoreApplicationView* window, ABI::Windows::ApplicationModel::Activation::IActivatedEventArgs* args, FlutterDesktopEngineRef engine); #else //! WINUWP // 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); #endif // 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); #ifndef WINUWP // 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); #endif // ========== 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 and optional entry point in the Dart // project. If the entry point is null, defaults to main(). // // If provided, 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. // // Returns false if running the engine failed. FLUTTER_EXPORT bool FlutterDesktopEngineRun(FlutterDesktopEngineRef engine, const char* entry_point); #ifndef WINUWP // 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); #endif FLUTTER_EXPORT void FlutterDesktopEngineReloadSystemFonts( FlutterDesktopEngineRef engine); FLUTTER_EXPORT void FlutterDesktopEngineReloadPlatformBrightness( 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. FLUTTER_EXPORT FlutterDesktopMessengerRef FlutterDesktopEngineGetMessenger(FlutterDesktopEngineRef engine); // Returns the texture registrar associated with the engine. FLUTTER_EXPORT FlutterDesktopTextureRegistrarRef FlutterDesktopEngineGetTextureRegistrar( FlutterDesktopTextureRegistrarRef texture_registrar); // ========== View ========== #ifdef WINUWP // Return backing CoreApplicationView for manipulation of CoreWindow and // CoreTitleBar in host application. FLUTTER_EXPORT ABI::Windows::ApplicationModel::Core::CoreApplicationView* FlutterDesktopViewGetCoreApplicationView(FlutterDesktopViewRef view); #else // Return backing HWND for manipulation in host application. FLUTTER_EXPORT HWND FlutterDesktopViewGetHWND(FlutterDesktopViewRef view); #endif // ========== 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); #ifndef WINUWP FLUTTER_EXPORT void FlutterDesktopPluginRegistrarRegisterTopLevelWindowProcDelegate( FlutterDesktopPluginRegistrarRef registrar, FlutterDesktopWindowProcCallback delegate, void* user_data); FLUTTER_EXPORT void FlutterDesktopPluginRegistrarUnregisterTopLevelWindowProcDelegate( FlutterDesktopPluginRegistrarRef registrar, FlutterDesktopWindowProcCallback delegate); #endif // ========== 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_