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

[FDclone-users:00813] Re: pasting text on FD



 しらいです。

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 ----

                                               しらい たかし