I was wondering if I could use Cairo from Qt3. Given that Cairo allows creating surfaces from X11 visuals and that Qt allow accessing them, I thought it was simple. As a proof, here is the interesting bit (using Qt3 and Cairomm, the C++ "bindings" for Cairo):

QSize size = QWidget::size();
RefPtr<Surface> surface = Cairo::XlibSurface::create(
	x11Display(),
	handle(),
	(Visual*)x11Visual(),
	size.width(),
	size.height()
	);

That code is from a member method of a QWidget subclass.

Get the code: main.cpp. To build, use the following command:

gcc main.cpp -o main -I/usr/include/qt3 -I/usr/include/cairo -I/usr/include/cairomm-1.0 \
 -lqt-mt -lcairo -lcairomm-1.0

Now lets think how to make that API clean, and how QPainter will conflict with it :-)

Update (July 30th): I got pointed to qcairo in the cairo-demo. I must admit I didn't really look for one as I liked the educational part of figuring things out (easy).