gwmaster
ribbo****@ns*****
2011年 2月 10日 (木) 17:09:13 JST
On Tue, Feb 08, 2011 at 07:15:30AM +0900, gwmaster wrote: 更にその後です。 > > 2) ◆などの文字入力 > > CentOS上で、◆などの文字を入力すると、入力しただけなら > > 正しく表示されます。但し、矢印キーで戻ると1バイト戻って > > しまい、乱れます。 > > FreeBSD 8.1では、入力しただけでも乱れるので、Linuxの方が > > まだましという感じです。 gdb でトレース取りながら調べてみました。 Subject: が出ている段階で ★ を入力すると、enter.c内の_mutt_enter_string() 内にあるループで入力を処理しています。 if (w > width) break; my_addwch (state->wbuf[i]); } clrtoeol (); move (y, x + my_wcswidth (state->wbuf + state->begin, state->curpos - state->begin)); } mutt_refresh (); のあたり、moveで、カーソルが2バイト移動(my_wcswidthの戻りが2)するのですが、 そのあとmutt_refresh()を呼び出すと、画面に★が表示された後、カーソルが3バイト分 移動してしまいます。しかし、〒ですと、上記のmoveではやはり2バイト 移動するのですが(my_wcswidthの戻りが2)、画面も2バイト移動します。 mutt_refresh()の内容は、 void mutt_refresh (void) { /* don't refresh when we are waiting for a child. */ if (option (OPTKEEPQUIET)) return; /* don't refresh in the middle of macros unless necessary */ if (UngetCount && !option (OPTFORCEREFRESH)) return; /* else */ refresh (); } なので、何もしていないと同値ですね。 ncursesがうまく文字幅を認識していないのかなあ。