[Xr] Dealing with groups in Xr

Owen Taylor otaylor at redhat.com
Wed Apr 23 21:55:33 PDT 2003

On Wed, 2003-04-23 at 11:53, Carl Worth wrote:

>  > The only thing I can think of to reduce the verbosity would be
>  > move back a bit in the direction you had before by introducing
>  > the idea of a "temporary surface" that is part of the state.
> [...]
>  > Legibility could be improved at the expense of potential
>  > efficiency by removing the x,y,width,height arguments
>  > from XrStartTemp.
> I think I'd like that. Since these are just convenience functions,
> they might as well be as convenient as possible.

It strikes me that making the user worry about the bounding
box of primitives drawn onto the temporary group is wrong; if creating
larger empty pixmaps becomes a time or memory bottleneck, it can
certainly be optimized out, at the cost of a moderate amount
of complexity. (For instance, with a tiled representation of the

> In which case, we'd have the same functionality that was there with
> Push/PopGroup except with the needed improvement that the compositing
> of the temporary surface is not tangled up with the end of drawing to
> the surface.
> Maybe we could go back to the old names as well:
> 	XrPushGroup, XrPopGroup, XrShowGroup
> What think ye?

Sounds reasonable to me; the "Temp" namings are clutter the
code a lot if the code if they are used extensively.

Just as a thought, perhaps Enter/Leave is better than Push/Pop?
Push/Pop seems to indicate tat

>  >         /* Draw 3 circles to the punch surface, then cut
>  >          * that out of the main circle in the overlay
>  >          */
>  >         if (XrStartTemp (r, XrFormatARGB8, 0, 0, width, height)) {
>  >             draw_3circles (r, xc, yc, radius);
>  > 
>  >             XrEndTemp (r);
>  >             XrSetOperator (r, XrOperatorOutReverse);
>  >             XrShowTemp (r);
>  >         }
> BTW, the bracing here helps readability quite a bit. The
> error-handling concept in Xr[*] has void functions everywhere. But
> discretionary braces could be quite nice in a case like this, even
> without the if statement.

Yeah - I thought about removing the error handling since it wasn't
a disaster if pushing the group failed and you drew garbage, but
I liked the effect of the bracing.

I could certainly see using gratuitous bracing in examples.

Though, it does bring another API to mind. Something like

   XrSurface *s = XrEnterGroup (r, XrFormatARGB8);
   draw_3circles (r, xc, yc, radius);

   XrLeaveGroup (r);

   XrShowSurface (r, s, 0, 0);
   XSurfaceDestroy (s);

Just another point on the convenience/flexibility scale...

> \[*] I don't think I've ever talked much about the error-handling API
> in Xr. The idea that Keith and I were working with is that checking
> the return status of every function gets messy in the code, and worse,
> nobody bothers to do it. So instead, the functions are all void, and
> the user can check the error status at any given point with:
> 	XrStatus
> 	XrGetStatus(XrState *xrs);
> In addition, any error condition in an XrState object makes it just
> shut down. That is, calling more Xr functions after an error will
> never cause a crash -- the functions just won't do anything.
> This way it should be easy to keep code clean by calling a collection
> of Xr functions and then just checking once at the end to make sure
> everything worked.

If we are going to use the API directly in GTK+, rather than wrapping
it, an API that minimizes error checking is certainly appreciated.

Though something even stronger would be appreciated; I'd like to be able
to set an OOM  handler that simply aborted the program, so that you
didn't have to check your XrCreateSurface() and nothing else in the GTK+

I assume XrCreateSurface() is going to fail asynchronously in the
remote-server case, so there is a certain problem with error returns
in any case.


More information about the cairo mailing list