Flutter Linux Embedder
fl_platform_handler.cc File Reference

Go to the source code of this file.

Classes

struct  _FlPlatformHandler
 

Functions

static void clipboard_text_cb (GtkClipboard *clipboard, const gchar *text, gpointer user_data)
 
static void clipboard_text_has_strings_cb (GtkClipboard *clipboard, const gchar *text, gpointer user_data)
 
static FlMethodResponse * clipboard_set_data (FlMethodCall *method_call, const gchar *text, gpointer user_data)
 
static FlMethodResponse * clipboard_get_data (FlMethodCall *method_call, const gchar *format, gpointer user_data)
 
static FlMethodResponse * clipboard_has_strings (FlMethodCall *method_call, gpointer user_data)
 
static void quit_application ()
 
static void request_app_exit_response_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 
static void request_app_exit (FlPlatformHandler *self, FlPlatformChannelExitType type)
 
static void system_initialization_complete (gpointer user_data)
 
static FlMethodResponse * system_exit_application (FlMethodCall *method_call, FlPlatformChannelExitType type, gpointer user_data)
 
static void system_sound_play (const gchar *type, gpointer user_data)
 
static void system_navigator_pop (gpointer user_data)
 
static void fl_platform_handler_dispose (GObject *object)
 
static void fl_platform_handler_class_init (FlPlatformHandlerClass *klass)
 
static void fl_platform_handler_init (FlPlatformHandler *self)
 
FlPlatformHandler * fl_platform_handler_new (FlBinaryMessenger *messenger)
 
void fl_platform_handler_request_app_exit (FlPlatformHandler *self)
 

Variables

static constexpr char kInProgressError [] = "In Progress"
 
static constexpr char kUnknownClipboardFormatError []
 
static constexpr char kTextPlainFormat [] = "text/plain"
 
static constexpr char kSoundTypeAlert [] = "SystemSoundType.alert"
 
static constexpr char kSoundTypeClick [] = "SystemSoundType.click"
 
static FlPlatformChannelVTable platform_channel_vtable
 

Function Documentation

◆ clipboard_get_data()

static FlMethodResponse* clipboard_get_data ( FlMethodCall *  method_call,
const gchar *  format,
gpointer  user_data 
)
static

Definition at line 65 of file fl_platform_handler.cc.

67  {
68  if (strcmp(format, kTextPlainFormat) != 0) {
69  return FL_METHOD_RESPONSE(fl_method_error_response_new(
70  kUnknownClipboardFormatError, "GTK clipboard API only supports text",
71  nullptr));
72  }
73 
74  GtkClipboard* clipboard =
75  gtk_clipboard_get_default(gdk_display_get_default());
76  gtk_clipboard_request_text(clipboard, clipboard_text_cb,
77  g_object_ref(method_call));
78 
79  // Will respond later.
80  return nullptr;
81 }

References clipboard_text_cb(), fl_method_error_response_new(), format, kTextPlainFormat, kUnknownClipboardFormatError, and method_call.

◆ clipboard_has_strings()

static FlMethodResponse* clipboard_has_strings ( FlMethodCall *  method_call,
gpointer  user_data 
)
static

Definition at line 85 of file fl_platform_handler.cc.

86  {
87  GtkClipboard* clipboard =
88  gtk_clipboard_get_default(gdk_display_get_default());
89  gtk_clipboard_request_text(clipboard, clipboard_text_has_strings_cb,
90  g_object_ref(method_call));
91 
92  // Will respond later.
93  return nullptr;
94 }

References clipboard_text_has_strings_cb(), and method_call.

◆ clipboard_set_data()

static FlMethodResponse* clipboard_set_data ( FlMethodCall *  method_call,
const gchar *  text,
gpointer  user_data 
)
static

Definition at line 54 of file fl_platform_handler.cc.

56  {
57  GtkClipboard* clipboard =
58  gtk_clipboard_get_default(gdk_display_get_default());
59  gtk_clipboard_set_text(clipboard, text, -1);
60 
61  return FL_METHOD_RESPONSE(fl_method_success_response_new(nullptr));
62 }

References fl_method_success_response_new().

◆ clipboard_text_cb()

static void clipboard_text_cb ( GtkClipboard *  clipboard,
const gchar *  text,
gpointer  user_data 
)
static

Definition at line 37 of file fl_platform_handler.cc.

