Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(319)

Unified Diff: ui/base/dragdrop/os_exchange_data_provider_aurax11.cc

Issue 16271006: Drag on linux (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Document Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/base/dragdrop/os_exchange_data_provider_aurax11.h ('k') | ui/base/x/selection_owner.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/base/dragdrop/os_exchange_data_provider_aurax11.cc
diff --git a/ui/base/dragdrop/os_exchange_data_provider_aurax11.cc b/ui/base/dragdrop/os_exchange_data_provider_aurax11.cc
index ccd55dcaed0512910ac96c23db512f4aac555cd7..8a5e954d31b4d53021753c73ac01ba8c019f7b0f 100644
--- a/ui/base/dragdrop/os_exchange_data_provider_aurax11.cc
+++ b/ui/base/dragdrop/os_exchange_data_provider_aurax11.cc
@@ -11,7 +11,6 @@
#include "net/base/net_util.h"
#include "ui/base/clipboard/clipboard.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h"
-#include "ui/base/dragdrop/desktop_selection_provider_aurax11.h"
#include "ui/base/x/selection_utils.h"
#include "ui/base/x/x11_util.h"
@@ -33,37 +32,31 @@ const char* kAtomsToCache[] = {
kDndSelection,
Clipboard::kMimeTypeURIList,
kMimeTypeMozillaURL,
+ Clipboard::kMimeTypeText,
NULL
};
} // namespace
OSExchangeDataProviderAuraX11::OSExchangeDataProviderAuraX11(
- ui::DesktopSelectionProviderAuraX11* provider,
::Window x_window,
- const std::vector< ::Atom> targets)
+ scoped_ptr<SelectionFormatMap> selection)
: x_display_(GetXDisplay()),
x_root_window_(DefaultRootWindow(x_display_)),
own_window_(false),
- selection_event_provider_(provider),
x_window_(x_window),
atom_cache_(x_display_, kAtomsToCache),
- selection_requestor_(x_display_, x_window_,
- atom_cache_.GetAtom(kDndSelection)),
+ format_map_(selection.Pass()),
selection_owner_(x_display_, x_window_,
- atom_cache_.GetAtom(kDndSelection)),
- targets_(targets) {
+ atom_cache_.GetAtom(kDndSelection)) {
// We don't know all possible MIME types at compile time.
atom_cache_.allow_uncached_atoms();
-
- selection_event_provider_->SetDropHandler(this);
}
OSExchangeDataProviderAuraX11::OSExchangeDataProviderAuraX11()
: x_display_(GetXDisplay()),
x_root_window_(DefaultRootWindow(x_display_)),
own_window_(true),
- selection_event_provider_(NULL),
x_window_(XCreateWindow(
x_display_,
x_root_window_,
@@ -75,8 +68,7 @@ OSExchangeDataProviderAuraX11::OSExchangeDataProviderAuraX11()
0,
NULL)),
atom_cache_(x_display_, kAtomsToCache),
- selection_requestor_(x_display_, x_window_,
- atom_cache_.GetAtom(kDndSelection)),
+ format_map_(new SelectionFormatMap),
selection_owner_(x_display_, x_window_,
atom_cache_.GetAtom(kDndSelection)) {
// We don't know all possible MIME types at compile time.
@@ -91,18 +83,42 @@ OSExchangeDataProviderAuraX11::~OSExchangeDataProviderAuraX11() {
if (own_window_) {
base::MessagePumpAuraX11::Current()->RemoveDispatcherForWindow(x_window_);
XDestroyWindow(x_display_, x_window_);
- } else {
- selection_event_provider_->SetDropHandler(NULL);
}
}
-void OSExchangeDataProviderAuraX11::OnSelectionNotify(
- const XSelectionEvent& event) {
- selection_requestor_.OnSelectionNotify(event);
+void OSExchangeDataProviderAuraX11::TakeOwnershipOfSelection() const {
+ selection_owner_.TakeOwnershipOfSelection(
+ scoped_ptr<SelectionFormatMap>(format_map_->Clone()));
}
-void OSExchangeDataProviderAuraX11::SetString(const string16& data) {
- NOTIMPLEMENTED();
+void OSExchangeDataProviderAuraX11::RetrieveTargets(
+ std::vector<Atom>* targets) const {
+ selection_owner_.RetrieveTargets(targets);
+}
+
+scoped_ptr<SelectionFormatMap>
+OSExchangeDataProviderAuraX11::CloneFormatMap() const {
+ // We clone the |selection_owner_|'s format map instead of our own in case
+ // ours has been modified since TakeOwnershipOfSelection() was called.
+ return selection_owner_.selection_format_map()->Clone();
+}
+
+void OSExchangeDataProviderAuraX11::SetString(const string16& text_data) {
+ std::string utf8 = UTF16ToUTF8(text_data);
+
+ // Ownership of |data| is passed to |format_map_|.
+ size_t text_len = utf8.size();
+ char* data = new char[text_len];
+ memcpy(data, utf8.c_str(), text_len);
+
+ format_map_->Insert(
+ atom_cache_.GetAtom(Clipboard::kMimeTypeText), data, text_len);
+ format_map_->Insert(
+ atom_cache_.GetAtom(kText), data, text_len);
+ format_map_->Insert(
+ atom_cache_.GetAtom(kString), data, text_len);
+ format_map_->Insert(
+ atom_cache_.GetAtom(kUtf8String), data, text_len);
}
void OSExchangeDataProviderAuraX11::SetURL(const GURL& url,
@@ -128,10 +144,9 @@ void OSExchangeDataProviderAuraX11::SetPickledData(
bool OSExchangeDataProviderAuraX11::GetString(string16* result) const {
std::vector< ::Atom> text_atoms = ui::GetTextAtomsFrom(&atom_cache_);
std::vector< ::Atom> requested_types;
- ui::GetAtomIntersection(text_atoms, targets_, &requested_types);
+ ui::GetAtomIntersection(text_atoms, GetTargets(), &requested_types);
- scoped_ptr<ui::SelectionData> data(
- selection_requestor_.RequestAndWaitForTypes(requested_types));
+ scoped_ptr<ui::SelectionData> data(format_map_->GetFirstOf(requested_types));
if (data) {
std::string text = data->GetText();
*result = UTF8ToUTF16(text);
@@ -145,10 +160,9 @@ bool OSExchangeDataProviderAuraX11::GetURLAndTitle(GURL* url,
string16* title) const {
std::vector< ::Atom> url_atoms = ui::GetURLAtomsFrom(&atom_cache_);
std::vector< ::Atom> requested_types;
- ui::GetAtomIntersection(url_atoms, targets_, &requested_types);
+ ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
- scoped_ptr<ui::SelectionData> data(
- selection_requestor_.RequestAndWaitForTypes(requested_types));
+ scoped_ptr<ui::SelectionData> data(format_map_->GetFirstOf(requested_types));
if (data) {
// TODO(erg): Technically, both of these forms can accept multiple URLs,
// but that doesn't match the assumptions of the rest of the system which
@@ -213,14 +227,14 @@ bool OSExchangeDataProviderAuraX11::GetPickledData(
bool OSExchangeDataProviderAuraX11::HasString() const {
std::vector< ::Atom> text_atoms = ui::GetTextAtomsFrom(&atom_cache_);
std::vector< ::Atom> requested_types;
- ui::GetAtomIntersection(text_atoms, targets_, &requested_types);
+ ui::GetAtomIntersection(text_atoms, GetTargets(), &requested_types);
return !requested_types.empty();
}
bool OSExchangeDataProviderAuraX11::HasURL() const {
std::vector< ::Atom> url_atoms = ui::GetURLAtomsFrom(&atom_cache_);
std::vector< ::Atom> requested_types;
- ui::GetAtomIntersection(url_atoms, targets_, &requested_types);
+ ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
return !requested_types.empty();
}
@@ -234,7 +248,7 @@ bool OSExchangeDataProviderAuraX11::HasCustomFormat(
std::vector< ::Atom> url_atoms;
url_atoms.push_back(atom_cache_.GetAtom(format.ToString().c_str()));
std::vector< ::Atom> requested_types;
- ui::GetAtomIntersection(url_atoms, targets_, &requested_types);
+ ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
return !requested_types.empty();
}
@@ -249,10 +263,9 @@ bool OSExchangeDataProviderAuraX11::GetHtml(string16* html,
std::vector< ::Atom> url_atoms;
url_atoms.push_back(atom_cache_.GetAtom(Clipboard::kMimeTypeHTML));
std::vector< ::Atom> requested_types;
- ui::GetAtomIntersection(url_atoms, targets_, &requested_types);
+ ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
- scoped_ptr<ui::SelectionData> data(
- selection_requestor_.RequestAndWaitForTypes(requested_types));
+ scoped_ptr<ui::SelectionData> data(format_map_->GetFirstOf(requested_types));
if (data) {
*html = data->GetHtml();
*base_url = GURL();
@@ -266,7 +279,7 @@ bool OSExchangeDataProviderAuraX11::HasHtml() const {
std::vector< ::Atom> url_atoms;
url_atoms.push_back(atom_cache_.GetAtom(Clipboard::kMimeTypeHTML));
std::vector< ::Atom> requested_types;
- ui::GetAtomIntersection(url_atoms, targets_, &requested_types);
+ ui::GetAtomIntersection(url_atoms, GetTargets(), &requested_types);
return !requested_types.empty();
}
@@ -274,22 +287,29 @@ bool OSExchangeDataProviderAuraX11::HasHtml() const {
void OSExchangeDataProviderAuraX11::SetDragImage(
const gfx::ImageSkia& image,
const gfx::Vector2d& cursor_offset) {
- NOTIMPLEMENTED();
+ drag_image_ = image;
+ drag_image_offset_ = cursor_offset;
}
const gfx::ImageSkia& OSExchangeDataProviderAuraX11::GetDragImage() const {
- NOTIMPLEMENTED();
return drag_image_;
}
const gfx::Vector2d& OSExchangeDataProviderAuraX11::GetDragImageOffset() const {
- NOTIMPLEMENTED();
return drag_image_offset_;
}
bool OSExchangeDataProviderAuraX11::Dispatch(const base::NativeEvent& event) {
- // TODO(erg): Implement this side when we implement sending data.
- return false;
+ XEvent* xev = event;
+ switch (xev->type) {
+ case SelectionRequest:
+ selection_owner_.OnSelectionRequest(xev->xselectionrequest);
+ break;
+ default:
+ NOTIMPLEMENTED();
+ }
+
+ return true;
}
bool OSExchangeDataProviderAuraX11::GetPlainTextURL(GURL* url) const {
@@ -297,6 +317,10 @@ bool OSExchangeDataProviderAuraX11::GetPlainTextURL(GURL* url) const {
return false;
}
+std::vector< ::Atom> OSExchangeDataProviderAuraX11::GetTargets() const {
+ return format_map_->GetTypes();
+}
+
///////////////////////////////////////////////////////////////////////////////
// OSExchangeData, public:
« no previous file with comments | « ui/base/dragdrop/os_exchange_data_provider_aurax11.h ('k') | ui/base/x/selection_owner.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698