Xクライアントの作成
しばらくXクライアントを作って感覚をつかんでみる。
こんなのがあったのでざっと読んでみると、割とWindowsでAPI叩いてプログラム書くのに似ている(むしろ逆なのだろう)。GC(Graphics Context)とかハンドルとかは大体同じような理解で良さそう。
「何もしない」やつを作ってみる
お約束のウィンドウが出るだけというアレをステップを追いつつ作ってみる。
Xサーバへの接続
何はともあれまずXサーバに接続する。必要なのはXサーバの動いているホストのアドレスとディスプレイ番号。ちなみに最初のディスプレイは0番。この辺は普通に使ってるだけでもわかるか。
- XOpenDisplay
- Xサーバと接続する
Display *XOpenDisplay(char *display_name);
nameに"<address>:<displaynumber>"の形式で指定する。NULLだとDISPLAY環境変数を見に行くらしい
Display型のポインタが帰ってくるので、これを使ってXサーバとやりとりする。失敗するとNULLが来る
終了時に接続を切るときはXCloseDisplay()を使うらしい。
- XCloseDisplay
- Xサーバとの接続を切る
int XCloseDisplay(Display *display);
- まあ見たとおり
- これによって全てのウィンドウと確保したリソースが解放されるらしい。プログラムは終了しない
とりあえず接続して終了するだけならこんな感じか。
Display *d;
d = XOpenDisplay(NULL);
if (!d) {
fprintf(stderr, "failed to connect X server\n");
exit(1);
}
/* ... */
XCloseDisplay(d);
ディスプレイの情報を取得してみる
ちょっと逸れて、接続したXサーバから情報を取得してみる。いろいろマクロがある。
1 #include <X11/Xlib.h>
2 #include <X11/Xutil.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5
6 void show(Display *d)
7 {
8 int def_screen = DefaultScreen(d);
9
10 printf("Server Vendor: %s, release %d\n", ServerVendor(d), VendorRelease(d));
11 printf("\tProtocol version %d, revision %d\n", ProtocolVersion(d), ProtocolRevision(d));
12 printf("Found %d screen\n", ScreenCount(d));
13 printf("Number of default screen: %d\n", def_screen);
14 printf("Size of default screen: %dx%d\n", DisplayWidth(d, def_screen), DisplayHeight(d, def_screen));
15 printf("\tDepth of Root Window: %d\n", DefaultDepth(d, def_screen));
16 }
17
18 int main(void)
19 {
20 Display *d;
21
22 d = XOpenDisplay(NULL);
23 if (!d) {
24 fprintf(stderr, "failed to connect X server\n");
25 exit(1);
26 } else {
27 show(d);
28 }
29
30 XCloseDisplay(d);
31
32 return 0;
33 }
試しに手元で実行。
Server Vendor: The X.Org Foundation, release 10707000 Protocol version 11, revision 0 Found 1 screen Number of default screen: 0 Size of default screen: 1920x1080 Depth of Root Window: 24