XComposite transition, was Re: [Xquartz-dev] fb / rootless crash bugs

Ben Byer bbyer at apple.com
Tue Dec 4 17:37:04 PST 2007

On Dec 4, 2007, at 4:36 PM, Greg Parker wrote:

> On Dec 4, 2007, at 4:02 PM, Ben Byer wrote:
>> On Dec 3, 2007, at 5:28 PM, Jeremy Huddleston wrote:
>>> Do they involve gutting rootless and using kdrive perchance?  I'm  
>>> only half joking...
>> No, but I *swore* I mentioned the analogous 100% serious suggestion  
>> from the X.org folks that we gut rootless and use xcomposite.  (I  
>> don't know that kdrive solves the problem that we're trying to  
>> solve here.)
> I took a quick look at Composite. It looks like it was designed to  
> work inside a window manager. I'm not sure that makes sense in our  
> environment. We could make quartz-wm also in charge of the Mac  
> windows via Composite, but that might leave other window managers  
> out in the cold. One alternative might be to use the Composite code  
> paths in the server, without using the Composite extension directly.

Yeah, there's definitely some subtlety here.

Keith Packard and I discussed this, here's some notes from a  
conversation that stretched over several months, while I tried and  
failed to make this happen:
- - - - -
If we call compRedirectSubwindows(serverClient, root,  
CompositeRedirectManual), then that will create pixmaps for all of the  
windows and keep those pixmaps up-to-date.   We could then create  
damage structures for each backing pixmap, and then our block handler  
sends the updated bits to the target windows.   If possible, we should  
point the composite pixmaps at the OS X backing buffer; that would  
make the code simpler and faster.

(elaborating further)
What composite gives you is per-window pixmaps.  If you set the root  
window to automatically redirect all children, you'll have pixmaps for  
every mapped child.  Then, hook CreateWindow to listen for damage on  
all children. Then, hack compWindowUpdateAutomatic to paint the right  
bits in a Quartz (Xplugin?)-specific manner, and once that's working  
we can abstract that out and get some hooks put into the DIX code.

compWindowUpdateAutomatic currently uses Render to copy the child  
window onto the parent; change that to copy the child onto the OSX  
surface.  Check if pParent->parent==NULL, and do your stuff.
We might be able to handle frame creation lazily from the update hook,  
but we might be better off hooking the following functions:
CreateWindow, DestroyWindow, RealizeWindow, UnrealizeWindow,  
ConfigureWindow, CloseScreen, PositionWindow, RestackWindow

This would be a simplification over the current Rootless code, which  
hooks all of the above, as well as  ValidateTree,  
ChangeWindowAttributes, MarkOverlappedWindows, ChangeBorderWidth,  
ReparentWindow, ResizeWindow, MoveWindow, SourceValidate, GetImage,  
CopyWindow, CreateGC, CreateScreenResources, and SetShape.
- - - - -

I tried for a week or two and utterly failed to gain any traction on  
this problem -- I got as far as that first compRedirectSubwindows  
call, but if I didn't have any of the rootless code enabled then I  
never got an initial Update message for anything, and if I left the  
rootless code enabled I got crashes and odd behavior.

There are certainly many more things we could do in the realm of  
compositing -- there may be things we can leverage more Quartz  
goodness for -- but for a first approximation, we'd just be using it  
to get pixmaps and updates.
Ben Byer
CoreOS / BSD Technology Group, XDarwin maintainer

More information about the Xquartz-dev mailing list