On Wed, 2 Jan 2008, Nathan Ingersoll wrote:

> I think this looks very reasonable. Were you able to verify with the
> XCB devs that we can poll on the cookies like this?

They didn't answer me yet. Maybe they are on holydays :)

Vincent

> On Dec 31, 2007 10:25 AM, Vincent Torri <[EMAIL PROTECTED]> wrote:
>>
>>
>>
>> On Sun, 30 Dec 2007, Nathan Ingersoll wrote:
>>
>>>> Another possibility (raster's idea) for
>>>> ecore_x_drawable_geometry_get_async is to sent an event
>>>> ECORE_X_REPLY_GEOMETRY_GET just when the xcb_get_geometry_reply call has
>>>> returned. The event would contain (actually, would be) the structure
>>>> above. Then, the prototype would just be:
>>>>
>>>> void ecore_x_drawable_geometry_get_async(Ecore_X_Drawable drawable 
>>>> (unused))
>>>>
>>>> raster: in that case, should we also add those events in the Xlib
>>>> implementation ?
>>>
>>> My preference would be a resounding YES! :-) I also tend to agree with
>>> raster's API choice of using the existing event model.
>>>
>>> I would like to see the removal of the _async calls entirely and get
>>> this to the point where we have essentially 2 exposed calls. The first
>>> is the traditional blocking call, while the second is a _request or
>>> _prefetch call. Below are my ideas of how this could work, but you are
>>> far more familiar with the XCB specifics so please let me know if a
>>> part of this is not feasible. There is also the possibility that
>>> extensions could be made to XCB to support some of this behavior.
>>>
>>> For the traditional blocking call the XCB backend would use the
>>> request call, but would immediately request the response value and
>>> cause the app to block. In the Xlib implementation, it would simply
>>> make the blocking call, and return the values as they currently do.
>>>
>>> The request or prefetch call would submit the request and add the
>>> cookie to a queue along with a reply specific callback (similar to the
>>> API rephorm mentioned). This queue would then be processed as part of
>>> the idle loop when the fd for the XCB connection has data available.
>>> Each cookie on the queue would be checked to see if a reply has been
>>> received, or better yet, XCB provides a list of available replies. For
>>> each cookie with a pending reply, it is processed with the reply
>>> specific callback. The callback is responsible for requesting the
>>> data, which we know is available and therefore should not block, and
>>> emitting the ecore event. The Xlib backend would have a blocking call
>>> occur and emit the same event immediately after the blocking call
>>> returns.
>>>
>>> This seems very similar to your proposal but I think it's more
>>> explicit about the expectations the end-user should have for requests.
>>> It should make them realize that the responses are asynchronous events
>>> and that they are potentially slow round trips that will return at
>>> some arbitrary time in the future.
>>
>> Here is a small implementation of your ideas for the GetGeometry request:
>>
>> [code]
>>
>> typedef struct Ecore_X_Cookie Ecore_X_Cookie;
>>
>> typedef struct
>> {
>>    int x, y, w, h, border, depth;
>> } Ecore_X_Reply_Get_Geometry;
>>
>> struct Ecore_X_Cookie
>> {
>>    xcb_get_geometry_cookie_t cookie;
>>    void (*reply) (Ecore_X_Cookie *cookie);
>> };
>>
>> /* The event */
>>
>> ECORE_X_REPLY_GET_GEOMETRY
>>
>> /* the prefetch function */
>>
>> void
>> ecore_x_get_geometry_prefetch (xcb_drawable_t draw)
>> {
>>    Ecore_X_Cookie *cookie;
>>
>>    cookie = calloc (1, sizeof (Ecore_X_Cookie));
>>    if (!cookie) return;
>>
>>    cookie.cookie = xcb_get_geometry_unchecked (_ecore_xcb_conn, draw);
>>    cookie.reply = _ecore_xcb_reply_get_geometry;
>>
>>    /* add the cookie to an ecore list */
>>    ecore_xcb_cookie_cache (cookie);
>> }
>>
>> /* the callback that is called when its reply is available */
>>
>> void
>> _ecore_x_reply_get_deometry (Ecore_X_Cookie *cookie)
>> {
>>    xcb_get_geometry_reply_t *reply;
>>    Ecore_X_Reply_Get_Geometry *r;
>>
>>    reply = xcb_get_geometry (_ecore_xcb_conn, cookie.cookie, NULL);
>>    if (!reply) return;
>>
>>    r = calloc (1, sizeof (Ecore_X_Reply_Get_Geometry));
>>    if (!r)
>>      {
>>        free (reply);
>>        return;
>>      }
>>
>>    r->x = reply->x;
>>    r->y = reply->y;
>>    r->w = reply->w;
>>    r->h = reply->h;
>>    r->border = reply->border;
>>    r->depth = reply->depth;
>>
>>    ecore_event_add (ECORE_X_REPLY_GET_GEOMETRY, r, NULL, NULL);
>>    ecore_xcb_cookie_remove (cookie);
>> }
>>
>>
>> /* like the events (see ecore_x.c or ecore_xcb.c), */
>> /* if the fd receives data */
>> /* (in _ecore_xcb_fd_handler ?) */
>> /* or somewhere else ?? */
>>
>>    Ecore_X_Cookie *cookie;
>>    void *reply;
>>
>>    ecore_xcb_cookie_begin ();
>>    while (cookie = ecore_xcb_cookie_next())
>>      {
>>        if (xcb_poll_for_reply (_ecore_xcb_conn,
>>                                cookie.cookie,
>>                                &reply,
>>                                NULL))
>>          cookie.reply (cookie);
>>      }
>>
>> [/code]
>>
>> what do you think of that code ?
>>
>> Vincent

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to