Xwindow 杂谈----(1)
这篇文章是关于Xwindow的杂谈,我或许有很多的东西要说明。每个要说明的东西都是一些独立点。所以显得有点杂乱,故取名杂谈。
我写这篇文章的目的是将我做eGUI过程中学习Xwindow的一些心得告诉大家。
我的联系方式:[email protected],www.egui.org,www.akaedu.org 研发部。希望大家多交流。
关于Xwindow的学习,大家可以看看 《Xwindow 系统使用指南》《xlib manual》。
1. Display *XOpenDisplay(display_name)
char *display_name;
理解XOpenDisplay,这个函数的作用是打开一个显示。
大家都知道X11(Xwindow),是server/client模式。
客户端运行前,需要启动server。Xserver,支持多个Xserver同时运行,
并且可以支持在多个 screen (screen 是指显示器,一般一个显卡对应一个显示器,有的一个显卡支
持多个显示器)。
C/S结构通过网络通讯。所以基于以上原因,我们应用程序需要确定显示的server是什么?
* hostname; 对应的服务器的网络IP。
* server ;对应的Xserver启动号。
* screen ;对应的显示器。
hostname,screen我都解释过了。
那么server是什么呢?是指“Xserver,支持多个Xserver同时运行”
当我们运行
bash # X &;X
肯定会报错。系统提示你,已经运行了一个Xserver.
有没有人这样做过呢?
bash # X& ;X :1
如果你做了这个实验,你会发现。系统在控制台7和控制台8上都有Xserver。
(关于控制台7,8我要申明的是:RedHat Linux 系统启动后默认启动 6个字符终端)
现在大家理解了server了吗?
那么我们看看 xlib manual对display_name参数的说明: hostname:number.screen_number
这里hostname和我说的hostname相同,number就是我结识的server,screen_number就是screen
如果大家写程序的时候没有设置 char *display_name;也就是说 XOpenDisplay参数为空,那么系
统会从DISPLAY环境变量去寻找参数。
现在大家理解了,当你启动了Xserver,再从另一个控制台启动xterm为什么出错了吧?那就是你的DISPLAY环境变量没有设置好。 2. XWindowAttributes;
typedef struct {
int x, y; /* location of window */
int width, height; /* width and height of window */
int border_width; /* border width of window */
int depth; /* depth of window */
Visual *visual; /* the associated visual structure */
Window root; /* root of screen containing window */
int class; /* InputOutput, InputOnly*/
int bit_gravity; /* one of the bit gravity values */
int win_gravity; /* one of the window gravity values */
int backing_store; /* NotUseful, WhenMapped, Always */
unsigned long backing_planes; /* planes to be preserved if possible */
unsigned long backing_pixel; /* value to be used when restoring planes */
Bool save_under; /* boolean, should bits under be saved? */
Colormap colormap; /* color map to be associated with window */
Bool map_installed; /* boolean, is color map currently installed*/
int map_state; /* IsUnmapped, IsUnviewable, IsViewable */
long all_event_masks; /* set of events all people have interest in*/
long your_event_mask; /* my event mask */
long do_not_propagate_mask; /* set of events that should not propagate */
Bool override_redirect; /* boolean value for override-redirect */
Screen *screen; /* back pointer to correct screen */
} XWindowAttributes;
有一定窗口设计经验的人都知道,一个窗口有很多描述。例如:x,y,width,height。一看就知道。我就不
多说了。
从图形库和窗口设计角度我要和大家谈谈 map_state。它有如下三个值。
* IsUnmapped 没有被允许显示;
* IsViewable 可以显示;
* IsUnviewable 这个窗口被设置为可显示;但是他的父辈不能显示。
当一个窗口被建立时他们的属性是:IsUnmapped;当使用XMapWindow,函数后表明该窗口可以显示。
属性应该:IsViewable。 但是当它判断它的父辈的map_state != IsViewable;他应该为:
IsUnviewable。 我是,
neogreat? 是?当年做cnix的朋友?
我的邮件[email protected]
页:
[1]