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

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



 しらいです。

In Message-Id <20050614165137.125263.51ba0940@isis.ocn.ne.jp>
        yuji tamura <yuji@isis.ocn.ne.jp>さんwrites:
> こんにちは、田村です。

> う〜ん、/etc/termcap が存在していないようです。
> どこかに代わりのものが無いか探してみたのですが見つかりませんでした。

 /usr/share の下のどこかかも知れませんね。もしくは terminfo
のの方が探し易いかも。まぁ見つからなくても当てずっぽうで試し
てみればいい訳ですが。


> ターミナルの環境設定のところにターミナルタイプを設定する部分があるのです
> が
> 複数の中から選ぶようになっていて、ansi、dtterm、rxvt、vt52、vt100、vt102
> 、
> xterm、xterm-colorの中から一つ選ぶようになっています。
> sun という選択肢はありませんでした。

 別に端末設定を Sun 端末に合わせろと言っているんじゃないん
ですよ。そのままの端末設定で、FDclone に Sun 端末と思い込ま
せるために環境変数 TERM を一時的に「sun」にしてみるという手
法を提示しただけです。
 駄目元でやってみるとどうなりますか?「sun」とか「sun-cmd」
とか、大概は用意されている筈です。探して見つけるより当てずっ
ぽうで試した方が手っ取り早いでしょう。


> まず、入力プロンプトの位置がファイル表示領域の最下行ではなく
> その一段上になっています。従って1行分以上ではなく、2行分以上
> 入力しないと、スクロールしません。
> スクロール確認後、Escを押して終了させると。症状は再現します。

 ということは pty が関係ありませんね。ここで再現しないよう
だと厄介な話になるところでした。pty の実装に何らかの支障があ
ったりするとアプリレベルでは手出し出来ませんから。


> >  まずは実際に pty を起動しなくても症状が再現するかどうかを
> > 検証してみましょう。
> 
> これは、OK でした。症状は出ません。この状態で h キーで ls -l コマンドを
> 実行させてみました。終了後やはり症状は出ません。

 やはりスクロール制御がうまく働いていないようです。VT100 と
完全に互換性を保つ訳にはいかなかったんでしょうね。


> >  もし Mac OS X 端末での支障がスクロール範囲を制御するシーケ
> > ンスにあるのだとしたら、多分これで直るんじゃないでしょうか。
> 
> はい、これでなおりました。症状は出ないようです。

 では巻末に 2.07 に対する patch を添付しますのでこれで試し
てみて下さい。起動も挙動も一通り試してみて、特に支障ないよう
なら 2.07a として release しましょう。


> >  もし TERM=vt100 でその挙動だとすると、VT100 emulation が不
> > 完全だということになりますね。
> 
> /etc/termcap がないので、自分では確認できませんでしたが、
> そういうことなのでしょう。代わりのものがどこかにあるのでしょうが
> 探し出せませんでした。

 これは termcap の entry がおかしいという話ではなくて、端末
の VT100 emulation が不十分だという話なので、代替 entry を探
してもどうしようもありません。
 画面の最大サイズが幾つか判らない時でも、「\E[0;0r」という
シーケンスは「画面の上端から下端までをスクロール範囲とする」
という意味なんですが、これが使えないという訳ですね。
 上端は 0 で判り切ってるんですが下端の値が不安だったので「0」
にしてあったんです。一応端末に問い合わせた下端の値を持ってる
ので、今回の対処ではその値を利用しています。
 但し、この問い合わせた値が何かの理由で間違っていた場合、従
来のコードでは正しいスクロール範囲に修復可能でしたが、今回の
patch で修復不能になってしまっています。
 尤も、問い合わせの結果が間違っているような環境では何が起こ
っても不思議ではないので、余り深く考えても仕方ないかも知れま
せんね。


 では patch です。

---- Cut Here ----
diff -u ../old/FD-2.07/termemu.c ./termemu.c
--- ../old/FD-2.07/termemu.c	Thu May 26 00:00:00 2005
+++ ./termemu.c	Tue Jun 14 19:49:35 2005
@@ -87,7 +87,7 @@
 
 	if (Xsetscroll(min, max) >= 0) {
 		doscroll(n, c, x, y);
-		Xsetscroll(-1, -1);
+		Xsetscroll(0, n_line - 1);
 		Xlocate(x, y);
 		return;
 	}
@@ -761,7 +761,14 @@
 		emupid = (p_id_t)0;
 		safeclose(emufd);
 		emufd = -1;
-		dup2(STDIN_FILENO, ttyio);
+		if (fileno(ttyout) == ttyio) dup2(STDIN_FILENO, ttyio);
+		else {
+			fd = fileno(ttyout);
+			closetty(&fd, &ttyout);
+			opentty(&fd, &ttyout);
+			dup2(fd, ttyio);
+			safeclose(fd);
+		}
 		maxfile = -1;
 
 		setdefterment();
diff -u ../old/FD-2.07/termio.c ./termio.c
--- ../old/FD-2.07/termio.c	Thu May 26 00:00:00 2005
+++ ./termio.c	Wed Jun  8 21:26:22 2005
@@ -346,7 +346,8 @@
 	if (*fdp >= 0) fd = *fdp;
 	else if ((fd = newdup(open(_PATH_TTY, flags, 0600))) < 0) return(-1);
 	if (*fpp) fp = *fpp;
-	else if (!(fp = fdopen(fd, "w+b"))) return(-1);
+	else if (!(fp = fdopen(fd, "w+b")) && !(fp = fopen(_PATH_TTY, "w+b")))
+		return(-1);
 
 	*fdp = fd;
 	*fpp = fp;
---- Cut Here ----

                                               しらい たかし