[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00421] Re: fd 終了後の挙動について



 しらいです。

 込み入った話になるので長くなりますが、Mac OS X ユーザの方
はおつき合い下さい。

In Message-Id <20050612234325.884597.5b335c64@isis.ocn.ne.jp>
        yuji tamura <yuji@isis.ocn.ne.jp>さんwrites:
> こんばんは、田村です。

> machine より #define SELECTRWONLY の行を削除していましたが
> 上記の方法で再度やってみました。が、状況は同じようです。
> 一応別のディレクトリを作り、そこで2.07 packageを展開し作業しました。

 machine.h をいじるのと config.h をいじるのとには本質的な違
いはないのでどっちでも構いません。要はそれ以外の箇所を元の状
態に戻して下さいという話だったんです。
 でも駄目だったようで、結構端末の性格の本質的なところに起因
しているみたいですね。


> ふと思いついて。X11.app を起動すると一緒に起動される
> xterm上で確認したところ、画面が乱れる状況は起きないようです??。
> Mac OS X のターミナルの挙動がおかしいということでしょうか?
> 試しに、ターミナルの環境設定で、「ターミナルタイプ ($TERM)を
> 宣言する」、という部分を「VT100」(デフォルト)から「xterm」に変更したと
> ころ
> fd 終了時に fd の画面はクリアされるようになりましたが。その後の挙動は
> 同じようです。一瞬画面の乱れがなおったように思ったのですが
> 再現しなくなってしまいました。

 画面がクリアというのは特に関係ないと思います。端末によって
は frame buffer を実装しているものがあって、そういう端末では
enter_ca_mode シーケンスを評価すると frame buffer を入換える
ような termcap entry が用意されています。
 この enter_ca_mode は、端末をいじくる program が端末初期化
の際に発行するのが作法になってますので、同様に作法となってい
る exit_ca_mode を最後に発行することで元の buffer に戻る訳で
す。
 xterm はこの buffer を持っているので enter_ca_mode が設定
されていますが、Mac OS X の端末は多分 vt100 辺りに設定されて
るんじゃないでしょうかね。本物の VT100 は buffer 持ってない
ので、enter_ca_mode に buffer 操作のシーケンスは載ってません。

 スクロール制御だと change_scroll_region というシーケンスに
なるので、これが設定されているか否かで挙動に違いが出て来るん
じゃないでしょうか。
 TERM=sun で起動してみるとどうなりますか?/etc/termcap を見
て他に「sun-cmd」とか「sun-e」とかそれっぽい名前があればそっ
ちでも構いません。
 これらの entry は Sun Workstation 端末用に用意されたもので、
スクロール範囲を制御する \E[?;?r というシーケンスに対応して
いません。
 この状態では代わりに他のシーケンスを用いて部分スクロールを
実現しますので、終了後の状態が元に戻ってるかも知れませんね。


> fd -PTYMODE=1 で起動..
> fdのプロセスは1個。
> h キーを押して ls を実行、表示し終わり Hit any key. の表示が出る..
> fd のプロセスは3個。
> キーを押して、通常の fd 画面に戻る..
> fd のプロセスは1個に戻る。
> fd を終了する..
> fd のプロセスは消える。

 ということは誰かが死に損なって悪さをしているという訳ではな
さそうですね。では次は上で言っているスクロール範囲を制御する
シーケンスをいじってみましょうか。

 まずは実際に pty を起動しなくても症状が再現するかどうかを
検証してみましょう。
 -PTYMODE=1 状態では「h」キーで現れる入力プロンプトの位置が
画面最下行ではなくファイル表示領域の最下行になっていると思い
ます。ここで一行分以上の文字列を入力していくとファイル表示領
域の中だけがスクロールします。
 入力の最後に Enter を押すと実際に pty が起動してしまうので、
部分スクロールが確認出来た時点で Esc を押して入力をキャンセ
ルします。
 このまま終了すると症状が再現するでしょうか?もし再現したら、
原因は pty ではなくて単純にスクロール範囲を制御するシーケン
スにあることが確認出来ます。

 次は実際にシーケンスを発行している箇所の記述を操作してみま
しょう。
 termemu.c に二箇所 Xsetscroll() という関数が記述されていま
す。一個目が範囲を制限して二個目が解除しています。この一連の
処理は 6 行しかありませんので、まとめて comment out して下さ
い。面倒なら削除しても構いません。
 この変更により、上で TERM=sun として実験したのと同じ挙動が
得られる筈です。この状態で上の入力プロンプトでの部分スクロー
ルを検証してみて下さい。
 ついでに普通に子プロセスを起動した時にどうなるかも見て下さ
い。多分どちらも同じ挙動だと思います。

 最後に根本的な対処を目指して、patch としての適用に耐えるコ
ードを実装してみましょう。
 上で削除した Xsetscroll() の箇所を元に戻したら、二個目の引
数を変更します。元は (-1, -1) になっている筈ですが、これを変
更して (0, n_line - 1) にします。
 もし Mac OS X 端末での支障がスクロール範囲を制御するシーケ
ンスにあるのだとしたら、多分これで直るんじゃないでしょうか。


 でも、これで直るとしたら Mac OS X の端末は正しくシーケンス
の実装が出来ていないということになりますよ。TERM の値は何に
なっていますか?
 もし TERM=vt100 でその挙動だとすると、VT100 emulation が不
完全だということになりますね。
 (-1, -1) という範囲指定は「範囲を指定しない」という指定な
ので、本当はこれで画面全体をスクロールに使えるようになってく
れないといけないんですけどね。

                                               しらい たかし