X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fchrome%2Fbrowser%2Fui%2Fviews%2Ftabs%2Fwindow_finder_x11.cc;h=6d9e50e9c8af794ffd4e499b5cfa60587b9e7f85;hb=004985e17e624662a4c85c76a7654039dc83f028;hp=eeca3e73d4b28d35de7ee55310da9208e9075c5b;hpb=2f108dbacb161091e42a3479f4e171339b7e7623;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/chrome/browser/ui/views/tabs/window_finder_x11.cc b/src/chrome/browser/ui/views/tabs/window_finder_x11.cc index eeca3e7..6d9e50e 100644 --- a/src/chrome/browser/ui/views/tabs/window_finder_x11.cc +++ b/src/chrome/browser/ui/views/tabs/window_finder_x11.cc @@ -4,12 +4,7 @@ #include "chrome/browser/ui/views/tabs/window_finder.h" -#include "base/debug/trace_event.h" -#include "chrome/browser/ui/host_desktop.h" -#include "ui/aura/window.h" -#include "ui/aura/window_tree_host.h" -#include "ui/base/x/x11_util.h" -#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" +#include "ui/views/widget/desktop_aura/x11_topmost_window_finder.h" #if defined(USE_ASH) aura::Window* GetLocalProcessWindowAtPointAsh( @@ -17,166 +12,6 @@ aura::Window* GetLocalProcessWindowAtPointAsh( const std::set& ignore); #endif -namespace { - -//////////////////////////////////////////////////////////////////////////////// -// BaseWindowFinder -// -// Base class used to locate a window. A subclass need only override -// ShouldStopIterating to determine when iteration should stop. -class BaseWindowFinder : public ui::EnumerateWindowsDelegate { - public: - explicit BaseWindowFinder(const std::set& ignore) { - std::set::iterator iter; - for (iter = ignore.begin(); iter != ignore.end(); iter++) { - XID xid = (*iter)->GetHost()->GetAcceleratedWidget(); - ignore_.insert(xid); - } - } - - virtual ~BaseWindowFinder() {} - - protected: - // Returns true if |window| is in the ignore list. - bool ShouldIgnoreWindow(XID window) { - return (ignore_.find(window) != ignore_.end()); - } - - // Returns true if iteration should stop, false otherwise. - virtual bool ShouldStopIterating(XID window) OVERRIDE { - return false; - } - - private: - std::set ignore_; - - DISALLOW_COPY_AND_ASSIGN(BaseWindowFinder); -}; - -//////////////////////////////////////////////////////////////////////////////// -// TopMostFinder -// -// Helper class to determine if a particular point of a window is not obscured -// by another window. -class TopMostFinder : public BaseWindowFinder { - public: - // Returns true if |window| is not obscured by another window at the - // location |screen_loc|, not including the windows in |ignore|. - static bool IsTopMostWindowAtPoint(XID window, - const gfx::Point& screen_loc, - const std::set& ignore) { - TopMostFinder finder(window, screen_loc, ignore); - return finder.is_top_most_; - } - - protected: - virtual bool ShouldStopIterating(XID window) OVERRIDE { - if (BaseWindowFinder::ShouldIgnoreWindow(window)) - return false; - - if (window == target_) { - // Window is topmost, stop iterating. - is_top_most_ = true; - return true; - } - - if (!ui::IsWindowVisible(window)) { - // The window isn't visible, keep iterating. - return false; - } - - // At this point we haven't found our target window, so this window is - // higher in the z-order than the target window. If this window contains - // the point, then we can stop the search now because this window is - // obscuring the target window at this point. - return ui::WindowContainsPoint(window, screen_loc_); - } - - private: - TopMostFinder(XID window, - const gfx::Point& screen_loc, - const std::set& ignore) - : BaseWindowFinder(ignore), - target_(window), - screen_loc_(screen_loc), - is_top_most_(false) { - ui::EnumerateTopLevelWindows(this); - } - - // The window we're looking for. - XID target_; - - // Location of window to find. - gfx::Point screen_loc_; - - // Is target_ the top most window? This is initially false but set to true - // in ShouldStopIterating if target_ is passed in. - bool is_top_most_; - - DISALLOW_COPY_AND_ASSIGN(TopMostFinder); -}; - -//////////////////////////////////////////////////////////////////////////////// -// LocalProcessWindowFinder -// -// Helper class to determine if a particular point of a window from our process -// is not obscured by another window. -class LocalProcessWindowFinder : public BaseWindowFinder { - public: - // Returns the XID from our process at screen_loc that is not obscured by - // another window. Returns 0 otherwise. - static XID GetProcessWindowAtPoint(const gfx::Point& screen_loc, - const std::set& ignore) { - LocalProcessWindowFinder finder(screen_loc, ignore); - if (finder.result_ && - TopMostFinder::IsTopMostWindowAtPoint(finder.result_, screen_loc, - ignore)) { - return finder.result_; - } - return 0; - } - - protected: - virtual bool ShouldStopIterating(XID window) OVERRIDE { - if (BaseWindowFinder::ShouldIgnoreWindow(window)) - return false; - - // Check if this window is in our process. - if (!aura::WindowTreeHost::GetForAcceleratedWidget(window)) - return false; - - if (!ui::IsWindowVisible(window)) - return false; - - if (ui::WindowContainsPoint(window, screen_loc_)) { - result_ = window; - return true; - } - - return false; - } - - private: - LocalProcessWindowFinder(const gfx::Point& screen_loc, - const std::set& ignore) - : BaseWindowFinder(ignore), - screen_loc_(screen_loc), - result_(0) { - ui::EnumerateTopLevelWindows(this); - } - - // Position of the mouse. - gfx::Point screen_loc_; - - // The resulting window. This is initially null but set to true in - // ShouldStopIterating if an appropriate window is found. - XID result_; - - DISALLOW_COPY_AND_ASSIGN(LocalProcessWindowFinder); -}; - -} // namespace - aura::Window* GetLocalProcessWindowAtPoint( chrome::HostDesktopType host_desktop_type, const gfx::Point& screen_point, @@ -185,9 +20,9 @@ aura::Window* GetLocalProcessWindowAtPoint( if (host_desktop_type == chrome::HOST_DESKTOP_TYPE_ASH) return GetLocalProcessWindowAtPointAsh(screen_point, ignore); #endif + // The X11 server is the canonical state of what the window stacking order // is. - XID xid = - LocalProcessWindowFinder::GetProcessWindowAtPoint(screen_point, ignore); - return views::DesktopWindowTreeHostX11::GetContentWindowForXID(xid); + views::X11TopmostWindowFinder finder; + return finder.FindLocalProcessWindowAt(screen_point, ignore); }