blob: bb96733e2b98885bf44e1b34d2c35a8020becb89 [file] [log] [blame]
// 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_GLFW_CLIENT_WRAPPER_INCLUDE_FLUTTER_FLUTTER_WINDOW_CONTROLLER_H_
#define FLUTTER_SHELL_PLATFORM_GLFW_CLIENT_WRAPPER_INCLUDE_FLUTTER_FLUTTER_WINDOW_CONTROLLER_H_
#include <flutter_glfw.h>
#include <chrono>
#include <memory>
#include <string>
#include <vector>
#include "flutter_window.h"
#include "plugin_registrar.h"
#include "plugin_registry.h"
namespace flutter {
// Properties for Flutter window creation.
struct WindowProperties {
// The display title.
std::string title;
// Width in screen coordinates.
int32_t width;
// Height in screen coordinates.
int32_t height;
// Whether or not the user is prevented from resizing the window.
// Reversed so that the default for a cleared struct is to allow resizing.
bool prevent_resize;
};
// A controller for a window displaying Flutter content.
//
// This is the primary wrapper class for the desktop C API.
// If you use this class, you should not call any of the setup or teardown
// methods in the C API directly, as this class will do that internally.
//
// Note: This is an early implementation (using GLFW internally) which
// requires control of the application's event loop, and is thus useful
// primarily for building a simple one-window shell hosting a Flutter
// application. The final implementation and API will be very different.
class FlutterWindowController : public PluginRegistry {
public:
// There must be only one instance of this class in an application at any
// given time, as Flutter does not support multiple engines in one process,
// or multiple views in one engine.
explicit FlutterWindowController(const std::string& icu_data_path);
virtual ~FlutterWindowController();
// Prevent copying.
FlutterWindowController(FlutterWindowController const&) = delete;
FlutterWindowController& operator=(FlutterWindowController const&) = delete;
// Creates and displays a window for displaying Flutter content.
//
// The |assets_path| is the path to the flutter_assets folder for the Flutter
// application to be run. |icu_data_path| is the path to the icudtl.dat file
// for the version of Flutter you are using.
//
// The |arguments| are passed to the Flutter engine. See:
// https://github.com/flutter/engine/blob/master/shell/common/switches.h for
// for details. Not all arguments will apply to desktop.
//
// Only one Flutter window can exist at a time; see constructor comment.
bool CreateWindow(const WindowProperties& window_properties,
const std::string& assets_path,
const std::vector<std::string>& arguments);
// Destroys the current window, if any.
//
// Because only one window can exist at a time, this method must be called
// between calls to CreateWindow, or the second one will fail.
void DestroyWindow();
// The FlutterWindow managed by this controller, if any. Returns nullptr
// before CreateWindow is called, after DestroyWindow is called, and after
// RunEventLoop returns;
FlutterWindow* window() { return window_.get(); }
// Processes the next event on this window, or returns early if |timeout| is
// reached before the next event.
//
// Returns false if the window was closed as a result of event processing.
bool RunEventLoopWithTimeout(
std::chrono::milliseconds timeout = std::chrono::milliseconds::max());
// Deprecated. Use RunEventLoopWithTimeout.
void RunEventLoop();
// flutter::PluginRegistry:
FlutterDesktopPluginRegistrarRef GetRegistrarForPlugin(
const std::string& plugin_name) override;
private:
// The path to the ICU data file. Set at creation time since it is the same
// for any window created.
std::string icu_data_path_;
// Whether or not FlutterDesktopInit succeeded at creation time.
bool init_succeeded_ = false;
// The owned FlutterWindow, if any.
std::unique_ptr<FlutterWindow> window_;
// Handle for interacting with the C API's window controller, if any.
FlutterDesktopWindowControllerRef controller_ = nullptr;
};
} // namespace flutter
#endif // FLUTTER_SHELL_PLATFORM_GLFW_CLIENT_WRAPPER_INCLUDE_FLUTTER_FLUTTER_WINDOW_CONTROLLER_H_