Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
fl_keyboard_manager.cc File Reference

Go to the source code of this file.

Classes

struct  HandleEventData
 
struct  _FlKeyboardManager
 

Macros

#define DEBUG_PRINT_LAYOUT
 

Functions

static HandleEventDatahandle_event_data_new (FlKeyEvent *event)
 
static void handle_event_data_free (HandleEventData *data)
 
 G_DEFINE_TYPE (FlKeyboardManager, fl_keyboard_manager, G_TYPE_OBJECT)
 
static gboolean event_is_redispatched (FlKeyboardManager *self, FlKeyEvent *event)
 
static void keymap_keys_changed_cb (FlKeyboardManager *self)
 
static void complete_handle_event (FlKeyboardManager *self, GTask *task)
 
static void responder_handle_embedder_event_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 
static void responder_handle_channel_event_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 
static uint16_t convert_key_to_char (FlKeyboardManager *self, guint keycode, gint group, gint level)
 
static void guarantee_layout (FlKeyboardManager *self, FlKeyEvent *event)
 
static void fl_keyboard_manager_dispose (GObject *object)
 
static void fl_keyboard_manager_class_init (FlKeyboardManagerClass *klass)
 
static void fl_keyboard_manager_init (FlKeyboardManager *self)
 
FlKeyboardManager * fl_keyboard_manager_new (FlEngine *engine)
 
void fl_keyboard_manager_add_redispatched_event (FlKeyboardManager *self, FlKeyEvent *event)
 
