2016-09-22 0:45 GMT+02:00 Gustavo Sverzut Barbieri <barbi...@gmail.com>:
> On Wed, Sep 21, 2016 at 11:33 AM, Tom Hacohen <t...@osg.samsung.com> wrote: > > On 21/09/16 15:10, Gustavo Sverzut Barbieri wrote: > >> On Wed, Sep 21, 2016 at 5:26 AM, Tom Hacohen <t...@osg.samsung.com> > wrote: > >> [...] > >>>> promise/future should be first-class citizen... as well as iterator > >>>> and the likes. There is a start already, but refinement is really > >>>> needed, like returning an iterator<x> should handle warn_unused, free, > >>>> own... Promise should have its own callback signature, simplified for > >>>> the user. > >>>> > >>> > >>> They can, be, but they will just be provided by Eo. There's no need for > >>> any special treatment in Eo. > >>> > >>> Promise signature: you don't need to do it in Eo. I mean, you can add a > >>> special type in Eolian, but Eo itself need not be aware. Also, I > disagree. > >> > >> Do you mean still use Eo's events to dispatch promises? > > > > Not necessarily, just use the same signature because it's a good one, > > it's extendable, it applies here too, and it's easier for bindings this > way. > > It's a good one to who? It's a generic one, for sure, but that doesn't > make it a good one. Promises, for instance, will carry a value, but > it's not immediately available. Even for regular events I don't get > why the object must be fetched from the efl_event... > I'm with Gustavo here, reusing the same callback signature for event and promises don't seems to be a good idea, it just make the usage more confusing and more error prone. Having 2 different signature will make the separation line between events and promises more clear. > > > > >> I don't get why Efl.Promise is an Eo at all. Looking at the code shows > >> now hints of benefits. Asking Cedric leads me to an awful answer... > >> :-/ > >> > >> The promise thing should only be a thin layer that forces a clear > >> pattern: wait for data, deliver data or call failure. I don't get why > >> in the other thread people were talking about references in promises, > >> inheritance, etc. > >> > > > > Not sure about inheritance, but you need references for lifecycle. It's > > even better when you have automatic lifecycle control, so when an object > > dies, the associated promise dies too. > > the lifecycle of a promise is simple and there should be no refs on > it. OTOH, if it's returned by an object, then the object indeed should > cancel all its promises. But it must know that already, after all it > must deliver a value sooner or later. > > IOW: Eo should know about promises, promises shouldn't know about > eo... or at least don't need to. > > > > >>>> AND if possible, make eolian or a new tool to handle connections for > >>>> us, if it was easy to declare objects with composition of > >>>> events/promises, it would save us lots of typing and errors. > >>>> > >>>> > >>> > >>> I'm not sure what you meant here. > >> > >> the process of creating and object, setting its properties and > >> connecting events is painful in C. We need to replicate the whole > >> "<NAMESPACE>_${METHOD}(efl_added, ${VALUE})"... for events it's even > >> worse. > >> > >> While the API is what it should be, it's PITA to use. If we could > >> extend the generator to do those for us, we'd have to implement only > >> high level functions. Like it does for C++ or Lua bindings, do to C > >> "user code" (could also do C++/Lua user code as well). Example: > >> > >> myapp.eou: # eou = eo user > >> > >> objects { > >> xpto { /* creates an object called "xpto" */ > >> children { > >> window { /* window is part of xpto, it will be created using > >> given type and properties */ > >> type: Efl.Ui.Win; > >> constructor { > >> type: Efl.Ui.Win.Type.basic; > >> title: "hello world"; > >> } > >> events { /* these will be connected for you, callback > >> handlers are expanded based on event payload */ > >> resized @proxy; /* proxy = will forward this event as > >> "xpto" using the same name */ > >> delete,request; /* user must implement the callback > >> with handler */ > >> } > >> } > >> box { > >> type: Efl.Ui.Box; > >> } > >> label1 { > >> type: Efl.Ui.Label; > >> } > >> label2 { > >> type: Efl.Ui.Label; > >> } > >> entry { > >> type: Efl.Ui.Entry; > >> } > >> } > >> > >> connections { > >> entry: changed -> label2: text.set; /* somehow like Qt's > >> signal connection */ > >> } > >> > >> composition { /* basic method calls using other objects and > constants */ > >> box.pack_align(0.5, 0.5); > >> > >> label1.hint_align.set(0.0, 0.0); > >> box.pack(label1); > >> > >> label2.hint_align.set(1.0, 1.0); > >> box.pack(label2); > >> box.pack(entry); > >> } > >> } > >> } > >> > >> > >> Then in my code I'd just: > >> > >> #include "myapp.eou.h" > >> > >> static void _xpto_window_delete_request(Eo *xpto, Eo *window) /* > >> nothing else as there is no payload in that event */ > >> { > >> printf("window was closed\n"); > >> } > >> > >> static void _xpto_resized(void *data, const Efl_Event *event) // or we > >> create an xpto_event_resized_add() which unpacks and makes it easier > >> to use > >> { > >> } > >> > >> int main() { > >> // ... > >> > >> Eo *xpto = xpto_new(); > >> efl_event_callback_add(xpto, XPTO_EVENT_RESIZED, _xpto_resized, > NULL); > >> > >> // ... > >> } > >> > >> #include "myapp.eou.c" > >> > > > > > > If I understand you correctly, you want a UI description language. Yes, > > we have that in the words under the "erigo" project. Erigo is the gui > > builder but it also implement a UI descrption language and should > > include cli tools that do just that. We already speced the language, > > though unfortunately the author is currently unavailable, so work > stopped. > > no, it's not an UI language.. although I did use only UI objects, the > idea is that I don't have to manually type lines that are 160 chars > wide due namespace... not to say manually resolve all the methods to > proper namespaces myself, like in the example above I know there is a > "pack()" method, the tool should find out where it is declared, not me > having to search all efl_*.eo to find. > > I'd love to rewrite src/examples/ecore/efl_*.c to use that generator, > currently a big part of that code is solely creating and setting > properties on the dialers/readers/writers, then linking one to > another. If all I had to do is parse cmdline and define my callbacks, > it would be much easier. > > Also note that it would simply the callbacks for me... unlike you said > above, it's not convenient to use "const Efl_Event *" myself... if the > tool could expand that to proper parameters, would save me time and > make it less error prone, like an event that delivers me an error code > should expand to: > > void cb(void *data, Eo *o, Eina_Error error) { } > > An event that delivers a 2 strings (key/value): > > void cb(void *data, Eo *o, const char *key, const char *value) { } > > or at least the event payload struct: > > void cb(void *data, Eo *o, const My_Key_Value kv); > > > the tool would generate the actual event callback, get data from > Efl_Event and then call my function > > > > -- > Gustavo Sverzut Barbieri > -------------------------------------- > Mobile: +55 (16) 99354-9890 > > ------------------------------------------------------------ > ------------------ > _______________________________________________ > enlightenment-devel mailing list > enlightenment-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > ------------------------------------------------------------------------------ _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel