ログイン
編集不可のページディスカッション情報添付ファイル

2011-08-16 16:47:28時点のリビジョン4

メッセージを消す
clear/wm_devel/2011-08-16

MMA

Xクライアントの作成

しばらくXクライアントを作って感覚をつかんでみる。

こんなのがあったのでざっと読んでみると、割とWindowsでAPI叩いてプログラム書くのに似ている(むしろ逆なのだろう)。GC(Graphics Context)とかハンドルとかは大体同じような理解で良さそう。

「何もしない」やつを作ってみる

お約束のウィンドウが出るだけというアレをステップを追いつつ作ってみる。

Xサーバへの接続

何はともあれまずXサーバに接続する。必要なのはXサーバの動いているホストのアドレスとディスプレイ番号。ちなみに最初のディスプレイは0番。この辺は普通に使ってるだけでもわかるか。

XOpenDisplay
Xサーバと接続する

Display *XOpenDisplay(char *display_name);

終了時に接続を切るときは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