| 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 constexpr char | kSoundTypeTick [] = "SystemSoundType.tick"
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 66 of file fl_platform_handler.cc.

68 {
69 if (strcmp(format, kTextPlainFormat) != 0) {
70 return FL_METHOD_RESPONSE(fl_method_error_response_new(
71 kUnknownClipboardFormatError, "GTK clipboard API only supports text",
72 nullptr));
73 }
74
75 GtkClipboard* clipboard =
76 gtk_clipboard_get_default(gdk_display_get_default());
77 gtk_clipboard_request_text(clipboard, clipboard_text_cb,
78 g_object_ref(method_call));
79
80 // Will respond later.
81 return nullptr;
82 }
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:38
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 86 of file fl_platform_handler.cc.

87 {
88 GtkClipboard* clipboard =
89 gtk_clipboard_get_default(gdk_display_get_default());
90 gtk_clipboard_request_text(clipboard, clipboard_text_has_strings_cb,
91 g_object_ref(method_call));
92
93 // Will respond later.
94 return nullptr;
95 }
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:46

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 55 of file fl_platform_handler.cc.

57 {
58 GtkClipboard* clipboard =
59 gtk_clipboard_get_default(gdk_display_get_default());
60 gtk_clipboard_set_text(clipboard, text, -1);
61
62 return FL_METHOD_RESPONSE(fl_method_success_response_new(nullptr));
63 }
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 38 of file fl_platform_handler.cc.

40 {
41 g_autoptr(FlMethodCall) method_call = FL_METHOD_CALL(user_data);
42 fl_platform_channel_respond_clipboard_get_data(method_call, text);
43 }
g_autoptr
g_autoptr(GMutexLocker) locker
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(), g_autoptr(), 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 46 of file fl_platform_handler.cc.

48 {
49 g_autoptr(FlMethodCall) method_call = FL_METHOD_CALL(user_data);
50 fl_platform_channel_respond_clipboard_has_strings(
51 method_call, text != nullptr && strlen(text) > 0);
52 }
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(), g_autoptr(), 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 236 of file fl_platform_handler.cc.

236 {
237 G_OBJECT_CLASS(klass)->dispose = fl_platform_handler_dispose;
238 }
fl_platform_handler_dispose
static void fl_platform_handler_dispose(GObject *object)
Definition: fl_platform_handler.cc:224

References fl_platform_handler_dispose().

## ◆ fl_platform_handler_dispose()

static void fl_platform_handler_dispose | ( | GObject * | object | ) |
| static

Definition at line 224 of file fl_platform_handler.cc.

224 {
225 FlPlatformHandler* self = FL_PLATFORM_HANDLER(object);
226
227 g_cancellable_cancel(self->cancellable);
228
229 g_clear_object(&self->channel);
230 g_clear_object(&self->exit_application_method_call);
231 g_clear_object(&self->cancellable);
232
233 G_OBJECT_CLASS(fl_platform_handler_parent_class)->dispose(object);
234 }
self
g_cond_signal & self
Definition: fl_compositor_software.cc:67

References self.

Referenced by fl_platform_handler_class_init().

## ◆ fl_platform_handler_init()

static void fl_platform_handler_init | ( | FlPlatformHandler * | self | ) |
| static

Definition at line 240 of file fl_platform_handler.cc.

240 {
241 self->cancellable = g_cancellable_new();
242 }

## ◆ 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 254 of file fl_platform_handler.cc.

254 {
255 g_return_val_if_fail(FL_IS_BINARY_MESSENGER(messenger), nullptr);
256
257 FlPlatformHandler* self = FL_PLATFORM_HANDLER(
258 g_object_new(fl_platform_handler_get_type(), nullptr));
259
260 self->channel =
261 fl_platform_channel_new(messenger, &platform_channel_vtable, self);
262 self->app_initialization_complete = FALSE;
263
264 return self;
265 }
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:244

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 267 of file fl_platform_handler.cc.

267 {
268 g_return_if_fail(FL_IS_PLATFORM_HANDLER(self));
269 // Request a cancellable exit.
270 request_app_exit(self, FL_PLATFORM_CHANNEL_EXIT_TYPE_CANCELABLE);
271 }
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:153

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 98 of file fl_platform_handler.cc.

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

References g_autoptr(), and 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 153 of file fl_platform_handler.cc.

