CygwinでX11を使ってみよう

概要

実際にCygwinでX11環境を使ってみよう。

X Window System Version11を使ってみる。

CygwinでX Window/XFree86ではなくX.orgのX WINDOW SYSTEMを使用することが出来ます。 利用できるX WINDOW SYSTEMバージョンはX11R6.3です。

まずユーザ設定ファイルをcp /etc/X11/xinit/xinitrc ~/.xinitrccp /etc/X11/xdm/Xresources ~/.Xresources を実行してユーザ設定ファイルを用意します。

日本語キーボードとキーマップが異なって、うまく操作できない場合はhttp://www.atmarkit.co.jp/flinux/special/cygwin/cygwin02d.htmlからxmodmap.jpをとってきて、~/.xmmodmapにコピーすると日本語キーボードのキーバインドが使えるようになります。
また、キーコードを知りたい場合はX環境のターミナルからxevというコマンドで調べることが出来ます。

bashの場合、~/.bash_profileの環境変数PATH/usr/X11R6.4/binを追加しておきますと、cygwinを起動したときにX11のコマンドパスを検索してくれるようになります。
またWindowsのスタートアップメニュからX Window Systemのアプリケーションを起動したい場合は、~/.bash_profileではなく、Windows側で環境変数PATHにCygwinのパスを追加しておきます。

環境変数をexport DISPLAY=$(hostname):0.0とかすればよさそうですが、$(hostname)を用いたのでは、ホストネームがセットされることになるのでDNSからアドレス参照きが必要になってしまうことになります。 DNSがローカルアドレスの紹介を行わなかったり、そもそもDNSを運用していないところでは、export DISPLAY=$(hostname):0.0は非力であります。
そこで何とかIPアドレスを環境変数にセットしたいものであります。Windowsではネットワークの設定を参照するのにIPCONFIGというコマンドがありまして、IPアドレスの確認ができます。

C:\home\om>IPCONFIG

Windows 2000 IP Configuration

Ethernet adapter ローカル エリア接続:

        Connection-specific DNS Suffix  . :
        IP Address. . . . . . . . . . . . : 192.168.2.120
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . . . . : 192.168.2.1

C:\home\om>

このIPCONFIGの出力を加工してIPアドレスだけを切り出して出力すれば、特にプログラミングもする必要もなしに、IPアドレスを環境変数DISPLAYにセットできるだろうということになります。
とりあえず、IPアドレスの行だけ出力するにはGNU grepを使ってしまうのが簡単ですので、とりあえずIPCONFIGの出力をgrepの入力にパイプしてあげることにします。

C:\home\om>ipconfig |grep "IP Address"
        IP Address. . . . . . . . . . . . : 192.168.2.120

C:\home\om>

192.168.2.120よりも手前の文字列 IP Address. . . . . . . . . . . . : が邪魔ですので、さらにGNU sedにパイプして文字列を編集してしまえばIPアドレスだけの文字列になるということです。
ということで環境変数IP_ADDRESSを用意して、IP_ADRESSにディスプレイ番号を足したのをDISPLAYに代入すれば良いということになります。
環境変数DISPLAYは以下のように(~/.bashrcなどの)スクリプトを記述すればすれば、自動的にセットできるようになる

export IP_ADDRESS=$(ipconfig |grep "IP Address" |sed -e "s/.IP\sAddress\.\s\.\s\.\s\.\s\.\s\.\s\.\s\.\s\.\s\.\s\.\s\.\s:\s//" |sed -e "s/\r//")
export DISPLAY=$IP_ADDRESS:0.0

X WINDOWの起動はコマンドstartxを実行します。
X-Windowが動き出しますと、Xサーバの出力画面は環境変数DISPLAYで指定したパソコンのアドレス及び画面階層に描写されます。

デフォルトの設定で起動した場合は、ウィンドウマネージャがXサーバXWin.exeにビルドインされたWidnows統合ウィドウマネージャになっております。
画面には時計の横にXのアイコンが並んで、デスクトップ上にはXTermがターミナルウィンドウとして一つ起動します。このターミナルウィンドウでexitを実行するとX-Windowを終了することが出来ます。

GTK2+の環境変数

gtk2+に関係する環境変数PKG_CONFIG_PATHをセットします。現在のPKG_CONFIG_PATHを確認するにはecho $PKG_CONFIG_PATHを打ち込んで実行します。 たぶんCygwinのセットアップからgnomeやgtk関係のアプリケーションをインストールした初期の状態では/usr/X11R6/lib/pkgconfigぐらいしかセットされていないでしょう。gtk+環境を十分に機能させるにはpkgconfigのパスを全て列挙させる必要があります。

