Bug #5423
closedreadlineの入力待機中に端末のウィンドウサイズ変更すると入力内容が乱れる
Description
Readline.readline("> ")の入力待機中にターミナルのウィンドウサイズを変更すると、
入力内容がウィンドウサイズ変更に合わせて変化せず、画面が乱れます。
readlineがSIGWINCHに反応しないように設定されているのが原因のようです。
revision 24140で追加されたrl_catch_sigwinch = 0;が該当部分になります。
rl_catch_signals=0を設定した場合でも、SIGWINCHは反応すべき(rl_catch_sigwinch=1)だと思います。
Index: ChangeLog¶
--- ChangeLog (revision 24139)
+++ ChangeLog (revision 24140)
@@ -1,3 +1,11 @@
+Thu Jul 16 12:42:10 2009 NARUSE, Yui naruse@ruby-lang.org
+
-
- ext/readline/readline.c (readline_readline): rl_free_line_state
-
before rl_cleanup_after_signal.
-
- ext/readline/readline.c (Init_readline): set rl_catch_signals and
-
rl_catch_signwinch as 0. [ruby-core:21884]
Thu Jul 16 08:59:22 2009 Koichi Sasada ko1@atdot.net
* node.h, vm_core.h, variable.c: rename global_entry to rb_global_entry.
Index: ext/readline/readline.c¶
--- ext/readline/readline.c (revision 24139)
+++ ext/readline/readline.c (revision 24140)
@@ -253,6 +253,7 @@
if (status) {
#if defined HAVE_RL_CLEANUP_AFTER_SIGNAL
/* restore terminal mode and signal handler*/
-
rl_free_line_state(); rl_cleanup_after_signal();
#elif defined HAVE_RL_DEPREP_TERM_FUNCTION
/* restore terminal mode */
@@ -1450,6 +1451,8 @@
#elif defined HAVE_RL_EVENT_HOOK
rl_event_hook = readline_event;
#endif
- rl_catch_signals = 0;
- rl_catch_sigwinch = 0;
#ifdef HAVE_RL_CLEAR_SIGNALS
rl_clear_signals();
#endif
Files
Updated by matsuu (Takuto Matsuu) about 13 years ago
- File readline-sigwinch.patch readline-sigwinch.patch added
Updated by sorah (Sorah Fukumori) about 13 years ago
- Status changed from Open to Assigned
- Assignee set to kouji (Kouji Takao)
Updated by kouji (Kouji Takao) almost 13 years ago
- Status changed from Assigned to Feedback
ご報告ありがとうございます。
ただ、こちら(OSX 10.6、ruby 2.0.0dev (2011-12-22 trunk 34097) [x86_64-darwin10.8.0]、 GNU Readline 6.2)では「画面が乱れます」を再現ができませんでした。
Readline.readline("> ")で何を入力しているときに、ウインドウサイズをどれくらい大きく、または小さくすると再現するのでしょうか。
Updated by nagachika (Tomoyuki Chikanaga) almost 13 years ago
元報告者と現象が同じかどうかわかりませんが、Ubuntu 10.04.3 で ruby 2.0.0dev (2012-01-10 trunk 34255) [i686-linux] + GNU Readline 6.1 で以下のような現象が確認できます。
$ echo $TERM
xterm
$ ruby -rreadline -e 'Readline.readline("> ")'
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
↑端末の幅が 80 としてここで折り返す前まで文字を入力しておきます
その後端末の幅を小さくすると
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
というように折り返されずにバッファの前半だけ表示された状態になります。
ここでさらに "bbb" と入力すると折り返されます
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
b
また端末の幅を戻しても、表示されるのは切り詰められた状態のままですが、
実際にはバッファには空白になった右半分の文字も存在していて Ctrl-L で再描画すると描画されます。
また逆に起動後に端末の幅を拡げた時も、折り返し位置が変化しません。
上記の動作は提示されているパッチで直るようです。 なおわたしの環境でも SnowLeopard 上で MacPorts でインストールした GNU Readline を使った場合にはこの現象は発生しないようでした。
Updated by mame (Yusuke Endoh) over 12 years ago
- Status changed from Feedback to Assigned
- Assignee changed from kouji (Kouji Takao) to naruse (Yui NARUSE)
#5023 もこれと同じ原因だと思います。再現します。
r24140 は #1118 で成瀬さんが FreeBSD のために入れたようですが、なんでこれで SEGV 回避になるのか説明がなくて
よくわかりませんが、r24140 を revert すると問題の現象が消えるので regression だと思います。
ということで、成瀬さんお願いします。
--
Yusuke Endoh mame@tsg.ne.jp
Updated by naruse (Yui NARUSE) over 12 years ago
- Assignee changed from naruse (Yui NARUSE) to kouji (Kouji Takao)
たぶん readline した後に rl_free_line_state() するのが本質だと思います。
残りはなんで入れたんだろう、今はF9+Readline5.2で消しても再現しないので、
- rl_catch_signals = 0;
- rl_catch_sigwinch = 0;
の部分は消して大丈夫だと思います。
Updated by kouji (Kouji Takao) over 12 years ago
- Category set to ext
mameさん、naruseさん、情報ありがとうございます。
こちらの環境では再現しないため、どうにも困っていました。
いただいた情報を元に少し調べてみます。
Readlineのバージョン(5.X, 6.1, 6.2)も関係があるのかもしれませんね。
なんにせよ、SEGVとかregressionは早くなんとかしますね。
Updated by naruse (Yui NARUSE) over 12 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r36130.
Takuto, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
- ext/readline/readline.c (Init_readline): don't set 0 to
rl_catch_signals and rl_catch_sigwinch. [Bug #5423]