Previous: サーバーとクライアントの通信
Up: Xウィンドウ概論
第10回 ウィンドウ + ネットワーク = X

Next: 通信プログラムを作る手順
Previous Page: サーバーとクライアントの通信
Next Page: 通信プログラムを作る手順

ディスプレイ名の設定のルール

普通はワークステーションの画面は1台に1個です。 従って、ホスト名を与えればたいていはディスプレイが決まります。 しかし、中には1台のマシンが複数の入力装置とディスプレイを備え、 複数のサーバープロセスを実行できるかもしれません。 Xでは、そのようなケースにも対応できるように、 ホスト名の後にサーバープロセスの番号を与えて 「ディスプレイ名」とする約束です。
たとえば、 ipca1 というマシンに2組の入出力装置のセットがあり、 2個のサーバープロセスが走っているとしたら、「ディスプレイ名」は ipca1:0 ipca1:1 のようにして与えます。
また、入力装置が1セットでサーバープロセスが1個しかなくても、 独立したディスプレイが存在する可能性もあります。 (三面鏡のようなディスプレイを想像してください。) その場合には次のようにディスプレイ名を与えます。 ipca1:0.0 ipca1:0.1 ipca1:0.2
ウィンドウが表示されるマシンの指定は、関数 XOpenDisplay() によって行われます。 この関数の引数には「ディスプレイ名」を渡します。 上で述べたように、ディスプレイ名は通常「ホスト名:0」です。 たとえばマシン名が ipcb2 のディスプレイにウィンドウを表示させたければ、 文字列 "ipcb2:0" を引数に指定するだけでよいわけです。

dsp = XOpenDisplay( "ipcb2:0" );

ネットワークを取り扱うための特別な命令は存在しません。 ネットワークの機能はすべてXのシステムに中に含まれているのです。
ディスプレイ名を省略することもできます。
dsp = XOpenDisplay( NULL );

この場合には「デフォルトのディスプレイ名」が使用されます。 デフォルトのディスプレイ名は、特別な指定をしない限り「自分のマシン名:0」です。 今までのプログラムでは、すべて自分のディスプレイを指定すればよかったので、 ディスプレイ名は省略されていたわけです。
またディスプレイ名を省略した形式にしておくと、 「デフォルトのディスプレイ名」を設定し直すことで、 プログラムの実行時にディスプレイを指定することもできます。 そのためには環境変数 DISPLAYを設定します。
DISPLAY=ipcj7:0
    a.out

ただし、この方法では NULL を指定したディスプレイは 全て同じディスプレイを指すことになります。 プログラムのウィンドウは全部そのディスプレイに表示されてしまいますから、 通信のツールのように複数のディスプレイにまたがるプログラムには この方法は使えません。
たとえば相手のマシンを指定して通信を行なう場合には、 実行時の引数で相手のディスプレイ名(またはマシン名)を 指定するのが自然でしょう。
main( int argc, char **argv )
      {
       Display  *dsp;
       dsp = XOpenDisplay( argv[1] );  /* 引数にそのままディスプレイ名 */
                 :
            (または)

main( int argc, char **argv ) { Display *dsp; char server[64]; /* ディスプレイ名を記憶する */

sprintf( server, "%s:0", argv[1] ); /* 引数がマシン名の場合 */ dsp = XOpenDisplay( server ); :

maruyama@wakhok.ac.jp
1995年02月01日 (水) 00時21分18秒 JST