X 随笔
Posted 半吊子全栈工匠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了X 随笔相关的知识,希望对你有一定的参考价值。
从人机交互到用户界面,从GUI到窗口系统,进而到X 系统。从X 系统的设计思想,到Xserver和Xclient以及X11协议,一直到窗口管理器乃至wayland。温故知新,那就从用户界面开始吧!
1. 从用户界面开始
用户界面(User Interface)是进行人机交互活动的系统部件,是人与计算机通讯与对话的接口。早期的计算机是通过面板上的指示灯来显示二进制数据和指令,人们则通过面板上的开关、扳键及穿孔纸带送入各种数据和命令。50年代中后期,由于采用了控制台及打字机等设备,使计算机可以批处理多个计算任务,从而代替了原来笨拙的手工扳键方式,提高了计算机的使用效率。
1963年,美国麻省理工学院在 709/7090计算机上成功地开发出第一个分时系统,该系统连接了多个分时终端,并最早使用了文本编辑程序。从此,以命令行形式的多用户分时终端成为70乃至80年代用户界面的主流。
20世纪80年代初,由美国施乐公司在Alto计算机首先使用Smarttalk-80程序设计了开发环境,以及后来的Mactosh等计算机,将用户界面推向图形用户界面的新阶段。随之而来的用户界面管理系统和智能界面的研究均推动了用户界面的发展。
GUI的核心特征是WIMP:
W(window)指窗口,是用户或系统的一个工作区域,一个屏幕可以有多个窗口。
I(icons)指图标,是形象化的图形标志,易于人们隐喻和理解。
M(menu)指菜单,可供用户选择的功能提示。
P(pointer)指鼠标器等,便于用户直接对屏幕对象进行操作。
GUI采用了不少桌面办公的隐喻,应用者共享一个直观的界面框架。人们熟悉办公桌的情况,因而对计算机显示的图标含义容易理解,诸如 文件夹、收件箱、画笔、工作簿、钥匙及时钟等。采用GUI后,用户可直接对屏幕上的对象进行操作,如拖动、删除、插入以至放大和旋转等。执行操作后,屏幕能立即给出反馈信息或结果,实现了所见即所得。
2. 关于GUI的点滴
一个GUI系统通常由三个基本层次组成。它们是显示模型,窗口模型和用户模型。用户模型包含了显示和交互的主要特征,因此,图形用户界面这一术语有时也仅指用户模型,这也是一个令人误解的地方。
最底层是计算机硬件平台,如Intel,PowerPC等,硬件平台的上面是计算机的操作系统。大多数图形用户界面系统都只能在一两种操作系统上运行,只有少数的产品例外。操作系统之上是图形用户界面的显示模型,它决定了图形在屏幕上的基本显示方式。不同的GUI系统所采用的显示模型各不相同,例如,大多数在Unix/Linux 之上运行的图形用户界面系统都采用 X窗口作显示模型 ,MS windows 则采用公司自己设计的GDI作为显示模型。
显示模型之上是GUI系统的窗口模型。窗口模型确定窗口如何在屏幕上显示,如何改变大小,如何移动,及窗口的层次关系等。它通常包括两个部分,一个是编程工具 ,另一个是对如何移动,输出和读取屏幕显示信息的说明。因为X窗口不但规定了如何显示基本图形对象也规定了如何显示窗口,所以它不但可以充当图形用户界面的显示模型,也可以充当它的窗口模型。
窗口模型之上是用户模型,图形用户界面的用户模型又称为GUI的视觉感受。它也包括两个部分 :构造用户界面的工具和对于如何在屏幕上组织各种图形对象,以及这些对象之间如何交互的说明。例如,每个GUI模型都会说明它支持什么样的菜单和什么样的显示方式。
GUI系统的应用程序接口由其显示模型,窗口模型和用户模型的应用程序接口共同组成。
GUI 系统一般分为三类:
基于操作系统内核的GUI:这类GUI的绝大多数功能都与操作系统的内核融合在一起,图形用户界面与操作系统密切配合,协调工作,来实现系统管理,应用程序采用系统调用的方式来完成对窗口的各类操作。这类图形用户界面主要实现于个人机环境,如苹果的Mac 。虽然图形用户接口与操作系统的紧密结合给GUI的开发带来了方便,但是这类图形用户界面依附于特定的操作系统与硬件支撑环境,使得GUI变得不易修改、难扩展、可移植性差。
基于CS模型型的GUI:这类GUI由与硬件直接相关的服务器部分和与硬件无关的客户部分共同组成,实现了GUI的设备独立性。当面对不同的硬件环境时,仅仅需要修改直接操作硬件的服务器部分,因而具有较好的可移植性。这一类图形用户界面的代表是 X window。
基于库函数的GUI:这类GUI实现于操作系统的上层,可视为操作系统的扩展,它以库函数的形式提供给对窗口进行操作的应用程序进行调用。这种图形用户界面比较容易修改、扩充和移植。但在其基础上编制的应用程序还是与操作系统强相关,并对它的移植带来了一些障碍。这类GUI的典型产品是 MS windows 。
3. 窗口系统
窗口系统是在屏幕某限定区域管理程序输入和输出的一组工具。它与操作系统类似,操作系统管理的是存储空间和I/O设备,而窗口系统管理的是窗口、事件、文本的输入、文本和图形的输出以及各种对象属性;操作系统用调度算法和I/O封锁来调度,窗口系统使用用户生成的事件来调度。
所谓窗口,是指屏幕上的一块矩形区域,用户通过窗口可以显示、观察其区域内的全部或部分内容,并可以对所显示的内容进行各种系统预先规定好的正文或图形操作。一般把窗口称为虚拟屏幕,把显示器称为物理屏幕。现代窗口系统支持多窗口重叠显示,这必然涉及到各个窗口在屏幕上的叠放顺序,一般采用一种称为窗口“Z序”的机制来进行管理。“Z序”实际是相对屏幕坐标而言的,假设一根过屏幕原点垂直于屏幕的Z轴,它由外指向屏幕内,窗口在这个Z轴上的值就确定了它的Z序, Z序值大的窗口覆盖了Z序值小的窗口,因此, Z序实际定义了各个窗口在屏幕上的层叠顺序。
窗口管理技术是屏幕管理技术的核心,在实现时首先要定义一个窗口的数据结构。各类窗口风格迥异,但它们的基本信息都可以归纳为下面几类:
标志信息,作为一个窗口的标志,以正整数表示,不同的窗口,标志不同。
风格信息,表示窗口的显示风格。
位置信息,描述窗口及其各个组成部分在屏幕上的位置。
内容信息,包括窗口内各组成部分相关的数据,如菜单等。
图像信息,存放与窗口相关的屏幕图像,如窗口的图标。
父子信息,指一个窗口的父窗口和其子窗口的信息。
消息过程,指窗口对各种消息的处理函数。
窗口管理提供了一组工具函数,实现对窗口的创建、关闭、删除等基本操作功能,此外还实现设置、获取窗口属性、移动等控制窗口的功能。这里要注意的是,对窗口进行创建、关闭、等操作时,要相应修改系统的窗口Z序链表以及各个有关窗口的信息。
4. X window
X window是由麻省理工学院推出的窗口系统,1984年发行了其最早版本,简称X,旨在建立不依赖于特定硬件系统的图形和文字显示窗口系统的标准。X window是一个图形显示、服务和管理系统,包含了光栅图形技术、用户界面技术、操作系统技术和计算机网络技术,为用户提供了一个灵活多样的交互式图形界面。X window完善的管理功能和高效的程序开发环境也成为一个事实上的工业标准。
从一般用户的视角看, 窗口系统具有下述特征:
支持实现不同风格的用户界面
具有网络透明性
本身独立于显示设备和输入设备
支持并行显示和多程序并行运行
支持重叠型和瓦片型窗口
提供了多种窗口管理器,但系统中只能有一个活动的窗口管理器
具有很好的可扩展性
从软件开发者的视角看,窗口具有下述特征:
提供了多种资源及其管理机制。
窗口系统的资源包括屏幕、窗口、象素映象、调色板、字体、光标、设备及绘图属性集。
提供了基于网络的窗口协议提供了各类库函数、工具箱和对象类等编程机制,将窗口环境下的各种动作或行为抽象为请求和事件,并提供了相应的数据流和管理机制,大大简化了程序设计工作。
5. X 系统的设计思想
X窗口系统设计思想是创立一个与系统硬件无关的图形界面接口(简称GUI)并且能够通过网络进行完全扩展的系统。因此X窗口系统设计上遵循Client/server模式该模式满足了X窗口系统的完全可扩展性,在网络上采用了X协议封装实现了网络的透明性。
X窗口系统的Server负责管理所有与显示有关的资源,不同的硬件平台往往对应不同的Server,因此,X Server是与硬件相关的,往往由硬件厂商提供其驱动。另一方面,由于X窗口系统是基于事件驱动的,因此X Server会将诸如鼠标移动等驱动事件传送给客户机。Client根据程序需要负责向Server提出服务请求,Server根据Client的请求将涉及图形部分显示在显示设备上,并将服务请求结果回送给客户机整个流程。因此,X Server的设计是由厂商完成,而Client是由用户设计,并通过X Server完全将显示设备和客户机隔离开来,使Client具有可移植性。
X Client的设计是通过调用Xlib库来实现对服务器的服务请求,从Xlib中调用函数,并将请求采用X协议封装通过网络传递给X Server,X Server负责依次将请求传递给指定设备,由设备负责处理。Xlib开发X Client的工作量非常大,在X窗口系统的设计中经常使用Xt库和窗口组件集。Xt库提供了多种用于容纳数据和提供用户界面的对象,称作组件或Widget,并管理Widget的几何特性和事件处理。在Xt库提供的Widget基础上,窗口组件集是建立了一些基本的Widget类和专门化的Widget子类,用以完成用户界面的各种功能,常见的窗口组件集有Motif、Athena、Qt和Gnome等库。
6. X server
X Server 是一个跟踪所有输入信息的程序,这些输入信息来自键盘和鼠标器等输入设备及任何正在运行的其他客户程序。服务器起到客户应用程序和本地工作站硬件之间的媒介的作用执行下列任务:
允许多个客户程序访问多屏工作站
·解释理解从客户程序来的网络消息
通过发送网络消息把用户的输入传送给客户程序
绘制二维图形,这些图形是由多屏工作站服务器而不是由客户程序完成的
把复杂的数据结构 ,包括窗口 、光标 、字体和图形信息作为资源来维护,由服务器维护资源就减少了由每个客户程序维护的数据量 , 也减少了必须在网络上传送的数据量
从结构的观点看,X Server可分为三个层次:顶层是与设备无关部分,负责接收和解释符合协议格式的客户请求消息,中间层是与操作系统相关部分,这部分使能接口到特定的操作系统;低层是与设备相关部分,这是特定支持硬件的设备驱动程序集。
X Server 通过X协议与客户程序的X协议 xlib接口通信,有四类通过协议传递的信息:请求、响应、事件和错误。协议请求由xlib产生并送到服务器,请求可以携带各种各样的信息,如一个画线说明,对当前某个窗口尺寸的询问等。服务器把协议对某些请求的响应送给xlib,不是所有的请求都能通过响应得到答复,如画图请求就不产生答复。事件是服务器传给xlib的,它含有关于某个设备动作的信息,事件是客户程序用以获取信息的主要手段。错误有两种,一种是可恢复性错误,另一种是致命性错误,由服务器发送到xlib的某一个错误管理库程序。
在这四种信息包中,请求和事件是主要的,Xlib先将请求存储起来,不是立即送给服务器,在适当的情况下再送到请求缓冲区的内容到服务器中。一旦用户引发了事件,而且网络允许,服务器就把事件送往xlib,xlib为每个服务器管理一个事件队列,每当来自服务器的事件到达,就被排队,等待客户程序读取。
7. X client
Xlib是X窗口系统的C语言编程接口,是向应用程序提供底层的编程接口。Xlib把参数封装为协议请求,通过IPC机制发送给服务器进程。Xlib共有320多个函数,可分为系统功能(连接的建立和拆除等)、窗口功能(窗口属性与操作)、图形功能(图元、图形属性、正文字体、区域、图像等)、色彩功能(颜色表操作等)、时间功能(输入时间及窗口事件)及其它功能(使用函数等)。
X Client不用标准的 C 函数来获取输入,而是接收事件,然后根据事件类型发生分支,执行适当的响应。传统程序是由程序控制,在确定的时间查询确定类型的输入。X 程序绝大多数情况是由 用户控制,在任何时间为任何类型事件的发生做好准备。
事件在 X 应用程序编程中处于中心地位。X Client使用事件与服务器或其他客户端进行通信。从程序员的角度看,一个事件可以包含很多信息:
应用程序想获取的信息,比如用户输入、其他客户端传来的有用信息。
其他客户端想知道你的应用程序正在做的一些事情,比如将可用文本传输给第三方客户端。
窗口管理器想知道的一些信息,比如在映射视窗时,应用程序发送的一个想改变屏幕布局的请求报文。
X Client对事件的处理过程分为三步:首先,选择每个视窗都需要的事件。然后,将视窗映射到屏幕上。最后,当事件产生后,应用程序提供一个事件循环(Event Loop)来从事件队列中一一读取事件并处理之。这个过程非常简单,唯一复杂的因素是各种事件可能同时发生,而且同一事件在不同的视窗发生可能具有不同的意义。所以,必须要了解每个事件产生的特定环境来确保应用程序会采取正确的行为来处理它。
8. X 协议
X Window系统网络协议即X11协议定义了在客户和服务器之间传送信息所使用的数据结构即信息格式定义。它是一个基于流处理通信而不是基于过程或核心调用的异步接口。X11的实现有许多种,其中用C语言实现的函数库Xlib提供了直接访问协议的原语,提供了信息交换的能力。
X.11.3共有120多个请求,且具有可扩充性,描述了客户与服务器进程通信的结构、语法及语义。X 协议的主要特点如下:
协议将用户接口事件和核心窗口系统本身分开,就是窗口管理器与图形用户接口的模式,这一特点表现在协议本身与用户接口的策略无关。简而言之,接口策略即为各个窗口在显示终端的布局,窗口大小、位置的控制,这些策略在一个高级程序中由应用程序本身去完成。窗口的动态布局管理是由窗口管理器来完成的,这一特点有利于实现与操作系统和显示没备无关。
协议提供了网络透明性,开发者使用协议函数而不需了解下层的网络如何完成各种数据和管理信息传输。
为了减小网络开销,提高网络性能,客户和服务器之间的通信是异步的。也就是说,在客户和服务器之间传送的大多数报文不必直接由对等实体给出应答。当一个报文被客户或服务器发送后,接收和处理都被默认为正确地进行。这个假定加快了X11的操作,因为在假定网络传输是可靠的情况下,客户或服务器不必等待X11应答。实际执行所带来的迟延如果超过一定限度,则协议规定重发请求。
提高网络性能的另一种方法是将许多相关的请求或应答合成一组用一个数据包分组发送,这大大缩小了在网络中传输的分组个数。基于这一特点,X11协议有时也被称为面向块的协议,不同的实现解决服务数据包的分解和重组的方法有所不同。
用OSI的观点来看,X11被认为是一个支持分布式应用的协议,但该协议并不提供太多的诸如中的第一层到第六层所提供的服务,因此被认为最接近应用层。但由于X11在中存在着表示层数据表示,会话层维护一次会话,确定异步请求和应答的特点,很多人认为相当于参考模型中的上三层,而其本身应作为运输层上的一个模块。另一种观点是从严格的OSI七层结构出发,认为X11仅仅能作为一个应用层中的应用服务元素,并将它的服务原语映射到联系控制服务元素以及表示层服务上。应用层映射观点则代表了将 X系统映射到 OSI模型的战略方向。
9. 窗口管理器
在Xwindow系统中,窗口管理器是一种特殊的客户端程序,其功能是将服务器和客户端之间的交互数据重定向到窗口管理器中,所以,窗口管理在GUI体系结构中处于中间角色。
窗口管理器是决定X外观风格的重要程序,能够改变窗口的大小或位置、将窗口在堆叠中重新安排位置、或将窗口改变成图标等等。在X中,窗口管理器类似于Linux系统中的shell命令行解释器:shell只是一个用户进程,如果改变它也就改变了系统的用户界面。
但是,窗口管理器和X的关系与shell和命令行的关系还是有本质上的不同。简单一点,没有窗口管理器也可以使用X,只不过界面简陋一点,使用不太方便;但没有了shell就没有了命令行。窗口管理器除了具有管理窗口的基本功能外,还改进了界面的品质。原来的目的是为了降低键盘输入的需要,而改成尽量多地使用鼠标。一个常见的功能是提供一个自己可以建构的一般性菜单,只要选取一个菜单选项便可启动窗口应用程序。这个启动的命令通常包含了指示应用窗口在何处出现、大小多少、文本用什么颜色等等,使用者不需要输入很多的信息便能启动应用程序。
窗口管理器和客户端之间遵循ICCCM协议,大多数通信建立在父窗口的属性之上,也可以通过窗口管理器产生的事件进行通信。Shell处理客户端和窗口管理器之间的通信,客户端不需要直接处理属性或事件,通过设定Shell的资源来指定窗口的属性。
X Client 应用程序可以最小化成图标。图标的结构常简单,只是窗口的代表图案,当系统图标化一个应用窗口时,窗口管理器告诉 Server 不再显示这个窗口到屏幕 上。窗口管理器通常提供预设的图标,但是 Client 应用程序可以提供它自己的图标并建议使用,有些窗口管理器接受这个要求,有些则不接受仍采用自己的图标,只把这个需求当作给窗口管理器的提示。
就如同要求显示一个特定的图标一样,应用程序也能传递其他的提示或信息给窗口管理器,这包括:
应用程序和图标窗口的名称
当应用程序和图标窗口被建立时它们在屏幕上的位置信息
对窗口大小的限制(例如xClient可以要求“所占用的窗口长度/宽度不得少于多少”)
对窗口重定大小的特别要求
这种将信息传递给窗口管理器的机制称之为属性机制。大部分重定大小或图标化的工作是通过窗口管理器实现的,这是因为它是一个公有的 Client。从理论上来说,任何Client均可随意重定自己的大小,但如果所有Client都这样做,便会造成不必要的混乱。因此,要这些应用程序和平共存的原则是:不要自行重定大小,把它交给窗口管理器也就是让用户去决定。
窗口管理器负责以下3个核心任务:
接受窗口进入的消息,并使消息正确路由至目的窗口并触发窗口过程;
更新活动窗口和焦点窗口控件;
维护窗口的序列和各个窗口的剪切矩形链,正确进行窗口重绘,执行窗口过程。
当使用窗口管理器时,服务器并不直接和其他客户端通信,而是通过窗口管理器中转,当一些消息被定义为WM指令时,它们会被拦截。
X Window努力做到和桌面(Desktop Enviroment)分离, 但还是出现了很多功能上的重合,很多桌面提供者都开始自己制作窗口管理器,并与桌面直接捆绑在一起,例如GNOME 和KDE。
KDE的价值不仅在于它包含了窗口管理器、文件管理器、工具面板、控制中心以及其他用户想得到的现代桌面系统应包含的组件,其真正的力量体现在内部各组成部分之间的互操作能力。KDE试图建立一个桌面环境,而不只是一个窗口管理器。KDE达到了令人惊讶的成熟程度,但由于KDE基于的QT库的许可证问题,有些人拒绝使用它。所幸的是QT库已开放源代码,但好像还是没有变成是基于GPL的方式。
GNOME是GNU网络对象模型环境的缩写,项目的目标是在完全基于免费软件的基础上建立一个完整的、用户友好的桌面环境。GNOME是GNU项目的一部分,同时也是开放源码运动的一部分,包含一组有一致外观的小工具和大的应用,所有应用程序都使用GTK+作为其GUI工具箱。GNOME并不与某个窗口管理器绑定,它的组件之间的互操作性不限于应用,而是可以跨越计算机和系统平台,因为它采用了公共对象请求代理结构(CORBA)。同时,它基于的GTK+库是完全免费且开放源码的,这和Linux的哲学一致。
10. 从X 到 Wayland
X11已经很古老了,X server协议提供的大部分功能不再使用,X11所做的几乎所有工作都重新分配给了各个应用程序和窗口管理器。
Wayland 由X Org开发人员Kristian Hogsberg于2008年作为个人项目开始。它是一种通信协议 ,用于指定显示服务器与其客户端之间的通信。Wayland最初是作为一个免费的开源项目开发的,目的是用现代、安全和简单的窗口系统代替X11。
在Wayland中,Compositor是一个窗口管理器,它为应用程序提供每个窗口的屏幕外缓冲区。窗口管理器将窗口缓冲区合成为代表屏幕的图像,并将结果写入显示内存。Wayland协议允许合成器将输入事件直接发送到客户端,并让客户端将事件直接发送到合成器。与X情况一样,客户端在接收到事件时会作为响应更新用户界面。但是,在Wayland中,渲染发生客户端,并且客户端只是向合成器发送请求以指示已更新的区域。Wayland的”直接渲染架构”彻底结束了传统X 系统在渲染图形时需要不停的向Server请求、确认再绘制这个繁琐的过程,理论上响应速度有了本质的增长。
也就是说,Wayland从根本上消除了”Server+Compositor”的重复劳动,仅有且只需要有一个”Compositor”合成器而已。Wayland Compositor的角色,就像是”X Server”+”Window Manager”,但它只做自己分内之事而已。Wayland构架简单高效,试图解决”X Window”发展这么多年来积累的、通过“扩展”去解决的那些问题。
但是,到目前为止,现有的绝大多数应用程序都是为X编写的。在移植所有这些应用程序之前,需要维护Xorg,与Xorg相比,Wayland还不是很稳定。
【参考资料与关联阅读】
https://www.x.org/wiki/
https://wayland.freedesktop.org/
https://en.wikipedia.org/wiki/Wayland_(display_server_protocol)
http://www.gnome.org
http://www.kde.org
https://blog.csdn.net/a8039974/article/details/122867167
以上是关于X 随笔的主要内容,如果未能解决你的问题,请参考以下文章
如何摆脱(Android Asset Studio - 图标生成器)中的透明背景空间?