[Elm] 2nd specialization of Elm's new base smart

class: elm_layout.
This will be, besides the codebase for the elm_layout widget, a common
base for all other widgets which got an edje layout as a basis for
their decoration.

From now on, all elm_layout_* namespaced fuctions will function
on objects inheriting from this base:

- elm_layout_content_set
- elm_layout_content_get
- elm_layout_content_unset
- elm_layout_text_set
- elm_layout_text_get

(recovered from deprecated header -> not anymore)

- elm_layout_sizing_eval
- elm_layout_data_get
- elm_layout_edje_get

- elm_layout_file_set
- elm_layout_theme_set

- elm_layout_box_append
- elm_layout_box_prepend
- elm_layout_box_insert_before
- elm_layout_box_insert_at
- elm_layout_box_remove
- elm_layout_box_remove_all
- elm_layout_table_pack
- elm_layout_table_unpack
- elm_layout_table_clear

Three missing functions on layouts were added, then:

- elm_layout_signal_emit
- elm_layout_signal_callback_add
- elm_layout_signal_callback_del

Naturally, the elm_object_ namespaced counterparts of those will also
function (they will be deprecated on the future).



SVN revision: 70708
This commit is contained in:
Gustavo Lima Chaves 2012-05-03 22:41:26 +00:00
parent d064f020c3
commit f4e29b50ee
5 changed files with 1882 additions and 674 deletions

View File

@ -42,7 +42,8 @@ includesdir = $(includedir)/elementary-@VMAJ@
includesunstable_HEADERS = \
elm_widget.h \
elm_widget_container.h
elm_widget_container.h \
elm_widget_layout.h
includesunstabledir = $(includedir)/elementary-@VMAJ@
includesub_HEADERS = \

File diff suppressed because it is too large Load Diff

View File

