在X系统中,服务方并没有指定一个窗口管理器的操作规范,甚至可以不需要窗口管理器,与其有鲜明的对比的是,在其他的GUI系统中,如果没有窗口管理器,那么一个GUI应用甚至不能够正常的运行。
在X中,GUI的模型是一个客户端服务器模型。每一个客户端的绘图请求都要经过服务器,来操作硬件,这也代表着X实际上能够通过任意的连接,包括单不仅限于Linux套接字,TCP/IP连接。
一个窗口管理器,实际上本质仍然是一个普通的客户端程序,没有任何内核支持。唯一区别普通窗口程序和窗口管理器的是,窗口管理器可以使用一些X中的特殊接口来和服务器进行通信。同时,用户程序首次使用这些接口将会成为窗口管理器,此后,X将不再允许任何用户程序再使用这些接口,也就是说,在同一时间内,只允许存在一个窗口管理器。
在缺少窗口管理器的X中,任意的窗口都可以自由的绘制自身,像最大化,最小化,调整窗口尺寸等等,但是有了窗口管理器,这些顶级窗口想会被X server重定向到窗口管理器,此时,任何的顶级窗口的请求将会被服务器转发给窗口管理器,由窗口管理器进行处理,包括修改请求或者直接拒绝该次请求。
需要注意的是窗口管理器实际上并不会管理顶级窗口下的任何子窗口,他们的绘制仍然是自由的。
X可以保证在每一块屏幕下只有一个窗口管理器在运行。在这时,如果存在一个顶级窗口的请求,那么服务器就会将其重定向到窗口管理器中,实际上,应用程序根本不需要添加任何额外UI元素,窗管会根据应用程序的大小给其适配一个title bar,其中就包含了最基本的缩放,最小化和关闭按键。此时这个顶级窗口实际上会被调整父窗口的属性,实际上,原本产生的顶级窗口都会由窗口管理器新生成一个顶级窗口并且刚好能够容纳其大小加上标题栏,而这个新生成的顶级窗口就会成为原来窗口的父窗口,以至于原先的顶级窗口不再是顶级窗口了。这点非常重要,因为窗口管理器并不能控制顶级窗口以下的任何后代窗口,如果该窗口需要调整大小的话,那么窗口管理器就无法接收到消息及时调整的大小,以至于多出来的部分会被截断。
对此的解决方案是,将原本的窗口在进行一次重定向,将其再一次使得其能够被窗口管理器接收到通知事件以便于对其进行调整。