Kaydet (Commit) 3d4fe8b1 authored tarafından Aleksei Nikiforov's avatar Aleksei Nikiforov Kaydeden (comit) Katarina Behrens

tdf#122689 KDE5: Fix selection clipboard

Selection clipboard now should properly get
and set data from/to selection buffer
and not from/to copy buffer.

Related: tdf#122239

Change-Id: Ia5298932ee277385c6f8a587d4fcb8204647c491
Reviewed-on: https://gerrit.libreoffice.org/66577
Tested-by: Jenkins
Reviewed-by: 's avatarKatarina Behrens <Katarina.Behrens@cib.de>
üst fd5599b9
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#include <com/sun/star/datatransfer/clipboard/XClipboardOwner.hpp> #include <com/sun/star/datatransfer/clipboard/XClipboardOwner.hpp>
#include <com/sun/star/datatransfer/clipboard/XClipboardListener.hpp> #include <com/sun/star/datatransfer/clipboard/XClipboardListener.hpp>
#include <QtGui/QClipboard>
using namespace com::sun::star; using namespace com::sun::star;
using namespace com::sun::star::uno; using namespace com::sun::star::uno;
using namespace com::sun::star::lang; using namespace com::sun::star::lang;
...@@ -26,6 +28,8 @@ using namespace com::sun::star::lang; ...@@ -26,6 +28,8 @@ using namespace com::sun::star::lang;
class Qt5Transferable : public cppu::WeakImplHelper<css::datatransfer::XTransferable> class Qt5Transferable : public cppu::WeakImplHelper<css::datatransfer::XTransferable>
{ {
public: public:
explicit Qt5Transferable(QClipboard::Mode aMode);
virtual css::uno::Any SAL_CALL virtual css::uno::Any SAL_CALL
getTransferData(const css::datatransfer::DataFlavor& rFlavor) override; getTransferData(const css::datatransfer::DataFlavor& rFlavor) override;
...@@ -35,6 +39,9 @@ public: ...@@ -35,6 +39,9 @@ public:
SAL_CALL getTransferDataFlavors() override; SAL_CALL getTransferDataFlavors() override;
virtual sal_Bool SAL_CALL virtual sal_Bool SAL_CALL
isDataFlavorSupported(const css::datatransfer::DataFlavor& rFlavor) override; isDataFlavorSupported(const css::datatransfer::DataFlavor& rFlavor) override;
private:
QClipboard::Mode m_aClipboardMode;
}; };
class VclQt5Clipboard class VclQt5Clipboard
...@@ -46,9 +53,11 @@ class VclQt5Clipboard ...@@ -46,9 +53,11 @@ class VclQt5Clipboard
Reference<css::datatransfer::XTransferable> m_aContents; Reference<css::datatransfer::XTransferable> m_aContents;
Reference<css::datatransfer::clipboard::XClipboardOwner> m_aOwner; Reference<css::datatransfer::clipboard::XClipboardOwner> m_aOwner;
std::vector<Reference<css::datatransfer::clipboard::XClipboardListener>> m_aListeners; std::vector<Reference<css::datatransfer::clipboard::XClipboardListener>> m_aListeners;
OUString m_aClipboardName;
QClipboard::Mode m_aClipboardMode;
public: public:
explicit VclQt5Clipboard(); explicit VclQt5Clipboard(const OUString& aModeString);
virtual ~VclQt5Clipboard() override; virtual ~VclQt5Clipboard() override;
/* /*
......
...@@ -12,16 +12,42 @@ ...@@ -12,16 +12,42 @@
#include <comphelper/sequence.hxx> #include <comphelper/sequence.hxx>
#include <cppuhelper/supportsservice.hxx> #include <cppuhelper/supportsservice.hxx>
#include <vcl/svapp.hxx> #include <vcl/svapp.hxx>
#include <sal/log.hxx>
#include <QtWidgets/QApplication> #include <QtWidgets/QApplication>
#include <QtGui/QClipboard>
#include <QtCore/QBuffer> #include <QtCore/QBuffer>
#include <QtCore/QMimeData> #include <QtCore/QMimeData>
#include <Qt5Clipboard.hxx> #include <Qt5Clipboard.hxx>
#include <Qt5Tools.hxx> #include <Qt5Tools.hxx>
#include <map>
namespace namespace
{ {
std::map<OUString, QClipboard::Mode> g_nameToClipboardMap
= { { "CLIPBOARD", QClipboard::Clipboard }, { "PRIMARY", QClipboard::Selection } };
QClipboard::Mode getClipboardTypeFromName(const OUString& aString)
{
// use QClipboard::Clipboard as fallback if requested type isn't found
QClipboard::Mode aMode = QClipboard::Clipboard;
auto iter = g_nameToClipboardMap.find(aString);
if (iter != g_nameToClipboardMap.end())
{
aMode = iter->second;
}
else
{
SAL_WARN("vcl.qt5", "Unrecognized clipboard type \""
<< aString
<< "\" is requested, falling back to QClipboard::Clipboard");
}
return aMode;
}
void lcl_peekFormats(const css::uno::Sequence<css::datatransfer::DataFlavor>& rFormats, void lcl_peekFormats(const css::uno::Sequence<css::datatransfer::DataFlavor>& rFormats,
bool& bHasHtml, bool& bHasImage) bool& bHasHtml, bool& bHasImage)
{ {
...@@ -37,12 +63,17 @@ void lcl_peekFormats(const css::uno::Sequence<css::datatransfer::DataFlavor>& rF ...@@ -37,12 +63,17 @@ void lcl_peekFormats(const css::uno::Sequence<css::datatransfer::DataFlavor>& rF
} }
} }
Qt5Transferable::Qt5Transferable(QClipboard::Mode aMode)
: m_aClipboardMode(aMode)
{
}
std::vector<css::datatransfer::DataFlavor> Qt5Transferable::getTransferDataFlavorsAsVector() std::vector<css::datatransfer::DataFlavor> Qt5Transferable::getTransferDataFlavorsAsVector()
{ {
std::vector<css::datatransfer::DataFlavor> aVector; std::vector<css::datatransfer::DataFlavor> aVector;
const QClipboard* clipboard = QApplication::clipboard(); const QClipboard* clipboard = QApplication::clipboard();
const QMimeData* mimeData = clipboard->mimeData(); const QMimeData* mimeData = clipboard->mimeData(m_aClipboardMode);
css::datatransfer::DataFlavor aFlavor; css::datatransfer::DataFlavor aFlavor;
if (mimeData) if (mimeData)
...@@ -95,8 +126,10 @@ Qt5Transferable::getTransferData(const css::datatransfer::DataFlavor& rFlavor) ...@@ -95,8 +126,10 @@ Qt5Transferable::getTransferData(const css::datatransfer::DataFlavor& rFlavor)
{ {
css::uno::Any aRet; css::uno::Any aRet;
const QClipboard* clipboard = QApplication::clipboard(); const QClipboard* clipboard = QApplication::clipboard();
const QMimeData* mimeData = clipboard->mimeData(); const QMimeData* mimeData = clipboard->mimeData(m_aClipboardMode);
if (mimeData)
{
if (rFlavor.MimeType == "text/plain;charset=utf-16") if (rFlavor.MimeType == "text/plain;charset=utf-16")
{ {
QString clipboardContent = mimeData->text(); QString clipboardContent = mimeData->text();
...@@ -125,14 +158,17 @@ Qt5Transferable::getTransferData(const css::datatransfer::DataFlavor& rFlavor) ...@@ -125,14 +158,17 @@ Qt5Transferable::getTransferData(const css::datatransfer::DataFlavor& rFlavor)
Sequence<sal_Int8> aSeq(reinterpret_cast<const sal_Int8*>(ba.data()), ba.size()); Sequence<sal_Int8> aSeq(reinterpret_cast<const sal_Int8*>(ba.data()), ba.size());
aRet <<= aSeq; aRet <<= aSeq;
} }
}
return aRet; return aRet;
} }
VclQt5Clipboard::VclQt5Clipboard() VclQt5Clipboard::VclQt5Clipboard(const OUString& aModeString)
: cppu::WeakComponentImplHelper<datatransfer::clipboard::XSystemClipboard, : cppu::WeakComponentImplHelper<datatransfer::clipboard::XSystemClipboard,
datatransfer::clipboard::XFlushableClipboard, XServiceInfo>( datatransfer::clipboard::XFlushableClipboard, XServiceInfo>(
m_aMutex) m_aMutex)
, m_aClipboardName(aModeString)
, m_aClipboardMode(getClipboardTypeFromName(aModeString))
{ {
} }
...@@ -163,7 +199,7 @@ sal_Bool VclQt5Clipboard::supportsService(const OUString& ServiceName) ...@@ -163,7 +199,7 @@ sal_Bool VclQt5Clipboard::supportsService(const OUString& ServiceName)
Reference<css::datatransfer::XTransferable> VclQt5Clipboard::getContents() Reference<css::datatransfer::XTransferable> VclQt5Clipboard::getContents()
{ {
if (!m_aContents.is()) if (!m_aContents.is())
m_aContents = new Qt5Transferable; m_aContents = new Qt5Transferable(m_aClipboardMode);
return m_aContents; return m_aContents;
} }
...@@ -181,6 +217,29 @@ void VclQt5Clipboard::setContents( ...@@ -181,6 +217,29 @@ void VclQt5Clipboard::setContents(
std::vector<Reference<datatransfer::clipboard::XClipboardListener>> aListeners(m_aListeners); std::vector<Reference<datatransfer::clipboard::XClipboardListener>> aListeners(m_aListeners);
datatransfer::clipboard::ClipboardEvent aEv; datatransfer::clipboard::ClipboardEvent aEv;
QClipboard* clipboard = QApplication::clipboard();
switch (m_aClipboardMode)
{
case QClipboard::Selection:
if (!clipboard->supportsSelection())
{
return;
}
break;
case QClipboard::FindBuffer:
if (!clipboard->supportsFindBuffer())
{
return;
}
break;
case QClipboard::Clipboard:
default:
break;
}
if (m_aContents.is()) if (m_aContents.is())
{ {
css::uno::Sequence<css::datatransfer::DataFlavor> aFormats css::uno::Sequence<css::datatransfer::DataFlavor> aFormats
...@@ -272,8 +331,7 @@ void VclQt5Clipboard::setContents( ...@@ -272,8 +331,7 @@ void VclQt5Clipboard::setContents(
} }
} }
QClipboard* clipboard = QApplication::clipboard(); clipboard->setMimeData(pMimeData.release(), m_aClipboardMode);
clipboard->setMimeData(pMimeData.release());
} }
aEv.Contents = getContents(); aEv.Contents = getContents();
...@@ -288,7 +346,7 @@ void VclQt5Clipboard::setContents( ...@@ -288,7 +346,7 @@ void VclQt5Clipboard::setContents(
} }
} }
OUString VclQt5Clipboard::getName() { return OUString("CLIPBOARD"); } OUString VclQt5Clipboard::getName() { return m_aClipboardName; }
sal_Int8 VclQt5Clipboard::getRenderingCapabilities() { return 0; } sal_Int8 VclQt5Clipboard::getRenderingCapabilities() { return 0; }
......
...@@ -253,7 +253,7 @@ Qt5Instance::CreateClipboard(const css::uno::Sequence<css::uno::Any>& arguments) ...@@ -253,7 +253,7 @@ Qt5Instance::CreateClipboard(const css::uno::Sequence<css::uno::Any>& arguments)
} }
css::uno::Reference<css::uno::XInterface> xClipboard( css::uno::Reference<css::uno::XInterface> xClipboard(
static_cast<cppu::OWeakObject*>(new VclQt5Clipboard())); static_cast<cppu::OWeakObject*>(new VclQt5Clipboard(sel)));
m_aClipboards[sel] = xClipboard; m_aClipboards[sel] = xClipboard;
return xClipboard; return xClipboard;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment