]> git.lyx.org Git - lyx.git/blobdiff - src/Undo.cpp
Fix external middle-mouse pasting with Qt5/X11.
[lyx.git] / src / Undo.cpp
index b305edef7909bbe1ab761e2884d769bdd5e1ca7c..95eb160d60c9c19494cf3646fac858b90964db48 100644 (file)
@@ -33,6 +33,7 @@
 #include "support/debug.h"
 #include "support/gettext.h"
 #include "support/lassert.h"
+#include "support/lyxtime.h"
 
 #include <algorithm>
 #include <deque>
@@ -72,7 +73,7 @@ struct UndoElement
                    bool lc, size_t gid) :
                kind(kin), cur_before(cb), cell(cel), from(fro), end(en),
                pars(pl), array(ar), bparams(0),
-               lyx_clean(lc), group_id(gid)
+               lyx_clean(lc), group_id(gid), time(current_time())
                {
                }
        ///
@@ -80,11 +81,11 @@ struct UndoElement
                                bool lc, size_t gid) :
                kind(ATOMIC_UNDO), cur_before(cb), cell(), from(0), end(0),
                pars(0), array(0), bparams(new BufferParams(bp)),
-               lyx_clean(lc), group_id(gid)
+               lyx_clean(lc), group_id(gid), time(current_time())
        {
        }
        ///
-       UndoElement(UndoElement const & ue)
+       UndoElement(UndoElement const & ue) : time(current_time())
        {
                kind = ue.kind;
                cur_before = ue.cur_before;
@@ -121,12 +122,14 @@ struct UndoElement
        ParagraphList * pars;
        /// the contents of the saved MathData (for mathed)
        MathData * array;
-       /// Only used in case of full backups
+       /// Only used in case of params undo
        BufferParams const * bparams;
        /// Was the buffer clean at this point?
        bool lyx_clean;
        /// the element's group id
        size_t group_id;
+       /// timestamp
+       time_t time;
 private:
        /// Protect construction
        UndoElement();
@@ -321,12 +324,17 @@ void Undo::Private::doRecordUndo(UndoKind kind,
        if (!undo_finished_
            && kind != ATOMIC_UNDO
            && !stack.empty()
+           && !stack.top().bparams
            && samePar(stack.top().cell, cell)
            && stack.top().kind == kind
            && stack.top().from == from
-           && stack.top().end == end) {
+           && stack.top().end == end
+           && stack.top().cur_after == cur_before
+           && current_time() - stack.top().time <= 2) {
                // reset cur_after; it will be filled correctly by endUndoGroup.
                stack.top().cur_after = CursorData();
+               // update the timestamp of the undo element
+               stack.top().time = current_time();
                return;
        }
 
@@ -567,40 +575,15 @@ void Undo::endUndoGroup(CursorData const & cur)
 }
 
 
-// FIXME: remove these convenience functions and make
-// Private::recordUndo public as sole interface. The code in the
-// convenience functions can move to Cursor.cpp.
-
 void Undo::recordUndo(CursorData const & cur, UndoKind kind)
 {
        d->recordUndo(kind, cur, cur.pit(), cur.pit(), cur);
 }
 
 
-void Undo::recordUndoInset(CursorData const & cur, UndoKind kind,
-                          Inset const * inset)
-{
-       if (!inset || inset == &cur.inset()) {
-               DocIterator c = cur;
-               c.pop_back();
-               d->recordUndo(kind, c, c.pit(), c.pit(), cur);
-       } else if (inset == cur.nextInset())
-               recordUndo(cur, kind);
-       else
-               LYXERR0("Inset not found, no undo stack added.");
-}
-
-
-void Undo::recordUndo(CursorData const & cur, UndoKind kind, pit_type from)
-{
-       d->recordUndo(kind, cur, cur.pit(), from, cur);
-}
-
-
-void Undo::recordUndo(CursorData const & cur, UndoKind kind,
-       pit_type from, pit_type to)
+void Undo::recordUndo(CursorData const & cur, pit_type from, pit_type to)
 {
-       d->recordUndo(kind, cur, from, to, cur);
+       d->recordUndo(ATOMIC_UNDO, cur, from, to, cur);
 }