text->getVisibleRow(bv, y + y_offset,
x_offset, row, y + text->first);
internal = internal && (st != LyXText::CHANGED_IN_DRAW);
- while(internal && text->status() == LyXText::CHANGED_IN_DRAW) {
+ while (internal && text->status() == LyXText::CHANGED_IN_DRAW) {
if (text->fullRebreak(bv)) {
st = LyXText::NEED_MORE_REFRESH;
text->setCursor(bv, text->cursor.par(), text->cursor.pos());
{
int newtop = text->first;
- if (text->cursor.y()
- - text->cursor.row()->baseline()
- + text->cursor.row()->height()
+ Row * row = text->cursor.row();
+
+ // Is this a hack? Yes, probably... (Lgb)
+ if (!row)
+ return max(newtop, 0);
+
+ if (text->cursor.y() - row->baseline() + row->height()
- text->first >= owner.height()) {
- if (text->cursor.row()->height() < owner.height()
- && text->cursor.row()->height() > owner.height() / 4)
+ if (row->height() < owner.height()
+ && row->height() > owner.height() / 4) {
newtop = text->cursor.y()
- + text->cursor.row()->height()
- - text->cursor.row()->baseline() - owner.height();
- else
+ + row->height()
+ - row->baseline() - owner.height();
+ } else {
+ // scroll down
newtop = text->cursor.y()
- - 3 * owner.height() / 4; /* the scroll region must be so big!! */
- } else if (static_cast<int>((text->cursor.y()) - text->cursor.row()->baseline()) <
- text->first && text->first > 0)
- {
- if (text->cursor.row()->height() < owner.height()
- && text->cursor.row()->height() > owner.height() / 4)
- newtop = text->cursor.y() - text->cursor.row()->baseline();
- else {
- newtop = text->cursor.y() - owner.height() / 4;
+ - owner.height() / 2; /* the scroll region must be so big!! */
+ }
+
+ } else if (static_cast<int>((text->cursor.y()) - row->baseline()) <
+ text->first && text->first > 0) {
+ if (row->height() < owner.height()
+ && row->height() > owner.height() / 4) {
+ newtop = text->cursor.y() - row->baseline();
+ } else {
+ // scroll up
+ newtop = text->cursor.y() - owner.height() / 2;
newtop = min(newtop, int(text->first));
}
}
void LyXScreen::update(LyXText * text, BufferView * bv,
- int y_offset, int x_offset)
+ int y_offset, int x_offset)
{
switch (text->status()) {
case LyXText::NEED_MORE_REFRESH:
int const y = max(int(text->refresh_y - text->first), 0);
drawFromTo(text, bv, y, owner.height(), y_offset, x_offset);
text->refresh_y = 0;
- text->status(bv, LyXText::UNCHANGED);
+ // otherwise this is called ONLY from BufferView_pimpl(update)
+ // or we should see to set this flag accordingly
+ if (text != bv->text)
+ text->status(bv, LyXText::UNCHANGED);
expose(0, y, owner.workWidth(), owner.height() - y);
}
break;
// this because if we had a major update the refresh_row could
// have been set to 0!
if (text->refresh_row) {
- text->status(bv, LyXText::UNCHANGED);
+ // otherwise this is called ONLY from BufferView_pimpl(update)
+ // or we should see to set this flag accordingly
+ if (text != bv->text)
+ text->status(bv, LyXText::UNCHANGED);
expose(0, text->refresh_y - text->first + y_offset,
owner.workWidth(), text->refresh_row->height());
}