二、X11基础——创建一个基本窗口
8 Creating A Basic Window - Our “hello world” Program
在我们获得一些窗口的基本信息之后,我们就可以开始创建我们的第一个窗口了。Xlib支持好几个函数来创建窗口,它们其中的一个是XCreateSimpleWindow()。这个函数使用很少的几个参数来指定窗口的尺寸,位置等。以下是它完整的参数列表:
/* 指向显示结构的指针 */
Display* display
/* 新窗口的父窗口的ID。 */
Window parent
/* 窗口的左上X坐标(单位为屏幕像素) */
int x
/* 窗口的左上Y坐标(单位为屏幕像素) */
int y
/* 窗口的宽度(单位为屏幕像素) */
unsigned int width
/* 窗口的高度(单位为屏幕像素) */
unsigned int height
/* 窗口的边框宽度(单位为屏幕像素) */
unsigned int border_width
/* 用来绘制窗口边框的颜色 */
unsigned long border
/* 用来绘制窗口背景的颜色 */
unsigned long background
让我们创建一个简单的窗口,它的宽度是屏幕宽的1/3,高度是屏幕高的1/3,背景色是白色,边框是黑色,边框的宽度是2个像素。该窗口将会被放置到屏幕的左上角。
/* this variable will store the ID of the newly created window. */
Window win;
/* these variables will store the window's width and height. */
int win_width;
int win_height;
/* these variables will store the window's location. */
int win_x;
int win_y;
/* calculate the window's width and height. */
win_width = DisplayWidth(display, screen_num) / 3;
win_height = DisplayHeight(display, screen_num) / 3;
/* position of the window is top-left corner - 0,0. */
win_x = win_y = 0;
/* create the window, as specified earlier. */
win = XCreateSimpleWindow(display,
RootWindow(display, screen_num),
win_x, win_y,
win_width, win_height,
win_border_width, BlackPixel(display, screen_num),
WhitePixel(display, screen_num));
如果想察看目前为止我们所举的例子的代码,请参看源程序src/01_simple_window.c。你将会发现两个新的函数 - XFlush() 和XSync()。函数XFlush()刷新所有处于等待状态的请求到X服务器 - 非常像函数fflush()刷新所有的内容到标准输出。XSync()也刷新所有处于等待状态的请求,接着等待X服务器处理完所有的请求再继续。在一个一般的程序里这不是必须的(据此你可以发现我们什么时候只是写一个一般的程序),但我们现在把它们提出来,尝试在有或没有这些函数的情况下程序不同的行为。
XFlush和XSync不同
-
XFlush: 该函数的主要目的是将任何还未发送到X server的缓冲区中的命令强制发送出去。这意味着,如果有任何挂起的请求(例如创建窗口、绘图操作等),它们会被立即发送到X server,但不会等待这些命令被执行。
-
XSync: 该函数不仅会发送任何挂起的请求到X server,而且还会等待直到X server处理完所有的请求。这意味着,当XSync返回时,你可以确定所有先前的请求都已经被X server处理。