9. X11

今回は Cygwin 上の X11 をとりあげます。 Cygwin には X サーバとクライアント環境の両方が一式そろっています。 とりわけ X サーバは (高いものでは) 数万円程度の市販商品とも競合していますが, とりあえず使うには十分な安定性と性能です。*1 Cygwin の X11 実装は,他の多くのフリーな Unix ライク環境の例にもれず,今年, XFree86 ベースから XOrg ベースに移行しました。

Cygwin の X サーバは,特に制限なく普通の X サーバとして使えます。 マルチウィンドウ・モードで動かせば,X11 クライアントをネイティブの Windows 環境に統合することもできます。*2

ただし,XOrg への移行以降, 残念なことに多くの Cygwin クライアントで日本語がうまく扱えなくなっています。 たとえば,kinput2 を用意して環境変数 LANG と XMODIFIERS を設定すれば, Cygwin の xterm で日本語入力することができます。しかし,その環境では Cygwin の emacs が起動時に segmentation fault を起こしてしまいます。 この点でクライアントまわりは 今年春の時点よりもむしろ後退しています。*3

しかし emacs はそれ単独で漢字変換が可能です。 xterm は (単独では日本語入力ができませんが) utf-8 端末として使えます。 パッケージ更新の活発な Cygwin のことですから,追従性のためにも, 標準のバイナリ・パッケージから外れない範囲でひととおり使える環境を 整備してみます。

9.1 X11 パッケージの導入

基本的な X11 パッケージをインストールするには, setup.exeX-startup-scripts のインストールを指定するだけで OK です。 (12月15日ごろの setup.ini ファイルの改訂により xorg-x11-base だけの指定でも OK になったもようです)

パッケージ間の依存関係にしたがって, X サーバやライブラリ,基本的なクライアント・プログラムに加え, xterm や日本語フォントも一式インストールされます。

ただし,これだけではマニュアルページ xorg-x11-man-pages や, 開発用パッケージ xorg-x11-devel はインストールされませんから,必要ならば追加します。

設定ファイル ~/.Xdefaults

下記のような内容のファイルをホームディレクトリに .Xdefaults として置きます。 X11 の設定ファイルです。 ファイルはここにあります。

*cursorColor: DarkOrange
*customization: -color

*.VT100.Translations: #override\n\
	<KeyPress>Prior: scroll-back(1, line)\n\
	<KeyPress>Next: scroll-forw(1, line)

XTerm*utf8: 1
XTerm*reverseVideo: true
XTerm*jumpScroll: false
XTerm*saveLines: 500
XTerm*scrollBar: yes
XTerm*rightScrollBar: yes
XTerm.vt100.geometry: 80x30
!XTerm.vt100*font: -misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1

Emacs.geometry: 80x45

上記の XTerm*utf8: 1 により xterm が utf-8 で日本語を扱えるようになります。*4 xterm の文字が小さくて見づらいときは XTerm.vt100*font の先頭の ! を外してください。 geometry 指定により,xterm を 80桁30行,emacs を 80桁45行にしています。 Prior/Next (Page Up/Down) キーで xterm をスクロールできるようにしています。 *customization: -color は,editres や oclock などいくつかのクライアント をカラーで表示させます。

起動スクリプト /usr/local/bin/startxwin

X11 をインストールすると /usr/X11R6/bin/ に startxwin.sh が置かれます。 これは Cygwin シェルから X11 環境を起動するスクリプトです。 これを使ってもよいのですが, ここでは下記のような独自の起動スクリプトを用意します。 /usr/local/bin に startxwin という名前で置きます。 ファイルはここにあります。

#!/bin/bash -
export DISPLAY=127.0.0.1:0.0

if ps | grep /usr/X11R6/bin/XWin
then exec xterm
fi

rm -rf /tmp/.X11-unix
XWin -multiwindow -clipboard -emulate3buttons &
pid_xwin=$!
#setxkbmap us
xterm -cr SteelBlue
kill $pid_xwin

このスクリプトのポイントは次の3点です。

  1. 多重起動したとき,1番手だけ X サーバも起動する。 2番手以降は xterm を起動するだけにする。
  2. 1番手だけ xterm のカーソルを青くすることで視覚的に区別する。
  3. 1番手の xterm が終了すると X サーバも終了し, それに伴いすべての X11 クライアントが終了する。
  4. マルチウィンドウ・モードを使い, X11 を Windows のデスクトップ環境と統合させる。