たとえば以下のようなコードを~/.bash_profile等に書き加えておます。

PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/X11R6/lib/pkgconfig"
export PKG_CONFIG_PATH

スタートメニューやデスクトップにあるアイコンをクリックしてCygwinのX環境を起動する場合は、アイコンに関連付けられているバッチファイルstartxserver.batに上述の環境変数を以下のように書き加えておきます。

SET PKG_CONFIG_PATH="/usr/lib/pkgconfig:/usr/X11R6/lib/pkgconfig"

もちろんconfigure --prefix=/usr/localなど自前ビルドで追加インストールしたばあいも、追加されたpkgconfigのパスを列挙する。

コマンドプロンプトやWindowsアプリケーションからCygwinをちゃんぽんに使う場合はコントロールパネルのシステムからWindowsの環境変数にPKG_CONFIG_PATHを設定するひつようがあります。

ウィンドウマネージャ

デフォルトのウィンドウマネージャはWindows統合ウィンドウマネージャで、ルートウィンドウはWindowsのデスクトップなのでWindowsと親和性が高いGUIといえるかもしれません。
でもWindowsのデスクトップが見えるのが嫌いだとか、X Windowのウィンドウマネージャデスクトップを利用したい場合には、Xサーバの起動オプションを変更することで、外部ウィンドウマネージャも利用できます。

CygwinにおけるXサーバの起動オプションは実に多彩であります。Webで公開されているドキュメントよりもはるかに多いように思えます。

$ xwin --help
-a #                   mouse acceleration (pixels)
-ac                    disable access control restrictions
-audit int             set audit trail level
-auth file             select authorization file
bc                     enable bug compatibility
-br                    create root window with black background
+bs                    enable any backing store support
-bs                    disable any backing store support
-c                     turns off key-click
c #                    key-click volume (0-100)
-cc int                default color visual class
-co file               color database file
-core                  generate core dump on fatal error
-dpi int               screen resolution in dots per inch
-deferglyphs [none|all|16] defer loading of [no|all|16-bit] glyphs
-f #                   bell base (0-100)
-fc string             cursor font
-fn string             default font name
-fp string             default font path
-help                  prints message with these options
-I                     ignore all remaining arguments
-ld int                limit data space to N Kb
-lf int                limit number of open files to N
-ls int                limit stack space to N Kb
-logo                  enable logo in screen saver
nologo                 disable logo in screen saver
-nolisten string       don't listen on protocol
-noreset               don't reset after last client exists
-reset                 reset after last client exists
-p #                   screen-saver pattern duration (minutes)
-pn                    accept failure to listen on all ports
-nopn                  reject failure to listen on all ports
-r                     turns off auto-repeat
r                      turns on auto-repeat 
-render [default|mono|gray|color] set render color alloc policy
-s #                   screen-saver timeout (minutes)
-sp file               security policy file
-su                    disable any save under support
-t #                   mouse threshold (pixels)
-terminate             terminate at server reset
-to #                  connection time out
-tst                   disable testing extensions
ttyxx                  server started from init on /dev/ttyxx
v                      video blanking for screen-saver
-v                     screen-saver without video blanking
-wm                    WhenMapped default backing-store
-x string              loads named extension at init time 
-maxbigreqsize         set maximal bigrequest size 
+extension name        Enable extension
-extension name        Disable extension
-query host-name       contact named host for XDMCP
-broadcast             broadcast for XDMCP
-indirect host-name    contact named host for indirect XDMCP
-port port-num         UDP port number to send messages to
-from local-address    specify the local address to connect from
-once                  Terminate server after one session
-class display-class   specify display class to send in manage
-cookie xdm-auth-bits  specify the magic cookie for XDMCP
-displayID display-id  manufacturer display ID for request
The X Keyboard Extension adds the following arguments:
-kb                    disable the X Keyboard Extension
+kb                    enable the X Keyboard Extension
[+-]accessx [ timeout [ timeout_mask [ feedback [ options_mask] ] ] ]
                       enable/disable accessx key sequences
-ar1                   set XKB autorepeat delay
-ar2                   set XKB autorepeat interval
-noloadxkb             don't load XKB keymap description
-xkbdb                 file that contains default XKB keymaps
-xkbmap                XKB keyboard description to load on startup
-depth bits_per_pixel
        Specify an optional bitdepth to use in fullscreen mode
        with a DirectDraw engine.
-emulate3buttons [timeout]
        Emulate 3 button mouse with an optional timeout in
        milliseconds.
