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 e7101ac8ce1a95fe645e36e15d0b94875144cb88..6e171959e09047ffd8d0c6f8aabf4f78d139469f 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 |
@@ -58,6 +58,7 @@ const char* kAtomsToCache[] = { |
kXdndSelection, |
"XdndStatus", |
"XdndTypeList", |
+ "_NET_WM_WINDOW_TYPE_MENU", |
NULL |
}; |
@@ -70,9 +71,11 @@ static base::LazyInstance< |
class DragTargetWindowFinder : public ui::EnumerateWindowsDelegate { |
public: |
DragTargetWindowFinder(XID ignored_icon_window, |
+ Atom menu_type_atom, |
gfx::Point screen_loc) |
: ignored_icon_window_(ignored_icon_window), |
output_window_(None), |
+ menu_type_atom_(menu_type_atom), |
screen_loc_(screen_loc) { |
ui::EnumerateTopLevelWindows(this); |
} |
@@ -92,7 +95,10 @@ class DragTargetWindowFinder : public ui::EnumerateWindowsDelegate { |
if (!ui::WindowContainsPoint(window, screen_loc_)) |
return false; |
- if (ui::PropertyExists(window, "WM_STATE")) { |
+ int value = 0; |
+ if (ui::PropertyExists(window, "WM_STATE") || |
+ (ui::GetIntProperty(window, "_NET_WM_WINDOW_TYPE", &value) && |
+ static_cast<Atom>(value) == menu_type_atom_)) { |
output_window_ = window; |
return true; |
} |
@@ -103,6 +109,7 @@ class DragTargetWindowFinder : public ui::EnumerateWindowsDelegate { |
private: |
XID ignored_icon_window_; |
XID output_window_; |
+ const Atom menu_type_atom_; |
gfx::Point screen_loc_; |
DISALLOW_COPY_AND_ASSIGN(DragTargetWindowFinder); |
@@ -113,8 +120,9 @@ class DragTargetWindowFinder : public ui::EnumerateWindowsDelegate { |
// |mouse_window|. If there's a Xdnd aware window, it will be returned in |
// |dest_window|. |
void FindWindowFor(const gfx::Point& screen_point, |
- ::Window* mouse_window, ::Window* dest_window) { |
- DragTargetWindowFinder finder(None, screen_point); |
+ ::Window* mouse_window, ::Window* dest_window, |
+ Atom menu_type_atom) { |
+ DragTargetWindowFinder finder(None, menu_type_atom, screen_point); |
*mouse_window = finder.window(); |
*dest_window = None; |
@@ -666,7 +674,8 @@ void DesktopDragDropClientAuraX11::OnMouseMovement(XMotionEvent* event) { |
// Find the current window the cursor is over. |
::Window mouse_window = None; |
::Window dest_window = None; |
- FindWindowFor(screen_point, &mouse_window, &dest_window); |
+ FindWindowFor(screen_point, &mouse_window, &dest_window, |
+ atom_cache_.GetAtom("_NET_WM_WINDOW_TYPE_MENU")); |
if (source_current_window_ != dest_window) { |
if (source_current_window_ != None) |