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

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: Further cleanup 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
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..8d2cd40c89e99d29fd4eb1930e1357fedd1b8c19 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)
+ 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),
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,40 @@ 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);
+}
+
+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);
+
+ 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 +142,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 +158,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 +225,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 +246,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 +261,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 +277,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 +285,31 @@ 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: {
Daniel Erat 2013/06/17 22:09:57 nit: don't need curly brackets here
+ selection_owner_.OnSelectionRequest(xev->xselectionrequest);
+ break;
+ }
+ default: {
Daniel Erat 2013/06/17 22:09:57 or here
+ 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:

Powered by Google App Engine
This is Rietveld 408576698