-engine engine_type_id
        Override the server's automatically selected engine type:
                1 - Shadow GDI
                2 - Shadow DirectDraw
                4 - Shadow DirectDraw4 Non-Locking
-fullscreen
        Run the server in fullscreen mode.
-refresh rate_in_Hz
        Specify an optional refresh rate to use in fullscreen mode
        with a DirectDraw engine.
-screen scr_num [width height [x y] | [[WxH[+X+Y]][@m]] ]
        Enable screen scr_num and optionally specify a width and
        height and initial position for that screen. Additionally
        a monitor number can be specified to start the server on,
        at which point, all coordinates become relative to that
        monitor (Not for Windows NT4 and 95). Examples:
         -screen 0 800x600+100+100@2 ; 2nd monitor offset 100,100 size 800x600
         -screen 0 1024x768@3        ; 3rd monitor size 1024x768
         -screen 0 @1 ; on 1st monitor using its full resolution (the default)
-lesspointer
        Hide the windows mouse pointer when it is over an inactive
        Cygwin/X window.  This prevents ghost cursors appearing where
        the Windows cursor is drawn overtop of the X cursor
-nodecoration
        Do not draw a window border, title bar, etc.  Windowed
        mode only.
-mwextwm
        Run the server in multi-window external window manager mode.
-internalwm
        Run the internal window manager.
-rootless
        Run the server in rootless mode.
-multiwindow
        Run the server in multi-window mode.
-multiplemonitors
        EXPERIMENTAL: Use the entire virtual screen if multiple
        monitors are present.
-clipboard
        Run the clipboard integration module.
        Do not use at the same time as 'xwinclip'.
-nounicodeclipboard
        Do not use Unicode clipboard even if NT-based platform.
-scrollbars
        In windowed mode, allow screens bigger than the Windows desktop.
        Moreover, if the window has decorations, one can now resize
        it.
-[no]trayicon
        Do not create a tray icon.  Default is to create one
        icon per screen.  You can globally disable tray icons with
        -notrayicon, then enable it for specific screens with
        -trayicon for those screens.
