#ifndef _EFL_INPUT_DEVICE_EO_H_
#define _EFL_INPUT_DEVICE_EO_H_

#ifndef _EFL_INPUT_DEVICE_EO_CLASS_TYPE
#define _EFL_INPUT_DEVICE_EO_CLASS_TYPE

typedef Eo Efl_Input_Device;

#endif

#ifndef _EFL_INPUT_DEVICE_EO_TYPES
#define _EFL_INPUT_DEVICE_EO_TYPES

/**
 * @brief General type of input device.
 *
 * Legacy support since 1.8.
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
typedef enum
{
  EFL_INPUT_DEVICE_CLASS_NONE = 0, /**< Not a device. */
  EFL_INPUT_DEVICE_CLASS_SEAT, /**< The user/seat (the user themselves). */
  EFL_INPUT_DEVICE_CLASS_KEYBOARD, /**< A regular keyboard, numberpad or
                                    * attached buttons. */
  EFL_INPUT_DEVICE_CLASS_MOUSE, /**< A mouse, trackball or touchpad relative
                                 * motion device. */
  EFL_INPUT_DEVICE_CLASS_TOUCH, /**< A touchscreen with fingers or stylus. */
  EFL_INPUT_DEVICE_CLASS_PEN, /**< A special pen device. */
  EFL_INPUT_DEVICE_CLASS_WAND, /**< A laser pointer, wii-style or "minority
                                * report" pointing device. */
  EFL_INPUT_DEVICE_CLASS_GAMEPAD /**< A gamepad controller or joystick. */
} Efl_Input_Device_Class;

/**
 * @brief Specific type of input device.
 *
 * Legacy support since 1.8.
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
typedef enum
{
  EFL_INPUT_DEVICE_SUB_CLASS_NONE = 0, /**< Not a device. */
  EFL_INPUT_DEVICE_SUB_CLASS_FINGER, /**< The normal flat of your finger. */
  EFL_INPUT_DEVICE_SUB_CLASS_FINGERNAIL, /**< A fingernail. */
  EFL_INPUT_DEVICE_SUB_CLASS_KNUCKLE, /**< A Knuckle. */
  EFL_INPUT_DEVICE_SUB_CLASS_PALM, /**< The palm of a users hand. */
  EFL_INPUT_DEVICE_SUB_CLASS_HAND_SIZE, /**< The side of your hand. */
  EFL_INPUT_DEVICE_SUB_CLASS_HAND_FLAT, /**< The flat of your hand. */
  EFL_INPUT_DEVICE_SUB_CLASS_PEN_TIP, /**< The tip of a pen. */
  EFL_INPUT_DEVICE_SUB_CLASS_TRACKPAD, /**< A trackpad style mouse. */
  EFL_INPUT_DEVICE_SUB_CLASS_TRACKPOINT, /**< A trackpoint style mouse. */
  EFL_INPUT_DEVICE_SUB_CLASS_TRACKBALL /**< A trackball style mouse. */
} Efl_Input_Device_Sub_Class;


#endif
/** Represents a pointing device, such as a touch finger, a pen or a mouse.
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
#define EFL_INPUT_DEVICE_CLASS efl_input_device_class_get()

EWAPI const Efl_Class *efl_input_device_class_get(void);

/**
 * @brief Device type property
 *
 * @param[in] klass Input device class
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI void efl_input_device_type_set(Eo *obj, Efl_Input_Device_Class klass);

/**
 * @brief Device type property
 *
 * @return Input device class
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI Efl_Input_Device_Class efl_input_device_type_get(const Eo *obj);

/**
 * @brief Device subtype property
 *
 * @param[in] klass Input device sub-class
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI void efl_input_device_subtype_set(Eo *obj, Efl_Input_Device_Sub_Class klass);

/**
 * @brief Device subtype property
 *
 * @return Input device sub-class
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI Efl_Input_Device_Sub_Class efl_input_device_subtype_get(const Eo *obj);

/**
 * @brief Device source property
 *
 * @param[in] src Input device
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI void efl_input_device_source_set(Eo *obj, Efl_Input_Device *src);

/**
 * @brief Device source property
 *
 * @return Input device
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI Efl_Input_Device *efl_input_device_source_get(const Eo *obj);

/**
 * @brief device name property
 *
 * @param[in] name Input device name
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI void efl_input_device_name_set(Eo *obj, const char *name);

/**
 * @brief device name property
 *
 * @return Input device name
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI const char *efl_input_device_name_get(const Eo *obj);

/**
 * @brief device description property
 *
 * @param[in] desc Input device description
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI void efl_input_device_description_set(Eo *obj, const char *desc);

/**
 * @brief device description property
 *
 * @return Input device description
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI const char *efl_input_device_description_get(const Eo *obj);

/**
 * @brief Device parent property
 *
 * @param[in] parent Parent input device
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI void efl_input_device_parent_set(Eo *obj, Efl_Input_Device *parent);

/**
 * @brief Device parent property
 *
 * @return Parent input device
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI Efl_Input_Device *efl_input_device_parent_get(const Eo *obj);

/**
 * @brief Get the @ref Efl_Input_Device that represents a seat.
 *
 * This method will find the seat the device belongs to.
 *
 * For this, it walk through device's parents looking for a device with
 * @ref EFL_INPUT_DEVICE_CLASS_SEAT. It may be the device itself.
 *
 * In case no seat is found, @c null is returned.
 *
 * @return The seat this device belongs to.
 *
 * @since 1.18
 *
 * @ingroup Efl_Input_Device
 */
EOAPI Efl_Input_Device *efl_input_device_seat_get(const Eo *obj);

#endif
