Index: ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc |
diff --git a/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc b/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc |
index acd5660ef6144c41629cd6621255c499e456b830..e6bd4c2e4bd82aaa0d8cb54203600025998318dc 100644 |
--- a/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc |
+++ b/ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc |
@@ -16,6 +16,7 @@ |
#include "ui/base/dragdrop/os_exchange_data.h" |
#include "ui/base/dragdrop/os_exchange_data_provider_aurax11.h" |
#include "ui/base/x/selection_utils.h" |
+#include "ui/base/x/x11_foreign_window_manager.h" |
#include "ui/base/x/x11_util.h" |
#include "ui/events/event.h" |
#include "ui/events/platform/platform_event_source.h" |
@@ -141,6 +142,14 @@ class DesktopDragDropClientAuraX11::X11DragContext |
// The XID of the window that's initiated the drag. |
unsigned long source_window_; |
+ // The DesktopDragDropClientAuraX11 for |source_window_| if |source_window_| |
+ // belongs to a Chrome window. |
+ DesktopDragDropClientAuraX11* source_client_; |
+ |
+ // Used to unselect PropertyChangeMask on |source_window_| if |source_window_| |
+ // does not belong to a Chrome window when X11DragContext is destroyed. |
+ int foreign_window_manager_source_window_id_; |
+ |
// The client we inform once we're done with requesting data. |
DesktopDragDropClientAuraX11* drag_drop_client_; |
@@ -175,6 +184,9 @@ DesktopDragDropClientAuraX11::X11DragContext::X11DragContext( |
: atom_cache_(atom_cache), |
local_window_(local_window), |
source_window_(event.data.l[0]), |
+ source_client_( |
+ DesktopDragDropClientAuraX11::GetForWindow(source_window_)), |
+ foreign_window_manager_source_window_id_(0), |
drag_drop_client_(NULL), |
waiting_to_handle_position_(false), |
suggested_action_(None) { |
@@ -195,13 +207,13 @@ DesktopDragDropClientAuraX11::X11DragContext::X11DragContext( |
} |
} |
- DesktopDragDropClientAuraX11* client = |
- DesktopDragDropClientAuraX11::GetForWindow(source_window_); |
- if (!client) { |
+ if (!source_client_) { |
// The window doesn't have a DesktopDragDropClientAuraX11, that means it's |
// created by some other process. Listen for messages on it. |
ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); |
- XSelectInput(gfx::GetXDisplay(), source_window_, PropertyChangeMask); |
+ foreign_window_manager_source_window_id_ = |
+ ui::XForeignWindowManager::GetInstance()->RequestEvents( |
+ source_window_, PropertyChangeMask); |
// We must perform a full sync here because we could be racing |
// |source_window_|. |
@@ -210,7 +222,7 @@ DesktopDragDropClientAuraX11::X11DragContext::X11DragContext( |
// This drag originates from an aura window within our process. This means |
// that we can shortcut the X11 server and ask the owning SelectionOwner |
// for the data it's offering. |
- fetched_targets_ = client->GetFormatMap(); |
+ fetched_targets_ = source_client_->GetFormatMap(); |
unfetched_targets_.clear(); |
} |
@@ -218,8 +230,12 @@ DesktopDragDropClientAuraX11::X11DragContext::X11DragContext( |
} |
DesktopDragDropClientAuraX11::X11DragContext::~X11DragContext() { |
- // Unsubscribe from message events. |
- ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); |
+ if (!source_client_) { |
+ // Unsubscribe from message events. |
+ ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); |
+ ui::XForeignWindowManager::GetInstance()->CancelRequest( |
+ foreign_window_manager_source_window_id_); |
+ } |
} |
void DesktopDragDropClientAuraX11::X11DragContext::OnStartXdndPositionMessage( |
@@ -283,9 +299,7 @@ void DesktopDragDropClientAuraX11::X11DragContext::OnSelectionNotify( |
} |
void DesktopDragDropClientAuraX11::X11DragContext::ReadActions() { |
- DesktopDragDropClientAuraX11* client = |
- DesktopDragDropClientAuraX11::GetForWindow(source_window_); |
- if (!client) { |
+ if (!source_client_) { |
std::vector<Atom> atom_array; |
if (!ui::GetAtomArrayProperty(source_window_, |
"XdndActionList", |
@@ -298,7 +312,7 @@ void DesktopDragDropClientAuraX11::X11DragContext::ReadActions() { |
// We have a property notify set up for other windows in case they change |
// their action list. Thankfully, the views interface is static and you |
// can't change the action list after you enter StartDragAndDrop(). |
- actions_ = client->GetOfferedDragOperations(); |
+ actions_ = source_client_->GetOfferedDragOperations(); |
} |
} |