make it easy to write bindings for box.

giving an extra void *user_data to layout function is now easy to
write bindings, just give the callback to be a generic function that
will call the language/binding specific function handled as user_data.

Example, for python we can use:

   void _layout_dispatcher(Evas_Object *o, Evas_Object_Box_Data *priv, void *data) {
       PyObject *pyobj = data, *args;

       args = PyTyple_New(1);
       PyTuple_SET_ITEM(args, 0, Evas_object_from_instance(o));
       PyObject_Call(pyobj, args, NULL);
       Py_DECREF(args);
   }

   evas_object_box_layout_set(o, _layout_dispatcher, pyobj, Py_DecRef);


SVN revision: 37640
This commit is contained in:
Gustavo Sverzut Barbieri 2008-11-14 23:10:29 +00:00
parent e20d52ab8b
commit 4e108162aa
2 changed files with 41 additions and 26 deletions

View File

@ -977,7 +977,7 @@ extern "C" {
typedef struct _Evas_Object_Box_Api Evas_Object_Box_Api;
typedef struct _Evas_Object_Box_Data Evas_Object_Box_Data;
typedef struct _Evas_Object_Box_Option Evas_Object_Box_Option;
typedef void (*Evas_Object_Box_Layout)(Evas_Object *o, Evas_Object_Box_Data *priv);
typedef void (*Evas_Object_Box_Layout)(Evas_Object *o, Evas_Object_Box_Data *priv, void *user_data);
struct _Evas_Object_Box_Api
{
@ -1007,7 +1007,11 @@ extern "C" {
Evas_Coord h, v;
} pad;
Eina_List *children;
Evas_Object_Box_Layout layout;
struct {
Evas_Object_Box_Layout cb;
void *data;
void (*free_data)(void *data);
} layout;
};
struct _Evas_Object_Box_Option
@ -1016,20 +1020,20 @@ extern "C" {
};
EAPI void evas_object_box_smart_set(Evas_Object_Box_Api *api);
EAPI void evas_object_box_layout_set(Evas_Object *o, Evas_Object_Box_Layout cb);
EAPI void evas_object_box_layout_set(Evas_Object *o, Evas_Object_Box_Layout cb, const void *data, void (*free_data)(void *data));
EAPI Evas_Object *evas_object_box_add(Evas *evas);
EAPI Evas_Object *evas_object_box_add_to(Evas_Object *parent);
EAPI void evas_object_box_layout_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv);
EAPI void evas_object_box_layout_vertical(Evas_Object *o, Evas_Object_Box_Data *priv);
EAPI void evas_object_box_layout_homogeneous_vertical(Evas_Object *o, Evas_Object_Box_Data *priv);
EAPI void evas_object_box_layout_homogeneous_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv);
EAPI void evas_object_box_layout_homogeneous_max_size_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv);
EAPI void evas_object_box_layout_homogeneous_max_size_vertical(Evas_Object *o, Evas_Object_Box_Data *priv);
EAPI void evas_object_box_layout_flow_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv);
EAPI void evas_object_box_layout_flow_vertical(Evas_Object *o, Evas_Object_Box_Data *priv);
EAPI void evas_object_box_layout_stack(Evas_Object *o, Evas_Object_Box_Data *priv);
EAPI void evas_object_box_layout_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data);
EAPI void evas_object_box_layout_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data);
EAPI void evas_object_box_layout_homogeneous_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data);
EAPI void evas_object_box_layout_homogeneous_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data);
EAPI void evas_object_box_layout_homogeneous_max_size_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data);
EAPI void evas_object_box_layout_homogeneous_max_size_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data);
EAPI void evas_object_box_layout_flow_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data);
EAPI void evas_object_box_layout_flow_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data);
EAPI void evas_object_box_layout_stack(Evas_Object *o, Evas_Object_Box_Data *priv, void *data);
EAPI void evas_object_box_align_set(Evas_Object *o, double horizontal, double vertical);
EAPI void evas_object_box_align_get(const Evas_Object *o, double *horizontal, double *vertical);

View File