void fl_keyboard_manager_handle_event (FlKeyboardManager *self, FlKeyEvent *event, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
 
gboolean fl_keyboard_manager_handle_event_finish (FlKeyboardManager *self, GAsyncResult *result, FlKeyEvent **redispatched_event, GError **error)
 
void fl_keyboard_manager_sync_modifier_if_needed (FlKeyboardManager *self, guint state, double event_time)
 
GHashTable * fl_keyboard_manager_get_pressed_state (FlKeyboardManager *self)
 
void fl_keyboard_manager_set_lookup_key_handler (FlKeyboardManager *self, FlKeyboardManagerLookupKeyHandler lookup_key_handler, gpointer user_data)
 

Macro Definition Documentation

◆ DEBUG_PRINT_LAYOUT

#define DEBUG_PRINT_LAYOUT

Definition at line 19 of file fl_keyboard_manager.cc.

Function Documentation

◆ complete_handle_event()

static void complete_handle_event ( FlKeyboardManager *  self,
GTask *  task 
)
static

Definition at line 145 of file fl_keyboard_manager.cc.

145 {
147 static_cast<HandleEventData*>(g_task_get_task_data(task));
148
149 // Waiting for responses.
150 if (!data->embedder_responded || !data->channel_responded) {
151 return;
152 }
153
154 data->redispatch = !data->handled;
155 g_task_return_boolean(task, TRUE);
156}
return TRUE
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switch_defs.h:36

References TRUE.

Referenced by responder_handle_channel_event_cb(), and responder_handle_embedder_event_cb().

◆ convert_key_to_char()

static uint16_t convert_key_to_char ( FlKeyboardManager *  self,
guint  keycode,
gint  group,
gint  level 
)
static

Definition at line 210 of file fl_keyboard_manager.cc.

213 {
214 GdkKeymapKey key = {keycode, group, level};
215 constexpr int kBmpMax = 0xD7FF;
216 guint origin;
217 if (self->lookup_key_handler != nullptr) {
218 origin = self->lookup_key_handler(&key, self->lookup_key_handler_user_data);
219 } else {
220 origin = gdk_keymap_lookup_key(self->keymap, &key);
221 }
222 return origin < kBmpMax ? origin : 0xFFFF;
223}
guint gdk_keymap_lookup_key(GdkKeymap *keymap, const GdkKeymapKey *key)
Definition mock_gtk.cc:65

References gdk_keymap_lookup_key(), key, and self.

Referenced by guarantee_layout().

◆ event_is_redispatched()

static gboolean event_is_redispatched ( FlKeyboardManager *  self,
FlKeyEvent *  event 
)
static

Definition at line 121 of file fl_keyboard_manager.cc.

122 {
123 guint32 time = fl_key_event_get_time(event);
124 gboolean is_press = !!fl_key_event_get_is_press(event);
125 guint16 keycode = fl_key_event_get_keycode(event);
126 for (guint i = 0; i < self->redispatched_key_events->len; i++) {
127 FlKeyEvent* e =
128 FL_KEY_EVENT(g_ptr_array_index(self->redispatched_key_events, i));
129 if (fl_key_event_get_time(e) == time &&
130 !!fl_key_event_get_is_press(e) == is_press &&
131 fl_key_event_get_keycode(e) == keycode) {
132 g_ptr_array_remove_index(self->redispatched_key_events, i);
133 return TRUE;
134 }
135 }
136
137 return FALSE;
138}
guint16 fl_key_event_get_keycode(FlKeyEvent *self)
gboolean fl_key_event_get_is_press(FlKeyEvent *self)
guint32 fl_key_event_get_time(FlKeyEvent *self)

References fl_key_event_get_is_press(), fl_key_event_get_keycode(), fl_key_event_get_time(), i, self, and TRUE.

Referenced by fl_keyboard_manager_handle_event().

◆ fl_keyboard_manager_add_redispatched_event()

void fl_keyboard_manager_add_redispatched_event ( FlKeyboardManager *  manager,
FlKeyEvent *  event 
)

fl_keyboard_manager_add_redispatched_event: @manager: an #FlKeyboardManager. @event: an event that will be handled by the manager in the future.

Add an event that will be redispatched and handled by the manager in the future. When that event is received it will be ignored.

Definition at line 362 of file fl_keyboard_manager.cc.

363 {
364 g_return_if_fail(FL_IS_KEYBOARD_MANAGER(self));
365
366 g_ptr_array_add(self->redispatched_key_events, g_object_ref(event));
367}

References self.

◆ fl_keyboard_manager_class_init()

static void fl_keyboard_manager_class_init ( FlKeyboardManagerClass *  klass)
static

Definition at line 324 of file fl_keyboard_manager.cc.

324 {
325 G_OBJECT_CLASS(klass)->dispose = fl_keyboard_manager_dispose;
326}
static void fl_keyboard_manager_dispose(GObject *object)

References fl_keyboard_manager_dispose().

◆ fl_keyboard_manager_dispose()

static void fl_keyboard_manager_dispose ( GObject *  object)
static

Definition at line 307 of file fl_keyboard_manager.cc.

307 {
308 FlKeyboardManager* self = FL_KEYBOARD_MANAGER(object);
309
310 g_cancellable_cancel(self->cancellable);
311
312 self->keycode_to_goals.reset();
313 self->logical_to_mandatory_goals.reset();
314
315 g_clear_pointer(&self->redispatched_key_events, g_ptr_array_unref);
316 g_clear_object(&self->key_embedder_responder);
317 g_clear_object(&self->key_channel_responder);
318 g_clear_object(&self->derived_layout);
319 g_clear_object(&self->cancellable);
320
321 G_OBJECT_CLASS(fl_keyboard_manager_parent_class)->dispose(object);
322}

References self.

Referenced by fl_keyboard_manager_class_init().

◆ fl_keyboard_manager_get_pressed_state()

GHashTable * fl_keyboard_manager_get_pressed_state ( FlKeyboardManager *  manager)

fl_keyboard_manager_get_pressed_state: @manager: the #FlKeyboardManager self.

Returns the keyboard pressed state. The hash table contains one entry per pressed keys, mapping from the logical key to the physical key.*

Definition at line 430 of file fl_keyboard_manager.cc.

430 {
431 g_return_val_if_fail(FL_IS_KEYBOARD_MANAGER(self), nullptr);
433 self->key_embedder_responder);
434}
GHashTable * fl_key_embedder_responder_get_pressed_state(FlKeyEmbedderResponder *self)

References fl_key_embedder_responder_get_pressed_state(), and self.

Referenced by get_keyboard_state().

◆ fl_keyboard_manager_handle_event()

void fl_keyboard_manager_handle_event ( FlKeyboardManager *  manager,
FlKeyEvent *  event,
GCancellable *  cancellable,
GAsyncReadyCallback  callback,
gpointer  user_data 
)

fl_keyboard_manager_handle_event: @manager: an #FlKeyboardManager. @event: the event to be dispatched. It is usually a wrap of a GdkEventKey. This event will be managed and released by #FlKeyboardManager. @cancellable: (allow-none): a #GCancellable or NULL. @callback: (scope async): a #GAsyncReadyCallback to call when the view is added. @user_data: (closure): user data to pass to @callback.

