ログイン
編集不可のページディスカッション情報添付ファイル
"clear/wm_devel/2011-08-16"の差分

MMA
3と4のリビジョン間の差分
2011-08-16 16:20:12時点のリビジョン3
サイズ: 2052
編集者: clear
コメント:
2011-08-16 16:47:28時点のリビジョン4
サイズ: 3195
編集者: clear
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 41: 行 41:
ちょっと逸れて、接続したXサーバから情報を取得してみる。 ちょっと逸れて、接続したXサーバから情報を取得してみる。いろいろマクロがある。
行 43: 行 43:
/* ... */ #include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <stdlib.h>

void show(Display *d)
{
    int def_screen = DefaultScreen(d);

    printf("Server Vendor: %s, release %d\n", ServerVendor(d), VendorRelease(d));
    printf("\tProtocol version %d, revision %d\n", ProtocolVersion(d), ProtocolRevision(d));
    printf("Found %d screen\n", ScreenCount(d));
    printf("Number of default screen: %d\n", def_screen);
    printf("Size of default screen: %dx%d\n", DisplayWidth(d, def_screen), DisplayHeight(d, def_screen));
    printf("\tDepth of Root Window: %d\n", DefaultDepth(d, def_screen));
}

int main(void)
{
    Display *d;

    d = XOpenDisplay(NULL);
    if (!d) {
        fprintf(stderr, "failed to connect X server\n");
        exit(1);
    } else {
        show(d);
    }

    XCloseDisplay(d);

    return 0;
}
行 45: 行 77:
試しに手元で実行。
{{{
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
}}}

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

clear/wm_devel/2011-08-16 (最終更新日時 2011-11-06 23:19:53 更新者 clear)