[Libreoffice-commits] core.git: Branch 'libreoffice-5-0' - 11 commits - vcl/inc vcl/unx

Caolán McNamara caolanm at redhat.com
Fri Jun 19 01:50:37 PDT 2015


 vcl/inc/unx/gtk/gtkinst.hxx                   |    4 
 vcl/unx/generic/plugadapt/salplug.cxx         |    8 
 vcl/unx/gtk3/app/gtk3gtkinst.cxx              |  612 ++++++++++++++++++++++++++
 vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx |   13 
 4 files changed, 620 insertions(+), 17 deletions(-)

New commits:
commit 0af056d72e9a26b52349babeefc27b6b2926803c
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Jun 17 16:25:47 2015 +0100

    use gtk3 vclplug by default under GNOME3 if available
    
    Change-Id: I4efe8bdfb7080365094306aee9db6b69a7f9e86a
    (cherry picked from commit 031a347668e56c1b38c0539d30e9a1cbb808ca02)

diff --git a/vcl/unx/generic/plugadapt/salplug.cxx b/vcl/unx/generic/plugadapt/salplug.cxx
index d49dccd..0d0b26d 100644
--- a/vcl/unx/generic/plugadapt/salplug.cxx
+++ b/vcl/unx/generic/plugadapt/salplug.cxx
@@ -68,14 +68,6 @@ static SalInstance* tryInstance( const OUString& rModuleBase, bool bForce = fals
         return svp_create_SalInstance();
 
     SalInstance* pInst = NULL;
-    // Disable gtk3 plugin for now unless explicitly requested via
-    // SAL_USE_VCLPLUGIN=gtk3 (would ideally depend on experimental mode, but
-    // reading the experimental mode setting requires the UNO service manager
-    // which has not yet been instantiated):
-    if (!bForce && rModuleBase == "gtk3")
-    {
-        return NULL;
-    }
     OUString aModule(
 #ifdef SAL_DLLPREFIX
             SAL_DLLPREFIX
commit 9c04fca94f7b6723eab703caeccd4fd092b9ed2c
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Jun 19 09:16:40 2015 +0100

    gtk3: use owner-changed to detect losing/gaining clipboard ownership
    
    and use the generic implementation (for now at least) for the PRIMARY
    selection and use this for the CLIPBOARD selection
    
    Change-Id: I31d65534481dc73f0cf65d68a663b7dfbb13aa31
    (cherry picked from commit 4008b6f9bfd919a7435047bc0aedcf7613009809)

diff --git a/vcl/unx/gtk3/app/gtk3gtkinst.cxx b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
index 6a67255..a45a5e1 100644
--- a/vcl/unx/gtk3/app/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
@@ -23,6 +23,7 @@
 #include "com/sun/star/datatransfer/dnd/XDragSource.hpp"
 #include "com/sun/star/datatransfer/dnd/XDropTarget.hpp"
 #include "com/sun/star/datatransfer/dnd/DNDConstants.hpp"
+#include <comphelper/processfactory.hxx>
 #include <comphelper/sequence.hxx>
 #include "cppuhelper/compbase.hxx"
 #include "cppuhelper/implbase1.hxx"
@@ -219,12 +220,51 @@ public:
     }
 };
 
+//We want to use gtk_clipboard_get_owner own owner-change to distinguish between
+//us gaining the clipboard ownership vs losing it. To do that we need to use
+//gtk_clipboard_set_with_owner and to do that we need a GObject, so define
+//one here for that purpose and just give it a VclGtkClipboard* member
+class VclGtkClipboard;
+
+typedef struct _ClipboardOwner ClipboardOwner;
+typedef struct _ClipboardOwnerClass ClipboardOwnerClass;
+
+struct _ClipboardOwner
+{
+    GObject parent_instance;
+
+    /* instance members */
+    VclGtkClipboard* m_pThis;
+};
+
+struct _ClipboardOwnerClass
+{
+  GObjectClass parent_class;
+
+  /* class members */
+};
+
+#define CLIPBOARD_OWNER_OBJECT           (clipboard_owner_get_type ())
+#define CLIPBOARD_OWNER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLIPBOARD_OWNER_OBJECT, ClipboardOwner))
+
+G_DEFINE_TYPE(ClipboardOwner, clipboard_owner, G_TYPE_OBJECT);
+
+static void clipboard_owner_class_init (ClipboardOwnerClass *)
+{
+}
+
+static void clipboard_owner_init(ClipboardOwner *)
+{
+}
+
 class VclGtkClipboard :
         public cppu::WeakComponentImplHelper<
         datatransfer::clipboard::XSystemClipboard,
         XServiceInfo>
 {
     osl::Mutex                                               m_aMutex;
+    ClipboardOwner*                                          m_pOwner;
+    gulong                                                   m_nOwnerChangedSignalId;
     Reference<css::datatransfer::XTransferable>              m_aContents;
     Reference<css::datatransfer::clipboard::XClipboardOwner> m_aOwner;
     std::list< Reference<css::datatransfer::clipboard::XClipboardListener> > m_aListeners;
@@ -233,16 +273,8 @@ class VclGtkClipboard :
 
 public:
 
-    VclGtkClipboard() : cppu::WeakComponentImplHelper<
-        datatransfer::clipboard::XSystemClipboard,
-        XServiceInfo
-        >( m_aMutex )
-    {
-    }
-
-    virtual ~VclGtkClipboard()
-    {
-    }
+    VclGtkClipboard();
+    virtual ~VclGtkClipboard();
 
     /*
      * XServiceInfo
@@ -290,6 +322,7 @@ public:
 
     void ClipboardGet(GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info);
     void ClipboardClear(GtkClipboard *clipboard);
+    void OwnerChanged(GtkClipboard *clipboard, GdkEvent *event);
 private:
     GtkTargetEntry makeGtkTargetEntry(const css::datatransfer::DataFlavor& rFlavor);
 };
@@ -323,27 +356,11 @@ sal_Bool VclGtkClipboard::supportsService( const OUString& ServiceName ) throw(
 
 Reference< css::datatransfer::XTransferable > VclGtkClipboard::getContents() throw( RuntimeException, std::exception )
 {
-    if (! m_aContents.is())
-        m_aContents = new GtkTransferable();
-
-    return m_aContents;
-}
-
-namespace
-{
-    void ClipboardGetFunc(GtkClipboard *clipboard, GtkSelectionData *selection_data,
-                          guint info,
-                          gpointer user_data_or_owner)
-    {
-        VclGtkClipboard* pThis = static_cast<VclGtkClipboard*>(user_data_or_owner);
-        pThis->ClipboardGet(clipboard, selection_data, info);
-    }
-
-    void ClipboardClearFunc(GtkClipboard *clipboard, gpointer user_data_or_owner)
+    if (!m_aContents.is())
     {
-        VclGtkClipboard* pThis = static_cast<VclGtkClipboard*>(user_data_or_owner);
-        pThis->ClipboardClear(clipboard);
+        m_aContents = new GtkTransferable();
     }
+    return m_aContents;
 }
 
 void VclGtkClipboard::ClipboardGet(GtkClipboard* /*clipboard*/, GtkSelectionData *selection_data,
@@ -405,6 +422,17 @@ void VclGtkClipboard::ClipboardGet(GtkClipboard* /*clipboard*/, GtkSelectionData
                            aData.getLength());
 }
 
