The ICCCM, or Inter-Client Communication Conventions Manual, is a part of the X11R6 distribution of the X Window System. It specifies how an X client ought to interact with other clients, including the window manager. This specification is important to those who create programs or toolkits using Xlib, as well as those who write window managers such as fluxbox or elightenment. It is fondly called "Ice Cubed" or I39L. (I, 39 letter, L.)
Why is the ICCCM necessary?
The X Window System protocol specification only provides a mechanism for the creation and use of windows; the ICCCM provides behavioral standards to make this mechanism useful. The protocol itself does not provide the user with features like minimization, iconization, resizing, or advanced uses like virtual desktops. Other important aspects of the ICCCM include handling selections and session management. Programs are expected to abide by these rules, and those that do not should (rightfully) be hated by users.
What is the technical basis of the ICCCM?
The ICCCM specifies its rules in terms of the core X protocol, rather than via Xlib or Xt, because clients do not have to use these libraries. The principle mechanism used is the atom, which is basically a named piece of information stored on the X Server. A means for providing a window manager with control over client windows is through allowing the wm to catch events (such as a mouse click or keypress) which would otherwise be sent to the client. This makes the document quite free of code, and very readable even to those not familiar with the protocol.
What does the ICCCM specify?
Selections are familiar to anyone who uses a word processor or web browser. Selections are handled by using atoms with pre-defined names. The names PRIMARY, SECONDARY, and CLIPBOARD have certain general uses, and related client windows are encouraged to have their own names for selection atoms. The transmission of selections between clients is regulated by a simple protocol that allows clients to describe the data being passed and how it can be used. This is a necessary oversimplification; read it yourself for details.
Chapter 4 of the ICCCM covers the rules that clients should follow in order to conform to the reign of the window manager. Again, these use atoms as messengers between the client and the manager. The topics covered are seperated into client requests, such as to move or resize one of their windows, as well as window manager requests to clients, such as iconization and minimization. Essentially, this section mentions everything to do with how both Window Managers and clients should act toward each other.
Others: Resource management, session management, cut buffers
There are a few other topics covered. Session management describes the hoops a client must jump through to preserve a window between sessions (such as before logging in or after logging out). Cut buffers are another method for communication related to selections. Resource management has to do with keeping mouse and keyboard control squarely in the hands of the user, and with other more technical things. These topics are not unimportant, but they don't inspire the interest of selections and window management.
Should X[sic] program comply with ICCCM?
If you are using a widget set or toolkit such as GTK+, QT, or many others, the programmers of those toolkits have already done you the favor. If you are writing an application in Xlib, though, you will have to pay attention to this, which a good reason not to do so. If you are writing a window manager or (I believe) a display manager (e.g. xdm, kdm), of course, you need to follow the specifications for those pieces of software.
Too little, too late?
In modern times, systems like X should be used for building higher level, integrated systems, rather than bitching about how X itself does not provide for beautiful, perfect client interaction.
There are a lot of objections to the X Window System, many of them having to do with lack of standards. Before ICCCM, of course, every program or set of programs was different. These days, most programs implement a significant amount of ICCCM supported high level behaviour, or interact through other means specific to the desktop environmnet or tooklit for which they were written. But X only provides low level windowing capabilities and certain low level management standards. The rest has been quite intentionally left to desktop environments.
- View the ICCCM in HTML: http://tronche.com/gui/x/icccm/
- The X Consortium: http://www.x.org
- The Open Group: http://www.opengroup.org