39  {
40  g_autoptr(FlMethodCall) method_call = FL_METHOD_CALL(user_data);
42 }

References fl_platform_channel_respond_clipboard_get_data(), method_call, and user_data.

Referenced by clipboard_get_data().

◆ clipboard_text_has_strings_cb()

static void clipboard_text_has_strings_cb ( GtkClipboard *  clipboard,
const gchar *  text,
gpointer  user_data 
)
static

Definition at line 45 of file fl_platform_handler.cc.

47  {
48  g_autoptr(FlMethodCall) method_call = FL_METHOD_CALL(user_data);
50  method_call, text != nullptr && strlen(text) > 0);
51 }

References fl_platform_channel_respond_clipboard_has_strings(), method_call, and user_data.

Referenced by clipboard_has_strings().

◆ fl_platform_handler_class_init()

static void fl_platform_handler_class_init ( FlPlatformHandlerClass *  klass)
static

Definition at line 233 of file fl_platform_handler.cc.

233  {
234  G_OBJECT_CLASS(klass)->dispose = fl_platform_handler_dispose;
235 }

References fl_platform_handler_dispose().

◆ fl_platform_handler_dispose()

static void fl_platform_handler_dispose ( GObject *  object)
static

Definition at line 221 of file fl_platform_handler.cc.

221  {
222  FlPlatformHandler* self = FL_PLATFORM_HANDLER(object);
223 
224  g_cancellable_cancel(self->cancellable);
225 
226  g_clear_object(&self->channel);
227  g_clear_object(&self->exit_application_method_call);
228  g_clear_object(&self->cancellable);
229 
230  G_OBJECT_CLASS(fl_platform_handler_parent_class)->dispose(object);
231 }

Referenced by fl_platform_handler_class_init().

◆ fl_platform_handler_init()

static void fl_platform_handler_init ( FlPlatformHandler *  self)
static

Definition at line 237 of file fl_platform_handler.cc.

237  {
238  self->cancellable = g_cancellable_new();
239 }

◆ fl_platform_handler_new()

FlPlatformHandler* fl_platform_handler_new ( FlBinaryMessenger *  messenger)

FlPlatformHandler:

#FlPlatformHandler is a handler that implements the shell side of SystemChannels.platform from the Flutter services library. fl_platform_handler_new: @messenger: an #FlBinaryMessenger

Creates a new handler that implements SystemChannels.platform from the Flutter services library.

Returns: a new #FlPlatformHandler

Definition at line 251 of file fl_platform_handler.cc.

251  {
252  g_return_val_if_fail(FL_IS_BINARY_MESSENGER(messenger), nullptr);
253 
254  FlPlatformHandler* self = FL_PLATFORM_HANDLER(
255  g_object_new(fl_platform_handler_get_type(), nullptr));
256 
257  self->channel =
259  self->app_initialization_complete = FALSE;
260 
261  return self;
262 }

References fl_platform_channel_new(), and platform_channel_vtable.

Referenced by fl_engine_start(), fl_test_application_activate(), and TEST().

◆ fl_platform_handler_request_app_exit()

void fl_platform_handler_request_app_exit ( FlPlatformHandler *  handler)

fl_platform_handler_request_app_exit: @handler: an #FlPlatformHandler

Request the application exits (i.e. due to the window being requested to be closed).

Calling this will only send an exit request to the framework if the framework has already indicated that it is ready to receive requests by sending a "System.initializationComplete" method call on the platform channel. Calls before initialization is complete will result in an immediate exit.

Definition at line 264 of file fl_platform_handler.cc.

264  {
265  g_return_if_fail(FL_IS_PLATFORM_HANDLER(self));
266  // Request a cancellable exit.
268 }

References FL_PLATFORM_CHANNEL_EXIT_TYPE_CANCELABLE, and request_app_exit().

Referenced by fl_engine_request_app_exit().

◆ quit_application()

static void quit_application ( )
static

Definition at line 97 of file fl_platform_handler.cc.

