// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_KEY_RESPONDER_H_
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_KEY_RESPONDER_H_

#include <gdk/gdk.h>
#include <cinttypes>

#include "flutter/shell/platform/linux/fl_key_event.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_binary_messenger.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_value.h"

G_BEGIN_DECLS

typedef struct _FlKeyboardManager FlKeyboardManager;

/**
 * FlKeyResponderAsyncCallback:
 * @event: whether the event has been handled.
 * @user_data: the same value as user_data sent by
 * #fl_key_responder_handle_event.
 *
 * The signature for a callback with which a #FlKeyResponder asynchronously
 * reports whether the responder handles the event.
 **/
typedef void (*FlKeyResponderAsyncCallback)(bool handled, gpointer user_data);

#define FL_TYPE_KEY_RESPONDER fl_key_responder_get_type()
G_DECLARE_INTERFACE(FlKeyResponder,
                    fl_key_responder,
                    FL,
                    KEY_RESPONDER,
                    GObject);

/**
 * FlKeyResponder:
 *
 * An interface for a responder that can process a key event and decides
 * asynchronously whether to handle an event.
 *
 * To use this class, add it with #fl_keyboard_manager_add_responder.
 */

struct _FlKeyResponderInterface {
  GTypeInterface g_iface;

  /**
   * FlKeyResponder::handle_event:
   *
   * The implementation of #fl_key_responder_handle_event.
   */
  void (*handle_event)(FlKeyResponder* responder,
                       FlKeyEvent* event,
                       FlKeyResponderAsyncCallback callback,
                       gpointer user_data);
};

/**
 * fl_key_responder_handle_event:
 * @responder: the #FlKeyResponder self.
 * @event: the event to be handled. Must not be null. The object is managed
 * by callee and must not be assumed available after this function.
 * @callback: the callback to report the result. It should be called exactly
 * once. Must not be null.
 * @user_data: a value that will be sent back in the callback. Can be null.
 *
 * Let the responder handle an event, expecting the responder to report
 * whether to handle the event. The result will be reported by invoking
 * `callback` exactly once, which might happen after
 * `fl_key_responder_handle_event` or during it.
 */
void fl_key_responder_handle_event(FlKeyResponder* responder,
                                   FlKeyEvent* event,
                                   FlKeyResponderAsyncCallback callback,
                                   gpointer user_data);

G_END_DECLS

#endif  // FLUTTER_SHELL_PLATFORM_LINUX_FL_KEY_RESPONDER_H_
