| Flutter Linux Embedder |

Classes | Functions | Variables
fl_platform_handler.cc File Reference
`#include "flutter/shell/platform/linux/fl_platform_handler.h"`
`#include <gtk/gtk.h>`
`#include <cstring>`
`#include "flutter/shell/platform/linux/fl_platform_channel.h"`
`#include "flutter/shell/platform/linux/public/flutter_linux/fl_method_channel.h"`

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 }
method_call
G_BEGIN_DECLS G_MODULE_EXPORT FlMethodCall * method_call
Definition: fl_method_channel.h:120
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
kUnknownClipboardFormatError
static constexpr char kUnknownClipboardFormatError[]
Definition: fl_platform_handler.cc:14
clipboard_text_cb
static void clipboard_text_cb(GtkClipboard *clipboard, const gchar *text, gpointer user_data)
Definition: fl_platform_handler.cc:37
kTextPlainFormat
static constexpr char kTextPlainFormat[]
Definition: fl_platform_handler.cc:17
format
uint32_t uint32_t * format
Definition: fl_texture_registrar_test.cc:42

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 }
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

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 }
fl_method_success_response_new
G_MODULE_EXPORT FlMethodSuccessResponse * fl_method_success_response_new(FlValue *result)
Definition: fl_method_response.cc:126

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);
41 fl_platform_channel_respond_clipboard_get_data(method_call, text);
42 }
user_data
G_BEGIN_DECLS G_MODULE_EXPORT FlValue gpointer user_data
Definition: fl_event_channel.h:90
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

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);
49 fl_platform_channel_respond_clipboard_has_strings(
50 method_call, text != nullptr && strlen(text) > 0);
51 }
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

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 }
fl_platform_handler_dispose
static void fl_platform_handler_dispose(GObject *object)
Definition: fl_platform_handler.cc:221

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 =
258 fl_platform_channel_new(messenger, &platform_channel_vtable, self);
259 self->app_initialization_complete = FALSE;
260
261 return self;
262 }
fl_platform_channel_new
FlPlatformChannel * fl_platform_channel_new(FlBinaryMessenger *messenger, FlPlatformChannelVTable *vtable, gpointer user_data)
Definition: fl_platform_channel.cc:222
platform_channel_vtable
static FlPlatformChannelVTable platform_channel_vtable
Definition: fl_platform_handler.cc:241

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.
267 request_app_exit(self, FL_PLATFORM_CHANNEL_EXIT_TYPE_CANCELABLE);
268 }
FL_PLATFORM_CHANNEL_EXIT_TYPE_CANCELABLE
@ FL_PLATFORM_CHANNEL_EXIT_TYPE_CANCELABLE
Definition: fl_platform_channel.h:14
request_app_exit
static void request_app_exit(FlPlatformHandler *self, FlPlatformChannelExitType type)
Definition: fl_platform_handler.cc:152

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 }
window
return window
Definition: fl_application.cc:41

