From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from euclid.skiles.gatech.edu (list@euclid.skiles.gatech.edu [130.207.146.50]) by melb.werple.net.au (8.7.5/8.7.3/2) with ESMTP id CAA11620 for ; Sun, 14 Jul 1996 02:22:31 +1000 (EST) Received: (from list@localhost) by euclid.skiles.gatech.edu (8.7.3/8.7.3) id MAA25837; Sat, 13 Jul 1996 12:03:41 -0400 (EDT) Resent-Date: Sat, 13 Jul 1996 12:03:41 -0400 (EDT) From: Geoff Wing Message-Id: <199607131602.QAA11406@werple.net.au> Subject: First zle_refresh.c patch To: zsh-workers@math.gatech.edu (zsh-list) Date: Sun, 14 Jul 1996 02:02:39 +1000 (EST) X-Mailer: ELM [version 2.4 PL25] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Resent-Message-ID: <"OyKnr2.0.dJ6.NZyvn"@euclid> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/1637 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu Heyla, this is the first zle_refresh.c patch - some of the changes have made a bug obvious which was extremely unlikely for people to display before. You'll have to await patch number 2 for that. This patch improves the display for long lines (except for the bug still there :-) If there's text before the start, you get ">...." at the start. The right prompt is no longer displayed if this is the case. If there's text after the end, you get "<...." at the end. Scrolling for < 9600 speeds is still by the half screen (which is why you sometimes get lines above your current line even when you've got more than a screenful of text). Scrolling for >=9600 is line by line (much prettier). I'm not entirely confident that this is best speed cutoff. Perhaps it should be 19200? *** zle_refresh.c 1996/06/28 02:05:24 2.5 --- zle_refresh.c 1996/07/13 15:50:22 *************** *** 46,52 **** char **nbuf = NULL, /* new video buffer line-by-line char array */ **obuf = NULL; /* old video buffer line-by-line char array */ static char *lpptbuf, *rpptbuf; /* prompt buffers */ ! static int olnct, /* previous number of lines */ ovln, /* previous video cursor position line */ lpptlen, rpptlen, /* length of prompt buffers */ pptw, rpw, /* prompt widths on screen */ --- 46,55 ---- char **nbuf = NULL, /* new video buffer line-by-line char array */ **obuf = NULL; /* old video buffer line-by-line char array */ static char *lpptbuf, *rpptbuf; /* prompt buffers */ ! static int baudrate, /* BAUD */ ! more_start, /* more text before start of screen? */ ! more_end, /* more stuff after end of screen? */ ! olnct, /* previous number of lines */ ovln, /* previous video cursor position line */ lpptlen, rpptlen, /* length of prompt buffers */ pptw, rpw, /* prompt widths on screen */ *************** *** 106,127 **** showinglist = -2; } /**/ int ! scrollwindow(int hwinh) { ! int t0; char *s; ! for (t0 = 0; t0 != winh - hwinh; t0++) { ! s = nbuf[t0]; ! nbuf[t0] = nbuf[t0 + hwinh]; ! nbuf[t0 + hwinh] = s; ! } ! memset(nbuf[0], ' ', pptw); ! t0 = winw - pptw; ! memset(nbuf[0] + pptw, '\0', t0 + 1); ! strncpy(nbuf[0] + pptw, ">....", t0 > 5 ? 5 : t0); return winh - hwinh; } --- 109,143 ---- showinglist = -2; } + /* + * Jul 96: changed to single line scroll for higher speed terminals - mason + * I've seperated the loops for readability (and it's slightly faster) + * Returns line number to be used next + */ + /**/ int ! scrollwindow(int tline) { ! int t0, hwinh; char *s; ! if (tline || baudrate >= 9600) { /* single line scroll */ ! hwinh = 1; ! s = nbuf[tline]; ! for (t0 = tline; t0 < winh - 1; t0++) ! nbuf[t0] = nbuf[t0 + 1]; ! nbuf[winh - 1] = s; ! } else { /* half screen scroll */ ! hwinh = winh / 2; ! for (t0 = 0; t0 != winh - hwinh; t0++) { ! s = nbuf[t0]; ! nbuf[t0] = nbuf[t0 + hwinh]; ! nbuf[t0 + hwinh] = s; ! } ! } ! if (!tline) ! more_start = 1; return winh - hwinh; } *************** *** 131,142 **** #define nextline \ { \ *s = '\0'; \ ! if (ln == winh - 1) \ ! if (nvln != -1) \ break; \ ! else \ ! ln = scrollwindow(winh / 2) - 1; \ ! if (!nbuf[++ln]) \ nbuf[ln] = (char *)zalloc(winw + 1); \ s = (unsigned char *)nbuf[ln]; \ sen = s + winw; \ --- 147,159 ---- #define nextline \ { \ *s = '\0'; \ ! if (++ln == winh) \ ! if (nvln != -1) { \ ! ln--; /* too eager */ \ break; \ ! } else \ ! ln = scrollwindow(0); \ ! if (!nbuf[ln]) \ nbuf[ln] = (char *)zalloc(winw + 1); \ s = (unsigned char *)nbuf[ln]; \ sen = s + winw; \ *************** *** 145,162 **** #define snextline \ { \ *s = '\0'; \ ! if (ln == winh - 1 && tosln <= nvln + 1) { \ ! ln = scrollwindow(1) - 1; \ ! if(nvln) \ ! nvln--, tosln--; \ ! } else if(ln == winh - 1) { \ ! char *sav = nbuf[--tosln]; \ ! for(t0 = tosln; t0 < winh - 1; t0++) \ ! nbuf[t0] = nbuf[t0 + 1]; \ ! nbuf[winh - 1] = sav; \ ! ln--; \ ! } \ ! if (!nbuf[++ln]) \ nbuf[ln] = (char *)zalloc(winw + 1); \ s = (unsigned char *)nbuf[ln]; \ sen = s + winw; \ --- 162,177 ---- #define snextline \ { \ *s = '\0'; \ ! if (++ln == winh) \ ! if (tosln <= nvln + 1) { \ ! ln = scrollwindow(0); \ ! if (nvln) \ ! nvln--, tosln--; \ ! } else { \ ! tosln--; \ ! ln = scrollwindow(tosln); \ ! } \ ! if (!nbuf[ln]) \ nbuf[ln] = (char *)zalloc(winw + 1); \ s = (unsigned char *)nbuf[ln]; \ sen = s + winw; \ *************** *** 180,190 **** static int inlist; /* avoiding recursion */ int ln = 0, /* current line we're working on */ nvcs = 0, nvln = -1, /* video cursor column and line */ ! t0 = -1; /* tmp */ unsigned char *s, /* pointer into the video buffer */ *t, /* pointer into the real buffer */ *sen, /* pointer to end of the video buffer (eol) */ ! *scs = line + cs; /* pointer to cursor position in real buffer */ char **qbuf; /* tmp */ /* If this is called from listmatches() (indirectly via trashzle()), and * --- 195,206 ---- static int inlist; /* avoiding recursion */ int ln = 0, /* current line we're working on */ nvcs = 0, nvln = -1, /* video cursor column and line */ ! t0 = -1, /* tmp */ ! tosln; /* tmp in statusline stuff */ unsigned char *s, /* pointer into the video buffer */ *t, /* pointer into the real buffer */ *sen, /* pointer to end of the video buffer (eol) */ ! *scs; /* pointer to cursor position in real buffer */ char **qbuf; /* tmp */ /* If this is called from listmatches() (indirectly via trashzle()), and * *************** *** 198,203 **** --- 214,221 ---- cost = 0; /* reset */ #endif cleareol = 0; /* unset */ + more_start = more_end = 0; /* unset */ + baudrate = getiparam("BAUD"); if (resetneeded) { setterm(); #ifdef TIOCGWINSZ *************** *** 239,244 **** --- 257,271 ---- return; } + if (cs < 0) { + #ifdef DEBUG + fprintf(stderr, "BUG: negative cursor position\n"); + fflush(stderr); + #endif + cs = 0; + } + scs = line + cs; + /* first, we generate the video line buffers so we know what to put on the screen - also determine final cursor position (nvln, nvcs) */ *************** *** 284,291 **** nvln++; } if (statusline) { ! int tosln = ln + 1; snextline t = (unsigned char *)statusline; for (; t < (unsigned char *)statusline+statusll; t++) { --- 311,321 ---- nvln++; } + if (t != line + ll) + more_end = 1; + if (statusline) { ! tosln = ln + 1; snextline t = (unsigned char *)statusline; for (; t < (unsigned char *)statusline+statusll; t++) { *************** *** 301,313 **** } } *s = '\0'; nlnct = ln + 1; for (ln = nlnct; ln < winh; ln++) zfree(nbuf[ln], winw + 1), nbuf[ln] = NULL; ! /* determine whether the right-prompt exists and can fit on the screen */ ! put_rpmpt = rpptlen && (int)strlen(nbuf[0]) + rpw < winw - 1; for (ln = 0; !clearf && (ln < nlnct); ln++) { /* if we have more lines than last time, clear the newly-used lines */ --- 331,361 ---- } } + /* 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); + nbuf[tosln - 1][winw] = '\0'; + } + *s = '\0'; nlnct = ln + 1; for (ln = nlnct; ln < winh; ln++) zfree(nbuf[ln], winw + 1), nbuf[ln] = NULL; ! /* determine whether the right-prompt exists and can fit on the screen */ ! if (!more_start) ! put_rpmpt = rpptlen && (int)strlen(nbuf[0]) + rpw < winw - 1; ! else { ! /* insert >.... on first line if there is more text before start of screen */ ! memset(nbuf[0], ' ', pptw); ! t0 = winw - pptw; ! t0 = t0 > 5 ? 5 : t0; ! strncpy(nbuf[0] + pptw, ">....", t0); ! memset(nbuf[0] + pptw + t0, ' ', winw - t0 - pptw); ! nbuf[0][winw] = '\0'; ! } for (ln = 0; !clearf && (ln < nlnct); ln++) { /* if we have more lines than last time, clear the newly-used lines */ *************** *** 811,816 **** --- 859,872 ---- else if (icntrl(line[t0])) vsiz++; vbuf = (char *)zalloc(vsiz); + + if (cs < 0) { + #ifdef DEBUG + fprintf(stderr, "BUG: negative cursor position\n"); + fflush(stderr); + #endif + cs = 0; + } memcpy(vbuf, lpptbuf + lpptlen - pptw, pptw); /* only use last part of prompt */ vbuf[pptw] = '\0'; -- Mason [G.C.W] mason@werple.mira.net.au "Hurt...Agony...Pain...LOVE-IT"