154 {
155 if (!self->app_initialization_complete ||
156 type == FL_PLATFORM_CHANNEL_EXIT_TYPE_REQUIRED) {
157 quit_application();
158 return;
159 }
160
161 fl_platform_channel_system_request_app_exit(
162 self->channel, type, self->cancellable, request_app_exit_response_cb,
163 self);
164 }
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:98
request_app_exit_response_cb
static void request_app_exit_response_cb(GObject *object, GAsyncResult *result, gpointer user_data)
Definition: fl_platform_handler.cc:123
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(), self, 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 123 of file fl_platform_handler.cc.

125 {
126 FlPlatformHandler* self = FL_PLATFORM_HANDLER(user_data);
127
128 g_autoptr(GError) error = nullptr;
129 FlPlatformChannelExitResponse exit_response;
130 if (!fl_platform_channel_system_request_app_exit_finish(
131 object, result, &exit_response, &error)) {
132 if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
133 return;
134 }
135 g_warning("Failed to complete System.requestAppExit: %s", error->message);
136 quit_application();
137 return;
138 }
139
140 if (exit_response == FL_PLATFORM_CHANNEL_EXIT_RESPONSE_EXIT) {
141 quit_application();
142 }
143
144 // If request was due to a request from Flutter, pass result back.
145 if (self->exit_application_method_call != nullptr) {
146 fl_platform_channel_respond_system_exit_application(
147 self->exit_application_method_call, exit_response);
148 }
149 }
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(), g_autoptr(), quit_application(), self, 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 175 of file fl_platform_handler.cc.

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

## ◆ system_initialization_complete()

static void system_initialization_complete | ( | gpointer | user_data | ) |
| static

Definition at line 169 of file fl_platform_handler.cc.

169 {
170 FlPlatformHandler* self = FL_PLATFORM_HANDLER(user_data);
171 self->app_initialization_complete = TRUE;
172 }
TRUE
return TRUE
Definition: fl_compositor_software.cc:69

References TRUE, and user_data.

## ◆ system_navigator_pop()

static void system_navigator_pop | ( | gpointer | user_data | ) |
| static

Definition at line 220 of file fl_platform_handler.cc.

220 {
221 quit_application();
222 }

References quit_application().

## ◆ system_sound_play()

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

Definition at line 204 of file fl_platform_handler.cc.

204 {
205 if (strcmp(type, kSoundTypeAlert) == 0) {
206 GdkDisplay* display = gdk_display_get_default();
207 if (display != nullptr) {
208 gdk_display_beep(display);
209 }
210 } else if (strcmp(type, kSoundTypeClick) == 0) {
211 // We don't make sounds for keyboard on desktops.
212 } else if (strcmp(type, kSoundTypeTick) == 0) {
213 // We don't make ticking sounds on desktops.
214 } else {
215 g_warning("Ignoring unknown sound type %s in SystemSound.play.\n", type);
216 }
217 }
kSoundTypeTick
static constexpr char kSoundTypeTick[]
Definition: fl_platform_handler.cc:21
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, kSoundTypeTick, 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().

## ◆ kSoundTypeTick

constexpr char kSoundTypeTick[] = "SystemSoundType.tick"
| static constexpr

Definition at line 21 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:169
clipboard_set_data
static FlMethodResponse * clipboard_set_data(FlMethodCall *method_call, const gchar *text, gpointer user_data)
Definition: fl_platform_handler.cc:55
system_exit_application
static FlMethodResponse * system_exit_application(FlMethodCall *method_call, FlPlatformChannelExitType type, gpointer user_data)
Definition: fl_platform_handler.cc:175
clipboard_has_strings
static FlMethodResponse * clipboard_has_strings(FlMethodCall *method_call, gpointer user_data)
Definition: fl_platform_handler.cc:86
system_navigator_pop
static void system_navigator_pop(gpointer user_data)
Definition: fl_platform_handler.cc:220
clipboard_get_data
static FlMethodResponse * clipboard_get_data(FlMethodCall *method_call, const gchar *format, gpointer user_data)
Definition: fl_platform_handler.cc:66
system_sound_play
static void system_sound_play(const gchar *type, gpointer user_data)
Definition: fl_platform_handler.cc:204

Definition at line 244 of file fl_platform_handler.cc.

Referenced by fl_platform_handler_new().