Hello all,

I'm planning to bootstrap the guarana + elementary merge* soon** but I
want to solve an unsolved problem first: help bindings and users of
evas_object_smart_callback*.

If you're out of time to read it in detail, skip to end and read
"Summary" at least.

= Problem =
Evas smart objects can emit signals with data, but these are
free-form. Nobody knows which signals are emitted or which type of
data they carry. This makes life of users harder since they have to
grep for code or hope that there is documentation and it's up to date,
which is quite hard we know. For bindings it's even worse, as we have
to do it and write specific mappers for each signal, that's very
boring and error prone.

= Solution =
I would like to avoid breaking current code, so changing things
drastically is a no go. I could also propose a new system with signal
inheritance and index access to speed up dispatching and all, but I
guess the best is to build on top of existing stuff as it's "fine" for
our use cases.

The proposal is to add an array/list of signals-types to
Evas_Smart_Class. This array would be defined when class is created
and should not be changed afterwards. Types would be DBus-like type
strings 
(http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-signatures),
for example "iis" is accessed as a struct with two leading integers32
followed by a string.

USERS: We could write a script to extract such information from C
files and generate documentation.

BINDINGS: On signal callback we just query Evas_Smart_Class from
Evas_Object then type from it. With type we can query a hash that
dispatch function for that type, converting native types to wrapped
types.

I don't plan to enforce checking on evas_object_smart_callback_call(),
but that could be a compile/run time toggle to help spotting bugs.

= Problems =
 - inheriting from another class would not automatically copy signals.
This could be worked around with a new call
"evas_smart_class_inherit_from()" that would copy all members and
duplicate this array/list.

 - "generic" smart objects would not be able to cooperate with it. I
clearly don't care much about this case as I find it abuse and not the
best solution as it would make bindings nearly impossible to do
efficiently. Unfortunately this is a real world case and raster likes
it, current elementary is built just like that, with a single
"elm_widget" class and all other widgets set hooks instead of
inheriting. A possibly solution for it is to add extra pointer per
Evas_Object_Smart with per-object signals. Then one could register
signals per instance as well as per class. I dislike it though.



= Summary =
EVAS_SMART_CLASS_VERSION -> 4 (version++)
struct Evas_Smart_Class: add
    const struct Evas_Smart_Callback { const char *name, const char
*type; } *callbacks;

// pseudo code:
const char *evas_object_smart_callback_type_get(Evas_Object *o, const
char *callback_name)
{
    const struct Evas_Smart_Callback *cb;

    cb = _evas_object_smart_callback_get(o->instance_callbacks, callback_name);
    if (cb) return cb->type;

    const Evas_Smart *smart = evas_object_smart_smart_get(o);
    const Evas_Smart_Class *sc = evas_smart_class_get(smart);
    cb = _evas_object_smart_callback_get(sc->callbacks, callback_name);
    if (cb) return cb->type;

    error("no callback %s in object %p (%s) type %s\n", callback_name,
o, o->name, smart->name);
    return NULL;
}

// pseudo code:
Eina_Bool evas_smart_class_inherit(Evas_Smart_Class *dst, const
Evas_Smart_Class *src)
{
    if (!dst || !src) return 0;
    memcpy(dst, src, sizeof(Evas_Smart_Class));
    dst->callbacks = _evas_smart_class_callbacks_dup(src->callbacks);
    return 1;
}

we can add variants to add extra callbacks or even provide functions
to just manipulate callbacks (join, copy) and let user handle it,
like:
my_sc->callbacks = evas_smart_callbacks_join(parent_sc->callbacks,
my_sc_extra_callbacks);



= Notes =
* merge: no, it's not a miracle and I don't suddenly have time to do
it all, but I guess I can bootstrap it and have more people to do the
conversion of remaining parts. I'll probably do the 1% of the work,
but I guess it's the tricky part and rest is basically copy & paste,
sed, etc.
** no deadlines yet, but I'll do my best.

-- 
Gustavo Sverzut Barbieri
http://profusion.mobi embedded systems
--------------------------------------
MSN: barbi...@gmail.com
Skype: gsbarbieri
Mobile: +55 (19) 9225-2202

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to