+void VclGtkClipboard::OwnerChanged(GtkClipboard* clipboard, GdkEvent* /*event*/)
+{
+    if (G_OBJECT(m_pOwner) != gtk_clipboard_get_owner(clipboard))
+    {
+        //null out m_aContents to return control to the system-one which
+        //will be retrieved if getContents is called again
+        setContents(Reference<css::datatransfer::XTransferable>(),
+                    Reference<css::datatransfer::clipboard::XClipboardOwner>());
+    }
+}
+
 void VclGtkClipboard::ClipboardClear(GtkClipboard * /*clipboard*/)
 {
     for (auto &a : m_aGtkTargets)
@@ -430,6 +458,47 @@ GtkTargetEntry VclGtkClipboard::makeGtkTargetEntry(const css::datatransfer::Data
     return aEntry;
 }
 
+namespace
+{
+    void ClipboardGetFunc(GtkClipboard *clipboard, GtkSelectionData *selection_data,
+                          guint info,
+                          gpointer user_data_or_owner)
+    {
+        VclGtkClipboard* pThis = CLIPBOARD_OWNER(user_data_or_owner)->m_pThis;
+        pThis->ClipboardGet(clipboard, selection_data, info);
+    }
+
+    void ClipboardClearFunc(GtkClipboard *clipboard, gpointer user_data_or_owner)
+    {
+        VclGtkClipboard* pThis = CLIPBOARD_OWNER(user_data_or_owner)->m_pThis;
+        pThis->ClipboardClear(clipboard);
+    }
+
+    void handle_owner_change(GtkClipboard *clipboard, GdkEvent *event, gpointer user_data)
+    {
+        VclGtkClipboard* pThis = static_cast<VclGtkClipboard*>(user_data);
+        pThis->OwnerChanged(clipboard, event);
+    }
+}
+
+VclGtkClipboard::VclGtkClipboard()
+    : cppu::WeakComponentImplHelper<datatransfer::clipboard::XSystemClipboard, XServiceInfo>
+        (m_aMutex)
+{
+    GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+    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));
+    m_pOwner->m_pThis = this;
+}
+
+VclGtkClipboard::~VclGtkClipboard()
+{
+    GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+    g_signal_handler_disconnect(clipboard, m_nOwnerChangedSignalId);
+    g_object_unref(m_pOwner);
+}
+
 void VclGtkClipboard::setContents(
         const Reference< css::datatransfer::XTransferable >& xTrans,
         const Reference< css::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner )
@@ -486,8 +555,10 @@ 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);
-        gtk_clipboard_set_with_data(clipboard, aGtkTargets.data(), aGtkTargets.size(),
-                                    ClipboardGetFunc, ClipboardClearFunc, this);
+        //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(),
+                                    ClipboardGetFunc, ClipboardClearFunc, G_OBJECT(m_pOwner));
         m_aGtkTargets = aGtkTargets;
     }
 
@@ -528,8 +599,25 @@ void VclGtkClipboard::removeClipboardListener( const Reference< datatransfer::cl
     m_aListeners.remove( listener );
 }
 
-Reference< XInterface > GtkInstance::CreateClipboard( const Sequence< Any >& )
+Reference< XInterface > GtkInstance::CreateClipboard(const Sequence< Any >& arguments)
 {
+    OUString sel;
+    if (arguments.getLength() == 0) {
+        sel = "CLIPBOARD";
+    } else if (arguments.getLength() != 1 || !(arguments[0] >>= sel)) {
+        throw css::lang::IllegalArgumentException(
+            "bad GtkInstance::CreateClipboard arguments",
+            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);
+    }
+
     return Reference< XInterface >( static_cast<cppu::OWeakObject *>(new VclGtkClipboard()) );
 }
 
commit 6ba65ce17f4fb0774f050beb9cfd1275032426af
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jun 18 16:33:16 2015 +0100

    gtk3: unused param
    
    Change-Id: I91fc320acf816d028186d25fd136f58c1c785d9d
    (cherry picked from commit babe536ec227c04d10e55cd780e7021bf905aa82)

diff --git a/vcl/unx/gtk3/app/gtk3gtkinst.cxx b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
index baa558d..6a67255 100644
--- a/vcl/unx/gtk3/app/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
@@ -346,7 +346,7 @@ namespace
     }
 }
 
-void VclGtkClipboard::ClipboardGet(GtkClipboard *clipboard, GtkSelectionData *selection_data,
+void VclGtkClipboard::ClipboardGet(GtkClipboard* /*clipboard*/, GtkSelectionData *selection_data,
                                    guint info)
 {
 
commit 62eb09d2f86f373b34cdb42be345ed2b1b007c1e
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jun 18 16:28:52 2015 +0100

    gtk3: implement paste from us
    
    Change-Id: Iea25d633a833965814a08d87954906e0133f7076
    (cherry picked from commit 698120857eecc0afa90bc408a3e0a41eee21f1dd)

diff --git a/vcl/unx/gtk3/app/gtk3gtkinst.cxx b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
index ae5b338..baa558d 100644
--- a/vcl/unx/gtk3/app/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
@@ -203,7 +203,7 @@ public:
         return aVector;
     }
 
-    virtual css::uno::Sequence< css::datatransfer::DataFlavor > SAL_CALL getTransferDataFlavors()
+    virtual css::uno::Sequence<css::datatransfer::DataFlavor> SAL_CALL getTransferDataFlavors()
         throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE
     {
         return comphelper::containerToSequence(getTransferDataFlavorsAsVector());
@@ -222,13 +222,14 @@ public:
 class VclGtkClipboard :
         public cppu::WeakComponentImplHelper<
         datatransfer::clipboard::XSystemClipboard,
-        XServiceInfo
-        >
+        XServiceInfo>
 {
-    osl::Mutex                                                              m_aMutex;
-    Reference< css::datatransfer::XTransferable >              m_aContents;
-    Reference< css::datatransfer::clipboard::XClipboardOwner > m_aOwner;
-    std::list< Reference< css::datatransfer::clipboard::XClipboardListener > > m_aListeners;
+    osl::Mutex                                               m_aMutex;
+    Reference<css::datatransfer::XTransferable>              m_aContents;
+    Reference<css::datatransfer::clipboard::XClipboardOwner> m_aOwner;
+    std::list< Reference<css::datatransfer::clipboard::XClipboardListener> > m_aListeners;
+    std::vector<GtkTargetEntry> m_aGtkTargets;
+    std::vector<css::datatransfer::DataFlavor> m_aInfoToFlavor;
 
 public:
 
@@ -238,6 +239,7 @@ public:
         >( m_aMutex )
     {
     }
+
     virtual ~VclGtkClipboard()
     {
     }
@@ -285,6 +287,11 @@ public:
     virtual void SAL_CALL removeClipboardListener(
         const Reference< css::datatransfer::clipboard::XClipboardListener >& listener )
         throw(RuntimeException, std::exception) SAL_OVERRIDE;
+
+    void ClipboardGet(GtkClipboard *clipboard, GtkSelectionData *selection_data, guint info);
+    void ClipboardClear(GtkClipboard *clipboard);
+private:
+    GtkTargetEntry makeGtkTargetEntry(const css::datatransfer::DataFlavor& rFlavor);
 };
 
 OUString VclGtkClipboard::getImplementationName_static()
@@ -322,6 +329,107 @@ Reference< css::datatransfer::XTransferable > VclGtkClipboard::getContents() thr
     return m_aContents;
 }
 
+namespace
+{
+    void ClipboardGetFunc(GtkClipboard *clipboard, GtkSelectionData *selection_data,
+                          guint info,
+                          gpointer user_data_or_owner)
+    {
+        VclGtkClipboard* pThis = static_cast<VclGtkClipboard*>(user_data_or_owner);
+        pThis->ClipboardGet(clipboard, selection_data, info);
+    }
+
+    void ClipboardClearFunc(GtkClipboard *clipboard, gpointer user_data_or_owner)
+    {
+        VclGtkClipboard* pThis = static_cast<VclGtkClipboard*>(user_data_or_owner);
+        pThis->ClipboardClear(clipboard);
+    }
+}
+
+void VclGtkClipboard::ClipboardGet(GtkClipboard *clipboard, GtkSelectionData *selection_data,
+                                   guint info)
+{
+
+    GdkAtom type(gdk_atom_intern(OUStringToOString(m_aInfoToFlavor[info].MimeType,
+                                                   RTL_TEXTENCODING_UTF8).getStr(),
+                                 false));
+
+    css::datatransfer::DataFlavor aFlavor(m_aInfoToFlavor[info]);
+    if (aFlavor.MimeType == "UTF8_STRING" || aFlavor.MimeType == "STRING")
+        aFlavor.MimeType = "text/plain;charset=utf-8";
+
+    Sequence<sal_Int8> aData;
+    Any aValue;
+
+    try
+    {
+        aValue = m_aContents->getTransferData(aFlavor);
+    }
+    catch(...)
+    {
+    }
+
+    if (aValue.getValueTypeClass() == TypeClass_STRING)
+    {
+        OUString aString;
+        aValue >>= aString;
+        aData = Sequence< sal_Int8 >( reinterpret_cast<sal_Int8 const *>(aString.getStr()), aString.getLength() * sizeof( sal_Unicode ) );
+    }
+    else if (aValue.getValueType() == cppu::UnoType<Sequence< sal_Int8 >>::get())
+    {
+        aValue >>= aData;
+    }
+    else if (aFlavor.MimeType == "text/plain;charset=utf-8")
+    {
+        //didn't have utf-8, try utf-16 and convert
+        aFlavor.MimeType = "text/plain;charset=utf-16";
+        aFlavor.DataType = cppu::UnoType<OUString>::get();
+        try
+        {
+            aValue = m_aContents->getTransferData(aFlavor);
+        }
+        catch(...)
+        {
+        }
+        OUString aString;
+        aValue >>= aString;
+        OString aUTF8String(OUStringToOString(aString, RTL_TEXTENCODING_UTF8));
+        gtk_selection_data_set(selection_data, type, 8,
+                               reinterpret_cast<const guchar *>(aUTF8String.getStr()),
+                               aUTF8String.getLength());
+        return;
+    }
+
+    gtk_selection_data_set(selection_data, type, 8,
+                           reinterpret_cast<const guchar *>(aData.getArray()),
+                           aData.getLength());
+}
+
+void VclGtkClipboard::ClipboardClear(GtkClipboard * /*clipboard*/)
+{
+    for (auto &a : m_aGtkTargets)
+        free(a.target);
+    m_aGtkTargets.clear();
+}
+
+GtkTargetEntry VclGtkClipboard::makeGtkTargetEntry(const css::datatransfer::DataFlavor& rFlavor)
+{
+    GtkTargetEntry aEntry;
+    aEntry.target =
+        g_strdup(OUStringToOString(rFlavor.MimeType, RTL_TEXTENCODING_UTF8).getStr());
+    aEntry.flags = 0;
+    auto it = std::find_if(m_aInfoToFlavor.begin(), m_aInfoToFlavor.end(),
+                        DataFlavorEq(rFlavor));
+    if (it != m_aInfoToFlavor.end())
+        aEntry.info = std::distance(m_aInfoToFlavor.begin(), it);
+    else
+    {
+        aEntry.info = m_aInfoToFlavor.size();
+        m_aInfoToFlavor.push_back(rFlavor);
+    }
+    return aEntry;
+}
+
 void VclGtkClipboard::setContents(
         const Reference< css::datatransfer::XTransferable >& xTrans,
         const Reference< css::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner )
@@ -337,6 +445,52 @@ void VclGtkClipboard::setContents(
     datatransfer::clipboard::ClipboardEvent aEv;
     aEv.Contents = m_aContents;
 
+    if (m_aContents.is())
+    {
+        css::uno::Sequence<css::datatransfer::DataFlavor> aFormats = xTrans->getTransferDataFlavors();
+        std::vector<GtkTargetEntry> aGtkTargets;
+        bool bHaveText(false), bHaveUTF8(false);
+        for (int i = 0; i < aFormats.getLength(); ++i)
+        {
+            const css::datatransfer::DataFlavor& rFlavor = aFormats[i];
+
+            sal_Int32 nIndex(0);
+            if (rFlavor.MimeType.getToken(0, ';', nIndex) == "text/plain")
+            {
+                bHaveText = true;
+                OUString aToken(rFlavor.MimeType.getToken(0, ';', nIndex));
+                if (aToken == "charset=utf-8")
+                {
+                    bHaveUTF8 = true;
+                }
+            }
+            GtkTargetEntry aEntry(makeGtkTargetEntry(rFlavor));
+            aGtkTargets.push_back(aEntry);
+        }
+
+        if (bHaveText)
+        {
+            css::datatransfer::DataFlavor aFlavor;
+            aFlavor.DataType = cppu::UnoType<Sequence< sal_Int8 >>::get();
+            if (!bHaveUTF8)
+            {
+                aFlavor.MimeType = "text/plain;charset=utf-8";
+                aGtkTargets.push_back(makeGtkTargetEntry(aFlavor));
+            }
+            aFlavor.MimeType = "UTF8_STRING";
+            aGtkTargets.push_back(makeGtkTargetEntry(aFlavor));
+            aFlavor.MimeType = "STRING";
+            aGtkTargets.push_back(makeGtkTargetEntry(aFlavor));
+        }
+
+        //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);
+        gtk_clipboard_set_with_data(clipboard, aGtkTargets.data(), aGtkTargets.size(),
+                                    ClipboardGetFunc, ClipboardClearFunc, this);
+        m_aGtkTargets = aGtkTargets;
+    }
+
     aGuard.clear();
 
     if( xOldOwner.is() && xOldOwner != xClipboardOwner )
commit a037aa409c6818ea00bd7d9f6aace476bcda0d4f
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jun 18 14:02:54 2015 +0100

    gtk3: little code cleanup
    
    Change-Id: I3e0f1fe0376ddcf9e79e6815a13f54007d47b03e
    (cherry picked from commit ceb31879c4fc3dd3e62a45318f22c1f69db9974a)

diff --git a/vcl/unx/gtk3/app/gtk3gtkinst.cxx b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
index 0b5ea9f..ae5b338 100644
--- a/vcl/unx/gtk3/app/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
@@ -98,14 +98,6 @@ class GtkTransferable : public ::cppu::WeakImplHelper1 <
 private:
     std::map<OUString, GdkAtom> m_aMimeTypeToAtom;
 public:
-    GtkTransferable()
-    {
-    }
-
-    virtual ~GtkTransferable()
-    {
-    }
-
     /*
      * XTransferable
      */
@@ -246,7 +238,9 @@ public:
         >( m_aMutex )
     {
     }
-    virtual ~VclGtkClipboard();
+    virtual ~VclGtkClipboard()
+    {
+    }
 
     /*
      * XServiceInfo
@@ -293,10 +287,6 @@ public:
         throw(RuntimeException, std::exception) SAL_OVERRIDE;
 };
 
-VclGtkClipboard::~VclGtkClipboard()
-{
-}
-
 OUString VclGtkClipboard::getImplementationName_static()
 {
     return OUString( "com.sun.star.datatransfer.VclGtkClipboard"  );
commit d04085c7c334c42efa0d1543c482628a9312c138
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jun 18 13:56:29 2015 +0100

    gtk3: implement isDataFlavorSupported
    
    Change-Id: Ia381d26a1c6a8f22aafef924215bc64b3c3473c6
    (cherry picked from commit a26d21acb34d6e35a12cf8afa3cc64701f384687)

diff --git a/vcl/unx/gtk3/app/gtk3gtkinst.cxx b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
index cb26b26..0b5ea9f 100644
--- a/vcl/unx/gtk3/app/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
@@ -77,6 +77,19 @@ namespace
         // PIXMAP
         { "PIXMAP", "image/bmp" }
     };
+
+    class DataFlavorEq : public std::unary_function<const css::datatransfer::DataFlavor&, bool>
+    {
+    private:
+        const css::datatransfer::DataFlavor& m_rData;
+    public:
+        explicit DataFlavorEq(const css::datatransfer::DataFlavor& rData) : m_rData(rData) {}
+        bool operator() (const css::datatransfer::DataFlavor& rData) const
+        {
+            return rData.MimeType == m_rData.MimeType &&
+                   rData.DataType  == m_rData.DataType;
+        }
+    };
 }
 
 class GtkTransferable : public ::cppu::WeakImplHelper1 <
@@ -131,12 +144,12 @@ public:
         return aRet;
     }
 
-    virtual css::uno::Sequence< css::datatransfer::DataFlavor > SAL_CALL getTransferDataFlavors(  )
-        throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE
+    std::vector<css::datatransfer::DataFlavor> getTransferDataFlavorsAsVector()
     {
+        std::vector<css::datatransfer::DataFlavor> aVector;
+
         GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
 
-        std::vector<css::datatransfer::DataFlavor> aVector;
         GdkAtom *targets;
         gint n_targets;
         if (gtk_clipboard_wait_for_targets(clipboard, &targets, &n_targets))
@@ -195,16 +208,22 @@ public:
             }
         }
 
-        return comphelper::containerToSequence(aVector);
+        return aVector;
+    }
+
+    virtual css::uno::Sequence< css::datatransfer::DataFlavor > SAL_CALL getTransferDataFlavors()
+        throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE
+    {
+        return comphelper::containerToSequence(getTransferDataFlavorsAsVector());
     }
 
-    virtual sal_Bool SAL_CALL isDataFlavorSupported( const css::datatransfer::DataFlavor& aFlavor )
+    virtual sal_Bool SAL_CALL isDataFlavorSupported(const css::datatransfer::DataFlavor& rFlavor)
         throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE
     {
-        fprintf(stderr, "TODO isDataFlavorSupported\n");
+        const std::vector<css::datatransfer::DataFlavor> aAll =
+            getTransferDataFlavorsAsVector();
 
-        (void)aFlavor;
-        return false;
+        return std::find_if(aAll.begin(), aAll.end(), DataFlavorEq(rFlavor)) != aAll.end();
     }
 };
 
commit 08662de9af02d4ceefc1701a5628729ffdcb3adf
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jun 18 13:37:52 2015 +0100

    gtk3: implement paste everything else into us
    
    Change-Id: I39c3e5646a5a1ea07aa881cad584a0b7ae9bd005
    (cherry picked from commit 50cfcd91a0893ff795fc1cf1a2e7c3f7c6da5326)

diff --git a/vcl/unx/gtk3/app/gtk3gtkinst.cxx b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
index a96d1e4..cb26b26 100644
--- a/vcl/unx/gtk3/app/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
@@ -82,6 +82,8 @@ namespace
 class GtkTransferable : public ::cppu::WeakImplHelper1 <
     css::datatransfer::XTransferable >
 {
+private:
+    std::map<OUString, GdkAtom> m_aMimeTypeToAtom;
 public:
     GtkTransferable()
     {
@@ -95,24 +97,37 @@ public:
      * XTransferable
      */
 
-    virtual css::uno::Any SAL_CALL getTransferData( const css::datatransfer::DataFlavor& aFlavor )
+    virtual css::uno::Any SAL_CALL getTransferData(const css::datatransfer::DataFlavor& rFlavor)
         throw(css::datatransfer::UnsupportedFlavorException,
               css::io::IOException,
               css::uno::RuntimeException, std::exception
               ) SAL_OVERRIDE
     {
-        css::uno::Any aRet;
         GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
-        if (aFlavor.MimeType == "text/plain;charset=utf-16")
+        if (rFlavor.MimeType == "text/plain;charset=utf-16")
         {
             gchar *pText = gtk_clipboard_wait_for_text(clipboard);
             OUString aStr(pText, rtl_str_getLength(pText),
                 RTL_TEXTENCODING_UTF8);
             g_free(pText);
+            css::uno::Any aRet;
             aRet <<= aStr.replaceAll("\r\n", "\n");
+            return aRet;
         }
-        else
-            fprintf(stderr, "TO-DO getTransferData %s\n", OUStringToOString(aFlavor.MimeType, RTL_TEXTENCODING_UTF8).getStr());
+
+        auto it = m_aMimeTypeToAtom.find(rFlavor.MimeType);
+        if (it == m_aMimeTypeToAtom.end())
+            return css::uno::Any();
+
+        css::uno::Any aRet;
+        GtkSelectionData* data = gtk_clipboard_wait_for_contents(clipboard,
+                                                                 it->second);
+        gint length;
+        const guchar *rawdata = gtk_selection_data_get_data_with_length(data,
+                                                                        &length);
+        Sequence<sal_Int8> aSeq(reinterpret_cast<const sal_Int8*>(rawdata), length);
+        gtk_selection_data_free(data);
+        aRet <<= aSeq;
         return aRet;
     }
 
@@ -146,6 +161,9 @@ public:
                 aFlavor.MimeType = OUString(pFinalName,
                                             rtl_str_getLength(pFinalName),
                                             RTL_TEXTENCODING_UTF8);
+
+                m_aMimeTypeToAtom[aFlavor.MimeType] = targets[i];
+
                 aFlavor.DataType = cppu::UnoType<Sequence< sal_Int8 >>::get();
 
                 sal_Int32 nIndex(0);
commit 87d95f2933044fc7abf61bdea0349f32bba4ce76
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jun 18 11:40:47 2015 +0100

    gtk3: implement most common case of text paste into us
    
    Change-Id: I733dd57e27330bc200f718ffb5680bbb81d5d77d
    (cherry picked from commit fe9da15401574551c34fffbd4e63eddca9743527)

diff --git a/vcl/unx/gtk3/app/gtk3gtkinst.cxx b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
index 902dd66..a96d1e4 100644
--- a/vcl/unx/gtk3/app/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
@@ -101,9 +101,19 @@ public:
               css::uno::RuntimeException, std::exception
               ) SAL_OVERRIDE
     {
-        fprintf(stderr, "TO-DO getTransferData\n");
-        (void)aFlavor;
-        return css::uno::Any();
+        css::uno::Any aRet;
+        GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+        if (aFlavor.MimeType == "text/plain;charset=utf-16")
+        {
+            gchar *pText = gtk_clipboard_wait_for_text(clipboard);
+            OUString aStr(pText, rtl_str_getLength(pText),
+                RTL_TEXTENCODING_UTF8);
+            g_free(pText);
+            aRet <<= aStr.replaceAll("\r\n", "\n");
+        }
+        else
+            fprintf(stderr, "TO-DO getTransferData %s\n", OUStringToOString(aFlavor.MimeType, RTL_TEXTENCODING_UTF8).getStr());
+        return aRet;
     }
 
     virtual css::uno::Sequence< css::datatransfer::DataFlavor > SAL_CALL getTransferDataFlavors(  )
commit 9c1fa2a581483ef42ac2f8604915752d352606d7
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Jun 17 16:50:39 2015 +0100

    gtk3 clipboard support
    
    doesn't work yet, but reports correctly what external formats
    are available
    
    Change-Id: I11cf9440ca516d4358c341fa67cc836b30ca42d6
    (cherry picked from commit b461e3189b9a95deef1e6c5e03b0e657b5754dfa)

diff --git a/vcl/inc/unx/gtk/gtkinst.hxx b/vcl/inc/unx/gtk/gtkinst.hxx
index fa61f07..28bca36 100644
--- a/vcl/inc/unx/gtk/gtkinst.hxx
+++ b/vcl/inc/unx/gtk/gtkinst.hxx
@@ -94,6 +94,10 @@ public:
         createFolderPicker( const com::sun::star::uno::Reference<
                                 com::sun::star::uno::XComponentContext >& ) SAL_OVERRIDE;
 
+#if GTK_CHECK_VERSION(3,0,0)
+    virtual css::uno::Reference< css::uno::XInterface > CreateClipboard( const css::uno::Sequence< css::uno::Any >& i_rArguments ) SAL_OVERRIDE;
+#endif
+
     void                        RemoveTimer (SalTimer *pTimer);
 
     // for managing a mirror of the in-flight un-dispatched gdk event queue
diff --git a/vcl/unx/gtk3/app/gtk3gtkinst.cxx b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
index c8cf298..902dd66 100644
--- a/vcl/unx/gtk3/app/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/app/gtk3gtkinst.cxx
@@ -9,4 +9,337 @@
 
 #include "../../gtk/app/gtkinst.cxx"
 
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include "com/sun/star/lang/XServiceInfo.hpp"
+#include "com/sun/star/lang/XSingleServiceFactory.hpp"
+#include "com/sun/star/lang/XInitialization.hpp"
+#include "com/sun/star/lang/DisposedException.hpp"
+#include "com/sun/star/datatransfer/XTransferable.hpp"
+#include "com/sun/star/datatransfer/clipboard/XClipboard.hpp"
+#include "com/sun/star/datatransfer/clipboard/XClipboardEx.hpp"
+#include "com/sun/star/datatransfer/clipboard/XClipboardNotifier.hpp"
+#include "com/sun/star/datatransfer/clipboard/XClipboardListener.hpp"
+#include "com/sun/star/datatransfer/clipboard/XSystemClipboard.hpp"
+#include "com/sun/star/datatransfer/dnd/XDragSource.hpp"
+#include "com/sun/star/datatransfer/dnd/XDropTarget.hpp"
+#include "com/sun/star/datatransfer/dnd/DNDConstants.hpp"
+#include <comphelper/sequence.hxx>
+#include "cppuhelper/compbase.hxx"
+#include "cppuhelper/implbase1.hxx"
+#include <cppuhelper/supportsservice.hxx>
+
+using namespace com::sun::star;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+
+namespace
+{
+    struct TypeEntry
+    {
+        const char*     pNativeType;        // string corresponding to nAtom for the case of nAtom being uninitialized
+        const char*     pType;              // Mime encoding on our side
+    };
+
+    static TypeEntry aConversionTab[] =
+    {
+        { "ISO10646-1", "text/plain;charset=utf-16" },
+        { "UTF8_STRING", "text/plain;charset=utf-8" },
+        { "UTF-8", "text/plain;charset=utf-8" },
+        { "text/plain;charset=UTF-8", "text/plain;charset=utf-8" },
+        // ISO encodings
+        { "ISO8859-2", "text/plain;charset=iso8859-2" },
+        { "ISO8859-3", "text/plain;charset=iso8859-3" },
+        { "ISO8859-4", "text/plain;charset=iso8859-4" },
+        { "ISO8859-5", "text/plain;charset=iso8859-5" },
+        { "ISO8859-6", "text/plain;charset=iso8859-6" },
+        { "ISO8859-7", "text/plain;charset=iso8859-7" },
+        { "ISO8859-8", "text/plain;charset=iso8859-8" },
+        { "ISO8859-9", "text/plain;charset=iso8859-9" },
+        { "ISO8859-10", "text/plain;charset=iso8859-10" },
+        { "ISO8859-13", "text/plain;charset=iso8859-13" },
+        { "ISO8859-14", "text/plain;charset=iso8859-14" },
+        { "ISO8859-15", "text/plain;charset=iso8859-15" },
+        // asian encodings
+        { "JISX0201.1976-0", "text/plain;charset=jisx0201.1976-0" },
+        { "JISX0208.1983-0", "text/plain;charset=jisx0208.1983-0" },
+        { "JISX0208.1990-0", "text/plain;charset=jisx0208.1990-0" },
+        { "JISX0212.1990-0", "text/plain;charset=jisx0212.1990-0" },
+        { "GB2312.1980-0", "text/plain;charset=gb2312.1980-0" },
+        { "KSC5601.1992-0", "text/plain;charset=ksc5601.1992-0" },
+        // eastern european encodings
+        { "KOI8-R", "text/plain;charset=koi8-r" },
+        { "KOI8-U", "text/plain;charset=koi8-u" },
+        // String (== iso8859-1)
+        { "STRING", "text/plain;charset=iso8859-1" },
+        // special for compound text
+        { "COMPOUND_TEXT", "text/plain;charset=compound_text" },
+
+        // PIXMAP
+        { "PIXMAP", "image/bmp" }
+    };
+}
+
+class GtkTransferable : public ::cppu::WeakImplHelper1 <
+    css::datatransfer::XTransferable >
+{
+public:
+    GtkTransferable()
+    {
+    }
+
+    virtual ~GtkTransferable()
+    {
+    }
+
+    /*
+     * XTransferable
+     */
+
+    virtual css::uno::Any SAL_CALL getTransferData( const css::datatransfer::DataFlavor& aFlavor )
+        throw(css::datatransfer::UnsupportedFlavorException,
+              css::io::IOException,
+              css::uno::RuntimeException, std::exception
+              ) SAL_OVERRIDE
+    {
+        fprintf(stderr, "TO-DO getTransferData\n");
+        (void)aFlavor;
+        return css::uno::Any();
+    }
+
+    virtual css::uno::Sequence< css::datatransfer::DataFlavor > SAL_CALL getTransferDataFlavors(  )
+        throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE
+    {
+        GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+
+        std::vector<css::datatransfer::DataFlavor> aVector;
+        GdkAtom *targets;
+        gint n_targets;
+        if (gtk_clipboard_wait_for_targets(clipboard, &targets, &n_targets))
+        {
+            bool bHaveText = false, bHaveUTF16 = false;
+
+            for (gint i = 0; i < n_targets; ++i)
+            {
+                gchar* pName = gdk_atom_name(targets[i]);
+                const char* pFinalName = pName;
+                css::datatransfer::DataFlavor aFlavor;
+
+                for (size_t j = 0; j < SAL_N_ELEMENTS(aConversionTab); ++j)
+                {
+                    if (rtl_str_compare(pName, aConversionTab[j].pNativeType) == 0)
+                    {
+                        pFinalName = aConversionTab[j].pType;
+                        break;
+                    }
+                }
+
+                aFlavor.MimeType = OUString(pFinalName,
+                                            rtl_str_getLength(pFinalName),
+                                            RTL_TEXTENCODING_UTF8);
+                aFlavor.DataType = cppu::UnoType<Sequence< sal_Int8 >>::get();
+
+                sal_Int32 nIndex(0);
+                if (aFlavor.MimeType.getToken(0, ';', nIndex) == "text/plain")
+                {
+                    bHaveText = true;
+                    OUString aToken(aFlavor.MimeType.getToken(0, ';', nIndex));
+                    if (aToken == "charset=utf-16")
+                    {
+                        bHaveUTF16 = true;
+                        aFlavor.DataType = cppu::UnoType<OUString>::get();
+                    }
+                }
+                aVector.push_back(aFlavor);
+                g_free(pName);
+            }
+
+            g_free(targets);
+
+            //If we have text, but no UTF-16 format which is basically the only
+            //text-format LibreOffice supports for cnp then claim we do and we
+            //will convert on demand
+            if (bHaveText && !bHaveUTF16)
+            {
+                css::datatransfer::DataFlavor aFlavor;
+                aFlavor.MimeType = "text/plain;charset=utf-16";
+                aFlavor.DataType = cppu::UnoType<OUString>::get();
+                aVector.push_back(aFlavor);
+            }
+        }
+
+        return comphelper::containerToSequence(aVector);
+    }
+
+    virtual sal_Bool SAL_CALL isDataFlavorSupported( const css::datatransfer::DataFlavor& aFlavor )
+        throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE
+    {
+        fprintf(stderr, "TODO isDataFlavorSupported\n");
+
+        (void)aFlavor;
+        return false;
+    }
+};
+
+class VclGtkClipboard :
+        public cppu::WeakComponentImplHelper<
+        datatransfer::clipboard::XSystemClipboard,
+        XServiceInfo
+        >
+{
+    osl::Mutex                                                              m_aMutex;
+    Reference< css::datatransfer::XTransferable >              m_aContents;
+    Reference< css::datatransfer::clipboard::XClipboardOwner > m_aOwner;
+    std::list< Reference< css::datatransfer::clipboard::XClipboardListener > > m_aListeners;
+
+public:
+
+    VclGtkClipboard() : cppu::WeakComponentImplHelper<
+        datatransfer::clipboard::XSystemClipboard,
+        XServiceInfo
+        >( m_aMutex )
+    {
+    }
+    virtual ~VclGtkClipboard();
+
+    /*
+     * XServiceInfo
+     */
+
+    virtual OUString SAL_CALL getImplementationName() throw( RuntimeException, std::exception ) SAL_OVERRIDE;
+    virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw( RuntimeException, std::exception ) SAL_OVERRIDE;
+    virtual Sequence< OUString > SAL_CALL getSupportedServiceNames() throw( RuntimeException, std::exception ) SAL_OVERRIDE;
+
+    static OUString getImplementationName_static();
+    static Sequence< OUString > getSupportedServiceNames_static();
+
+    /*
+     * XClipboard
+     */
+
+    virtual Reference< css::datatransfer::XTransferable > SAL_CALL getContents()
+        throw(RuntimeException, std::exception) SAL_OVERRIDE;
+
+    virtual void SAL_CALL setContents(
+        const Reference< css::datatransfer::XTransferable >& xTrans,
+        const Reference< css::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner )
+        throw(RuntimeException, std::exception) SAL_OVERRIDE;
+
+    virtual OUString SAL_CALL getName()
+        throw(RuntimeException, std::exception) SAL_OVERRIDE;
+
+    /*
+     * XClipboardEx
+     */
+
+    virtual sal_Int8 SAL_CALL getRenderingCapabilities()
+        throw(RuntimeException, std::exception) SAL_OVERRIDE;
+
+    /*
+     * XClipboardNotifier
+     */
+    virtual void SAL_CALL addClipboardListener(
+        const Reference< css::datatransfer::clipboard::XClipboardListener >& listener )
+        throw(RuntimeException, std::exception) SAL_OVERRIDE;
+
+    virtual void SAL_CALL removeClipboardListener(
+        const Reference< css::datatransfer::clipboard::XClipboardListener >& listener )
+        throw(RuntimeException, std::exception) SAL_OVERRIDE;
+};
+
+VclGtkClipboard::~VclGtkClipboard()
+{
+}
+
+OUString VclGtkClipboard::getImplementationName_static()
+{
+    return OUString( "com.sun.star.datatransfer.VclGtkClipboard"  );
+}
+
+Sequence< OUString > VclGtkClipboard::getSupportedServiceNames_static()
+{
+    Sequence< OUString > aRet(1);
+    aRet[0] = "com.sun.star.datatransfer.clipboard.SystemClipboard";
+    return aRet;
+}
+
+OUString VclGtkClipboard::getImplementationName() throw( RuntimeException, std::exception )
+{
+    return getImplementationName_static();
+}
+
+Sequence< OUString > VclGtkClipboard::getSupportedServiceNames() throw( RuntimeException, std::exception )
+{
+    return getSupportedServiceNames_static();
+}
+
+sal_Bool VclGtkClipboard::supportsService( const OUString& ServiceName ) throw( RuntimeException, std::exception )
+{
+    return cppu::supportsService(this, ServiceName);
+}
+
+Reference< css::datatransfer::XTransferable > VclGtkClipboard::getContents() throw( RuntimeException, std::exception )
+{
+    if (! m_aContents.is())
+        m_aContents = new GtkTransferable();
+
+    return m_aContents;
+}
+
+void VclGtkClipboard::setContents(
+        const Reference< css::datatransfer::XTransferable >& xTrans,
+        const Reference< css::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner )
+    throw( RuntimeException, std::exception )
+{
+    osl::ClearableMutexGuard aGuard( m_aMutex );
+    Reference< datatransfer::clipboard::XClipboardOwner > xOldOwner( m_aOwner );
+    Reference< datatransfer::XTransferable > xOldContents( m_aContents );
+    m_aContents = xTrans;
+    m_aOwner = xClipboardOwner;
+
+    std::list< Reference< datatransfer::clipboard::XClipboardListener > > xListeners( m_aListeners );
+    datatransfer::clipboard::ClipboardEvent aEv;
+    aEv.Contents = m_aContents;
+
+    aGuard.clear();
+
+    if( xOldOwner.is() && xOldOwner != xClipboardOwner )
+        xOldOwner->lostOwnership( this, xOldContents );
+    for( std::list< Reference< datatransfer::clipboard::XClipboardListener > >::iterator it =
+         xListeners.begin(); it != xListeners.end() ; ++it )
+    {
+        (*it)->changedContents( aEv );
+    }
+}
+
+OUString VclGtkClipboard::getName() throw( RuntimeException, std::exception )
+{
+    return OUString( "CLIPBOARD"  );
+}
+
+sal_Int8 VclGtkClipboard::getRenderingCapabilities() throw( RuntimeException, std::exception )
+{
+    return 0;
+}
+
+void VclGtkClipboard::addClipboardListener( const Reference< datatransfer::clipboard::XClipboardListener >& listener )
+    throw( RuntimeException, std::exception )
+{
+    osl::ClearableMutexGuard aGuard( m_aMutex );
+
+    m_aListeners.push_back( listener );
+}
+
+void VclGtkClipboard::removeClipboardListener( const Reference< datatransfer::clipboard::XClipboardListener >& listener )
+    throw( RuntimeException, std::exception )
+{
+    osl::ClearableMutexGuard aGuard( m_aMutex );
+
+    m_aListeners.remove( listener );
+}
+
+Reference< XInterface > GtkInstance::CreateClipboard( const Sequence< Any >& )
+{
+    return Reference< XInterface >( static_cast<cppu::OWeakObject *>(new VclGtkClipboard()) );
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 1f4766d592101c8c89ca774b15c03769bd9e6d6b
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Sat May 30 21:20:14 2015 +0100

    coverity#1302608 gtk3 Logically dead code
    
    Change-Id: I7e727bc71a5fb02d89eb6b4fb35cda26bcfa617a
    (cherry picked from commit 1abbba1d0980786b4bded6961a12da494cb93806)

diff --git a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
index a782bf8..3b06626 100644
--- a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
@@ -87,11 +87,10 @@ enum {
     RENDER_SCROLLBAR = 9,
     RENDER_SPINBUTTON = 10,
     RENDER_COMBOBOX = 11,
-    RENDER_EXTENSION = 12,
-    RENDER_EXPANDER = 13,
-    RENDER_ICON = 14,
-    RENDER_PROGRESS = 15,
-    RENDER_FOCUS = 16,
+    RENDER_EXPANDER = 12,
+    RENDER_ICON = 13,
+    RENDER_PROGRESS = 14,
+    RENDER_FOCUS = 15,
 };
 
 static void NWCalcArrowRect( const Rectangle& rButton, Rectangle& rArrow )
@@ -1089,9 +1088,6 @@ bool GtkSalGraphics::drawNativeControl( ControlType nType, ControlPart nPart, co
             gtk_render_frame(context, cr, nX, nY, nWidth, nHeight);
         }
         break;
-    case RENDER_EXTENSION:
-        gtk_render_extension(context, cr, nX, nY, nWidth, nHeight, GTK_POS_BOTTOM);
-        break;
     case RENDER_CHECK:
     case RENDER_RADIO:
         PaintCheckOrRadio(context, cr, rControlRegion, nType);
commit d9db5a56b1f0504219067048e9fd4a47429c3d8d
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Sat May 30 21:18:20 2015 +0100

    coverity#1302691 gtk3 Unused value
    
    Change-Id: Iabd10ef2c77dc389c6afdba1d38064e54bf3198d
    (cherry picked from commit 0b25823eced797ab039f26fe51df73c7aa3e1130)

diff --git a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
index 9cdf850..a782bf8 100644
--- a/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk3/gdi/gtk3salnativewidgets-gtk.cxx
@@ -1648,7 +1648,6 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings )
         case PANGO_STRETCH_EXTRA_EXPANDED:    aInfo.m_eWidth = WIDTH_EXTRA_EXPANDED;break;
         case PANGO_STRETCH_ULTRA_EXPANDED:    aInfo.m_eWidth = WIDTH_ULTRA_EXPANDED;break;
     }
-    aInfo.m_eWidth = WIDTH_ULTRA_CONDENSED;
 
 #if OSL_DEBUG_LEVEL > 1
     fprintf( stderr, "font name BEFORE system match: \"%s\"\n", aFamily.getStr() );


More information about the Libreoffice-commits mailing list