Le programme suivant crée un fenêtre contenant un petit carré noir à l'intérieur.
/*
* Application Xlib simple affichant une carré dans une fenêtre.
*/
#include int main() {
Display *d;
int s;
Window w;
XEvent e;
/* Ouvrir la connexion avec le serveur. */
d = XOpenDisplay(NULL);
if (d == NULL) {
printf("Impossible d'ouvrir le Display\n");
exit(1);
}
s = DefaultScreen(d);
/* Créer la fenêtre. */
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1,
BlackPixel(d, s), WhitePixel(d, s));
/* Choisir les événements qui nous intéressent. */
XSelectInput(d, w, ExposureMask | KeyPressMask);
/* Afficher la fenêtre. */
XMapWindow(d, w);
/* Boucle des événements. */
while (1) {
XNextEvent(d, &e);
/* Dessiner ou redessiner la fenêtre. */
if (e.type == Expose) {
XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10);
}
/* Sortir si une touche est pressée. */
if (e.type == KeyPress)
break;
}
/* Couper la connexion avec le serveur */
XCloseDisplay(d);
return 0;
}
Le client crée une connexion avec le serveur en appelant XOpenDisplay. Puis il demande la création d'une fenêtre avec XCreateSimpleWindow. Un appel supplémentaire à XMapWindow est nécessaire pour « mapper » la fenêtre, c'est-à-dire la rendre visible à l'écran.
Le carré est dessiné en appelant la fonction XFillRectangle. Toutefois, cette opération ne doit pas être effectuée qu'après la création de la fenêtre. En effet, la fenêtre n'a pas la certitude que son contenu sera préservé. Par exemple, si la fenêtre est recouverte puis découverte, il est possible que son contenu doivent être redessiné. Le programme est informé que tout ou partie de la fenêtre doit être redessiné grâce à la réception d'un événement Expose.
Le dessin du contenu de la fenêtre est par conséquent effectué au sein de la boucle des événements. Avant d'entrer dans cette boucle, les événement que l'application juge pertinents sont choisis, dans le cas présent avec XSelectInput. La boucle des événements attend l'arrivée des événements : si l'événement est l'appui sur une touche, l'application quitte ; si l'événement indique qu'une partie de la fenêtre est maintenant découverte, le contenu de la fenêtre est dessiné. La fonction XNextEvent est bloquante, et vide le tampon de sortie quand aucun événement ne se trouve dans la file d'attente.