summaryrefslogtreecommitdiff
path: root/vcl/unx
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-08-07 10:43:09 +0100
committerCaolán McNamara <caolanm@redhat.com>2015-08-07 09:44:19 +0000
commitea4a775eb1a15d2be198e42b199af025ed90926a (patch)
treeb37c50ca79202b42045754ecce6d0ce3eee60732 /vcl/unx
parent6d3b26829b5f30ea934249ef88eb10b2507969f1 (diff)
Resolves: tdf#93198 gtk3: support PRIMARY as well as CLIPBOARD
Change-Id: Ia8c7da1e321f363efee2d60b29078b35fcbe1dcd Reviewed-on: https://gerrit.libreoffice.org/17570 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/unx')
-rw-r--r--vcl/unx/gtk3/app/gtk3gtkinst.cxx35
1 files changed, 19 insertions, 16 deletions
diff --git a/vcl/unx/gtk3/app/gtk3gtkinst.cxx b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
index 41708923cc2d..76b44dacd912 100644
--- a/vcl/unx/gtk3/app/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
@@ -97,8 +97,15 @@ class GtkTransferable : public ::cppu::WeakImplHelper1 <
css::datatransfer::XTransferable >
{
private:
+ GdkAtom m_nSelection;
std::map<OUString, GdkAtom> m_aMimeTypeToAtom;
public:
+
+ GtkTransferable(GdkAtom nSelection)
+ : m_nSelection(nSelection)
+ {
+ }
+
/*
* XTransferable
*/
@@ -109,7 +116,7 @@ public:
css::uno::RuntimeException, std::exception
) SAL_OVERRIDE
{
- GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+ GtkClipboard* clipboard = gtk_clipboard_get(m_nSelection);
if (rFlavor.MimeType == "text/plain;charset=utf-16")
{
OUString aStr;
@@ -142,7 +149,7 @@ public:
{
std::vector<css::datatransfer::DataFlavor> aVector;
- GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+ GtkClipboard* clipboard = gtk_clipboard_get(m_nSelection);
GdkAtom *targets;
gint n_targets;
@@ -270,6 +277,7 @@ class VclGtkClipboard :
datatransfer::clipboard::XSystemClipboard,
XServiceInfo>
{
+ GdkAtom m_nSelection;
osl::Mutex m_aMutex;
ClipboardOwner* m_pOwner;
gulong m_nOwnerChangedSignalId;
@@ -281,7 +289,7 @@ class VclGtkClipboard :
public:
- VclGtkClipboard();
+ VclGtkClipboard(GdkAtom nSelection);
virtual ~VclGtkClipboard();
/*
@@ -366,7 +374,7 @@ Reference< css::datatransfer::XTransferable > VclGtkClipboard::getContents() thr
{
if (!m_aContents.is())
{
- m_aContents = new GtkTransferable();
+ m_aContents = new GtkTransferable(m_nSelection);
}
return m_aContents;
}
@@ -489,11 +497,12 @@ namespace
}
}
-VclGtkClipboard::VclGtkClipboard()
+VclGtkClipboard::VclGtkClipboard(GdkAtom nSelection)
: cppu::WeakComponentImplHelper<datatransfer::clipboard::XSystemClipboard, XServiceInfo>
(m_aMutex)
+ , m_nSelection(nSelection)
{
- GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+ GtkClipboard* clipboard = gtk_clipboard_get(m_nSelection);
m_nOwnerChangedSignalId = g_signal_connect(clipboard, "owner-change",
G_CALLBACK(handle_owner_change), this);
m_pOwner = CLIPBOARD_OWNER(g_object_new(CLIPBOARD_OWNER_OBJECT, NULL));
@@ -502,7 +511,7 @@ VclGtkClipboard::VclGtkClipboard()
VclGtkClipboard::~VclGtkClipboard()
{
- GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+ GtkClipboard* clipboard = gtk_clipboard_get(m_nSelection);
g_signal_handler_disconnect(clipboard, m_nOwnerChangedSignalId);
g_object_unref(m_pOwner);
}
@@ -562,7 +571,7 @@ void VclGtkClipboard::setContents(
//if there was a previous gtk_clipboard_set_with_data call then
//ClipboardClearFunc will be called now
- GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+ GtkClipboard* clipboard = gtk_clipboard_get(m_nSelection);
//use with_owner with m_pOwner so we can distinguish in handle_owner_change
//if we have gained or lost ownership of the clipboard
gtk_clipboard_set_with_owner(clipboard, aGtkTargets.data(), aGtkTargets.size(),
@@ -618,15 +627,9 @@ Reference< XInterface > GtkInstance::CreateClipboard(const Sequence< Any >& argu
css::uno::Reference<css::uno::XInterface>(), -1);
}
- //see window.cxx HAVE_FEATURE_X11 hack, for now just support the
- //system clipboard and not the primary selection
- if (sel != "CLIPBOARD")
- {
- Reference< XComponentContext > xContext(comphelper::getProcessComponentContext());
- return xContext->getServiceManager()->createInstanceWithContext("com.sun.star.datatransfer.clipboard.GenericClipboard", xContext);
- }
+ GdkAtom nSelection = (sel == "CLIPBOARD") ? GDK_SELECTION_CLIPBOARD : GDK_SELECTION_PRIMARY;
- return Reference< XInterface >( static_cast<cppu::OWeakObject *>(new VclGtkClipboard()) );
+ return Reference< XInterface >( static_cast<cppu::OWeakObject *>(new VclGtkClipboard(nSelection)) );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */