用Xlib库进行基本图形编程(2)

陈着 posted @ Nov 04, 2009 10:22:39 AM in GTK+ , 13539 阅读
2.X Window系统的客户和服务器模型
X window系统开发之初有一个最大的目标-灵活性。想法是这样的东西看上如如何一回事,
东西如何工作的又是另外一回事。因而,底层提供在画窗口,处理用户输入,允许使用颜色
画图形(或者黑白屏幕)等动作中需要的工作。就这点决定了把系统分为两个部分。客户决定
作什么,而服务器实际在屏幕上画图并读出用户输入以发给客户进行处理。
这个模型正好和人们在客户和服务器中所习惯的行为相反。在我们的例子,用户坐在由服务
器控制的机器旁边,而客户可能运行于一个远程的机器上。服务器控制屏幕,鼠标和键盘。
客户可能连接到了服务器,发出画一个(或者多个)窗口的请求,并要求服务器把任何用户发
送给这些窗口的输入给他。因而,几个客户可能连接到了同一个X服务器-一个可能在运行e
mail软件,一个可能在运行WWW浏览器,等等。当由用户发送输入给某些窗口时,服务器向
控制这些窗口的客户发送消息以供处理。客户决定对输入作什么,并给服务器发送请求来在
窗口中绘图。
整个会话过程是用X消息协议执行的。该协议最初时由TCP/IP协议包执行的,允许客户运行
于任何和服务器连接在相同网络上的机器上。后来,X服务器被扩展为允许客户运行在本地
机器上更优的访问服务器(注意到X协议消息可能有几百KB那么大),比如使用共享内存,或
者使用Unix域sockets(一个在Unix系统上的两个进程间创建逻辑通道的方法)。
3.GUI编程-同步化的编程模型
不同于包含某种顺序化执行内质的传统的计算机程序。GUI程序通常使用同步化的编程模型
,也被称为“事件驱动编程”。这个意味着程序大部分时候时闲着的,等待由X服务器发送
的事件,然后根据这些事件作出反应。事件可能时”用户在点x,y处按下第一个按钮“,或
者时”你控制的串口需要重画“。为了程序能够响应用户输入以及刷新请求,它需要在一个
相当短的时间内处理每个事件(比如作为一个大体的规则,小于200毫秒)。
这也意味着程序可能不执行在处理过程也许需要很长时间的事件的操作(例如打开一个连接
到远程服务器的网络连接,或者连接到数据库服务器,甚至执行一个大文件的拷贝)。而是
,它需要同步化的执行所有这些操作。这可能通过使用各种同步模型来执行长时间的操作,
或者通过用不同的进程或者线程来执行他们。
因而GUI程序看上去大概是这样:
   1、执行初始化
   2、连接到X服务器
   3、执行X相关的初始化工作
   4、在没有结束之前:
        1、接收来自于X服务器的下一个事件
        2、处理事件,也许向X服务器发送多种绘画请求
        3、如果事件是退出消息,跳出循环
   5、关闭连接到X服务器的连接
   6、执行清理操作
4.基本的Xlib概念
为了消除程序事件实现X协议层的需求,一个称为‘Xlib’的库被创造出来。该库给程序提
供了一个对任何X服务器非常底层的访问。因为协议是标准化的,客户使用Xlib的任何一种
实现都可以和和X服务器通话。这些可能在今天看来没什么大用,但回到使用字符模式终端
和专有方法在屏幕上绘图的日子,这是一个很大的突破。事实上,你将注意到咱爱瘦客户,
窗口终端服务器,等等周围进行的各种虚伪的骗局。他们在今天实现X协议在80年代晚期已
经能够作的事情。另外一方面,X universe在玩一个关于CUA(共通用户感观,一个由IBM
制造的概念,指的是对所有程序使用共通的观感以使得用户能够更加轻松)的catch-up游戏。
没有共通的感观是X window系统创造者的哲学。明显,它有许多在今天看来显然的缺陷。
X Display

使用Xlib的最大的概念是X display。这是一个代表我们和一个给定X服务器打开的连接的结
构体。它隐藏了服务器的消息队列,客户将要发送给服务器的请求队列。在Xlib中,这个结
构体被命名为‘Display’。当我们打开一个连接到X服务器的连接的时候,库返回一个指向
这种结构体的指针。然后,我们把这个指针提供给任何需要发送消息给X服务器或者从这个
服务器接收消息的Xlib函数。
GC -图形上下文

当我们执行各种绘出(图形,文本,等)操作的时候,我们可能要指定几个选项以控制数据怎
么被绘出 - 前景色和背景色是什么,线的边缘如何连接,在绘出文本的时候使用何种字体
,等。为了避免给每个绘出函数提供n多参数,一个类型为‘GC’的图形上下文结构被启用
。我们在这个结构中设置各种绘出选项,并且把指向这个结构的指针传递给每个绘出函数。
这个是相当方便的,因为我们通常需要用相同选项执行好几个绘出请求。因而,我们初始化
图形上下文,设置所需的选项,并把这个GC结构传递给所有的绘出函数。
对象句柄

当各种对象被创造出来给X服务器使用 - 例如窗口,绘画区域和光标 - 相关的函数返回
一个句柄。这是实际存在于X服务器的内存中的对象的标识符。我们能够在后面通过把这些
句柄提供给各种Xlib函数来操纵这些对象。服务器保存了这些句柄和它们管理的对象之间的
映射。Xlib提供各种型别定义给这些对象(窗口,光标,色表等等),它们实际上最终映射为
简单的整数。我们在定义保存这些句柄的变量的时候仍然应当使用这些型别名-为了有更好
的可移植性。

为Xlib结构体分配内存

在Xlib的接口中使用了各种结构型别。他们中的一些直接由用户分配内存。其他的使用Xli
b函数分配。这使得库能够恰当的初始化这些结构。这非常方便,因为这些结构倾向于包含
很多变量,使得对于差劲点的程序员非常难于初始化它们。记住-Xlib尝试着尽可能的了灵
活,而且这意味着他也是尽可能的复杂。由缺省值使得初学X的程序员能够使用这个库,而
不打扰有经验的程序员在n多选项中作调整的可能。对于释放内存,由两种方法完成。在我们
分配内存的情况-我们用相同方法释放它们(也就是使用free()来释放由malloc()分配的内
存)。在我们用某Xlib函数分配的时候,或者我们使用返回动态分配的内存的Xlib查询方法
的时候-我们使用XFree()函数来释放这些内存块。
事件

型别‘XEvent’的结构被用来传递从X服务器接收来的事件。Xlib支持很大数量的事件型别
。XEvent结构包含接收事件的类型,以及与该事件相关的数据(例如事件产生的屏幕位置,
与事件相关的鼠标按钮,和‘redraw’事件相关的屏幕区域,等)。读取事件的数据的方法
和事件类型有关。因而,XEvent结构包含一个C语言对于所有可能事件型别的联合(如果你不
确知C的联合是什么,该是查查你的C语言手册的时候...)。因而,我们能够有一个XExpose
事件,XButton事件,XMotion事件,等。

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter