[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00813] Re: pasting text on FD
- Subject: [FDclone-users:00813] Re: pasting text on FD
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Thu, 10 Jul 2008 01:41:31 +0900
しらいです。
In Message-Id <86iqvfn9bc.knu@iDaemons.org>
"Akinori MUSHA" <knu@iDaemons.org>さんwrites:
> 以前、 INPUTKCODE=UTF8-mac の時に入力がもたつくという報告を
> しましたが、最近、 FDclone 2 および 3 上にテキストをペースト
> すると文字の順序がめちゃくちゃになることに気づきました。GNU
> screen, iTerm 等で再現します。
詳しくは [FDclone-users:00721] で解説していますが、以前に
もペースト文字列が文字化けを起こすという支障がありました。
この時の原因は先読みした文字を key buffer の先頭に戻すか最
後に戻すかの違いで順番が狂ってしまうという点にあって、一般的
な key sequence 用の先読みに関しては 2.09f で修正済です。
今回もこれと同じ原因なんですが、UTF-8 専用の処理の中で先読
みを行なっていた箇所なので、2.09f の bug fix の際に修正漏れ
していました。
以下の patch を試してみて下さい。
色々なケースを想定してみたのですが、どうも buffer の最後に
追加するという用途は余り無さそうですね。
FDclone のケースだと、画面を再描画させるために ^L を無理矢
理挿入する箇所くらいで、一般的には読んだ直後に戻すので常に先
頭に戻すべきだと思います。
---- Cut Here ----
diff -u ../old/FD-3.00b/input.c ./input.c
--- ../old/FD-3.00b/input.c Sun Jul 6 00:00:00 2008
+++ ./input.c Thu Jul 10 01:12:32 2008
@@ -258,7 +258,7 @@
else if ((c = getch2()) == EOF) /*EMPTY*/;
else if (c != K_ESC) /*EMPTY*/;
else if (kbhit2(WAITKEYPAD * 1000L)) {
- ungetkey2(c);
+ ungetkey2(c, 0);
c = EOF;
}
@@ -268,7 +268,7 @@
else fprintf2(Xstderr, "%k\n", INTR_K);
}
else {
- ungetkey2(c);
+ ungetkey2(c, 0);
c = EOF;
}
errno = duperrno;
@@ -374,7 +374,7 @@
{
int n;
- for (n = ungetnum3 - 1; n >= 0; n--) ungetkey2((int)ungetbuf3[n]);
+ for (n = 0; n < ungetnum3; n++) ungetkey2((int)ungetbuf3[n], 0);
# ifdef DEP_IME
if (imemode && !ungetnum3 && getime(sig, &n, 0) >= 0) /*EMPTY*/;
else
diff -u ../old/FD-3.00b/main.c ./main.c
--- ../old/FD-3.00b/main.c Sun Jul 6 00:00:00 2008
+++ ./main.c Thu Jul 10 01:12:16 2008
@@ -692,7 +692,7 @@
checkscreen(-1, -1);
if (isorgpid()) {
if (x != n_column || y != n_line) rewritefile(1);
- if (subwindow) ungetkey2(K_CTRL('L'));
+ if (subwindow) ungetkey2(K_CTRL('L'), 1);
}
}
}
diff -u ../old/FD-3.00b/term.c ./term.c
--- ../old/FD-3.00b/term.c Sun Jul 6 00:00:00 2008
+++ ./term.c Thu Jul 10 01:21:37 2008
@@ -2881,14 +2881,17 @@
return(ch);
}
-int ungetkey2(c)
-int c;
+int ungetkey2(c, desc)
+int c, desc;
{
if (c == EOF || ttyio < 0) return(EOF);
if (ungetnum >= arraysize(ungetbuf)) return(EOF);
- memmove((char *)&(ungetbuf[1]), (char *)&(ungetbuf[0]),
- ungetnum * sizeof(u_char));
- ungetbuf[0] = (u_char)c;
+ if (!desc) ungetbuf[ungetnum] = (u_char)c;
+ else {
+ memmove((char *)&(ungetbuf[1]),
+ (char *)&(ungetbuf[0]), ungetnum * sizeof(u_char));
+ ungetbuf[0] = (u_char)c;
+ }
ungetnum++;
return(c);
@@ -3133,14 +3136,15 @@
return(alternate(ch));
}
-int ungetkey2(c)
-int c;
+int ungetkey2(c, desc)
+int c, desc;
{
# ifdef TIOCSTI
u_char ch;
# endif
if (c == EOF || ttyio < 0) return(EOF);
+ if (!desc) return(ungetch2(c));
# ifdef TIOCSTI
ch = c;
Xioctl(ttyio, TIOCSTI, &ch);
diff -u ../old/FD-3.00b/term.h ./term.h
--- ../old/FD-3.00b/term.h Sun Jul 6 00:00:00 2008
+++ ./term.h Thu Jul 10 01:08:55 2008
@@ -214,7 +214,7 @@
#else
extern int getkey3 __P_((int, int, int));
#endif
-extern int ungetkey2 __P_((int));
+extern int ungetkey2 __P_((int, int));
extern int setscroll __P_((int, int));
extern int locate __P_((int, int));
extern int tflush __P_((VOID_A));
---- Cut Here ----
しらい たかし