Index: ui/base/dragdrop/os_exchange_data_provider_aurax11.h |
diff --git a/ui/base/dragdrop/os_exchange_data_provider_aurax11.h b/ui/base/dragdrop/os_exchange_data_provider_aurax11.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..931c49248aed207b13bd237a43c992068bad9275 |
--- /dev/null |
+++ b/ui/base/dragdrop/os_exchange_data_provider_aurax11.h |
@@ -0,0 +1,127 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_AURAX11_H_ |
+#define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_AURAX11_H_ |
+ |
+#include <X11/Xlib.h> |
+ |
+// Get rid of a macro from Xlib.h that conflicts with Aura's RootWindow class. |
+#undef RootWindow |
+ |
+#include <map> |
+ |
+#include "base/files/file_path.h" |
+#include "base/message_pump_dispatcher.h" |
+#include "base/pickle.h" |
+#include "googleurl/src/gurl.h" |
+#include "ui/base/dragdrop/os_exchange_data.h" |
+#include "ui/base/x/selection_owner.h" |
+#include "ui/base/x/selection_requestor.h" |
+#include "ui/base/x/x11_atom_cache.h" |
+#include "ui/gfx/image/image_skia.h" |
+#include "ui/gfx/vector2d.h" |
+ |
+namespace ui { |
+ |
+class Clipboard; |
+class DesktopSelectionProviderAuraX11; |
+ |
+// OSExchangeData::Provider implementation for aura on linux. |
+class UI_EXPORT OSExchangeDataProviderAuraX11 |
+ : public OSExchangeData::Provider, |
+ public base::MessagePumpDispatcher { |
+ public: |
+ // Creates a Provider for drag receiving. |x_window| is the window the cursor |
+ // is over, and |targets| are the MIME types being offered by the other |
+ // process. |
+ OSExchangeDataProviderAuraX11(ui::DesktopSelectionProviderAuraX11* provider, |
+ ::Window x_window, |
+ const std::vector< ::Atom> targets); |
+ |
+ // Creates a Provider for sending drag information. This creates its own, |
+ // hidden X11 window to own send data. |
+ OSExchangeDataProviderAuraX11(); |
+ |
+ virtual ~OSExchangeDataProviderAuraX11(); |
+ |
+ // If we are receiving, we receive messages from a DesktopRootWindowHost |
+ // through this interface. |
+ void OnSelectionNotify(const XSelectionEvent& event); |
+ |
+ // Overridden from OSExchangeData::Provider: |
+ virtual void SetString(const string16& data) OVERRIDE; |
+ virtual void SetURL(const GURL& url, const string16& title) OVERRIDE; |
+ virtual void SetFilename(const base::FilePath& path) OVERRIDE; |
+ virtual void SetFilenames( |
+ const std::vector<OSExchangeData::FileInfo>& filenames) OVERRIDE; |
+ virtual void SetPickledData(OSExchangeData::CustomFormat format, |
+ const Pickle& data) OVERRIDE; |
+ virtual bool GetString(string16* data) const OVERRIDE; |
+ virtual bool GetURLAndTitle(GURL* url, string16* title) const OVERRIDE; |
+ virtual bool GetFilename(base::FilePath* path) const OVERRIDE; |
+ virtual bool GetFilenames( |
+ std::vector<OSExchangeData::FileInfo>* filenames) const OVERRIDE; |
+ virtual bool GetPickledData(OSExchangeData::CustomFormat format, |
+ Pickle* data) const OVERRIDE; |
+ virtual bool HasString() const OVERRIDE; |
+ virtual bool HasURL() const OVERRIDE; |
+ virtual bool HasFile() const OVERRIDE; |
+ virtual bool HasCustomFormat( |
+ OSExchangeData::CustomFormat format) const OVERRIDE; |
+ |
+ virtual void SetHtml(const string16& html, const GURL& base_url) OVERRIDE; |
+ virtual bool GetHtml(string16* html, GURL* base_url) const OVERRIDE; |
+ virtual bool HasHtml() const OVERRIDE; |
+ virtual void SetDragImage(const gfx::ImageSkia& image, |
+ const gfx::Vector2d& cursor_offset) OVERRIDE; |
+ virtual const gfx::ImageSkia& GetDragImage() const OVERRIDE; |
+ virtual const gfx::Vector2d& GetDragImageOffset() const OVERRIDE; |
+ |
+ // Overridden from base::MessagePumpDispatcher: |
+ virtual bool Dispatch(const base::NativeEvent& event) OVERRIDE; |
+ |
+ private: |
+ typedef std::map<OSExchangeData::CustomFormat, Pickle> PickleData; |
+ |
+ // Returns true if |formats_| contains a string format and the string can be |
+ // parsed as a URL. |
+ bool GetPlainTextURL(GURL* url) const; |
+ |
+ // Drag image and offset data. |
+ gfx::ImageSkia drag_image_; |
+ gfx::Vector2d drag_image_offset_; |
+ |
+ // Our X11 state. |
+ Display* x_display_; |
+ ::Window x_root_window_; |
+ |
+ // In X11, because the IPC parts of drag operations are implemented by |
+ // XSelection, we require an x11 window to receive drag messages on. The |
+ // OSExchangeDataProvider system is modeled on the Windows implementation, |
+ // which does not require a window. We only sometimes have a valid window |
+ // available (in the case of drag receiving). Other times, we need to create |
+ // our own xwindow just to receive events on it. |
+ const bool own_window_; |
+ |
+ // When we don't own the window, we keep track of the object that does so we |
+ // can receive messages from it. |
+ ui::DesktopSelectionProviderAuraX11* selection_event_provider_; |
+ |
+ ::Window x_window_; |
+ |
+ X11AtomCache atom_cache_; |
+ |
+ mutable SelectionRequestor selection_requestor_; |
+ mutable SelectionOwner selection_owner_; |
+ |
+ // The mime types we have been offered by the source window. |
+ std::vector< ::Atom> targets_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(OSExchangeDataProviderAuraX11); |
+}; |
+ |
+} // namespace ui |
+ |
+#endif // UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_AURAX11_H_ |