#include #include #ifdef GDK_WINDOWING_X11 #include #endif #include "flutter/generated_plugin_registrant.h" struct _MyFlutterApp { GtkApplication parent_instance; char** dart_entrypoint_arguments; }; G_DEFINE_TYPE(MyFlutterApp, my_flutter_app, GTK_TYPE_APPLICATION) // Implements GApplication::activate. static void my_flutter_app_activate(GApplication* application) { MyFlutterApp* self = MY_FLUTTER_APP(application); GtkWindow* window = GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); // Use a header bar when running in GNOME as this is the common style used // by applications and is the layout most users expect. gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(gtk_header_bar_new()), TRUE); gtk_window_set_titlebar(window, GTK_HEADER_BAR(gtk_header_bar_new())); gtk_window_set_default_size(window, 1280, 720); gtk_widget_show(GTK_WIDGET(window)); g_autoptr(FlutterDartProject) project = flutter_dart_project_new(); flutter_dart_project_set_dart_entrypoint_arguments( project, self->dart_entrypoint_arguments); FlView* view = fl_view_new(project); gtk_widget_show(GTK_WIDGET(view)); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); fl_register_plugins(FL_PLUGIN_REGISTRY(view)); gtk_widget_grab_focus(GTK_WIDGET(view)); } // Implements GApplication::local_command_line. static gboolean my_flutter_app_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { MyFlutterApp* self = MY_FLUTTER_APP(application); // Strip out the first argument as it is the binary name. self->dart_entrypoint_arguments = *arguments + 1; g_autoptr(GError) error = nullptr; if (!g_application_register(application, nullptr, &error)) { g_warning("Failed to register: %s", error->message); *exit_status = 1; return TRUE; } g_application_activate(application); *exit_status = 0; return TRUE; } // Implements GObject::dispose. static void my_flutter_app_dispose(GObject* object) { G_OBJECT_CLASS(my_flutter_app_parent_class)->dispose(object); } static void my_flutter_app_class_init(MyFlutterAppClass* klass) { G_APPLICATION_CLASS(klass)->activate = my_flutter_app_activate; G_APPLICATION_CLASS(klass)->local_command_line = my_flutter_app_local_command_line; G_OBJECT_CLASS(klass)->dispose = my_flutter_app_dispose; } static void my_flutter_app_init(MyFlutterApp* self) {} MyFlutterApp* my_flutter_app_new() { return MY_FLUTTER_APP(g_object_new(my_flutter_app_get_type(), "application-id", APPLICATION_ID, "flags", G_APPLICATION_NON_UNIQUE, nullptr)); } int main(int argc, char** argv) { g_autoptr(MyFlutterApp) app = my_flutter_app_new(); return g_application_run(G_APPLICATION(app), argc, argv); }