On Fri, Dec 10, 2010 at 07:32:01AM +0100, Stephan Witt wrote: > > The original issue is back again. > Pasting a copied graphics straight below the original > the copy has an absolute path again.
Ok, let's change approach, then. Please, back out all previous patches and give the attached one a try. Test it even more thoroughly, as on Mac different code flows will now be used, because isInternal() may now return "true" instead of always "false" (I don't expect problems, though). -- Enrico
Index: src/insets/InsetTabular.cpp =================================================================== --- src/insets/InsetTabular.cpp (revisione 36820) +++ src/insets/InsetTabular.cpp (copia locale) @@ -4170,8 +4170,7 @@ void InsetTabular::doDispatch(Cursor & c cell(cur.idx())->dispatch(cur, cmd); break; } - if (theClipboard().isInternal() || - (!theClipboard().hasInternal() && theClipboard().hasLyXContents())) { + if (theClipboard().isInternal()) { cur.recordUndoInset(INSERT_UNDO); pasteClipboard(cur); } Index: src/frontends/qt4/GuiClipboard.cpp =================================================================== --- src/frontends/qt4/GuiClipboard.cpp (revisione 36820) +++ src/frontends/qt4/GuiClipboard.cpp (copia locale) @@ -45,6 +45,8 @@ #include <QString> #include <QStringList> +#include <boost/crc.hpp> + #include <memory> #include <map> #include <iostream> @@ -349,6 +351,13 @@ void GuiClipboard::put(string const & ly if (!lyx.empty()) { QByteArray const qlyx(lyx.c_str(), lyx.size()); data->setData(lyxMimeType(), qlyx); + // If the OS has not the concept of clipboard ownership, + // we recognize internal data through its checksum. + if (!hasInternal()) { + boost::crc_32_type crc32; + crc32.process_bytes(lyx.c_str(), lyx.size()); + checksum = crc32.checksum(); + } } // Don't test for text.empty() since we want to be able to clear the // clipboard. @@ -414,11 +423,22 @@ bool GuiClipboard::hasGraphicsContents(C bool GuiClipboard::isInternal() const { + if (!hasLyXContents()) + return false; + // ownsClipboard() is also true for stuff coming from dialogs, e.g. - // the preamble dialog - // FIXME: This does only work on X11, since ownsClipboard() is - // hardwired to return false on Windows and OS X. - return qApp->clipboard()->ownsClipboard() && hasLyXContents(); + // the preamble dialog. This does only work on X11 and Windows, since + // ownsClipboard() is hardwired to return false on OS X. + if (hasInternal()) + return qApp->clipboard()->ownsClipboard(); + + // We are running on OS X: Check whether clipboard data is from + // ourself by comparing its checksum with the stored one. + QByteArray const ar = cache_.data(lyxMimeType()); + string const data(ar.data(), ar.count()); + boost::crc_32_type crc32; + crc32.process_bytes(data.c_str(), data.size()); + return checksum == crc32.checksum(); } @@ -426,8 +446,10 @@ bool GuiClipboard::hasInternal() const { // Windows and Mac OS X does not have the concept of ownership; // the clipboard is a fully global resource so all applications - // are notified of changes. -#if (defined(Q_WS_X11)) + // are notified of changes. However, on Windows ownership is + // emulated by Qt through the OleIsCurrentClipboard() API, while + // on Mac OS X we deal with this issue by ourself. +#if (defined(Q_WS_X11) || defined(Q_WS_WIN)) return true; #else return false; Index: src/frontends/qt4/GuiClipboard.h =================================================================== --- src/frontends/qt4/GuiClipboard.h (revisione 36820) +++ src/frontends/qt4/GuiClipboard.h (copia locale) @@ -20,6 +20,8 @@ #include <QObject> #include <QStringList> +#include <boost/cstdint.hpp> + namespace lyx { namespace frontend { @@ -90,6 +92,8 @@ private: /// the cached mime data used to describe the information /// that can be stored in the clipboard CacheMimeData cache_; + /// checksum for internal clipboard data (used on Mac) + boost::uint32_t checksum; }; QString const lyxMimeType();