#ifndef _EFL_INPUT_INTERFACE_EO_H_
#define _EFL_INPUT_INTERFACE_EO_H_

#ifndef _EFL_INPUT_INTERFACE_EO_CLASS_TYPE
#define _EFL_INPUT_INTERFACE_EO_CLASS_TYPE

typedef Eo Efl_Input_Interface;

#endif

#ifndef _EFL_INPUT_INTERFACE_EO_TYPES
#define _EFL_INPUT_INTERFACE_EO_TYPES


#endif
#ifdef EFL_BETA_API_SUPPORT
/**
 * @brief An object implementing this interface can send pointer events.
 *
 * Windows and canvas objects may send input events.
 *
 * A "pointer" refers to the main pointing device, which could be a mouse,
 * trackpad, finger, pen, etc... In other words, the finger id in any pointer
 * event will always be 0.
 *
 * A "finger" refers to a single point of input, usually in an absolute
 * coordinates input device, and that can support more than one input position
 * at at time (think multi-touch screens). The first finger (id 0) is sent
 * along with a pointer event, so be careful to not handle those events twice.
 * Note that if the input device can support "hovering", it is entirely
 * possible to receive move events without down coming first.
 *
 * A "key" is a key press from a keyboard or equivalent type of input device.
 * Long, repeated, key presses will always happen like this:
 * down...up,down...up,down...up (not down...up or down...down...down...up).
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_INPUT_INTERFACE_INTERFACE efl_input_interface_interface_get()

EWAPI const Efl_Class *efl_input_interface_interface_get(void);

#ifdef EFL_BETA_API_SUPPORT
/**
 * @brief Add or remove a given seat to the filter list. If the filter list is
 * empty this object will report mouse, keyboard and focus events from any
 * seat, otherwise those events will only be reported if the event comes from a
 * seat that is in the list.
 *
 * @param[in] obj The object.
 * @param[in] seat The seat to act on.
 * @param[in] enable @c true to enable events for a seat or @c false otherwise.
 *
 * @ingroup Efl_Input_Interface
 */
EOAPI void efl_input_seat_event_filter_set(Eo *obj, Efl_Input_Device *seat, Eina_Bool enable);
#endif /* EFL_BETA_API_SUPPORT */

#ifdef EFL_BETA_API_SUPPORT
/**
 * @brief Check if input events from a given seat is enabled.
 *
 * @param[in] obj The object.
 * @param[in] seat The seat to act on.
 *
 * @return @c true to enable events for a seat or @c false otherwise.
 *
 * @ingroup Efl_Input_Interface
 */
EOAPI Eina_Bool efl_input_seat_event_filter_get(const Eo *obj, Efl_Input_Device *seat);
#endif /* EFL_BETA_API_SUPPORT */

EWAPI extern const Efl_Event_Description _EFL_EVENT_POINTER_MOVE;

/** Main pointer move (current and previous positions are known).
 * @return Efl_Input_Pointer *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_POINTER_MOVE (&(_EFL_EVENT_POINTER_MOVE))

EWAPI extern const Efl_Event_Description _EFL_EVENT_POINTER_DOWN;

/** Main pointer button pressed (button id is known).
 * @return Efl_Input_Pointer *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_POINTER_DOWN (&(_EFL_EVENT_POINTER_DOWN))

EWAPI extern const Efl_Event_Description _EFL_EVENT_POINTER_UP;

/** Main pointer button released (button id is known).
 * @return Efl_Input_Pointer *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_POINTER_UP (&(_EFL_EVENT_POINTER_UP))

EWAPI extern const Efl_Event_Description _EFL_EVENT_POINTER_CANCEL;

/** Main pointer button press was cancelled (button id is known). This can
 * happen in rare cases when the window manager passes the focus to a more
 * urgent window, for instance. You probably don't need to listen to this
 * event, as it will be accompanied by an up event.
 * @return Efl_Input_Pointer *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_POINTER_CANCEL (&(_EFL_EVENT_POINTER_CANCEL))

EWAPI extern const Efl_Event_Description _EFL_EVENT_POINTER_IN;

/** Pointer entered a window or a widget.
 * @return Efl_Input_Pointer *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_POINTER_IN (&(_EFL_EVENT_POINTER_IN))

EWAPI extern const Efl_Event_Description _EFL_EVENT_POINTER_OUT;

/** Pointer left a window or a widget.
 * @return Efl_Input_Pointer *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_POINTER_OUT (&(_EFL_EVENT_POINTER_OUT))

EWAPI extern const Efl_Event_Description _EFL_EVENT_POINTER_WHEEL;

/** Mouse wheel event.
 * @return Efl_Input_Pointer *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_POINTER_WHEEL (&(_EFL_EVENT_POINTER_WHEEL))

EWAPI extern const Efl_Event_Description _EFL_EVENT_POINTER_AXIS;

/** Pen or other axis event update.
 * @return Efl_Input_Pointer *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_POINTER_AXIS (&(_EFL_EVENT_POINTER_AXIS))

EWAPI extern const Efl_Event_Description _EFL_EVENT_FINGER_MOVE;

/** Finger moved (current and previous positions are known).
 * @return Efl_Input_Pointer *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_FINGER_MOVE (&(_EFL_EVENT_FINGER_MOVE))

EWAPI extern const Efl_Event_Description _EFL_EVENT_FINGER_DOWN;

/** Finger pressed (finger id is known).
 * @return Efl_Input_Pointer *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_FINGER_DOWN (&(_EFL_EVENT_FINGER_DOWN))

EWAPI extern const Efl_Event_Description _EFL_EVENT_FINGER_UP;

/** Finger released (finger id is known).
 * @return Efl_Input_Pointer *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_FINGER_UP (&(_EFL_EVENT_FINGER_UP))

EWAPI extern const Efl_Event_Description _EFL_EVENT_KEY_DOWN;

/** Keyboard key press.
 * @return Efl_Input_Key *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_KEY_DOWN (&(_EFL_EVENT_KEY_DOWN))

EWAPI extern const Efl_Event_Description _EFL_EVENT_KEY_UP;

/** Keyboard key release.
 * @return Efl_Input_Key *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_KEY_UP (&(_EFL_EVENT_KEY_UP))

EWAPI extern const Efl_Event_Description _EFL_EVENT_HOLD;

/** All input events are on hold or resumed.
 * @return Efl_Input_Hold *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_HOLD (&(_EFL_EVENT_HOLD))

EWAPI extern const Efl_Event_Description _EFL_EVENT_FOCUS_IN;

/** A focus in event.
 * @return Efl_Input_Focus *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_FOCUS_IN (&(_EFL_EVENT_FOCUS_IN))

EWAPI extern const Efl_Event_Description _EFL_EVENT_FOCUS_OUT;

/** A focus out event.
 * @return Efl_Input_Focus *
 *
 * @ingroup Efl_Input_Interface
 */
#define EFL_EVENT_FOCUS_OUT (&(_EFL_EVENT_FOCUS_OUT))
#endif /* EFL_BETA_API_SUPPORT */

#endif
