GNU screenはとっても便利だがX環境のことは考えられてないので
screenの中からXのアプリケーションを起動するときDISPLAY環境変数をどうするか
人間が与えてやらないといけない面倒くささがある。

これまではラッパースクリプトをつかって以下のように半自動化させていた。
0. DISPLAY環境変数が設定されてたら引数で与えられたプログラムをそのまま実行。
1. TCP 6000番から6020番までをポートスキャンして開いてるポートをさがす。
2. 複数のポートが開いていればリストして人間に決めさせる。
3. DISPLAY環境変数を設定して引数で与えられたプログラムを実行。

VNCをつかうという手もある。VNCをつかったときのメリットは
接続が切れてもXのアプリが死なないことと、
リモート接続の回線が細いときでもGUI操作ができることである。
(今の通信技術レベルだとWiMAXでつないでもXプロトコルが遅延に敏感すぎて使いものにならない。)
VNCをつかった場合の手順は以下のようになる。
0. VNCサーバを立ち上げる。vncserver :1
1. ~/.screenrcに setenv DISPLAY :1 と書いておく。
2. screenとは別にvncviewerも接続しておく。VNC用にsshのポートフォワーディングが必要かもしれない。

screenxはこれとは別のやりかたでscreenの中からXserverへ接続できるようにする。
0. screenの中ではDISPLAY環境変数はずっと同じ。デフォルトの設定では、あまり使われそうにない:99(port 6099)を利用する。
1. screen -rでアタッチする代りにscreenx -rを実行する。
   1.1 screenxはxauthコマンドをつかって外のDISPLAY環境変数に対応したエントリを:99にコピーする。
   1.2 screenxは外のDISPLAY環境変数をみてunix domain socketをつかうかtcp socketをつかうか判断する。
       1.2.1 unix domainならシンボリックリンクをはる。
       1.2.2 tcp socketならstoneをつかってポートフォワーディング用のデーモンを立ち上げる。
   1.3 screen -rを実行して本来のアタッチをする。
2. screenセッション内でXクライアントを実行するとDISPLAY=:99に接続しにいく。
   2.1 unix domainなら実際には外のDISPLAY(たとえばコンソールからxtermを起動しているなら:0)に接続していることになる。
   2.2 tcpならstoneが外のDISPLAY(たとえばsshをつかっていればlocalhost:11)に接続を転送する。

インストールは、まずstoneをインストールする。
デーモンモードを利用しているのでBSDの場合はMakefileにパッチが必要である。
それがおわったらscreenxを
hg clone https://koie@bitbucket.org/koie/screenx
からとってきてパスのとおったところに置いて、
~/.screenに次の2行を追加したら完了。
 setenv DISPLAY :99
 unsetenv WINDOWID

細い回線からXアプリをつかう場合にはvncviewerでリモート環境に接続して、その中でxtermを立ち上げscreenでアッタッチし、Xアプリを立ち上げればVNCの中でGUIの操作ができる。デタッチするとXの接続が切れるので、そこのところは要注意。