From 8e8c451ca1ddfa660e297b5c562a6a1ed61b717a Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Wed, 5 Jan 2011 14:02:35 +0000 Subject: [PATCH] Fix bug #6538 (Figure: relative path changed to absolute on copy/paste) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_6_X@37114 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/frontends/qt4/GuiClipboard.cpp | 38 +++++++++++++++++++++++++----- src/frontends/qt4/GuiClipboard.h | 4 ++++ src/insets/InsetTabular.cpp | 3 +-- status.16x | 3 +++ 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/frontends/qt4/GuiClipboard.cpp b/src/frontends/qt4/GuiClipboard.cpp index 03fb6312aa..01a191c5b5 100644 --- a/src/frontends/qt4/GuiClipboard.cpp +++ b/src/frontends/qt4/GuiClipboard.cpp @@ -44,6 +44,8 @@ #include #include +#include + #include #include @@ -325,6 +327,13 @@ void GuiClipboard::put(string const & lyx, docstring const & text) 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. @@ -397,11 +406,26 @@ bool GuiClipboard::hasGraphicsContents(Clipboard::GraphicsType type) const 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. + QMimeData const * source = + qApp->clipboard()->mimeData(QClipboard::Clipboard); + if (!source) + return false; + QByteArray const ar = source->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(); } @@ -409,8 +433,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; diff --git a/src/frontends/qt4/GuiClipboard.h b/src/frontends/qt4/GuiClipboard.h index d0552a8281..5f8f32ca73 100644 --- a/src/frontends/qt4/GuiClipboard.h +++ b/src/frontends/qt4/GuiClipboard.h @@ -18,6 +18,8 @@ #include +#include + namespace lyx { namespace frontend { @@ -57,6 +59,8 @@ private: bool text_clipboard_empty_; bool has_lyx_contents_; bool has_graphics_contents_; + /// checksum for internal clipboard data (used on Mac) + boost::uint32_t checksum; }; QString const lyxMimeType(); diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index 104d9b4350..d176d474d0 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -3729,8 +3729,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) cell(cur.idx())->dispatch(cur, cmd); break; } - if (theClipboard().isInternal() || - !theClipboard().hasInternal() && theClipboard().hasLyXContents()) { + if (theClipboard().isInternal()) { cur.recordUndoInset(INSERT_UNDO); pasteClipboard(cur); } diff --git a/status.16x b/status.16x index ba8b038161..18d86c3f5d 100644 --- a/status.16x +++ b/status.16x @@ -117,6 +117,9 @@ What's new - Don't allow to make tables within floats "long" as this could lead to LaTeX errors (bug 6585). +- Don't use absolute paths on internal copy/paste operations on Mac + (bug 6538). + - Correct the denomination of the languages Norsk and Nynorsk. - Do not allow to put the cursor in an InsetInfo. Instead, a context