1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_AURAX11_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_AURAX11_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <X11/Xlib.h> 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Get rid of a macro from Xlib.h that conflicts with Aura's RootWindow class. 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#undef RootWindow 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <map> 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/pickle.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/x/selection_owner.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/x/selection_requestor.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/x/selection_utils.h" 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/platform/platform_event_dispatcher.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/image/image_skia.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/vector2d.h" 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_atom_cache.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ui { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Clipboard; 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class OSExchangeDataProviderAuraX11Test; 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// OSExchangeData::Provider implementation for aura on linux. 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT OSExchangeDataProviderAuraX11 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public OSExchangeData::Provider, 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public ui::PlatformEventDispatcher { 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |x_window| is the window the cursor is over, and |selection| is the set of 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // data being offered. 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OSExchangeDataProviderAuraX11(::Window x_window, 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const SelectionFormatMap& selection); 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Creates a Provider for sending drag information. This creates its own, 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // hidden X11 window to own send data. 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OSExchangeDataProviderAuraX11(); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~OSExchangeDataProviderAuraX11(); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // After all the Set* methods have built up the data we're offering, call 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // this to take ownership of the XdndSelection clipboard. 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void TakeOwnershipOfSelection() const; 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Retrieves a list of types we're offering. Noop if we haven't taken the 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // selection. 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void RetrieveTargets(std::vector<Atom>* targets) const; 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Makes a copy of the format map currently being offered. 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SelectionFormatMap GetFormatMap() const; 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::FilePath& file_contents_name() const { 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return file_contents_name_; 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Overridden from OSExchangeData::Provider: 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual Provider* Clone() const OVERRIDE; 65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void MarkOriginatedFromRenderer() OVERRIDE; 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool DidOriginateFromRenderer() const OVERRIDE; 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void SetString(const base::string16& data) OVERRIDE; 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void SetURL(const GURL& url, const base::string16& title) OVERRIDE; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetFilename(const base::FilePath& path) OVERRIDE; 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void SetFilenames(const std::vector<FileInfo>& filenames) OVERRIDE; 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void SetPickledData(const OSExchangeData::CustomFormat& format, 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const Pickle& pickle) OVERRIDE; 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual bool GetString(base::string16* data) const OVERRIDE; 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool GetURLAndTitle(OSExchangeData::FilenameToURLPolicy policy, 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL* url, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* title) const OVERRIDE; 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool GetFilename(base::FilePath* path) const OVERRIDE; 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual bool GetFilenames(std::vector<FileInfo>* filenames) const OVERRIDE; 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool GetPickledData(const OSExchangeData::CustomFormat& format, 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Pickle* pickle) const OVERRIDE; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool HasString() const OVERRIDE; 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool HasURL(OSExchangeData::FilenameToURLPolicy policy) const 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OVERRIDE; 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool HasFile() const OVERRIDE; 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool HasCustomFormat(const OSExchangeData::CustomFormat& format) const 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OVERRIDE; 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void SetFileContents(const base::FilePath& filename, 89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& file_contents) OVERRIDE; 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void SetHtml(const base::string16& html, 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const GURL& base_url) OVERRIDE; 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual bool GetHtml(base::string16* html, GURL* base_url) const OVERRIDE; 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool HasHtml() const OVERRIDE; 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetDragImage(const gfx::ImageSkia& image, 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Vector2d& cursor_offset) OVERRIDE; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual const gfx::ImageSkia& GetDragImage() const OVERRIDE; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual const gfx::Vector2d& GetDragImageOffset() const OVERRIDE; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // ui::PlatformEventDispatcher: 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool CanDispatchEvent(const PlatformEvent& event) OVERRIDE; 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual uint32_t DispatchEvent(const PlatformEvent& event) OVERRIDE; 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) friend class OSExchangeDataProviderAuraX11Test; 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) typedef std::map<OSExchangeData::CustomFormat, Pickle> PickleData; 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Returns true if |formats_| contains a string format and the string can be 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // parsed as a URL. 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool GetPlainTextURL(GURL* url) const; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns the targets in |format_map_|. 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector< ::Atom> GetTargets() const; 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Drag image and offset data. 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::ImageSkia drag_image_; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Vector2d drag_image_offset_; 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Our X11 state. 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Display* x_display_; 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::Window x_root_window_; 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // In X11, because the IPC parts of drag operations are implemented by 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // XSelection, we require an x11 window to receive drag messages on. The 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // OSExchangeDataProvider system is modeled on the Windows implementation, 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // which does not require a window. We only sometimes have a valid window 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // available (in the case of drag receiving). Other times, we need to create 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // our own xwindow just to receive events on it. 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const bool own_window_; 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::Window x_window_; 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) X11AtomCache atom_cache_; 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // A representation of data. This is either passed to us from the other 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // process, or built up through a sequence of Set*() calls. It can be passed 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // to |selection_owner_| when we take the selection. 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SelectionFormatMap format_map_; 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Auxilary data for the X Direct Save protocol. 141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::FilePath file_contents_name_; 142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Takes a snapshot of |format_map_| and offers it to other windows. 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch mutable SelectionOwner selection_owner_; 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OSExchangeDataProviderAuraX11); 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace ui 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // UI_BASE_DRAGDROP_OS_EXCHANGE_DATA_PROVIDER_AURAX11_H_ 152