about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2010-10-25 14:59:18 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2010-10-25 14:59:18 +0000
commit73d622e9c48519b4781120d154b868df882c0bbd (patch)
treee77b89fefe5a9a75781fe5ad3ff8d5e682aeacf1
parent3f3d80c394134cae020c49420917eb34a456ff68 (diff)
downloadzsh-73d622e9c48519b4781120d154b868df882c0bbd.tar.gz
zsh-73d622e9c48519b4781120d154b868df882c0bbd.tar.xz
zsh-73d622e9c48519b4781120d154b868df882c0bbd.zip
28363: fix insert bug refreshing zle with wide characteter
-rw-r--r--ChangeLog7
-rw-r--r--Src/Zle/zle_refresh.c42
2 files changed, 38 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 3d867afe2..61afa833a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2010-10-25  Peter Stephenson  <pws@csr.com>
+
+	* 28363: Src/Zle/zle_refresh.c: inserting a character when a
+	wide character was at the end of the line didn't work.
+
 2010-10-22  Peter Stephenson  <pws@csr.com>
 
 	* 28360: Src/subst.c, Test/E01options.ztst: NO_UNSET option
@@ -13781,5 +13786,5 @@
 
 *****************************************************
 * This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.5113 $
+* $Revision: 1.5114 $
 *****************************************************
diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index 33a46a2f3..137065513 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -2000,7 +2000,7 @@ refreshline(int ln)
 		   newline: foobar	 / characters, then we have six matches */
 		if (tccan(TCDEL)) {
 		    int first = 1;
-		    for (i = 1; ol[i].chr; i++)
+		    for (i = 1; ol[i].chr; i++) {
 			if (tcdelcost(i) < wpfxlen(ol + i, nl)) {
 			    /*
 			     * Some terminals will output the current
@@ -2023,15 +2023,19 @@ refreshline(int ln)
 			    i = 0;
 			    break;
 			}
+		    }
 		    if (!i)
 			continue;
 		}
-		/* inserting characters - characters pushed off the right should be
-		   annihilated, but we don't do this if we're on the last line lest
-		   undesired scrolling occurs due to `illegal' characters on screen */
-
-		if (tccan(TCINS) && (vln != lines - 1)) {	/* not on last line */
-		    for (i = 1; nl[i].chr; i++)
+		/*
+		 * inserting characters - characters pushed off the right
+		 * should be annihilated, but we don't do this if we're on the
+		 * last line lest undesired scrolling occurs due to `illegal'
+		 * characters on screen
+		 */ 
+		if (tccan(TCINS) && (vln != lines - 1)) {
+		    /* not on last line */
+		    for (i = 1; nl[i].chr; i++) {
 			if (tcinscost(i) < wpfxlen(ol, nl + i)) {
 			    tc_inschars(i);
 			    zwrite(nl, i);
@@ -2044,19 +2048,37 @@ refreshline(int ln)
 #endif
 			    char_ins += i;
 			    ccs = (vcs += i);
-			    /* if we've pushed off the right, truncate oldline */
-			    for (i = 0; ol[i].chr && i < winw - ccs; i++);
+			    /*
+			     * if we've pushed off the right, truncate
+			     * oldline
+			     */
+			    for (i = 0; ol[i].chr && i < winw - ccs; i++)
+				;
 #ifdef MULTIBYTE_SUPPORT
 			    while (ol[i].chr == WEOF)
 				i++;
-#endif
 			    if (i >= winw - ccs) {
+				/*
+				 * Yes, we're over the right.
+				 * Make sure we truncate at the real
+				 * character, not a WEOF added to
+				 * make up the width.
+				 */
+				while (ol[i-1].chr == WEOF)
+				    i--;
 				ol[i] = zr_zr;
 				ins_last = 1;
 			    }
+#else
+			    if (i >= winw - ccs) {
+				ol[i] = zr_zr;
+				ins_last = 1;
+			    }
+#endif
 			    i = 0;
 			    break;
 			}
+		    }
 		    if (!i)
 			continue;
 		}