Make the manager process a system key event. This might eventually send messages to the framework, trigger text input effects, or redispatch the event back to the system.

Definition at line 369 of file fl_keyboard_manager.cc.

373 {
374 g_return_if_fail(FL_IS_KEYBOARD_MANAGER(self));
375 g_return_if_fail(event != nullptr);
376
377 g_autoptr(GTask) task = g_task_new(self, cancellable, callback, user_data);
378
379 guarantee_layout(self, event);
380
381 g_task_set_task_data(
382 task, handle_event_data_new(event),
383 reinterpret_cast<GDestroyNotify>(handle_event_data_free));
384
385 if (event_is_redispatched(self, event)) {
387 static_cast<HandleEventData*>(g_task_get_task_data(task));
388 data->handled = TRUE;
389 g_task_return_boolean(task, TRUE);
390 return;
391 }
392
393 uint64_t specified_logical_key = fl_keyboard_layout_get_logical_key(
394 self->derived_layout, fl_key_event_get_group(event),
397 self->key_embedder_responder, event, specified_logical_key,
399 g_object_ref(task));
401 self->key_channel_responder, event, specified_logical_key,
402 self->cancellable, responder_handle_channel_event_cb, g_object_ref(task));
403}
g_autoptr(FlEngine) engine
void fl_key_channel_responder_handle_event(FlKeyChannelResponder *self, FlKeyEvent *event, uint64_t specified_logical_key, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
void fl_key_embedder_responder_handle_event(FlKeyEmbedderResponder *self, FlKeyEvent *event, uint64_t specified_logical_key, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
guint8 fl_key_event_get_group(FlKeyEvent *self)
uint64_t fl_keyboard_layout_get_logical_key(FlKeyboardLayout *self, uint8_t group, uint16_t keycode)
static void guarantee_layout(FlKeyboardManager *self, FlKeyEvent *event)
static void responder_handle_channel_event_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void handle_event_data_free(HandleEventData *data)
static void responder_handle_embedder_event_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static gboolean event_is_redispatched(FlKeyboardManager *self, FlKeyEvent *event)
static HandleEventData * handle_event_data_new(FlKeyEvent *event)
FlutterDesktopBinaryReply callback

References callback, event_is_redispatched(), fl_key_channel_responder_handle_event(), fl_key_embedder_responder_handle_event(), fl_key_event_get_group(), fl_key_event_get_keycode(), fl_keyboard_layout_get_logical_key(), g_autoptr(), guarantee_layout(), handle_event_data_free(), handle_event_data_new(), responder_handle_channel_event_cb(), responder_handle_embedder_event_cb(), self, TRUE, and user_data.

Referenced by handle_key_event(), and TEST_F().

◆ fl_keyboard_manager_handle_event_finish()

gboolean fl_keyboard_manager_handle_event_finish ( FlKeyboardManager *  manager,
GAsyncResult *  result,
FlKeyEvent **  redispatched_event,
GError **  error 
)

fl_keyboard_manager_handle_event_finish: @manager: an #FlKeyboardManager.

Returns
: a #GAsyncResult. @redispatched_event: FIXME @error: (allow-none): #GError location to store the error occurring, or NULL to ignore. If error is not NULL, *error must be initialized (typically NULL, but an error from a previous call using GLib error handling is explicitly valid).

Completes request started with fl_keyboard_manager_handle_event().

Returns: TRUE on success.

Definition at line 405 of file fl_keyboard_manager.cc.

409 {
410 g_return_val_if_fail(FL_IS_KEYBOARD_MANAGER(self), FALSE);
411 g_return_val_if_fail(g_task_is_valid(result, self), FALSE);
412
414 static_cast<HandleEventData*>(g_task_get_task_data(G_TASK(result)));
415 if (redispatched_event != nullptr && data->redispatch) {
416 *redispatched_event = FL_KEY_EVENT(g_object_ref(data->event));
417 }
418
419 return g_task_propagate_boolean(G_TASK(result), error);
420}
const uint8_t uint32_t uint32_t GError ** error

References error, and self.

Referenced by TEST_F().

◆ fl_keyboard_manager_init()

static void fl_keyboard_manager_init ( FlKeyboardManager *  self)
static

Definition at line 328 of file fl_keyboard_manager.cc.

328 {
329 self->redispatched_key_events =
330 g_ptr_array_new_with_free_func(g_object_unref);
331 self->derived_layout = fl_keyboard_layout_new();
332
333 self->keycode_to_goals =
334 std::make_unique<std::map<uint16_t, const LayoutGoal*>>();
335 self->logical_to_mandatory_goals =
336 std::make_unique<std::map<uint64_t, const LayoutGoal*>>();
337 for (const LayoutGoal& goal : layout_goals) {
338 (*self->keycode_to_goals)[goal.keycode] = &goal;
339 if (goal.mandatory) {
340 (*self->logical_to_mandatory_goals)[goal.logical_key] = &goal;
341 }
342 }
343
345 g_signal_connect_object(self->keymap, "keys-changed",
346 G_CALLBACK(keymap_keys_changed_cb), self,
347 G_CONNECT_SWAPPED);
348 self->cancellable = g_cancellable_new();
349}
const std::vector< LayoutGoal > layout_goals
FlKeyboardLayout * fl_keyboard_layout_new()
static void keymap_keys_changed_cb(FlKeyboardManager *self)
GdkDisplay * gdk_display_get_default()
Definition mock_gtk.cc:70
GdkKeymap * gdk_keymap_get_for_display(GdkDisplay *display)
Definition mock_gtk.cc:57

References fl_keyboard_layout_new(), gdk_display_get_default(), gdk_keymap_get_for_display(), keymap_keys_changed_cb(), layout_goals, and self.

◆ fl_keyboard_manager_new()

FlKeyboardManager * fl_keyboard_manager_new ( FlEngine *  engine)

FlKeyboardManager:

Processes keyboard events and cooperate with TextInputManager.

A keyboard event goes through a few sections, each can choose to handle the event, and only unhandled events can move to the next section:

  • Keyboard: Dispatch to the embedder responder and the channel responder simultaneously. After both responders have responded (asynchronously), the event is considered handled if either responder handles it.
  • Text input: Events are sent to IM filter (usually owned by TextInputManager) and are handled synchronously.
  • Redispatching: Events are inserted back to the system for redispatching. fl_keyboard_manager_new: @engine: an #FlEngine.

Create a new #FlKeyboardManager.

Returns: a new #FlKeyboardManager.

Definition at line 351 of file fl_keyboard_manager.cc.

351 {
352 FlKeyboardManager* self = FL_KEYBOARD_MANAGER(
353 g_object_new(fl_keyboard_manager_get_type(), nullptr));
354
355 self->key_embedder_responder = fl_key_embedder_responder_new(engine);
356 self->key_channel_responder =
358
359 return self;
360}
FlutterEngine engine
Definition main.cc:84
G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger(FlEngine *self)
FlKeyChannelResponder * fl_key_channel_responder_new(FlBinaryMessenger *messenger)
FlKeyEmbedderResponder * fl_key_embedder_responder_new(FlEngine *engine)

References engine, fl_engine_get_binary_messenger(), fl_key_channel_responder_new(), fl_key_embedder_responder_new(), and self.

Referenced by fl_engine_new_full(), FlKeyboardHandlerTest::SetUp(), and setup_keyboard().

◆ fl_keyboard_manager_set_lookup_key_handler()

void fl_keyboard_manager_set_lookup_key_handler ( FlKeyboardManager *  manager,
FlKeyboardManagerLookupKeyHandler  lookup_key_handler,
gpointer  user_data 
)

fl_keyboard_manager_set_lookup_key_handler: @manager: the #FlKeyboardManager self.

Set the handler for key lookup, for testing purposes only.

Definition at line 436 of file fl_keyboard_manager.cc.

439 {
440 g_return_if_fail(FL_IS_KEYBOARD_MANAGER(self));
441 self->lookup_key_handler = lookup_key_handler;
442 self->lookup_key_handler_user_data = user_data;
443}

References self, and user_data.

◆ fl_keyboard_manager_sync_modifier_if_needed()

void fl_keyboard_manager_sync_modifier_if_needed ( FlKeyboardManager *  manager,
guint  state,
double  event_time 
)

fl_keyboard_manager_sync_modifier_if_needed: @manager: the #FlKeyboardManager self. @state: the state of the modifiers mask. @event_time: the time attribute of the incoming GDK event.

If needed, synthesize modifier keys up and down event by comparing their current pressing states with the given modifiers mask.

Definition at line 422 of file fl_keyboard_manager.cc.

424 {
425 g_return_if_fail(FL_IS_KEYBOARD_MANAGER(self));
427 self->key_embedder_responder, state, event_time);
428}
void fl_key_embedder_responder_sync_modifiers_if_needed(FlKeyEmbedderResponder *self, guint state, double event_time)

References fl_key_embedder_responder_sync_modifiers_if_needed(), and self.

Referenced by sync_modifier_if_needed().

◆ G_DEFINE_TYPE()

G_DEFINE_TYPE ( FlKeyboardManager  ,
fl_keyboard_manager  ,
G_TYPE_OBJECT   
)

◆ guarantee_layout()

static void guarantee_layout ( FlKeyboardManager *  self,
FlKeyEvent *  event 
)
static

Definition at line 227 of file fl_keyboard_manager.cc.

227 {
228 guint8 group = fl_key_event_get_group(event);
229 if (fl_keyboard_layout_has_group(self->derived_layout, group)) {
230 return;
231 }
232 if (self->keycode_to_goals->find(fl_key_event_get_keycode(event)) ==
233 self->keycode_to_goals->end()) {
234 return;
235 }
236
237 // Clone all mandatory goals. Each goal is removed from this cloned map when
238 // fulfilled, and the remaining ones will be assigned to a default position.
239 std::map<uint64_t, const LayoutGoal*> remaining_mandatory_goals =
240 *self->logical_to_mandatory_goals;
241
242#ifdef DEBUG_PRINT_LAYOUT
243 std::string debug_layout_data;
244 for (uint16_t keycode = 0; keycode < 128; keycode += 1) {
245 std::vector<uint16_t> this_key_clues = {
246 convert_key_to_char(self, keycode, group, 0),
247 convert_key_to_char(self, keycode, group, 1), // Shift
248 };
249 debug_format_layout_data(debug_layout_data, keycode, this_key_clues[0],
250 this_key_clues[1]);
251 }
252#endif
253
254 // It's important to only traverse layout goals instead of all keycodes.
255 // Some key codes outside of the standard keyboard also gives alpha-numeric
256 // letters, and will therefore take over mandatory goals from standard
257 // keyboard keys if they come first. Example: French keyboard digit 1.
258 for (const LayoutGoal& keycode_goal : layout_goals) {
259 uint16_t keycode = keycode_goal.keycode;
260 std::vector<uint16_t> this_key_clues = {
261 convert_key_to_char(self, keycode, group, 0),
262 convert_key_to_char(self, keycode, group, 1), // Shift
263 };
264
265 // The logical key should be the first available clue from below:
266 //
267 // - Mandatory goal, if it matches any clue. This ensures that all alnum
268 // keys can be found somewhere.
269 // - US layout, if neither clue of the key is EASCII. This ensures that
270 // there are no non-latin logical keys.
271 // - A value derived on the fly from keycode & keyval.
272 for (uint16_t clue : this_key_clues) {
273 auto matching_goal = remaining_mandatory_goals.find(clue);
274 if (matching_goal != remaining_mandatory_goals.end()) {
275 // Found a key that produces a mandatory char. Use it.
276 g_return_if_fail(fl_keyboard_layout_get_logical_key(
277 self->derived_layout, group, keycode) == 0);
278 fl_keyboard_layout_set_logical_key(self->derived_layout, group, keycode,
279 clue);
280 remaining_mandatory_goals.erase(matching_goal);
281 break;
282 }
283 }
284 bool has_any_eascii =
285 is_eascii(this_key_clues[0]) || is_eascii(this_key_clues[1]);
286 // See if any produced char meets the requirement as a logical key.
287 if (fl_keyboard_layout_get_logical_key(self->derived_layout, group,
288 keycode) == 0 &&
289 !has_any_eascii) {
290 auto found_us_layout = self->keycode_to_goals->find(keycode);
291 if (found_us_layout != self->keycode_to_goals->end()) {
293 self->derived_layout, group, keycode,
294 found_us_layout->second->logical_key);
295 }
296 }
297 }
298
299 // Ensure all mandatory goals are assigned.
300 for (const auto mandatory_goal_iter : remaining_mandatory_goals) {
301 const LayoutGoal* goal = mandatory_goal_iter.second;
302 fl_keyboard_layout_set_logical_key(self->derived_layout, group,
303 goal->keycode, goal->logical_key);
304 }
305}
void fl_keyboard_layout_set_logical_key(FlKeyboardLayout *self, uint8_t group, uint16_t keycode, uint64_t logical_key)
gboolean fl_keyboard_layout_has_group(FlKeyboardLayout *self, uint8_t group)
static uint16_t convert_key_to_char(FlKeyboardManager *self, guint keycode, gint group, gint level)
uint16_t keycode
uint64_t logical_key

