Flutter Linux Embedder
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  {
146  HandleEventData* data =
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

References HandleEventData::channel_responded, HandleEventData::embedder_responded, HandleEventData::handled, HandleEventData::redispatch, and 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 }

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)
Definition: fl_key_event.cc:89
gboolean fl_key_event_get_is_press(FlKeyEvent *self)
Definition: fl_key_event.cc:84
guint32 fl_key_event_get_time(FlKeyEvent *self)
Definition: fl_key_event.cc:79

References fl_key_event_get_is_press(), fl_key_event_get_keycode(), fl_key_event_get_time(), i, 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 }

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

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().

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)) {
386  HandleEventData* data =
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),
395  fl_key_event_get_keycode(event));
397  self->key_embedder_responder, event, specified_logical_key,
398  self->cancellable, responder_handle_embedder_event_cb,
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
const char FlTextDirection FlAssertiveness gpointer user_data
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 HandleEventData * handle_event_data_new(FlKeyEvent *event)
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)

References 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(), HandleEventData::handled, responder_handle_channel_event_cb(), responder_handle_embedder_event_cb(), 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 
413  HandleEventData* data =
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, HandleEventData::event, and HandleEventData::redispatch.

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 
344  self->keymap = gdk_keymap_get_for_display(gdk_display_get_default());
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 }
if(engine==nullptr)
const std::vector< LayoutGoal > layout_goals
FlKeyboardLayout * fl_keyboard_layout_new()
static void keymap_keys_changed_cb(FlKeyboardManager *self)

References fl_keyboard_layout_new(), if(), keymap_keys_changed_cb(), and layout_goals.

◆ 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 }
G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger(FlEngine *self)
Definition: fl_engine.cc:1542
FlKeyChannelResponder * fl_key_channel_responder_new(FlBinaryMessenger *messenger)
FlKeyEmbedderResponder * fl_key_embedder_responder_new(FlEngine *engine)

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

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 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().

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, and LayoutGoal::logical_key.

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 }

References HandleEventData::event.

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  {
72  HandleEventData* data =
73  static_cast<HandleEventData*>(g_new0(HandleEventData, 1));
74  data->event = FL_KEY_EVENT(g_object_ref(event));
75  return data;
76 }

References HandleEventData::event.

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().

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 
190  HandleEventData* data =
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 
207  complete_handle_event(self, task);
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 HandleEventData::channel_responded, complete_handle_event(), error, fl_key_channel_responder_handle_event_finish(), g_autoptr(), HandleEventData::handled, 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 
164  HandleEventData* data =
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 
181  complete_handle_event(self, task);
182 }
gboolean fl_key_embedder_responder_handle_event_finish(FlKeyEmbedderResponder *self, GAsyncResult *result, gboolean *handled, GError **error)

References complete_handle_event(), HandleEventData::embedder_responded, error, fl_key_embedder_responder_handle_event_finish(), g_autoptr(), HandleEventData::handled, TRUE, and user_data.

Referenced by fl_keyboard_manager_handle_event().