A truly portable X application is required to act like the persistent customer in Monty Python’s “Cheese Shop” sketch, or a grail seeker in “Monty Python and the Holy Grail.” Even the simplest applications must answer many difficult questions:
Server: What is your Display?
Client: display = XOpenDisplay("unix:0");
Server: What is your Root?
Client: root = RootWindow(display,DefaultScreen(display));
Server: And what is your Window?
Client: win = XCreateSimpleWindow(display,
root, 0, 0, 256, 256, 1,
BlackPixel(display,DefaultScreen(display)),
WhitePixel(display,DefaultScreen(display)));
Server: Oh all right, you can go on.
(client passes)
Server: What is your Display?
Client: display = XOpenDisplay("unix:0");
Server: What is your Colormap?
Client: cmap = DefaultColormap(display,
DefaultScreen(display));
Server: And what is your favorite color?
Client: favorite_color = 0; /* Black. */
/* Whoops! No, I mean: */
favorite_color = BlackPixel(display,
DefaultScreen(display));
Client: /* AAAYYYYEEEEE!!*/
(client dumps core and falls into the chasm)
Server: What is your display?
Client: display = XOpenDisplay("unix:0");
Server: What is your visual?
Client: struct XVisualInfo vinfo;
if (XMatchVisualInfo(display,DefaultScreen(display),
8, PseudoColor, &vinfo) != 0)
visual = vinfo.visual;
Server: And what is the net speed velocity of an XConfigureWindow
request?
Client: /* Is that a SubStructureRedirectMask or
* a ResizeRedirectMask?
*/*
Server: What?! how am I supposed to know that? Aaaauuuggghhh!!!!
(*server dumps core and falls into the chasm)