References convert_key_to_char(), fl_key_event_get_group(), fl_key_event_get_keycode(), fl_keyboard_layout_get_logical_key(), fl_keyboard_layout_has_group(), fl_keyboard_layout_set_logical_key(), LayoutGoal::keycode, layout_goals, LayoutGoal::logical_key, and self.

Referenced by fl_keyboard_manager_handle_event().

◆ handle_event_data_free()

static void handle_event_data_free ( HandleEventData data)
static

Definition at line 78 of file fl_keyboard_manager.cc.

78 {
79 g_object_unref(data->event);
80 g_free(data);
81}

Referenced by fl_keyboard_manager_handle_event().

◆ handle_event_data_new()

static HandleEventData * handle_event_data_new ( FlKeyEvent *  event)
static

Definition at line 71 of file fl_keyboard_manager.cc.

71 {
73 static_cast<HandleEventData*>(g_new0(HandleEventData, 1));
74 data->event = FL_KEY_EVENT(g_object_ref(event));
75 return data;
76}

Referenced by fl_keyboard_manager_handle_event().

◆ keymap_keys_changed_cb()

static void keymap_keys_changed_cb ( FlKeyboardManager *  self)
static

Definition at line 140 of file fl_keyboard_manager.cc.

140 {
141 g_clear_object(&self->derived_layout);
142 self->derived_layout = fl_keyboard_layout_new();
143}

