From 0b354d18ccfc05e7c2582f851d9201e2aa353d7d Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Sat, 23 Jan 2016 21:10:03 +0000 Subject: Related: tdf#93054 gtk3: implement enough dnd to be dragged into... from another application, e.g. text from gedit or a standalone image (view image) from firefox Change-Id: I68b82217eb2513cedc096f5ff653fb7c75b48052 --- vcl/inc/unx/gtk/gtkinst.hxx | 81 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) (limited to 'vcl/inc/unx/gtk/gtkinst.hxx') diff --git a/vcl/inc/unx/gtk/gtkinst.hxx b/vcl/inc/unx/gtk/gtkinst.hxx index adcb142e21ac..a2f8f78943dc 100644 --- a/vcl/inc/unx/gtk/gtkinst.hxx +++ b/vcl/inc/unx/gtk/gtkinst.hxx @@ -23,6 +23,11 @@ #include #include #include +#include +#include +#include +#include +#include #include namespace vcl @@ -44,6 +49,82 @@ public: void ThreadsLeave(); }; +#if GTK_CHECK_VERSION(3,0,0) +class GtkSalFrame; + +struct VclToGtkHelper +{ + std::vector aInfoToFlavor; + std::vector FormatsToGtk(const css::uno::Sequence &rFormats); +private: + GtkTargetEntry makeGtkTargetEntry(const css::datatransfer::DataFlavor& rFlavor); +}; + +class GtkTransferable : public cppu::WeakImplHelper +{ +protected: + std::map m_aMimeTypeToAtom; + + std::vector getTransferDataFlavorsAsVector(GdkAtom *targets, gint n_targets); +public: + + virtual css::uno::Any SAL_CALL getTransferData(const css::datatransfer::DataFlavor& rFlavor) + throw(css::datatransfer::UnsupportedFlavorException, + css::io::IOException, + css::uno::RuntimeException, std::exception) override = 0; + + virtual std::vector getTransferDataFlavorsAsVector() = 0; + + virtual css::uno::Sequence SAL_CALL getTransferDataFlavors() + throw(css::uno::RuntimeException, std::exception) override; + virtual sal_Bool SAL_CALL isDataFlavorSupported(const css::datatransfer::DataFlavor& rFlavor) + throw(css::uno::RuntimeException, std::exception) override; +}; + +class GtkDropTarget : public cppu::WeakComponentImplHelper +{ + osl::Mutex m_aMutex; + GtkSalFrame* m_pFrame; + bool m_bActive; + sal_Int8 m_nDefaultActions; + std::list> m_aListeners; +public: + GtkDropTarget(); + virtual ~GtkDropTarget(); + + // XInitialization + virtual void SAL_CALL initialize(const css::uno::Sequence& rArgs) + throw (css::uno::Exception, std::exception) override; + void deinitialize(); + + // XDropTarget + virtual void SAL_CALL addDropTargetListener(const css::uno::Reference&) + throw (std::exception) override; + virtual void SAL_CALL removeDropTargetListener(const css::uno::Reference&) + throw (std::exception) override; + virtual sal_Bool SAL_CALL isActive() throw(std::exception) override; + virtual void SAL_CALL setActive(sal_Bool active) throw(std::exception) override; + virtual sal_Int8 SAL_CALL getDefaultActions() throw(std::exception) override; + virtual void SAL_CALL setDefaultActions(sal_Int8 actions) throw(std::exception) override; + + OUString SAL_CALL getImplementationName() + throw (css::uno::RuntimeException, std::exception) override; + + sal_Bool SAL_CALL supportsService(OUString const & ServiceName) + throw (css::uno::RuntimeException, std::exception) override; + + css::uno::Sequence SAL_CALL getSupportedServiceNames() + throw (css::uno::RuntimeException, std::exception) override; + + void fire_dragEnter(const css::datatransfer::dnd::DropTargetDragEnterEvent& dtdee); + void fire_dragOver(const css::datatransfer::dnd::DropTargetDragEvent& dtde); + void fire_drop(const css::datatransfer::dnd::DropTargetDropEvent& dtde); + void fire_dragExit(const css::datatransfer::dnd::DropTargetEvent& dte); +}; +#endif + class GtkSalTimer; #if GTK_CHECK_VERSION(3,0,0) class GtkInstance : public SvpSalInstance -- cgit