Index: ui/views/widget/desktop_aura/desktop_screen_x11.cc |
diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11.cc b/ui/views/widget/desktop_aura/desktop_screen_x11.cc |
index 271e4ec558a10b10a81d0ad439906dfc37254100..f82f24e5a8f05f96b24d940f723d9d4010bbf5d1 100644 |
--- a/ui/views/widget/desktop_aura/desktop_screen_x11.cc |
+++ b/ui/views/widget/desktop_aura/desktop_screen_x11.cc |
@@ -63,6 +63,48 @@ std::vector<gfx::Display> GetFallbackDisplayList() { |
return std::vector<gfx::Display>(1, gfx_display); |
} |
+// Helper class to GetWindowAtScreenPoint() which returns the topmost window at |
+// the location passed to FindAt(). NULL is returned if a window which does not |
+// belong to Chromium is topmost at the passed in location. |
+class ToplevelWindowFinder : public ui::EnumerateWindowsDelegate { |
+ public: |
+ ToplevelWindowFinder() : toplevel_(NULL) { |
+ } |
+ |
+ virtual ~ToplevelWindowFinder() { |
+ } |
+ |
+ aura::Window* FindAt(const gfx::Point& screen_loc) { |
+ screen_loc_ = screen_loc; |
+ ui::EnumerateTopLevelWindows(this); |
+ return toplevel_; |
+ } |
+ |
+ protected: |
+ virtual bool ShouldStopIterating(XID xid) OVERRIDE { |
+ aura::Window* window = |
+ views::DesktopWindowTreeHostX11::GetContentWindowForXID(xid); |
+ if (window && |
+ window->IsVisible() && |
+ window->GetBoundsInScreen().Contains(screen_loc_)) { |
+ toplevel_ = window; |
+ return true; |
+ } |
+ |
+ if (ui::IsWindowVisible(xid) && |
+ ui::WindowContainsPoint(xid, screen_loc_)) { |
pkotwicz
2014/02/20 03:01:55
Should I be checking for the WM_STATE property her
Elliot Glaysher
2014/02/20 18:30:09
I don't think so. You're already checking for visi
|
+ toplevel_ = window; |
+ return true; |
+ } |
+ return false; |
+ } |
+ |
+ gfx::Point screen_loc_; |
+ aura::Window* toplevel_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ToplevelWindowFinder); |
+}; |
+ |
} // namespace |
namespace views { |
@@ -182,16 +224,8 @@ gfx::NativeWindow DesktopScreenX11::GetWindowUnderCursor() { |
gfx::NativeWindow DesktopScreenX11::GetWindowAtScreenPoint( |
const gfx::Point& point) { |
- std::vector<aura::Window*> windows = |
- DesktopWindowTreeHostX11::GetAllOpenWindows(); |
- |
- for (std::vector<aura::Window*>::const_iterator it = windows.begin(); |
- it != windows.end(); ++it) { |
- if ((*it)->GetBoundsInScreen().Contains(point)) |
- return *it; |
- } |
- |
- return NULL; |
+ ToplevelWindowFinder finder; |
+ return finder.FindAt(point); |
} |
int DesktopScreenX11::GetNumDisplays() const { |