в общем, экспериментальный вариант фикса такой (все изменения в StdDocuments):
1. заменяем PollRect на:
Код:
PROCEDURE (d: Document) PollRect* (OUT l, t, r, b: INTEGER);
BEGIN
DoRecalc(d, 0, ~forceRecalc);
l := (*d.clipper.l +*) d.model.l; t := (*d.clipper.t +*) d.model.t;
r := (*d.clipper.l +*) d.model.r; b := (*d.clipper.t +*) d.model.b
END
END PollRect;
2. заменяем GetRect на:
Код:
PROCEDURE (d: Document) GetRect* (f_: Views.Frame; view: Views.View; OUT l, t, r, b: INTEGER);
VAR c: Models.Context;
BEGIN ASSERT(view # NIL, 20); c := view.context; ASSERT(c # NIL, 21);
IF view = d.model.view THEN
d.PollRect(l, t, r, b);
INC(l, d.clipper.l); INC(t, d.clipper.t);
INC(r, d.clipper.l); INC(b, d.clipper.t);
INC(l, d.x); INC(t, d.y); INC(r, d.x); INC(b, d.y)
ELSE HALT(126)
END
END GetRect;
таким образом сохраняем симметричность операций, и возвращаем правильный прямоугольник для рисования.
с первого взгляда это работает, что может нечаянно слететь — не знаю. ну, для случая «скроллбар справа» не поменялось вообще ничего, так что как работало — так и будет работать. скроллбар слева вроде бы тоже починился. и фикс в `PollSection()` тоже нужен, да.