-clipupdates num_boxes
        Use a clipping region to constrain shadow update blits to
        the updated region when num_boxes, or more, are in the
        updated region.  Currently supported only by `-engine 1'.
-[no]unixkill
        Ctrl+Alt+Backspace exits the X Server.
-[no]winkill
        Alt+F4 exits the X Server.
-xkbrules XKBRules
        Equivalent to XKBRules in XF86Config files.
-xkbmodel XKBModel
        Equivalent to XKBModel in XF86Config files.
-xkblayout XKBLayout
        Equivalent to XKBLayout in XF86Config files.
        For example: -xkblayout de
-xkbvariant XKBVariant
        Equivalent to XKBVariant in XF86Config files.
        For example: -xkbvariant nodeadkeys
-xkboptions XKBOptions
        Equivalent to XKBOptions in XF86Config files.
-logfile filename
        Write logmessages to <filename> instead of /tmp/Xwin.log.
-logverbose verbosity
        Set the verbosity of logmessages. [NOTE: Only a few messages
        respect the settings yet]
                0 - only print fatal error.
                1 - print additional configuration information.
                2 - print additional runtime information [default].
                3 - print debugging and tracing information.
-[no]keyhook
        Grab special windows key combinations like Alt-Tab or the Menu key.
 These keys are discarded by default.
-swcursor
        Disable the usage of the windows cursor and use the X11 software cursor instead

XWin.exeの数多くある起動オプションのうち特に注目すべきものを列挙すると以下のようなものがあります。

-screen scr_num [width height]

有効にするスクリーンの階層数scr_num と、そのスクリーン用の幅および高さを指定する。 重要なことには、第1番目の-screenパラメーターの前に指定されたどんなパラメーターも、すべてのスクリーンに適用されす。 第1番目の-screenパラメーターの後のどんなオプションも、パラメーターより前に指定されたスクリーンにのみ適用されます。

Example-->例:
XWin -fullscreen -screen 0 -screen 1 -depth 8 -screen 2
スクリーンはすべてフルスクリーンになるでしょう、しかし、スクリーン2は階層深度8になるでしょう。 その一方でスクリーン0および1は既定の深度( Windows が現在稼働しているどんな深度でも)であるでしょう。

scr_numは、0.5のようにするとスクリーン0に0.0か0.5までの6つのスクリーンを持たせることができるらしい。 また0.0~0.15あるいは1.0~1.15が指定できるようだ。 [width height]で、たとえばheightを画面の解像度からタスクバー分だけ小さくした数値を与えることができる。

-mwextwm
マルチウィンドウの外部ウィンドウマネージャ・モードにおけるサーバーを実行します。
ディスプレイ・スキャンの周波数を指定しないと表示できないようです。
-multiwindow
Windows統合ウィンドウマネージャを開始します。 外部ウィンドウマネージャは使用できません。
このオプションと一緒に-rootless および -fullscreen. を指定しないでください。
-rootless
透明なルートウィンドウを備えた(twmのような)外部ウィンドウマネージャを使用する。 このオプションと一緒に-multiwindow および -fullscreen. を指定しないでください。
-fullscreen
主モニター上で、できるだけ大きなウィンドウ(フルスクリーン)を用います。
-multiplemonitors
多重モニターでシステム上のモニターをすべて覆うルートウィンドウを作成します。
-nounicodeclipboard
NTベースのプラットホームでもUnicodeクリップボードを使用しない。
-clipboard
xwinclipの統合バージョンを有効にします。 このオプションを指定する場合は、xwinclipプログラムと共に使用しないでください。
-depth bits_per_pixel
-fullscreenオプションが指定されない場合に無視されます。 -fullscreenオプションと協力するDirectDrawベースのエンジンを使用するとき(ビット・パー・ピクセルで)を適用すべきスクリーン番号を指定してください。 もし-fullscreenオプションが指定ではないなら、無視された-fullscreenオプションと共に DirectDraw ベースのエンジンを使って(ビット・パー・ピクセルで)作動するべきスクリーン深度を指定してください。 デフォルトでは、それを支援するすべてのシステム上でDirectDrawに基づいたエンジンを使用するでしょう。
-unixkill
Ctrl+Alt+Backspaceキーの組み合わせで、サーバのシャットダウンをトラップします。
-nounixkill

Ctrl+Alt+Backspaceキーの組み合わせによるサーバのシャットダウンを無効にします。(即定値)

例:
XWin -unixkill -screen 0 -screen 1 -screen 2 -nounixkill
スクリーン0および1はCtrl+Alt+Backspaceを許可するでしょう。しかし、スクリーン2は許可しないでしょう。

-winkill
キーの組み合わせAlt+F4でサーバーのシャットダウンへトラップします。(即定)
-nowinkill
キーの組み合わせAlt+F4でサーバーのシャットダウンを無効にします。
-scrollbars
サーバーディスプレイウィンドウのサイズ変更を可能にします。 このオプションと一緒に-multiwindow および -rootless を指定しないでください。
-nodecoration
サーバーはタイトル・バー、境界のないルートウィンドウを描写します。 このオプションと一緒に-multiwindow および -rootless を指定しないでください。
-lesspointer
Windowsのマウス・カーソルをいつでも隠す。Cygwin/Xがフォーカスにないウィンドウでも、それはウィンドウの任意の部分上にあります。
-refresh rate_in_Hz
-fullscreenオプションと共に使用された時、使用するリフレッシュレートを指定してください。
-trayicon
トレイアイコンを有効にします(即定)
-notrayicon

トレイアイコンを無効にします

例:
XWin -notrayicon -screen 0 -screen 1 -screen 2 -trayicon
スクリーン0および1はトレー・アイコンを持たないでしょう。しかし、スクリーン2ではトレー・アイコンを有します。

-emulate3buttons [timeout]
3つボタン・マウスをエミュレートします。 オプションのタイムアウトをミリ秒で指定できます。
-xf86config
XF86Configスタイルのコンフィギュレーションファイルを指定します。
-keyboard
コンフィギュレーションファイルからのキーボード装置を指定

外部ウィンドウマネージャ

外部ウィンドウマネージャも利用できるわけですが、Windows統合ウィンドウマネージャよりも動作が重たくなる傾向があるようです。
KEDは大変重く、fvwm2やや重く・・・
twmは軽いほうなのですが素っ気もない感じで面白みがないかもしれません。 blackboxというのも比較的軽いのですが、癖のあるUIというきがして好き嫌いが色々ありそうです。 twmの他を利用するならば、まぁ、何とか使えそうなのがWindow Makerというところです。 他に試すならばJWMでしょうか。

ウィンドウマネージャはXサーバの起動オプションを変更して外部のウィンドウマネージャを利用することを指定できます。
Xサーバの起動オプションを変更する場合は~/.xserverrcに起動のコマンドラインを記述します。

exec /usr/X11R6/bin/X <オプション>

外部ウィンドウマネージャにはtwmやfvwm2, Window Maker, KED, gnome 2, blackbox などが利用できます。
外部ウィンドウマネージャの起動は~/.xinitrcに外部ウィンドウマネージャを起動するコマンドラインを追加します。

Window Maker を使う

Window Maker を使うには、最初にwmaker.instというインストールスクリプトを実行して設定ファイルを環境変数HOMEにあるパスの下にGNUstepというディレクトリを作成して設定ファイルを格納します。
このインストールスクリプトは実行する前に、環境変数LANGを言語ロケールja_JP.ujisにセットしておくと、カタログから日本語化した設定を生成してくれます。
そして、~/.xinitrcで環境変数LANGに言語ロケールja_JP.UTF-8をセットしておくと、メニューなどの表示が日本語になります。

Window Makerも重いし、twmもいやだというならば、OpenBoxを試してみると、若干軽いようですけど、デフォルトのウィンドウマネージャにくらべればどれも若干重たいようです。

JWM を使う

CygwinのセットアップにJWMが見つからない場合はソースコードをダウンロードして自前ビルドあるのみです。 今回はgentoo Linuxのインストールしてあるパソコンから、jwm-2.0.1.tar.bz2とfrbidi-0.10.9.tar.gzを、Pedrosaのssh接続とzmodem転送を利用してLAN越しに転送してきてビルドしました。

/opt/srcなど、適当なディレクトリを作ってcdコマンドで移動してtar -zvxf frbidi-0.10.9.tar.gzとかtar -jvxf jwm-2.0.1.tar.bz2などのようにソースコードを展開します。

cd frbidi-0.10.9のようにfrbidiソースディレクトリに移動してconfigure --prefix==<インストール先> CFLAGS="-march=<プロセッサ名> -mtune=<プロセッサ名>"Makefileを生成してmake allといった具合にビルドを開始します。ビルドが正常に終わったらmake installでインストールします。 設定に関係するメッセージが英語で表示されますので、指摘された環境変数の設定を行います。

次にjwm-2.0.1のソースディレクトリにcdコマンドで移動します。 configure --prefix==<インストール先> --libdir=<frbidiのライブラリがあるディレクトリ> --includedir=<frbidiのインクルードファイルがあるディレクトリ> --x-includes=/usr/X11R6/include --x-libraries=/usr/X11R6/lib --with-x --disable-xinerama CFLAGS="-march=<プロセッサ名> -mtune=<プロセッサ名> -I<frbidiのインクルードファイルがあるディレクトリ>" CPPFLAGS=-I<frbidiのインクルードファイルがあるディレクトリ> LDFLAGS=<frbidiのライブラリがあるディレクトリ> てなぐあいに、長々と必要なパラメータを記述して実行しますと、Makefileができます。src/Makefileをエディタで開いてEXE = jwmの行をEXE = jwm.exeにします。 さらに.SUFFIXES: .o .h .cとかいてある行の後ろに空白をいれて.exeを書き足します。

あとはご多分に漏れずmake allmake installを実行してインストールは終わりです。

ホームディレクトリに.xserverrcというファイルをexec XWin -mwextwm -clipboard -silent-dup-errorのようにしてXサーバの起動オプションを変更します。 さらに、ホームディレクトリに.xinitrcというファイルを作ってexec jwmというふうにを書きます。

jwmをインストールしたディレクトリのetcディレクトリにsystem.jwmrcというデフォルト設定のXMLファイルがあります。 system.jwmrcをエディタで開いて<Tray x="0" y="-0" height="32">とあるところのy="-0"y="-30"ぐらいにしておきますとWindosのタスクバーとJWMのトレイが重ならないようになります。

起動はいつものようにstarxで起動させるだけです。

jwmのクリップボードとCygwinのクリップボードが競合するようでX環境起動中にエラーメッセージがでるようです。.xserverrc-clipboardをつけなければ競合は起きないと思われますが、すこし不便になってしまいます。 ということで、jwmのクリップボードを無効化するとかCygwinと整合性を取る必要があります。


ROX Desktopを使う

ROX Desktopは数百メガヘルツで動作する組み込み用RISCプロセッサのような小さなパフォーマンス(経験則的にいうと、CISCプロセッサのベンチマークと比較して、ほぼPentium程度のパフォーマンスに相当します。)で動作させることを目的としたウィンドウマネージャです。 ROX Desktopに関する日本語の情報はRox Filer Informationにあります。 こういったものをCygwinへ移植するのも一つの選択肢だと思います。

付録

文章

用語

文章


著作権 大槻昌弥 © 2001年
このファイルの著作権は大槻昌弥が所有しています。 無断転載厳禁

Webサイトの内容に関するお問い合わせや、ご意見ご要望は連絡用フォームから送信するようにお願いします。
なお、iso2022-jpのプレーンテキストのみ送信できます。
また、整理の都合上、問い合わせになるURIを明記するようにお願いします。