もしも日本語 Windows を英語 (101/104) キーボードで使っていて, X11 上でソフト的に日本語 (106/109) キーボード配列になってしまうようならば, setxkbmap のコメントを外してみてください。 逆に,日本語キーボードなのに英語キーボード配列になってしまうようならば, setxkbmap jp としてみてください。

9.2 X11 の起動と終了

Cygwin のデフォルトでは PATH の先頭に /usr/local/bin がありますから,

01:~$ startxwin

とすると,X サーバが起動し,その上で xterm が起動します。 1番手ですから青いカーソルになっています。

~/.Xdefaults で設定しましたから, この xterm は utf-8 で文字を表示できます。 右図はエスペラントと日本語を utf-8 で同時に表示した例です。

Windows 標準の「メモ帳」では数年前からナチュラルに utf-8 を利用できました。 今,コマンドライン環境でも,一応仮には utf-8 を利用できるわけです。

ただし,基盤となる Cygwin はそのままですから, ファイル名などはシフト JIS です。

ls | nkf -w

のように nkf を利用すれば, シフト JIS を読むことはできます。

この青色カーソルの xterm を終了させると,X11 全体が終了します。

Windows XP SP2 の注意点

Windows XP SP2 で X11 をはじめて起動すると右図のような警告が出ます。

このマシンだけで X サーバを使うならば, 「ブロックする」を選択しても OK です。

他のマシンからこの X サーバを使うつもりならば, 「ブロックを解除」します。

ブロックの解除が必要な場合とは, たとえば,ssh で Cygwin から他のマシンにリモートログインし, そこで環境変数 DISPLAY を "このマシンのホスト名またはIPアドレス:0" に設定して,この X サーバに xterm などの X11 クライアントを表示させる場合です。 このとき, このマシンでは xhost コマンドで他のマシンからのアクセスを許可するようにしておきます。 9.5節 を参照してください。

9.3 起動ショートカットの作成

startxwin を使えば Cygwin シェルから X11 を起動できますが, もう一歩すすんで,さらに簡便に Windows 環境から直接 X11 を起動できるようにしてみましょう。

Cygwin ではその目的のために /usr/X11R6/bin/startxwin.bat を用意しています。 しかし,せっかく工夫して /usr/local/bin/startxwin を用意したのですから,ここではそれを利用することを考えてみます。

起動バッチ /usr/local/bin/startxwin.bat

下図のようにバッチファイル startxwin.bat を /usr/local/bin に置きます。 ファイルはここにあります。 そして, そのバッチファイルへのクイック起動のショートカットを下図左下のように作成します。



アイコンの設定

このままではあまり見映えがしませんから,Cygwin の X サーバ Xwin.exe のアイコンをショートカットに貼り付けます。

このアイコンは X11 のロゴがデザインされています。

起動ショートカットの利用

こうして用意したクイック起動の X11 のロゴのショートカットをクリックすると X サーバが起動し,青色カーソルの xterm が現れます。 もう一度 X11 のロゴをクリックすると,みかん色のカーソルの xterm が現れます。 下図は,みかん色カーソルの xterm からさらに目玉プログラムの xeyes と囲碁プログラムの cgoban を起動した例です。

青色カーソルの xterm を終了させると, X サーバも終了し,その道連れにすべての X11 クライアントが終了します。



9.4 囲碁プログラム cgoban

上記のスクリーンショットでは X11 クライアントとして, おなじみの xterm や xeyes に加えて囲碁プログラム cgoban を動かしました。 実はこれも Cygwin の標準パッケージのひとつです。 パッケージ名はプログラム名と同じ cgoban です。

cgoban を起動すると CGoban Control というタイトルのウィンドウが現れます。 ここで Go Modem を選ぶと,先手・後手を誰にするか指定できます。 両方を Program にすると, 人間の手を離れてプログラムが勝手に打ち合いをします。 Human を選ぶと, マウスでマシンを操作している人間がプレイヤーになれます。

cgoban のバックエンドの思考プログラムには gnugo が使われています。*5

