mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-07 02:28:35 +00:00
Avoid some caret ghosts
When the caret is at end of row, if may happen that it is drawn after the end of the row. In this case caret blinking will not work properly. This patch extends the row background on the left and right by Inset::TEXT_TO_INSET_OFFSET. This is only a hack that will not work if the caret has a ridiculous width like 6. Additionally, introduce some (disabled) debug code that numbers the rows on screen by painting order. Finally, make the code that detects whether the caret was in a given row more precise (take boundary into account). Fixes (mostly, see above) bug #10797.
This commit is contained in:
parent
4f10c0a14b
commit
e64ea3576c
@ -2975,7 +2975,7 @@ namespace {
|
||||
bool sliceInRow(CursorSlice const & cs, Text const * text, Row const & row)
|
||||
{
|
||||
return !cs.empty() && cs.text() == text && cs.pit() == row.pit()
|
||||
&& row.pos() <= cs.pos() && cs.pos() <= row.endpos();
|
||||
&& row.pos() <= cs.pos() && cs.pos() < row.endpos();
|
||||
}
|
||||
|
||||
}
|
||||
@ -3158,9 +3158,11 @@ void BufferView::draw(frontend::Painter & pain, bool paint_caret)
|
||||
}
|
||||
|
||||
// Remember what has just been done for the next draw() step
|
||||
if (paint_caret)
|
||||
if (paint_caret) {
|
||||
d->caret_slice_ = d->cursor_.top();
|
||||
else
|
||||
if (d->cursor_.boundary())
|
||||
--d->caret_slice_.pos();
|
||||
} else
|
||||
d->caret_slice_ = CursorSlice();
|
||||
}
|
||||
|
||||
|
@ -45,6 +45,7 @@
|
||||
#include "frontends/Painter.h"
|
||||
#include "frontends/NullPainter.h"
|
||||
|
||||
#include "support/convert.h"
|
||||
#include "support/debug.h"
|
||||
#include "support/lassert.h"
|
||||
|
||||
@ -1925,8 +1926,16 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
|
||||
LYXERR(Debug::PAINTING, "Clear rect@("
|
||||
<< max(row_x, 0) << ", " << y - row.ascent() << ")="
|
||||
<< width() << " x " << row.height());
|
||||
pi.pain.fillRectangle(max(row_x, 0), y - row.ascent(),
|
||||
width(), row.height(), pi.background_color);
|
||||
// FIXME: this is a hack. We know that at least this
|
||||
// amount of pixels can be cleared on right and left.
|
||||
// Doing so gets rid of caret ghosts when the cursor is at
|
||||
// the begining/end of row. However, it will not work if
|
||||
// the caret has a ridiculous width like 6. (see ticket
|
||||
// #10797)
|
||||
pi.pain.fillRectangle(max(row_x, 0) - Inset::TEXT_TO_INSET_OFFSET,
|
||||
y - row.ascent(),
|
||||
width() + 2 * Inset::TEXT_TO_INSET_OFFSET,
|
||||
row.height(), pi.background_color);
|
||||
}
|
||||
|
||||
// Instrumentation for testing row cache (see also
|
||||
@ -1964,6 +1973,20 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
|
||||
row_x + row.right_x() > bv_->workWidth());
|
||||
y += row.descent();
|
||||
|
||||
#if 0
|
||||
// This debug code shows on screen which rows are repainted.
|
||||
// FIXME: since the updates related to caret blinking restrict
|
||||
// the painter to a small rectangle, the numbers are not
|
||||
// updated when this happens. Change the code in
|
||||
// GuiWorkArea::Private::show/hideCaret if this is important.
|
||||
static int count = 0;
|
||||
++count;
|
||||
FontInfo fi(sane_font);
|
||||
fi.setSize(FONT_SIZE_TINY);
|
||||
fi.setColor(Color_red);
|
||||
pi.pain.text(row_x, y, convert<docstring>(count), fi);
|
||||
#endif
|
||||
|
||||
// Restore full_repaint status.
|
||||
pi.full_repaint = tmp;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user