97  {
98  GApplication* app = g_application_get_default();
99  if (app == nullptr) {
100  // Unable to gracefully quit, so just exit the process.
101  exit(0);
102  }
103 
104  // GtkApplication windows contain a reference back to the application.
105  // Break them so the application object can cleanup.
106  // See https://gitlab.gnome.org/GNOME/gtk/-/issues/6190
107  if (GTK_IS_APPLICATION(app)) {
108  // List is copied as it will be modified as windows are disconnected from
109  // the application.
110  g_autoptr(GList) windows =
111  g_list_copy(gtk_application_get_windows(GTK_APPLICATION(app)));
112  for (GList* link = windows; link != NULL; link = link->next) {
113  GtkWidget* window = GTK_WIDGET(link->data);
114  gtk_window_set_application(GTK_WINDOW(window), NULL);
115  }
116  }
117 
118  g_application_quit(app);
119 }

Referenced by request_app_exit(), request_app_exit_response_cb(), system_exit_application(), and system_navigator_pop().

◆ request_app_exit()

static void request_app_exit ( FlPlatformHandler *  self,
FlPlatformChannelExitType  type 
)
static

Definition at line 152 of file fl_platform_handler.cc.

153  {
154  if (!self->app_initialization_complete ||
157  return;
158  }
159 
161  self->channel, type, self->cancellable, request_app_exit_response_cb,
162  self);
163 }

References FL_PLATFORM_CHANNEL_EXIT_TYPE_REQUIRED, fl_platform_channel_system_request_app_exit(), quit_application(), request_app_exit_response_cb(), and type.

Referenced by fl_platform_handler_request_app_exit(), and system_exit_application().

◆ request_app_exit_response_cb()

static void request_app_exit_response_cb ( GObject *  object,
GAsyncResult *  result,
gpointer  user_data 
)
static

Definition at line 122 of file fl_platform_handler.cc.

124  {
125  FlPlatformHandler* self = FL_PLATFORM_HANDLER(user_data);
126 
127  g_autoptr(GError) error = nullptr;
128  FlPlatformChannelExitResponse exit_response;
130  object, result, &exit_response, &error)) {
131  if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
132  return;
133  }
134  g_warning("Failed to complete System.requestAppExit: %s", error->message);
136  return;
137  }
138 
139  if (exit_response == FL_PLATFORM_CHANNEL_EXIT_RESPONSE_EXIT) {
141  }
142 
143  // If request was due to a request from Flutter, pass result back.
144  if (self->exit_application_method_call != nullptr) {
146  self->exit_application_method_call, exit_response);
147  }
148 }

References error, FL_PLATFORM_CHANNEL_EXIT_RESPONSE_EXIT, fl_platform_channel_respond_system_exit_application(), fl_platform_channel_system_request_app_exit_finish(), quit_application(), and user_data.

Referenced by request_app_exit().

◆ system_exit_application()

static FlMethodResponse* system_exit_application ( FlMethodCall *  method_call,
FlPlatformChannelExitType  type,
gpointer  user_data 
)
static

Definition at line 174 of file fl_platform_handler.cc.

176  {
177  FlPlatformHandler* self = FL_PLATFORM_HANDLER(user_data);
178  // Save method call to respond to when our request to Flutter completes.
179  if (self->exit_application_method_call != nullptr) {
180  return FL_METHOD_RESPONSE(fl_method_error_response_new(
181  kInProgressError, "Request already in progress", nullptr));
182  }
183  self->exit_application_method_call =
184  FL_METHOD_CALL(g_object_ref(method_call));
185 
186  // Requested to immediately quit if the app hasn't yet signaled that it is
187  // ready to handle requests, or if the type of exit requested is "required".
188  if (!self->app_initialization_complete ||
193  }
194 
195  // Send the request back to Flutter to follow the standard process.
196  request_app_exit(self, type);
197 
198  // Will respond later.
199  return nullptr;
200 }

References fl_method_error_response_new(), FL_PLATFORM_CHANNEL_EXIT_RESPONSE_EXIT, FL_PLATFORM_CHANNEL_EXIT_TYPE_REQUIRED, fl_platform_channel_make_system_request_app_exit_response(), kInProgressError, method_call, quit_application(), request_app_exit(), type, and user_data.

◆ system_initialization_complete()

static void system_initialization_complete ( gpointer  user_data)
static

Definition at line 168 of file fl_platform_handler.cc.

168  {
169  FlPlatformHandler* self = FL_PLATFORM_HANDLER(user_data);
170  self->app_initialization_complete = TRUE;
171 }

References TRUE, and user_data.

◆ system_navigator_pop()

static void system_navigator_pop ( gpointer  user_data)
static