References fl_keyboard_layout_new(), and self.

Referenced by fl_keyboard_manager_init().

◆ responder_handle_channel_event_cb()

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

Definition at line 184 of file fl_keyboard_manager.cc.

186 {
187 g_autoptr(GTask) task = G_TASK(user_data);
188 FlKeyboardManager* self = FL_KEYBOARD_MANAGER(g_task_get_source_object(task));
189
191 static_cast<HandleEventData*>(g_task_get_task_data(G_TASK(task)));
192 data->channel_responded = TRUE;
193
194 g_autoptr(GError) error = nullptr;
195 gboolean handled;
197 FL_KEY_CHANNEL_RESPONDER(object), result, &handled, &error)) {
198 if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
199 g_warning("Failed to handle key event in platform: %s", error->message);
200 }
201 handled = FALSE;
202 }
203 if (handled) {
204 data->handled = TRUE;
205 }
206
208}
gboolean fl_key_channel_responder_handle_event_finish(FlKeyChannelResponder *self, GAsyncResult *result, gboolean *handled, GError **error)
static void complete_handle_event(FlKeyboardManager *self, GTask *task)

References complete_handle_event(), error, fl_key_channel_responder_handle_event_finish(), g_autoptr(), self, TRUE, and user_data.

Referenced by fl_keyboard_manager_handle_event().

◆ responder_handle_embedder_event_cb()

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

Definition at line 158 of file fl_keyboard_manager.cc.

160 {
161 g_autoptr(GTask) task = G_TASK(user_data);
162 FlKeyboardManager* self = FL_KEYBOARD_MANAGER(g_task_get_source_object(task));
163
165 static_cast<HandleEventData*>(g_task_get_task_data(G_TASK(task)));
166 data->embedder_responded = TRUE;
167
168 g_autoptr(GError) error = nullptr;
169 gboolean handled;
171 FL_KEY_EMBEDDER_RESPONDER(object), result, &handled, &error)) {
172 if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
173 g_warning("Failed to handle key event in embedder: %s", error->message);
174 }
175 handled = FALSE;
176 }
177 if (handled) {
178 data->handled = TRUE;
179 }
180
182}
gboolean fl_key_embedder_responder_handle_event_finish(FlKeyEmbedderResponder *self, GAsyncResult *result, gboolean *handled, GError **error)

References complete_handle_event(), error, fl_key_embedder_responder_handle_event_finish(), g_autoptr(), self, TRUE, and user_data.

Referenced by fl_keyboard_manager_handle_event().