about summary refs log tree commit diff
path: root/Src/Zle
diff options
context:
space:
mode:
authorGeoff Wing <gcw@users.sourceforge.net>2001-09-09 06:52:12 +0000
committerGeoff Wing <gcw@users.sourceforge.net>2001-09-09 06:52:12 +0000
commitc5e254b022b9a57b46bc3dba51c38e5d6cdaaf8c (patch)
tree963b70d0d99c752a3fb4f967b4c90e0c5b2c6c99 /Src/Zle
parent8e6076fdded0be53efa1d1c5735b1a1e2aa8d70e (diff)
downloadzsh-c5e254b022b9a57b46bc3dba51c38e5d6cdaaf8c.tar.gz
zsh-c5e254b022b9a57b46bc3dba51c38e5d6cdaaf8c.tar.xz
zsh-c5e254b022b9a57b46bc3dba51c38e5d6cdaaf8c.zip
pullup 1.2 & 1.3:
1.2: 15621: display of status line was being mucked up; continuation
     markers "<...." and "<....>" weren't being displayed properly
1.3: Don't segv if we were displaying  n  lines and screen was
     resized to fewer than  n  lines
Diffstat (limited to 'Src/Zle')
-rw-r--r--Src/Zle/zle_refresh.c60
1 files changed, 41 insertions, 19 deletions
diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index 75da73efb..c432907d1 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -223,16 +223,25 @@ scrollwindow(int tline)
     if (ln != winh - 1)					\
 	ln++;						\
     else						\
-	if (tosln < 3) {				\
+	if (tosln > ln) {				\
+	    tosln--;					\
+	    if (nvln > 1) {				\
+		scrollwindow(0);			\
+		nvln--;					\
+	    } else					\
+		more_end = 1;				\
+	} else if (tosln > 2 && nvln > 1) {		\
+	    tosln--;					\
+	    if (tosln <= nvln) {			\
+		scrollwindow(0);			\
+		nvln--;					\
+	    } else {					\
+		scrollwindow(tosln);			\
+		more_end = 1;				\
+	    }						\
+	} else {					\
 	    more_status = 1;				\
 	    scrollwindow(tosln + 1);			\
-	} else if (tosln - 1 <= nvln) {			\
-	    scrollwindow(0);				\
-	    if (nvln)					\
-		nvln--, tosln--;			\
-	} else {					\
-	    tosln--;					\
-	    scrollwindow(tosln);			\
 	}						\
     if (!nbuf[ln])					\
 	nbuf[ln] = (char *)zalloc(winw + 2);		\
@@ -341,7 +350,7 @@ zrefresh(void)
 		listshown = 0;
 	}
         if (t0 > -1)
-            olnct = t0;
+            olnct = (t0 < winh) ? t0 : winh;
         if (termflags & TERM_SHORT)
             vcs = 0;
         else if (!clearflag && lpromptbuf[0]) {
@@ -435,13 +444,6 @@ zrefresh(void)
 
     if (statusline) {
 	tosln = ln + 1;
-        if (ln == winh - 1) {
-	    if (nvln > 0) {
-		scrollwindow(0);
-		nvln--;
-	    }
-	    tosln--;
-	}
 	nbuf[ln][winw + 1] = '\0';	/* text not wrapped */
 	snextline
 	t = (unsigned char *)statusline;
@@ -460,23 +462,43 @@ zrefresh(void)
 		snextline
 	    }
 	}
+	if (s == sen)
+	    snextline
     }
+    *s = '\0';
 
 /* insert <.... at end of last line if there is more text past end of screen */
     if (more_end) {
 	if (!statusline)
 	    tosln = winh;
-	strncpy(nbuf[tosln - 1] + winw - 7, " <.... ", 7);
+	s = nbuf[tosln - 1];
+	sen = s + winw - 7;
+	for (; s < sen; s++) {
+	    if (*s == '\0') {
+		for (; s < sen; )
+		    *s++ = ' ';
+		break;
+	    }
+	}
+	strncpy(sen, " <.... ", 7);
 	nbuf[tosln - 1][winw] = nbuf[tosln - 1][winw + 1] = '\0';
     }
 
 /* insert <....> at end of first status line if status is too big */
     if (more_status) {
-	strncpy(nbuf[tosln] + winw - 8, " <....> ", 8);
+	s = nbuf[tosln];
+	sen = s + winw - 8;
+	for (; s < sen; s++) {
+	    if (*s == '\0') {
+		for (; s < sen; )
+		    *s++ = ' ';
+		break;
+	    }
+	}
+	strncpy(sen, " <....> ", 8);
 	nbuf[tosln][winw] = nbuf[tosln][winw + 1] = '\0';
     }
 
-    *s = '\0';
     nlnct = ln + 1;
     for (ln = nlnct; ln < winh; ln++)
 	zfree(nbuf[ln], winw + 2), nbuf[ln] = NULL;