On Sun, Apr 03, 2011 at 04:23:07PM +0300, Martynas Venckus wrote:
> > Comments?
>
> Thanks for the detailed report.
:-)
I don't know how but I somehow missed this message in my
inbox. I only noticed it this past Sunday.
> However, your diff is wrong.
I didn't think it was the optimal solution.
> > Index: vi/vs_smap.c
> > ===================================================================
> > RCS file: /cvs/obsd/src/usr.bin/vi/vi/vs_smap.c,v
> > retrieving revision 1.7
> > diff -u -p vi/vs_smap.c
> > --- vi/vs_smap.c 27 Oct 2009 23:59:49 -0000 1.7
> > +++ vi/vs_smap.c 8 Dec 2010 06:22:09 -0000
> > @@ -224,6 +224,17 @@ top: HMAP->lno = lno;
> > HMAP->coff = 0;
> > HMAP->soff = 1;
> > }
> > + else {
>
> This is not the right place to fix this, since it would affect the
> other 6 calls with OOBLNO in a bad way.
>
> > + /*
> > + * If number of lines HMAP->lno (top line) spans
> > + * changed due to, say reformatting, and now is
> > + * fewer than HMAP->soff, reset so the line is
> > + * redrawn at the top of the screen.
> > + */
>
> This should additionally check if the current line is HMAP->lno
> (top line); otherwise you're changing behaviour in a strange way,
> the top line will be forced to be on top. (Try it.)
I don't understand what you mean.
> > + cnt = vs_screens(sp, HMAP->lno, NULL);
>
> This could use the cached value (cno), it would be faster for larger
> lines.
>
> > + if (cnt < HMAP->soff)
> > + HMAP->soff = 1;
>
> This should actually be cnt, not 1--you're forcing the top to be
> at the beginning of the line; however this is only good for your
> test case (two lines become one). This is bad for longer lines.
It was intended, and I know it isn't the best way but
it was better than the glitch+crash.
> > + }
>
> A similar problem applies for the TMAP case, too.
I don't see it with my patch applied. Maybe I'm missing
steps you follow.
> > /* If we fail, just punt. */
> > for (p = HMAP, cnt = sp->t_rows; --cnt; ++p)
> > if (vs_sm_next(sp, p, p + 1))
>
> Could you verify that the attached diff fixes your problem?
Yes. Thanks! But I see that your patch has been committed
already. Sorry for the lag. As I said, I only saw your
message this past Sunday.
--patrick
> Index: vi/vs_refresh.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/vi/vs_refresh.c,v
> retrieving revision 1.16
> diff -u -r1.16 vs_refresh.c
> --- vi/vs_refresh.c 27 Oct 2009 23:59:49 -0000 1.16
> +++ vi/vs_refresh.c 3 Apr 2011 10:13:47 -0000
> @@ -199,9 +199,18 @@
> else if (F_ISSET(sp, SC_SCR_CENTER)) {
> if (vs_sm_fill(sp, LNO, P_MIDDLE))
> return (1);
> - } else
> + } else {
> + if (LNO == HMAP->lno || LNO == TMAP->lno) {
> + cnt = vs_screens(sp, LNO, &CNO);
> + if (LNO == HMAP->lno && cnt < HMAP->soff)
> + HMAP->soff = cnt;
> + if (LNO == TMAP->lno && cnt > TMAP->soff)
> + TMAP->soff = cnt;
> + }
> +
> if (vs_sm_fill(sp, OOBLNO, P_TOP))
> return (1);
> + }
> F_SET(sp, SC_SCR_REDRAW);
> }