#ifndef _EFL_LAYOUT_SIGNAL_EO_H_
#define _EFL_LAYOUT_SIGNAL_EO_H_

#ifndef _EFL_LAYOUT_SIGNAL_EO_CLASS_TYPE
#define _EFL_LAYOUT_SIGNAL_EO_CLASS_TYPE

typedef Eo Efl_Layout_Signal;

#endif

#ifndef _EFL_LAYOUT_SIGNAL_EO_TYPES
#define _EFL_LAYOUT_SIGNAL_EO_TYPES

/** EflLayoutSignalCb function that is called when a specifc pair of
 * signal/emission is triggered
 *
 * @since 1.22
 *
 * @ingroup EflLayoutSignalCb
 */
typedef void (*EflLayoutSignalCb)(void *data, Efl_Layout_Signal *object, const char *emission, const char *source);


#endif
/** Layouts asynchronous messaging and signaling interface.
 *
 * @since 1.22
 *
 * @ingroup Efl_Layout_Signal
 */
#define EFL_LAYOUT_SIGNAL_INTERFACE efl_layout_signal_interface_get()

EWAPI const Efl_Class *efl_layout_signal_interface_get(void);

/**
 * @brief Sends an (Edje) message to a given Edje object
 *
 * This function sends an Edje message to obj and to all of its child objects,
 * if it has any (swallowed objects are one kind of child object). Only a few
 * types are supported: - int, - float/double, - string/stringshare, - arrays
 * of int, float, double or strings.
 *
 * Messages can go both ways, from code to theme, or theme to code.
 *
 * The id argument as a form of code and theme defining a common interface on
 * message communication. One should define the same IDs on both code and EDC
 * declaration, to individualize messages (binding them to a given context).
 *
 * @param[in] obj The object.
 * @param[in] id A identification number for the message to be sent
 * @param[in] msg The message's payload
 *
 * @since 1.22
 *
 * @ingroup Efl_Layout_Signal
 */
EOAPI void efl_layout_signal_message_send(Eo *obj, int id, const Eina_Value msg);

/**
 * @brief Adds a callback for an arriving Edje signal, emitted by a given Edje
 * object.
 *
 * Edje signals are one of the communication interfaces between code and a
 * given Edje object's theme. With signals, one can communicate two string
 * values at a time, which are: - "emission" value: the name of the signal, in
 * general - "source" value: a name for the signal's context, in general
 *
 * Signals can go both ways, from code to theme, or theme to code.
 *
 * Though there are those common uses for the two strings, one is free to use
 * them however they like.
 *
 * Signal callback registration is powerful, in the way that blobs may be used
 * to match multiple signals at once. All the "*?[\" set of @c fnmatch()
 * operators can be used, both for emission and source.
 *
 * Edje has internal signals it will emit, automatically, on various actions
 * taking place on group parts. For example, the mouse cursor being moved,
 * pressed, released, etc., over a given part's area, all generate individual
 * signals.
 *
 * With something like emission = "mouse,down,*", source = "button.*" where
 * "button.*" is the pattern for the names of parts implementing buttons on an
 * interface, you'd be registering for notifications on events of mouse buttons
 * being pressed down on either of those parts (those events all have the
 * "mouse,down," common prefix on their names, with a suffix giving the button
 * number). The actual emission and source strings of an event will be passed
 * in as the emission and source parameters of the callback function (e.g.
 * "mouse,down,2" and "button.close"), for each of those events.
 *
 * See also the Edje Data Collection Reference for EDC files.
 *
 * See @ref efl_layout_signal_emit on how to emit signals from code to a an
 * object See @ref efl_layout_signal_callback_del.
 *
 * @param[in] obj The object.
 * @param[in] emission The signal's "emission" string
 * @param[in] source The signal's "source" string
 * @param[in] func The callback function to be executed when the signal is
 * emitted.
 *
 * @return @c true in case of success, @c false in case of error.
 *
 * @since 1.22
 *
 * @ingroup Efl_Layout_Signal
 */
EOAPI Eina_Bool efl_layout_signal_callback_add(Eo *obj, const char *emission, const char *source, void *func_data, EflLayoutSignalCb func, Eina_Free_Cb func_free_cb);

/**
 * @brief Removes a signal-triggered callback from an object.
 *
 * This function removes a callback, previously attached to the emission of a
 * signal, from the object  obj. The parameters emission, source and func must
 * match exactly those passed to a previous call to
 * @ref efl_layout_signal_callback_add().
 *
 * See @ref efl_layout_signal_callback_add.
 *
 * @param[in] obj The object.
 * @param[in] emission The signal's "emission" string
 * @param[in] source The signal's "source" string
 * @param[in] func The callback function to be executed when the signal is
 * emitted.
 *
 * @return @c true in case of success, @c false in case of error.
 *
 * @since 1.22
 *
 * @ingroup Efl_Layout_Signal
 */
EOAPI Eina_Bool efl_layout_signal_callback_del(Eo *obj, const char *emission, const char *source, void *func_data, EflLayoutSignalCb func, Eina_Free_Cb func_free_cb);

/**
 * @brief Sends/emits an Edje signal to this layout.
 *
 * This function sends a signal to the object. An Edje program, at the EDC
 * specification level, can respond to a signal by having declared matching
 * "signal" and "source" fields on its block.
 *
 * See also the Edje Data Collection Reference for EDC files.
 *
 * See @ref efl_layout_signal_callback_add() for more on Edje signals.
 *
 * @param[in] obj The object.
 * @param[in] emission The signal's "emission" string
 * @param[in] source The signal's "source" string
 *
 * @since 1.22
 *
 * @ingroup Efl_Layout_Signal
 */
EOAPI void efl_layout_signal_emit(Eo *obj, const char *emission, const char *source);

/**
 * @brief Processes an object's messages and signals queue.
 *
 * This function goes through the object message queue processing the pending
 * messages for this specific Edje object. Normally they'd be processed only at
 * idle time.
 *
 * If @c recurse is @c true, this function will be called recursively on all
 * subobjects.
 *
 * @param[in] obj The object.
 * @param[in] recurse Whether to process messages on children objects.
 *
 * @since 1.22
 *
 * @ingroup Efl_Layout_Signal
 */
EOAPI void efl_layout_signal_process(Eo *obj, Eina_Bool recurse);

#endif