@ -333,7 +333,9 @@ _evas_object_box_smart_add(Evas_Object *o)
priv->align.v = 0.5;
priv->pad.h = 0;
priv->pad.v = 0;
priv->layout = evas_object_box_layout_horizontal;
priv->layout.cb = evas_object_box_layout_horizontal;
priv->layout.data = NULL;
priv->layout.free_data = NULL;
}
static void
@ -362,6 +364,9 @@ _evas_object_box_smart_del(Evas_Object *o)
l = eina_list_remove_list(l, l);
}
if (priv->layout.data && priv->layout.free_data)
priv->layout.free_data(priv->layout.data);
_parent_sc.del(o);
}
@ -375,8 +380,8 @@ static void
_evas_object_box_smart_calculate(Evas_Object *o)
{
EVAS_OBJECT_BOX_DATA_GET_OR_RETURN(o, priv);
if (priv->layout)
priv->layout(o, priv);
if (priv->layout.cb)
priv->layout.cb(o, priv, priv->layout.data);
else
fprintf(stderr, "ERROR: no layout function set for %p box.\n", o);
}
@ -478,10 +483,16 @@ evas_object_box_smart_set(Evas_Object_Box_Api *api)
* etc.).
*/
void
evas_object_box_layout_set(Evas_Object *o, Evas_Object_Box_Layout cb)
evas_object_box_layout_set(Evas_Object *o, Evas_Object_Box_Layout cb, const void *data, void (*free_data)(void *data))
{
EVAS_OBJECT_BOX_DATA_GET_OR_RETURN(o, priv);
priv->layout = cb;
if (priv->layout.data && priv->layout.free_data)
priv->layout.free_data(priv->layout.data);
priv->layout.cb = cb;
priv->layout.data = (void *)data;
priv->layout.free_data = free_data;
evas_object_smart_changed(o);
}
@ -656,7 +667,7 @@ _evas_object_box_layout_horizontal_weight_apply(Evas_Object_Box_Data *priv, Evas
* @todo consider aspect hint and respect it.
*/
void
evas_object_box_layout_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv)
evas_object_box_layout_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
{
int pad_inc = 0, sub_pixel = 0;
int req_w, global_pad, remaining;
@ -816,7 +827,7 @@ _evas_object_box_layout_vertical_weight_apply(Evas_Object_Box_Data *priv, Evas_O
* @todo consider aspect hint and respect it.
*/
void
evas_object_box_layout_vertical(Evas_Object *o, Evas_Object_Box_Data *priv)
evas_object_box_layout_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
{
int pad_inc = 0, sub_pixel = 0;
int req_h, global_pad, remaining;
@ -947,7 +958,7 @@ evas_object_box_layout_vertical(Evas_Object *o, Evas_Object_Box_Data *priv)
* @todo consider aspect hint and respect it.
*/
void
evas_object_box_layout_homogeneous_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv)
evas_object_box_layout_homogeneous_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
{
int cell_sz, share, inc;
int sub_pixel = 0;
@ -1014,7 +1025,7 @@ evas_object_box_layout_homogeneous_horizontal(Evas_Object *o, Evas_Object_Box_Da
* @todo consider aspect hint and respect it.
*/
void
evas_object_box_layout_homogeneous_vertical(Evas_Object *o, Evas_Object_Box_Data *priv)
evas_object_box_layout_homogeneous_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
{
int cell_sz, share, inc;
int sub_pixel = 0;
@ -1113,7 +1124,7 @@ evas_object_box_layout_homogeneous_vertical(Evas_Object *o, Evas_Object_Box_Data
* @todo consider aspect hint and respect it.
*/
void
evas_object_box_layout_homogeneous_max_size_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv)
evas_object_box_layout_homogeneous_max_size_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
{
int remaining, global_pad, pad_inc = 0, sub_pixel = 0;
int cell_sz = 0;
@ -1202,7 +1213,7 @@ evas_object_box_layout_homogeneous_max_size_horizontal(Evas_Object *o, Evas_Obje
* @todo consider aspect hint and respect it.
*/
void
evas_object_box_layout_homogeneous_max_size_vertical(Evas_Object *o, Evas_Object_Box_Data *priv)
evas_object_box_layout_homogeneous_max_size_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
{
int remaining, global_pad, pad_inc = 0, sub_pixel = 0;
int cell_sz = 0;
@ -1381,7 +1392,7 @@ _evas_object_box_layout_flow_horizontal_row_info_collect(Evas_Object_Box_Data *p
* @todo consider aspect hint and respect it.
*/
void
evas_object_box_layout_flow_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv)
evas_object_box_layout_flow_horizontal(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
{
int n_children, v_justify;
int r, row_count = 0;
@ -1550,7 +1561,7 @@ _evas_object_box_layout_flow_vertical_col_info_collect(Evas_Object_Box_Data *pri
* @todo consider aspect hint and respect it.
*/
void
evas_object_box_layout_flow_vertical(Evas_Object *o, Evas_Object_Box_Data *priv)
evas_object_box_layout_flow_vertical(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
{
int n_children, h_justify;
int c, col_count;
@ -1668,7 +1679,7 @@ evas_object_box_layout_flow_vertical(Evas_Object *o, Evas_Object_Box_Data *priv)
* @todo consider aspect hint and respect it.
*/
void
evas_object_box_layout_stack(Evas_Object *o, Evas_Object_Box_Data *priv)
evas_object_box_layout_stack(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
{
Eina_List *l;
Evas_Coord ox, oy, ow, oh;