References window.

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 ||
155 type == FL_PLATFORM_CHANNEL_EXIT_TYPE_REQUIRED) {
156 quit_application();
157 return;
158 }
159
160 fl_platform_channel_system_request_app_exit(
161 self->channel, type, self->cancellable, request_app_exit_response_cb,
162 self);
163 }
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
FL_PLATFORM_CHANNEL_EXIT_TYPE_REQUIRED
@ FL_PLATFORM_CHANNEL_EXIT_TYPE_REQUIRED
Definition: fl_platform_channel.h:15
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
type
uint8_t type
Definition: fl_standard_message_codec_test.cc:1117

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;
129 if (!fl_platform_channel_system_request_app_exit_finish(
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);
135 quit_application();
136 return;
137 }
138
139 if (exit_response == FL_PLATFORM_CHANNEL_EXIT_RESPONSE_EXIT) {
140 quit_application();
141 }
142
143 // If request was due to a request from Flutter, pass result back.
144 if (self->exit_application_method_call != nullptr) {
145 fl_platform_channel_respond_system_exit_application(
146 self->exit_application_method_call, exit_response);
147 }
148 }
error
const uint8_t uint32_t uint32_t GError ** error
Definition: fl_pixel_buffer_texture_test.cc:40
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_respond_system_exit_application
void fl_platform_channel_respond_system_exit_application(FlMethodCall *method_call, FlPlatformChannelExitResponse exit_response)
Definition: fl_platform_channel.cc:318
FlPlatformChannelExitResponse
FlPlatformChannelExitResponse
Definition: fl_platform_channel.h:18
FL_PLATFORM_CHANNEL_EXIT_RESPONSE_EXIT
@ FL_PLATFORM_CHANNEL_EXIT_RESPONSE_EXIT
Definition: fl_platform_channel.h:20

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 ||
189 type == FL_PLATFORM_CHANNEL_EXIT_TYPE_REQUIRED) {
190 quit_application();
191 return fl_platform_channel_make_system_request_app_exit_response(
192 FL_PLATFORM_CHANNEL_EXIT_RESPONSE_EXIT);
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 }
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
kInProgressError
static constexpr char kInProgressError[]
Definition: fl_platform_handler.cc:13

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 }
TRUE
return TRUE
Definition: fl_pixel_buffer_texture_test.cc:53

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 {
218 quit_application();
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 }
kSoundTypeAlert
static constexpr char kSoundTypeAlert[]
Definition: fl_platform_handler.cc:19
kSoundTypeClick
static constexpr char kSoundTypeClick[]
Definition: fl_platform_handler.cc:20

References kSoundTypeAlert, kSoundTypeClick, and type.

## Variable Documentation

## ◆ kInProgressError

constexpr char kInProgressError[] = "In Progress"
| static constexpr

Definition at line 13 of file fl_platform_handler.cc.

Referenced by system_exit_application().

## ◆ kSoundTypeAlert

constexpr char kSoundTypeAlert[] = "SystemSoundType.alert"
| static constexpr

Definition at line 19 of file fl_platform_handler.cc.

Referenced by system_sound_play().

## ◆ kSoundTypeClick

constexpr char kSoundTypeClick[] = "SystemSoundType.click"
| static constexpr

Definition at line 20 of file fl_platform_handler.cc.

Referenced by system_sound_play().

## ◆ kTextPlainFormat

constexpr char kTextPlainFormat[] = "text/plain"
| static constexpr

Definition at line 17 of file fl_platform_handler.cc.

Referenced by clipboard_get_data().

## ◆ kUnknownClipboardFormatError

constexpr char kUnknownClipboardFormatError[]
| static constexpr

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,
}
system_initialization_complete
static void system_initialization_complete(gpointer user_data)
Definition: fl_platform_handler.cc:168
clipboard_set_data
static FlMethodResponse * clipboard_set_data(FlMethodCall *method_call, const gchar *text, gpointer user_data)
Definition: fl_platform_handler.cc:54
system_exit_application
static FlMethodResponse * system_exit_application(FlMethodCall *method_call, FlPlatformChannelExitType type, gpointer user_data)
Definition: fl_platform_handler.cc:174
clipboard_has_strings
static FlMethodResponse * clipboard_has_strings(FlMethodCall *method_call, gpointer user_data)
Definition: fl_platform_handler.cc:85
system_navigator_pop
static void system_navigator_pop(gpointer user_data)
Definition: fl_platform_handler.cc:217
clipboard_get_data
static FlMethodResponse * clipboard_get_data(FlMethodCall *method_call, const gchar *format, gpointer user_data)
Definition: fl_platform_handler.cc:65
system_sound_play
static void system_sound_play(const gchar *type, gpointer user_data)
Definition: fl_platform_handler.cc:203

Definition at line 241 of file fl_platform_handler.cc.

Referenced by fl_platform_handler_new().