9.5 外部 kinput2 による日本語入力 (参考)

本当に xterm で日本語入力ができるのかといぶかしんでいる人もいることでしょうから, 簡単な実験をしてみます。

まず,Cygwin 上の青色カーソルの xterm で他マシンからの X サーバへのアクセスを許します。

02:~$ xhost + 

次に, 日本語環境の整った Linux から Cygwin マシン (アドレスは仮に 192.168.131.65 とします) に kinput2 を出します。xterm との比較用に kterm も出します。 (具体的には Plamo Linux 4.01 を使いました)

01:~$ export DISPLAY=192.168.131.65:0
01:~$ kinput2 &
[1] 251
01:~$ kterm &
[2] 255

下図は奥から Cygwin の青色カーソル xterm,Linux の kterm, そして青色カーソル xterm から起動した第2の xterm の順です。 青色のカーソルはフォーカスが外れて枠だけになっています。 第2の xterm 上に kinput2 のプレエディット・テキスト (ここでは「跳び越える」) が表示されています。



このスクリーンショットに示すとおり, 第2の xterm は青色カーソル xterm から次のコマンド行で起動したものです。 環境変数 LANG と XMODIFIERS の設定により kinput2 の管轄下にしています。

02:~$ LANG='ja_JP' XMODIFIERS='@im=kinput2' xterm &

Linux の kterm と第2の xterm で, 同じ kinput2 で入力した同じ日本語文 (ここでは「ごきげんよう」) の文字エンコーディングが, それぞれ euc-jp と utf-8 になっている点に注目してください。

9.6 Related Work

現在の一般的な X11 用 日本語 アプリケーションを本格的に Cygwin で動かす方法については,中丸氏の http://www.on.cs.keio.ac.jp/~maru/cygwin-xfree-jp-supplement/ を参照してください。 専用に調整された kterm, kinput2, X11 ライブラリ等が, ていねいな環境設定方法の説明とともに配布されています。

次回予告

次回は X11 上の emacs をとりあげます。


脚注

*1 X サーバの Cygwin パッケージには,通常の xorg-x11-xwin のほか, Open GL のアクセラレーションを有効にした実験的な xorg-x11-gl も用意されています。 setup.exe で陽に指定すればインストールできます。

*2 ただし Windows ネイティブの日本語 IME を X11 クライアントから直接使うことはできません。 別に X11 用に入力メソッドを用意する必要があります。 Cygwin 自身からであれ,外部の Unix からであれ, kinput2 等を Cygwin の X サーバで動かしてやる必要があります。

*3 5.3節 に述べたように, 現在の Cygwin はカタログスペック的には locale まわりの実装がひととおり 用意されている一方,setlocale(LC_ALL, "") の呼び出しによる 環境変数からのダイナミックな locale 切り替えが機能していません。 そのため, Unix 的に正攻法で国際化/地域化を実現しようとすればするほど 逆に日本語に不自由するというパラドックスに陥ります。 python の print 出力がそのよい例です。 内部を詳しく見ていませんが, おそらく最近の X11 もこのパラドックスの犠牲になっています。

*4 実は,今日の xterm は euc-jp なども扱えるようになっています。 ネイティブには utf-8 だけですが, 疑似端末をフロントエンドに置いてコード変換することで, 様々な文字エンコーディングを汎用的に扱えます。 しかし残念ながら, 現在の Cygwin は疑似端末の実装不足(?)により,この機能を使えないもようです。 本来ならば次のコマンド行で euc-jp な xterm を起動できたはずです。 (実際に筆者は Mac OS X でこれを日常的に利用しています)

01:~$ LANG=ja_JP.eucJP xterm -en euc-jp

*5 つまり,Mac OS X 上の囲碁プログラム Goban などと同類です。 フロントエンド・プログラムが依拠する GUI の基盤が Unix 類の X11 か, それとも Mac OS X 固有の Aqua かが両者の大きな違いです。 X11 にせよ Aqua にせよ,あくまで基盤ですから, ユーザにとって存在意義はアプリケーションがあってはじめて見えてきます。 cgoban は Cygwin に標準パッケージとして用意されている "分かりやすい" エンドユーザ向けアプリケーションの代表です。

目次へ戻る

Copyright (c) 2004 Oki Software Co., Ltd.