@ -188,10 +188,70 @@ EAPI Eina_Bool elm_layout_file_set(Evas_Object *obj, const ch
*
* @return (1 = success, 0 = error)
*
* Note that @a style will be the new style of @a obj too, as in an
* elm_object_style_set() call.
*
* @ingroup Layout
*/
EAPI Eina_Bool elm_layout_theme_set(Evas_Object *obj, const char *clas, const char *group, const char *style);
/**
* Send a (Edje) signal to a given layout widget's underlying Edje
* object.
*
* @param obj The layout object handle
* @param emission The signal's name string
* @param source The signal's source string
*
* This function sends a signal to the underlying Edje object of @a
* obj. An Edje program on that Edje object's definition can respond
* to a signal by specifying matching 'signal' and 'source' fields.
*
* @ingroup Layout
*/
EAPI void elm_layout_signal_emit(Evas_Object *obj, const char *emission, const char *source);
/**
* Add a callback for a (Edje) signal emitted by a layout widget's
* underlying Edje object.
*
* @param obj The layout object handle
* @param emission The signal's name string
* @param source The signal's source string
* @param func The callback function to be executed when the signal is
* emitted.
* @param data A pointer to data to pass in to the callback function.
*
* This function connects a callback function to a signal emitted by
* the underlying Edje object of @a obj. Globs are accepted in either
* the emission or source strings (see @c
* edje_object_signal_callback_add()).
*
* @ingroup Layout
*/
EAPI void elm_layout_signal_callback_add(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func, void *data);
/**
* Remove a signal-triggered callback from a given layout widget.
*
* @param obj The layout object handle
* @param emission The signal's name string
* @param source The signal's source string
* @param func The callback function being executed when the signal
* was emitted.
* @return The data pointer of the signal callback (passed on
* elm_layout_signal_callback_add()) or @c NULL, on errors.
*
* This function removes the @b last callback attached to a signal
* emitted by the undelying Edje object of @a obj, with parameters @a
* emission, @a source and @c func matching exactly those passed to a
* previous call to elm_object_signal_callback_add(). The data pointer
* that was passed to this call will be returned.
*
* @ingroup Layout
*/
EAPI void *elm_layout_signal_callback_del(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func);
/**
* Append child to layout box part.
*
@ -577,6 +637,71 @@ EAPI Eina_Bool elm_layout_part_cursor_engine_only_set(Evas_Ob
*/
EAPI Eina_Bool elm_layout_part_cursor_engine_only_get(const Evas_Object *obj, const char *part_name);
/**
* Set the layout content.
*
* @param obj The layout object
* @param swallow The swallow part name in the edje file
* @param content The child that will be added in this layout object
* @return @c EINA_TRUE on success, @c EINA_FALSE otherwise
*
* Once the content object is set, a previously set one will be deleted.
* If you want to keep that old content object, use the
* elm_object_part_content_unset() function.
*
* @note In an Edje theme, the part used as a content container is called @c
* SWALLOW. This is why the parameter name is called @p swallow, but it is
* expected to be a part name just like the second parameter of
* elm_layout_box_append().
*
* @see elm_layout_box_append()
* @see elm_object_part_content_get()
* @see elm_object_part_content_unset()
* @see @ref secBox
*/
EAPI Eina_Bool elm_layout_content_set(Evas_Object *obj, const char *swallow, Evas_Object *content);
/**
* Get the child object in the given content part.
*
* @param obj The layout object
* @param swallow The SWALLOW part to get its content
*
* @return The swallowed object or NULL if none or an error occurred
*/
EAPI Evas_Object *elm_layout_content_get(const Evas_Object *obj, const char *swallow);
/**
* Unset the layout content.
*
* @param obj The layout object
* @param swallow The swallow part name in the edje file
* @return The content that was being used
*
* Unparent and return the content object which was set for this part.
*/
EAPI Evas_Object *elm_layout_content_unset(Evas_Object *obj, const char *swallow);
/**
* Set the text of the given part
*
* @param obj The layout object
* @param part The TEXT part where to set the text
* @param text The text to set
* @return @c EINA_TRUE on success, @c EINA_FALSE otherwise
*/
EAPI Eina_Bool elm_layout_text_set(Evas_Object *obj, const char *part, const char *text);
/**
* Get the text set in the given part
*
* @param obj The layout object
* @param part The TEXT part to retrieve the text off
*
* @return The text set in @p part
*/
EAPI const char *elm_layout_text_get(const Evas_Object *obj, const char *part);
/**
* @def elm_layout_icon_set
* Convenience macro to set the icon object in a layout that follows the
@ -629,10 +754,6 @@ EAPI Eina_Bool elm_layout_part_cursor_engine_only_get(const E
#define elm_layout_end_get(_ly) \
elm_object_part_content_get((_ly), "elm.swallow.end")
/* smart callbacks called:
* "theme,changed" - when elm theme is changed.
*/
/**
* @}
*/

View File

@ -1,5 +1,6 @@
#include <Elementary.h>
#include "elm_priv.h"
#include "elm_widget_container.h"
static const char SMART_NAME[] = "elm_widget";
static const char SMART_NAME_COMPAT[] = "elm_widget_compat";
@ -2506,6 +2507,8 @@ elm_widget_signal_emit(Evas_Object *obj,
if (_elm_legacy_is(obj) && COMPAT_SMART_DATA(sd)->signal)
COMPAT_SMART_DATA(sd)->signal(obj, emission, source);
else if (evas_object_smart_type_check(obj, "elm_layout"))
elm_layout_signal_emit(obj, emission, source);
}
static void
@ -2528,21 +2531,30 @@ elm_widget_signal_callback_add(Evas_Object *obj,
Edje_Signal_Data *esd;
API_ENTRY return;
if (!_elm_legacy_is(obj) || !COMPAT_SMART_DATA(sd)->callback_add) return;
EINA_SAFETY_ON_NULL_RETURN(func);
esd = ELM_NEW(Edje_Signal_Data);
if (!esd) return;
if (_elm_legacy_is(obj) && !COMPAT_SMART_DATA(sd)->callback_add) return;
else if (!evas_object_smart_type_check(obj, "elm_layout"))
return;
esd->obj = obj;
esd->func = func;
esd->emission = eina_stringshare_add(emission);
esd->source = eina_stringshare_add(source);
esd->data = data;
COMPAT_SMART_DATA(sd)->edje_signals = eina_list_append
(COMPAT_SMART_DATA(sd)->edje_signals, esd);
COMPAT_SMART_DATA(sd)->callback_add
(obj, emission, source, _edje_signal_callback, esd);
if (_elm_legacy_is(obj))
{
esd = ELM_NEW(Edje_Signal_Data);
if (!esd) return;
esd->obj = obj;
esd->func = func;
esd->emission = eina_stringshare_add(emission);
esd->source = eina_stringshare_add(source);
esd->data = data;
COMPAT_SMART_DATA(sd)->edje_signals = eina_list_append
(COMPAT_SMART_DATA(sd)->edje_signals, esd);
COMPAT_SMART_DATA(sd)->callback_add
(obj, emission, source, _edje_signal_callback, esd);
}
else
elm_layout_signal_callback_add(obj, emission, source, func, data);
}
EAPI void *
@ -2555,26 +2567,34 @@ elm_widget_signal_callback_del(Evas_Object *obj,
Eina_List *l;
void *data = NULL;
API_ENTRY return NULL;
if (!_elm_legacy_is(obj) || !COMPAT_SMART_DATA(sd)->callback_del)
if (_elm_legacy_is(obj) && !COMPAT_SMART_DATA(sd)->callback_del)
return NULL;
else if (!evas_object_smart_type_check(obj, "elm_layout"))
return NULL;
EINA_LIST_FOREACH(COMPAT_SMART_DATA(sd)->edje_signals, l, esd)
if (_elm_legacy_is(obj))
{
if ((esd->func == func) && (!strcmp(esd->emission, emission)) &&
(!strcmp(esd->source, source)))
EINA_LIST_FOREACH (COMPAT_SMART_DATA(sd)->edje_signals, l, esd)
{
COMPAT_SMART_DATA(sd)->edje_signals = eina_list_remove_list
(COMPAT_SMART_DATA(sd)->edje_signals, l);
eina_stringshare_del(esd->emission);
eina_stringshare_del(esd->source);
data = esd->data;
free(esd);
COMPAT_SMART_DATA(sd)->callback_del
(obj, emission, source, _edje_signal_callback, esd);
return data;
if ((esd->func == func) && (!strcmp(esd->emission, emission)) &&
(!strcmp(esd->source, source)))
{
COMPAT_SMART_DATA(sd)->edje_signals = eina_list_remove_list
(COMPAT_SMART_DATA(sd)->edje_signals, l);
eina_stringshare_del(esd->emission);
eina_stringshare_del(esd->source);
data = esd->data;
free(esd);
break;
}
}
COMPAT_SMART_DATA(sd)->callback_del
(obj, emission, source, _edje_signal_callback, esd);
}
else
elm_layout_signal_callback_del(obj, emission, source, func);
return data;
}
@ -3029,6 +3049,8 @@ elm_widget_text_part_set(Evas_Object *obj, const char *part, const char *label)
if (_elm_legacy_is(obj) && COMPAT_SMART_DATA(sd)->text_set)
COMPAT_SMART_DATA(sd)->text_set(obj, part, label);
else if (evas_object_smart_type_check(obj, "elm_layout"))
elm_layout_text_set(obj, part, label);
}
EAPI const char *
@ -3036,10 +3058,12 @@ elm_widget_text_part_get(const Evas_Object *obj, const char *part)
{
API_ENTRY return NULL;
if (!_elm_legacy_is(obj) || !COMPAT_SMART_DATA(sd)->text_get)
return NULL;
if (_elm_legacy_is(obj) && COMPAT_SMART_DATA(sd)->text_get)
return COMPAT_SMART_DATA(sd)->text_get(obj, part);
else if (evas_object_smart_type_check(obj, "elm_layout"))
return elm_layout_text_get(obj, part);
return COMPAT_SMART_DATA(sd)->text_get(obj, part);
return NULL;
}
EAPI void
@ -3146,6 +3170,8 @@ elm_widget_content_part_set(Evas_Object *obj, const char *part, Evas_Object *con
if (_elm_legacy_is(obj) && COMPAT_SMART_DATA(sd)->content_set)
COMPAT_SMART_DATA(sd)->content_set(obj, part, content);
else if (evas_object_smart_type_check(obj, "elm_container"))
ELM_CONTAINER_CLASS(sd->api)->content_set(obj, part, content);
}
EAPI Evas_Object *
@ -3153,10 +3179,12 @@ elm_widget_content_part_get(const Evas_Object *obj, const char *part)
{
API_ENTRY return NULL;
if (!_elm_legacy_is(obj) || !COMPAT_SMART_DATA(sd)->content_get)
return NULL;
if (_elm_legacy_is(obj) && COMPAT_SMART_DATA(sd)->content_get)
return COMPAT_SMART_DATA(sd)->content_get(obj, part);
else if (evas_object_smart_type_check(obj, "elm_container"))
return ELM_CONTAINER_CLASS(sd->api)->content_get(obj, part);
return COMPAT_SMART_DATA(sd)->content_get(obj, part);
return NULL;
}
EAPI Evas_Object *
@ -3164,10 +3192,12 @@ elm_widget_content_part_unset(Evas_Object *obj, const char *part)
{
API_ENTRY return NULL;
if (!_elm_legacy_is(obj) || !COMPAT_SMART_DATA(sd)->content_unset)
return NULL;
if (_elm_legacy_is(obj) && COMPAT_SMART_DATA(sd)->content_unset)
return COMPAT_SMART_DATA(sd)->content_unset(obj, part);
else if (evas_object_smart_type_check(obj, "elm_container"))
return ELM_CONTAINER_CLASS(sd->api)->content_unset(obj, part);
return COMPAT_SMART_DATA(sd)->content_unset(obj, part);
return NULL;
}
EAPI void
@ -3360,7 +3390,10 @@ elm_widget_type_check(const Evas_Object *obj,
const char *provided, *expected = "(unknown)";
static int abort_on_warn = -1;
provided = elm_widget_type_get(obj);
if (EINA_LIKELY(provided == type)) return EINA_TRUE;
if (_elm_legacy_is(obj) && EINA_LIKELY(provided == type))
return EINA_TRUE;
/* TODO: eventually migrate to check_ptr version */
else if (evas_object_smart_type_check(obj, type)) return EINA_TRUE;
if (type) expected = type;
if ((!provided) || (!provided[0]))
{

View File

@ -0,0 +1,257 @@
#ifndef ELM_WIDGET_LAYOUT_H
#define ELM_WIDGET_LAYOUT_H
#include "elm_widget_container.h"
/**
* @addtogroup Widget
* @{
*
* @section elm-layout-class The Elementary Layout Class
*
* Elementary, besides having the @ref Layout widget, exposes its
* foundation -- the Elementary Layout Class -- in order to create
* other widgets which are, basically, a certain layout with some more
* logic on top.
*
* The idea is make the creation of that widgets as easy as possible,
* factorizing code on this common base. For example, a button is a
* layout (that looks like push button) that happens to react on
* clicks and keyboard events in a special manner, calling its user
* back on those events. That's no surprise, then, that the @ref
* Button implementation relies on #Elm_Layout_Smart_Class, if you go
* to check it.
*
* The Layout class inherits from
* #Elm_Container_Smart_Class. Container parts, here, map directly to
* Edje parts from the layout's Edje group. Besides that, there's a whole
* infrastructure around Edje files:
* - intefacing by signals,
* - setting/retrieving text part values,
* - dealing with table and box parts directly,
* - etc.
*
* Take a look at #Elm_Layout_Smart_Class's 'virtual' functions to
* understand the whole interface. Finally, layout objects will do
* <b>part aliasing</b> for you, if you set it up properly. For that,
* take a look at #Elm_Layout_Part_Alias_Description, where it's
* explained in detail.
*/
/**
* @def ELM_LAYOUT_CLASS
*
* Use this macro to cast whichever subclass of
* #Elm_Layout_Smart_Class into it, so to acess its fields.
*
* @ingroup Widget
*/
#define ELM_LAYOUT_CLASS(x) ((Elm_Layout_Smart_Class *) x)
/**
* @def ELM_LAYOUT_DATA
*
* Use this macro to cast whichever subdata of
* #Elm_Layout_Smart_Data into it, so to acess its fields.
*
* @ingroup Widget
*/
#define ELM_LAYOUT_DATA(x) ((Elm_Layout_Smart_Data *) x)
/**
* @def ELM_LAYOUT_SMART_CLASS_VERSION
*
* Current version for Elementary layout @b base smart class, a value
* which goes to _Elm_Layout_Smart_Class::version.
*
* @ingroup Widget
*/
#define ELM_LAYOUT_SMART_CLASS_VERSION 1
/**
* @def ELM_LAYOUT_SMART_CLASS_INIT
*
* Initializer for a whole #Elm_Layout_Smart_Class structure, with
* @c NULL values on its specific fields.
*
* @param smart_class_init initializer to use for the "base" field
* (#Evas_Smart_Class).
*
* @see EVAS_SMART_CLASS_INIT_NULL
* @see EVAS_SMART_CLASS_INIT_NAME_VERSION
* @see ELM_LAYOUT_SMART_CLASS_INIT_NULL
* @see ELM_LAYOUT_SMART_CLASS_INIT_NAME_VERSION
*
* @ingroup Widget
*/
#define ELM_LAYOUT_SMART_CLASS_INIT(smart_class_init) \
{smart_class_init, ELM_LAYOUT_SMART_CLASS_VERSION, NULL, NULL, NULL, NULL, \
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \
NULL}
/**
* @def ELM_LAYOUT_SMART_CLASS_INIT_NULL
*
* Initializer to zero out a whole #Elm_Layout_Smart_Class structure.
*
* @see ELM_LAYOUT_SMART_CLASS_INIT_NAME_VERSION
* @see ELM_LAYOUT_SMART_CLASS_INIT
*
* @ingroup Widget
*/
#define ELM_LAYOUT_SMART_CLASS_INIT_NULL \
ELM_LAYOUT_SMART_CLASS_INIT(EVAS_SMART_CLASS_INIT_NULL)
/**
* @def ELM_LAYOUT_SMART_CLASS_INIT_NAME_VERSION
*
* Initializer to zero out a whole #Elm_Layout_Smart_Class structure and
* set its name and version.
*
* This is similar to #ELM_LAYOUT_SMART_CLASS_INIT_NULL, but it will
* also set the version field of #Elm_Layout_Smart_Class (base field)
* to the latest #ELM_LAYOUT_SMART_CLASS_VERSION and name it to the
* specific value.
*
* It will keep a reference to the name field as a <c>"const char *"</c>,
* i.e., the name must be available while the structure is
* used (hint: static or global variable!) and must not be modified.
*
* @see ELM_LAYOUT_SMART_CLASS_INIT_NULL
* @see ELM_LAYOUT_SMART_CLASS_INIT
*
* @ingroup Widget
*/
#define ELM_LAYOUT_SMART_CLASS_INIT_NAME_VERSION(name) \
ELM_LAYOUT_SMART_CLASS_INIT \
(ELM_CONTAINER_SMART_CLASS_INIT_NAME_VERSION(name))
/**
* @typedef Elm_Layout_Part_Alias_Description
*
* A layout part aliasing (proxying) description, used to get part
* names aliasing independently of a widgets theme.
*
* @ingroup Widget
*/
typedef struct _Elm_Layout_Part_Alias_Description Elm_Layout_Part_Alias_Description;
/**
* @struct _Elm_Layout_Part_Alias_Description
*
* Elementary Layout-based widgets may declare part proxies, i.e., aliases
* for real theme part names to expose to the API calls:
* - elm_layout_text_set()
* - elm_layout_text_get()
* - elm_layout_content_set()
* - elm_layout_content_get()
* - elm_layout_content_unset()
* and their equivalents. This list must be set on the
* @c "_smart_set_user()" function of inheriting widgets, so that part
* aliasing is handled automatically for them.
*
* @ingroup Widget
*/
struct _Elm_Layout_Part_Alias_Description
{
const char *alias; /**< Alternate name for a given (real) part. Calls receiving this string as a part name will be translated to the string at _Elm_Layout_Part_Proxies_Description::real_part */
const char *real_part; /**< Target part name for the alias set on @ref _Elm_Layout_Part_Proxies_Description::real_part. An example of usage would be @c "default" on that field, with @c "elm.content.swallow" on this one */
};
/**
* Elementary layout base smart class. This inherits directly from
* #Elm_Container_Smart_Class and is meant to build widgets relying on
* an Edje layout as a building block of its visuals.
*
* For instance, the elm_layout @b widget itself is just a realization
* of this smart class (see the code for elm_layout_add()). All of the
* functions listed on @ref Layout namespace will work for objects
* deriving from #Elm_Layout_Smart_Class.
*/
typedef struct _Elm_Layout_Smart_Class
{
Elm_Container_Smart_Class base; /**< Elementary container widget class struct, since we're inheriting from it */
int version; /**< Version of this smart class definition */
void (*sizing_eval)(Evas_Object *obj); /* 'Virtual' function on evalutating the object's final geometry, accounting for its sub-objects */
void (*signal)(Evas_Object *obj,
const char *emission,
const char *source); /* 'Virtual' function on emitting an (Edje) signal to the object, acting on its internal layout */
void (*callback_add)(Evas_Object *obj,
const char *emission,
const char *source,
Edje_Signal_Cb func,
void *data); /* 'Virtual' function on adding an (Edje) signal callback to the object, proxyed from its internal layout */
void * (*callback_del)(Evas_Object * obj,
const char *emission,
const char *source,
Edje_Signal_Cb func); /* 'Virtual' function on deleting an (Edje) signal callback on the object, proxyed from its internal layout */
Eina_Bool (*text_set)(Evas_Object *obj,
const char *part,
const char *text); /* 'Virtual' function on setting text on an (Edje) part of the object, from its internal layout */
const char *(*text_get)(const Evas_Object * obj,
const char *part); /* 'Virtual' function on fetching text from an (Edje) part of the object, on its internal layout */
Eina_Bool (*box_append)(Evas_Object *obj,
const char *part,
Evas_Object *child); /* 'Virtual' function on appending an object to an (Edje) box part of the object, from its internal layout */
Eina_Bool (*box_prepend)(Evas_Object *obj,
const char *part,
Evas_Object *child); /* 'Virtual' function on prepending an object to an (Edje) box part of the object, from its internal layout */
Eina_Bool (*box_insert_before)(Evas_Object *obj,
const char *part,
Evas_Object *child,
const Evas_Object *reference); /* 'Virtual' function on inserting an object to an (Edje) box part of the object, from its internal layout. The new child's position in the box is be prior to the one of a relative child already in the box */
Eina_Bool (*box_insert_at)(Evas_Object *obj,
const char *part,
Evas_Object *child,
unsigned int pos); /* 'Virtual' function on inserting an object to an (Edje) box part of the object, from its internal layout. The new child's position number is passed explicitly */
Evas_Object *(*box_remove)(Evas_Object * obj,
const char *part,
Evas_Object * child); /* 'Virtual' function on removing an object from an (Edje) box part of the object, on its internal layout */
Eina_Bool (*box_remove_all)(Evas_Object *obj,
const char *part,
Eina_Bool clear); /* 'Virtual' function on removing @b all objects from an (Edje) box part of the object, on its internal layout */
Eina_Bool (*table_pack)(Evas_Object *obj,
const char *part,
Evas_Object *child,
unsigned short col,
unsigned short row,
unsigned short colspan,
unsigned short rowspan); /* 'Virtual' function on inserting an object to an (Edje) table part of the object, from its internal layout */
Evas_Object *(*table_unpack)(Evas_Object * obj,
const char *part,
Evas_Object * child); /* 'Virtual' function on removing an object from an (Edje) table part of the object, on its internal layout */
Eina_Bool (*table_clear)(Evas_Object *obj,
const char *part,
Eina_Bool clear); /* 'Virtual' function on removing @b all objects from an (Edje) table part of the object, on its internal layout */
const Elm_Layout_Part_Alias_Description *content_aliases; /**< List of (@c 'SWALLOW') part aliases, <b>@c NULL terminated</b>. If @c NULL is passed as part name, it will be translated to the 1st _Elm_Layout_Part_Proxies_Description::real_part field in the list. */
const Elm_Layout_Part_Alias_Description *text_aliases; /**< List of (@c 'TEXT' or 'TEXTBLOCK') part aliases, <b>@c NULL terminated</b>. If @c NULL is passed as part name, it will be translated to the 1st _Elm_Layout_Part_Proxies_Description::real_part field in the list. */
} Elm_Layout_Smart_Class;
/**
* Base widget smart data extended with layout widget data.
*/
typedef struct _Elm_Layout_Smart_Data
{
Elm_Widget_Smart_Data base; /**< Base widget smart data as first member obligatory */
Eina_List *subs; /**< List of Elm_Layout_Sub_Object_Data structs, to hold the actual sub objects */
Eina_List *edje_signals;
Eina_List *parts_cursors;
const char *klass, *group;
Eina_Bool needs_size_calc : 1;
} Elm_Layout_Smart_Data;
/**
* @}
*/
EAPI const Elm_Layout_Smart_Class *elm_layout_smart_class_get(void);
#endif