一個與linux下使用Xlib進行窗口編程的小例子,作爲一個剛開始瞭解Xlib的初學者,應該從一個小例子開始,從編譯,運行,再到逐步深入...,根據X11協議原理,其實我們所編寫的程序都是Xclient程序,Xserver負責接收硬件事件,Xclient負責計算,結果會反饋給Xserver,Xserver來負責與硬件溝通,例如顯示Xclient繪製的圖形到顯示器.
具體編譯:gcc x11.c -o output -I/usr/X11R6/include -L/usr/X11R6/lib -lX11
源碼如下:
/*
* 下邊是編譯命令
* gcc x11.c -o output -I/usr/X11R6/include -L/usr/X11R6/lib -lX11
*/
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
Display *display;
Window window;
XEvent event;
char *msg = "你好 ,這是一個測試窗口!";
int s;
/* 與Xserver建立連接 */
display = XOpenDisplay(NULL);
if (display == NULL)
{
fprintf(stderr, "Cannot open display\n");
exit(1);
}
s = DefaultScreen(display);
/* 創建一個窗口 */
window = XCreateSimpleWindow(display, RootWindow(display, s), 10, 10, 200, 200, 1,
BlackPixel(display, s), WhitePixel(display, s));
/* 選擇一種感興趣的事件進行監聽 */
XSelectInput(display, window, ExposureMask | KeyPressMask);
/* 顯示窗口 */
XMapWindow(display, window);
/* 事件遍歷 */
for (;;)
{
XNextEvent(display, &event);
/* 繪製窗口或者重新繪製 */
if (event.type == Expose)
{
XFillRectangle(display, window, DefaultGC(display, s), 20, 20, 10, 10);
XDrawString(display, window, DefaultGC(display, s), 50, 50, msg, strlen(msg));
}
/* 當檢測到鍵盤按鍵,退出消息循環 */
if (event.type == KeyPress)
break;
}
/* 關閉與Xserver服務器的連接 */
XCloseDisplay(display);
return 0;
}