Definition at line 217 of file fl_platform_handler.cc.

217  {
219 }

References quit_application().

◆ system_sound_play()

static void system_sound_play ( const gchar *  type,
gpointer  user_data 
)
static

Definition at line 203 of file fl_platform_handler.cc.

203  {
204  if (strcmp(type, kSoundTypeAlert) == 0) {
205  GdkDisplay* display = gdk_display_get_default();
206  if (display != nullptr) {
207  gdk_display_beep(display);
208  }
209  } else if (strcmp(type, kSoundTypeClick) == 0) {
210  // We don't make sounds for keyboard on desktops.
211  } else {
212  g_warning("Ignoring unknown sound type %s in SystemSound.play.\n", type);
213  }
214 }

References kSoundTypeAlert, kSoundTypeClick, and type.

Variable Documentation

◆ kInProgressError

constexpr char kInProgressError[] = "In Progress"
staticconstexpr

Definition at line 13 of file fl_platform_handler.cc.

Referenced by system_exit_application().

◆ kSoundTypeAlert

constexpr char kSoundTypeAlert[] = "SystemSoundType.alert"
staticconstexpr

Definition at line 19 of file fl_platform_handler.cc.

Referenced by system_sound_play().

◆ kSoundTypeClick

constexpr char kSoundTypeClick[] = "SystemSoundType.click"
staticconstexpr

Definition at line 20 of file fl_platform_handler.cc.

Referenced by system_sound_play().

◆ kTextPlainFormat

constexpr char kTextPlainFormat[] = "text/plain"
staticconstexpr

Definition at line 17 of file fl_platform_handler.cc.

Referenced by clipboard_get_data().

◆ kUnknownClipboardFormatError

constexpr char kUnknownClipboardFormatError[]
staticconstexpr
Initial value:
=
"Unknown Clipboard Format"

Definition at line 14 of file fl_platform_handler.cc.

Referenced by clipboard_get_data().

◆ platform_channel_vtable

FlPlatformChannelVTable platform_channel_vtable
static
Initial value:
= {
.clipboard_set_data = clipboard_set_data,
.clipboard_get_data = clipboard_get_data,
.clipboard_has_strings = clipboard_has_strings,
.system_exit_application = system_exit_application,
.system_initialization_complete = system_initialization_complete,
.system_sound_play = system_sound_play,
.system_navigator_pop = system_navigator_pop,
}

Definition at line 241 of file fl_platform_handler.cc.

Referenced by fl_platform_handler_new().

