窗口管理器(Window Manager)
这篇文章可以看成是一个备忘录,分别从两个角度来描述了有关窗口管理器的一些信息。首先是从用户的角度来看,接着从技术的角度来探讨有关窗口管理器的一些问题。
什么是窗口管理器
-
是X11/Linux上的一个概念,windows似乎没有这种东西。技术上说它是一个X11的客户端程序,没有走后门,通过标准的X11技术来管理顶层窗口的请求、大小、位置、层次关系等。并且根据口味、窗口类型等信息决定是不是要给顶层窗口提供边框,标题栏、状态栏等界面元素。不同的窗口管理器外表上看可能千差万别。
-
所以窗口管理器是 一个X11客户端程序,它控制其他图形程序的外观和行为方式:边框、标题栏、大小、布局等以及允许对窗口进行调整大小、位置的等操作(通过鼠标或快捷键)。
-
窗口管理器有几种分类方式:
按照管理窗口的方式:
-
堆栈式窗口管理器(stacking window manager):最常见的方式,窗口按层次排列,有前有后,可以通过快捷键、鼠标点击等方式交换前后位置的两个窗口。
-
平铺式窗口管理器(tiling window manager):基本上窗口之前不会有前后重叠的部分,每个窗口占用的屏幕区域不会交错。
-
动态?就是兼顾上面两种能力的。
主流都是堆栈式,很多小众的都是平铺式。也可以用另外一种方式分类:
-
混成式窗口管理器:offscreen渲染(因此可以获取缩略图),alpha混合透明化,甚至各种动画效果。
-
非混成式窗口管理器:客户端窗口根据服务器报告的expose事件重绘窗口部分区域,X11服务器并没有保存窗口内容的离线位图。
-
为什么要使用窗口管理器
-
首先想想看没有是什么样的,可以自行脑补:一般就是没有标题栏,没有边框,背景黑压压的一片,窗口之间没有明显的界限,没有圆角(或者有锯齿的圆角),没有透明等等。但是有些例外,比如使用gtk+的程序有一个趋势,就是绕过窗口管理器自己来绘制边框和标题栏。然后常规的操作可能不起作用,比如鼠标点击最大化,最小化,移动,改变大小等,也即无法进行交互。同时也没有输入焦点(跟随鼠标),也就是说很难切换到一个窗口里进行输入。
-
有是什么样的:可能有好看的桌面背景,可能有标题栏,可能有边框,大部分时候可以鼠标点击最大化,最小化,移动,改变大小等。可能有透明(取决于是否使用了混成器),反锯齿的窗口圆角等。可用通过鼠标点击使一个被遮挡的窗口置顶,获得焦点(当然不是唯一的方式)并且能够输入。
-
从外观怎么区分有没有窗口管理器:看经验,看外表。比较悲观的是有时候可能是区分不出来的,尤其是在使用一些所谓的平铺窗口管理器的时候。很多情况下,如果你使用一个窗口管理器的时间够长,那么还是有一些方法从表像来判断的。
窗口管理器提供了什么
直观上,一般会在client上加入边框和标题栏,并且有丰富的样式,支持漂亮的主题,并且用户至少能够定制某些外观。但是也不一定,比如大多数平铺窗口管理器等就不提供标题栏,比如有些窗口类型是splash,tooltip等等也不会有标题栏。所以说不同的窗口管理器会有不同的视觉风格。
-
管理大小:窗口的大小变化会有很多因素的共同影响:窗口自己的要求,工作区的大小,workarea的范围,窗口管理器的想法等等。
-
调整位置:同类型的窗口,一般窗口管理器会有规律的排列,类似瓦片堆叠的效果。不同类型的窗口,窗口管理器一般会尽量分散到workarea各处。当然,这只是一类窗口管理器的做法。