Fix bug #6538 (Figure: relative path changed to absolute on copy/paste)

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@36835 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Enrico Forestieri 2010-12-11 23:04:24 +00:00
parent 937984898a
commit 573694da5f
3 changed files with 33 additions and 8 deletions

View File

@ -45,6 +45,8 @@
#include <QString> #include <QString>
#include <QStringList> #include <QStringList>
#include <boost/crc.hpp>
#include <memory> #include <memory>
#include <map> #include <map>
#include <iostream> #include <iostream>
@ -349,6 +351,13 @@ void GuiClipboard::put(string const & lyx, docstring const & text)
if (!lyx.empty()) { if (!lyx.empty()) {
QByteArray const qlyx(lyx.c_str(), lyx.size()); QByteArray const qlyx(lyx.c_str(), lyx.size());
data->setData(lyxMimeType(), qlyx); 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 // Don't test for text.empty() since we want to be able to clear the
// clipboard. // clipboard.
@ -414,11 +423,22 @@ bool GuiClipboard::hasGraphicsContents(Clipboard::GraphicsType type) const
bool GuiClipboard::isInternal() const bool GuiClipboard::isInternal() const
{ {
if (!hasLyXContents())
return false;
// ownsClipboard() is also true for stuff coming from dialogs, e.g. // ownsClipboard() is also true for stuff coming from dialogs, e.g.
// the preamble dialog // the preamble dialog. This does only work on X11 and Windows, since
// FIXME: This does only work on X11, since ownsClipboard() is // ownsClipboard() is hardwired to return false on OS X.
// hardwired to return false on Windows and OS X. if (hasInternal())
return qApp->clipboard()->ownsClipboard() && hasLyXContents(); 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; // Windows and Mac OS X does not have the concept of ownership;
// the clipboard is a fully global resource so all applications // the clipboard is a fully global resource so all applications
// are notified of changes. // are notified of changes. However, on Windows ownership is
#if (defined(Q_WS_X11)) // 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; return true;
#else #else
return false; return false;

View File

@ -20,6 +20,8 @@
#include <QObject> #include <QObject>
#include <QStringList> #include <QStringList>
#include <boost/cstdint.hpp>
namespace lyx { namespace lyx {
namespace frontend { namespace frontend {
@ -90,6 +92,8 @@ private:
/// the cached mime data used to describe the information /// the cached mime data used to describe the information
/// that can be stored in the clipboard /// that can be stored in the clipboard
CacheMimeData cache_; CacheMimeData cache_;
/// checksum for internal clipboard data (used on Mac)
boost::uint32_t checksum;
}; };
QString const lyxMimeType(); QString const lyxMimeType();

View File

@ -4170,8 +4170,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
cell(cur.idx())->dispatch(cur, cmd); cell(cur.idx())->dispatch(cur, cmd);
break; break;
} }
if (theClipboard().isInternal() || if (theClipboard().isInternal()) {
(!theClipboard().hasInternal() && theClipboard().hasLyXContents())) {
cur.recordUndoInset(INSERT_UNDO); cur.recordUndoInset(INSERT_UNDO);
pasteClipboard(cur); pasteClipboard(cur);
} }