[Xcb] [ANNOUNCE] Xnb: X protocol library for .NET

Alp Toker alp at atoker.com
Thu Feb 2 07:15:10 PST 2006


I've started work on an X library written in C#. It's generated from the 
Xcb XML sources, so I thought it'd be appropriate to collaborate with 
the Xcb project on its development. Xnb is part of the NDesk project 
(http://www.ndesk.org/).

It doesn't actually work yet, but is nearing basic functionality. I'm 
announcing this early on because I have a few contributions to make and 
questions ask that may affect the design of Xnb.

You can check out the sources in Mono SVN (see http://www.go-mono.com/ 
for details), module xnb. Don't expect to see much, but the default make 
target will hopefully generate and build some 25,000 lines of X protocol 
helpers.

The library API is designed to look and feel like any other .NET API. It 
should work with any language that can target the CLR including Boo, 
Nemerle, VB, Python and a dozen more. It should also be possible to 
generate C GObject bindings for Xnb using the Mono 'cilc' tool which I 
maintain.

XCB
===

First of all, I've found a number of errors in the XML specs that should 
be integrated back into Xcb CVS. They were found using the mono-xmltool 
validator. You can get the fixed xml files in xnb/proto, and run the 
validator on them with 'make validate'. Hopefully, I'll eventually be 
able to exclude these files from Xnb SVN and use pkg-config to pull them 
out of the Xcb protocol package. There is still a validation error which 
shows up in glx.xml and xprint.xml: xcb.xsd does not permit the 
valueparam element within replies. Will leave fixing this one up to the 
Xcb developers.

DESIGN
======

Xnb has a fairly flat type hierarchy which tries to stay close to the X 
protocol without imposing decisions on the developer. XID-backed values 
are typesafe and checked at compile using implicitly castable structs 
(value types in the CLR) without the overhead of full objects. Casing is 
in the C# style, so CreateWindowRequest has the properties BorderWidth, 
Class, Depth etc.

IO is done using scatter gather IO vectors for performance, combined 
with lazy marshaling where necessary. Unsafe code is used to optimise IO 
where possible, with plans for fallback backends on high endian systems, 
Windows and 64-bit platforms with different memory layouts. The need to 
marshal will be reduced even further for common cases soon, and I expect 
performance to rival and exceed Xlib and even Xcb in certain cases.

INTEROP
=======

Xnb depends on Xcb to set up the connection right now, but this is only 
a temporary measure. I think it's pretty important for Xnb to maintain 
full compatibility with Xcb but I'd also like to make sure it can 
operate in "standalone mode", with no dependencies outside of the CLR. I 
have no particular desire to rewrite Cairo and would love nothing more 
than to be able to use the existing Mono.Cairo with Xcb backend, for 
example.

USES
====

Xnb could be used for:

	* Writing X applications, window managers, compositing managers
	* Writing "fun" X servers, say using Ajax and http
	* A porting layer to port X applications to other platforms
	* Profiling X applications and toolkits, in conjunction with Linux OProfile

ROADMAP
=======

Rewrite the generator cleanly
Get message passing to work in all cases, from both the client and 
server perspective
Implement X authentication using Mono crypto libraries, replacing Xau
Lose dependency on Xcb
Work out interoperability with Xcb
Decide whether to do latency hiding explicitly or implicitly
Consolidate X,Y pairs into Point, X,Y,Width,Height into Rectangle, 
Red,Green,Blue into Color etc.

In the mean time, I'd appreciate any comments on the design. Please go 
ahead and integrate the fixed XML files into Xcb CVS.

I'd also appreciate it if you could extend the schema and XML files to 
include information on how enums map to parameters. High level languages 
like C# provide features for typesafe enumerations, and it would be nice 
to maintain this information centrally in Xcb CVS rather than in a 
separate repository. Does this work for you?

Also, do you have any experience or thoughts on how Xnb might 
interoperate with Xcb?

Are there any plans to integrate documentation into the XML files, or 
for Xcb documentation in general? Xnb will need documentation too and 
there might be cause for collaboration.

(Note that the DNS record for this email address is updating. Please CC 
the list or find me on IRC with any questions over the next few days)


More information about the Xcb mailing list