mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 10:00:33 +00:00
Skip paint event when in the middle of a buffer operation
This is detected when an undo group is open and contains at east one element. This means indeed that changes are in progress. Note that the group is in general opened in GuiApplication::dispatch. The code there is changed to ensure that the group is closed before updating the screen. This patch is experimental. It is expected to be replaced in master by a more complete solution. It could in the meantime be backported to 2.3.x. Fixes bug #11159. (cherry picked from commitc7496a11b2
) (cherry picked from commit4d0c43f9aa
)
This commit is contained in:
parent
8abea3b7e9
commit
567e94347a
@ -604,6 +604,14 @@ void Undo::endUndoGroup(CursorData const & cur_after)
|
||||
}
|
||||
|
||||
|
||||
bool Undo::activeUndoGroup() const
|
||||
{
|
||||
return d->group_level_ > 0
|
||||
&& !d->undostack_.empty()
|
||||
&& d->undostack_.top().group_id == d->group_id_;
|
||||
}
|
||||
|
||||
|
||||
void Undo::recordUndo(CursorData const & cur, UndoKind kind)
|
||||
{
|
||||
d->recordUndo(kind, cur, cur.pit(), cur.pit(), cur);
|
||||
|
@ -96,6 +96,8 @@ public:
|
||||
void endUndoGroup();
|
||||
/// end the current undo group and set UndoElement::cur_after if necessary.
|
||||
void endUndoGroup(CursorData const & cur_after);
|
||||
/// return true if an undo group is open and contains at least one element
|
||||
bool activeUndoGroup() const;
|
||||
|
||||
/// The general case: record undo information for an arbitrary range.
|
||||
/**
|
||||
|
@ -1396,16 +1396,18 @@ DispatchResult const & GuiApplication::dispatch(FuncRequest const & cmd)
|
||||
current_view_->currentBufferView()->cursor().saveBeforeDispatchPosXY();
|
||||
buffer = ¤t_view_->currentBufferView()->buffer();
|
||||
}
|
||||
// This handles undo groups automagically
|
||||
UndoGroupHelper ugh(buffer);
|
||||
|
||||
DispatchResult dr;
|
||||
dr.screenUpdate(Update::FitCursor);
|
||||
{
|
||||
// This handles undo groups automagically
|
||||
UndoGroupHelper ugh(buffer);
|
||||
dispatch(cmd, dr);
|
||||
}
|
||||
|
||||
// redraw the screen at the end (first of the two drawing steps).
|
||||
// This is done unless explicitly requested otherwise
|
||||
dr.screenUpdate(Update::FitCursor);
|
||||
dispatch(cmd, dr);
|
||||
updateCurrentView(cmd, dr);
|
||||
|
||||
d->dispatch_result_ = dr;
|
||||
return d->dispatch_result_;
|
||||
}
|
||||
|
@ -1245,10 +1245,12 @@ void GuiWorkArea::Private::paintPreeditText(GuiPainter & pain)
|
||||
void GuiWorkArea::paintEvent(QPaintEvent * ev)
|
||||
{
|
||||
// Do not trigger the painting machinery if we are not ready (see
|
||||
// bug #10989). However, since macOS has turned the screen black at
|
||||
// this point, our backing store has to be copied to screen.
|
||||
if (view().busy()) {
|
||||
// this is a no-op except on macOS.
|
||||
// bug #10989). The second test triggers when in the middle of a
|
||||
// dispatch operation.
|
||||
if (view().busy() || d->buffer_view_->buffer().undo().activeUndoGroup()) {
|
||||
// Since macOS has turned the screen black at this point, our
|
||||
// backing store has to be copied to screen (this is a no-op
|
||||
// except on macOS).
|
||||
d->updateScreen(ev->rect());
|
||||
ev->accept();
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user