kSoundTypeClick
static constexpr char kSoundTypeClick[]
Definition: fl_platform_handler.cc:20
fl_platform_channel_system_request_app_exit_finish
gboolean fl_platform_channel_system_request_app_exit_finish(GObject *object, GAsyncResult *result, FlPlatformChannelExitResponse *exit_response, GError **error)
Definition: fl_platform_channel.cc:268
fl_platform_channel_make_system_request_app_exit_response
FlMethodResponse * fl_platform_channel_make_system_request_app_exit_response(FlPlatformChannelExitResponse exit_response)
Definition: fl_platform_channel.cc:330
fl_method_error_response_new
G_MODULE_EXPORT FlMethodErrorResponse * fl_method_error_response_new(const gchar *code, const gchar *message, FlValue *details)
Definition: fl_method_response.cc:144
type
uint8_t type
Definition: fl_standard_message_codec_test.cc:1115
clipboard_text_has_strings_cb
static void clipboard_text_has_strings_cb(GtkClipboard *clipboard, const gchar *text, gpointer user_data)
Definition: fl_platform_handler.cc:45
FlPlatformChannelExitResponse
FlPlatformChannelExitResponse
Definition: fl_platform_channel.h:18
fl_platform_handler_dispose
static void fl_platform_handler_dispose(GObject *object)
Definition: fl_platform_handler.cc:221
kSoundTypeAlert
static constexpr char kSoundTypeAlert[]
Definition: fl_platform_handler.cc:19
clipboard_get_data
static FlMethodResponse * clipboard_get_data(FlMethodCall *method_call, const gchar *format, gpointer user_data)
Definition: fl_platform_handler.cc:65
request_app_exit
static void request_app_exit(FlPlatformHandler *self, FlPlatformChannelExitType type)
Definition: fl_platform_handler.cc:152
fl_method_success_response_new
G_MODULE_EXPORT FlMethodSuccessResponse * fl_method_success_response_new(FlValue *result)
Definition: fl_method_response.cc:126
user_data
G_BEGIN_DECLS G_MODULE_EXPORT FlValue gpointer user_data
Definition: fl_event_channel.h:90
method_call
G_BEGIN_DECLS G_MODULE_EXPORT FlMethodCall * method_call
Definition: fl_method_channel.h:120
fl_platform_channel_system_request_app_exit
void fl_platform_channel_system_request_app_exit(FlPlatformChannel *self, FlPlatformChannelExitType type, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
Definition: fl_platform_channel.cc:243
kTextPlainFormat
static constexpr char kTextPlainFormat[]
Definition: fl_platform_handler.cc:17
TRUE
return TRUE
Definition: fl_pixel_buffer_texture_test.cc:53
platform_channel_vtable
static FlPlatformChannelVTable platform_channel_vtable
Definition: fl_platform_handler.cc:241
fl_platform_channel_respond_clipboard_has_strings
void fl_platform_channel_respond_clipboard_has_strings(FlMethodCall *method_call, gboolean has_strings)
Definition: fl_platform_channel.cc:302
clipboard_text_cb
static void clipboard_text_cb(GtkClipboard *clipboard, const gchar *text, gpointer user_data)
Definition: fl_platform_handler.cc:37
kInProgressError
static constexpr char kInProgressError[]
Definition: fl_platform_handler.cc:13
fl_platform_channel_respond_clipboard_get_data
void fl_platform_channel_respond_clipboard_get_data(FlMethodCall *method_call, const gchar *text)
Definition: fl_platform_channel.cc:284
FL_PLATFORM_CHANNEL_EXIT_TYPE_CANCELABLE
@ FL_PLATFORM_CHANNEL_EXIT_TYPE_CANCELABLE
Definition: fl_platform_channel.h:14
system_exit_application
static FlMethodResponse * system_exit_application(FlMethodCall *method_call, FlPlatformChannelExitType type, gpointer user_data)
Definition: fl_platform_handler.cc:174
kUnknownClipboardFormatError
static constexpr char kUnknownClipboardFormatError[]
Definition: fl_platform_handler.cc:14
clipboard_has_strings
static FlMethodResponse * clipboard_has_strings(FlMethodCall *method_call, gpointer user_data)
Definition: fl_platform_handler.cc:85
FL_PLATFORM_CHANNEL_EXIT_TYPE_REQUIRED
@ FL_PLATFORM_CHANNEL_EXIT_TYPE_REQUIRED
Definition: fl_platform_channel.h:15
fl_platform_channel_new
FlPlatformChannel * fl_platform_channel_new(FlBinaryMessenger *messenger, FlPlatformChannelVTable *vtable, gpointer user_data)
Definition: fl_platform_channel.cc:222
clipboard_set_data
static FlMethodResponse * clipboard_set_data(FlMethodCall *method_call, const gchar *text, gpointer user_data)
Definition: fl_platform_handler.cc:54
FL_PLATFORM_CHANNEL_EXIT_RESPONSE_EXIT
@ FL_PLATFORM_CHANNEL_EXIT_RESPONSE_EXIT
Definition: fl_platform_channel.h:20
error
const uint8_t uint32_t uint32_t GError ** error
Definition: fl_pixel_buffer_texture_test.cc:40
quit_application
static void quit_application()
Definition: fl_platform_handler.cc:97
request_app_exit_response_cb
static void request_app_exit_response_cb(GObject *object, GAsyncResult *result, gpointer user_data)
Definition: fl_platform_handler.cc:122
system_initialization_complete
static void system_initialization_complete(gpointer user_data)
Definition: fl_platform_handler.cc:168
system_sound_play
static void system_sound_play(const gchar *type, gpointer user_data)
Definition: fl_platform_handler.cc:203
format
uint32_t uint32_t * format
Definition: fl_texture_registrar_test.cc:42
fl_platform_channel_respond_system_exit_application
void fl_platform_channel_respond_system_exit_application(FlMethodCall *method_call, FlPlatformChannelExitResponse exit_response)
Definition: fl_platform_channel.cc:318
system_navigator_pop
static void system_navigator_pop(gpointer user_data)
Definition: fl_platform_handler.cc:217