]> git.lyx.org Git - features.git/commitdiff
Skip paint event when in the middle of a buffer operation
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 31 May 2018 21:15:40 +0000 (23:15 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 31 May 2018 21:26:17 +0000 (23:26 +0200)
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.

src/Undo.cpp
src/Undo.h
src/frontends/qt4/GuiApplication.cpp
src/frontends/qt4/GuiWorkArea.cpp

index 4510e25c4b6249c5df260d00c4187409014f5fc5..c0cf56925eee4c1aa9021b73c0d754d37834c37b 100644 (file)
@@ -610,6 +610,12 @@ void Undo::endUndoGroup(CursorData const & cur_after)
 }
 
 
+bool Undo::activeUndoGroup() const
+{
+       return d->group_level_ > 0 && 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);
index b1908a25b322d798980faca3a803c001cf56f8cd..6f6cca6e90e968ee46c87d591a27fe97f82fd0a4 100644 (file)
@@ -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.
        /**
index 9104b2a99397b03b3073ce1d4c167fb9193fe6e1..25eff65ec2221a897a54dd4cb6c64a27e89428ae 100644 (file)
@@ -1401,15 +1401,17 @@ DispatchResult const & GuiApplication::dispatch(FuncRequest const & cmd)
                current_view_->currentBufferView()->cursor().saveBeforeDispatchPosXY();
                buffer = &current_view_->currentBufferView()->buffer();
        }
-       // This handles undo groups automagically
-       UndoGroupHelper ugh(buffer);
+
+       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_;
 }
index a4c08649a712eeb5db803f8e09844b307a08c40e..43e7b576ec65f5ec7c12ea3d639a1f2558463f8a 100644 (file)
@@ -1248,10 +1248,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;