<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    So I've had an interesting time. I've parsed your message as
    essentially saying either<br>
    <ul>
      <li>re-implement xcopyarea using cairo constructs</li>
      <li>OR, continue to use xcopyarea and handle the resulting
        graphics-expose event with a cairo-based function</li>
    </ul>
    I've tried re-implementing xcopyarea, and it resulted in a bad-match
    X error based on something that gets put on the event queue - hard
    to tell what because as soon as the error occurs it locks keboard
    input to X up :-(<br>
    <br>
    I've also noticed that the when scrolling I get "no-exposure"
    events, so that means even if I implemented a cairo-based handler
    for graphics-expose event, it wouldn't be called when scrolling.<br>
    <br>
    So I explored the "function"s being used. That is, before calling
    xcopyarea, the function "property" of the xlib graphics context is
    set to a value from 0 to 15. The function I'd used successfully with
    the purely xlib implementation was "GXandReverse" (defined as
    logically "src AND NOT dst"). With a window rendered using Cairo,
    this resulted in odd scrolling, the worst of which was that the
    background went from white to black, but it had additional problems.
    I surmise this is because the colors have an alpha channel and so
    the logical combination has a different result, but I really haven't
    thought it through. Instead, I experimented and found that using
    "GXxor" (defined logically as "src XOR dst") worked much better,
    thought it seems to smear text one pixel to the right, though
    graphics scroll fine.<br>
    <br>
    Any comments or observations greatly appreciated. Still hacking away
    at this.<br>
    .:Richard<br>
    <br>
    <br>
    <div class="moz-cite-prefix">On 05/15/2015 01:47 AM, Chris Wilson
      wrote:<br>
    </div>
    <blockquote
      cite="mid:20150515084720.GA17226@nuc-i3427.alporthouse.com"
      type="cite">
      <pre wrap="">On Thu, May 14, 2015 at 08:34:00PM -0700, Richard Billington wrote:
</pre>
      <blockquote type="cite">
        <pre wrap="">I'm trying to translate a backend from using Xlib calls to using
Cairo, where reasonable. The drawing operations I'm doing (text and
graphics) are ignoring the xlib gcontext, and instead using the
cairo context. However, when I try to use my cairo implementation of
an xcopyarea-like function, I get some kind of event generated which
I don't know how to handle. If I try to use xcopyarea (the xlib
implementation), it "works" except that the background is always
black, not the background it ought to be.

I can go into more specifics, but I'm just wondering if there's any
standard way of doing this. I found an archived discussion from many
years ago about this subject, but I can't tell if there were
patches/reimplementations done to better accommodate this nor if
there's a standard approach.
</pre>
      </blockquote>
      <pre wrap="">
Sure, the crux of the issue is that the self-copy case remains undefined
(it more or less boils down to not all hardware truly supports it). The
easiest no-nonsense definition would be that the source is treated as
static from the instance of being bound to the context (that is if it
maps to the cairo_get_target, then we immediately take a copy[-on-write?]).
That is overkill and prevents some optimisations for e.g. converting a
        cairo_set_source_surface(cairo_get_target(), 10, 10);
        cairo_rectangle();
        cairo_fill();
into a XCopyArea, so finding the right balance is hard (but I think that
is the right definition for the API!).

On the other hand, with the hypothetical cairo-surface API you would be
able to do the transformation into XCopyArea easily (since the definition
there would be an implicit copy-on-write for the source being passed
into the operation, and not at the context).

However, that all has to be compared to

expose-event (or preferrably repaint function after accumulating
exposures):
        /* use double buffering */
        cairo_create(xlib_surface);
        cairo_rectangle(redraw_x, redraw_y, redraw_w, redraw_h);
        cairo_clip();
        cairo_push_group_with_context(CAIRO_CONTENT_COLOR);
        .... bunch of rendering ...
        cairo_pop_group_to_source();
        cairo_paint();
        cairo_destroy();

        cairo_surface_flush(xlib_surface);

and now in your scroll function you are free to use XCopyArea on the
underlying drawable. For completeness after using XCopyArea, call
cairo_surface_mark_dirty().
-Chris

</pre>
    </blockquote>
    <br>
  </body>
</html>