OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/views/tabs/window_finder.h" | 5 #include "chrome/browser/ui/views/tabs/window_finder.h" |
6 | 6 |
7 #include "base/win/scoped_gdi_object.h" | 7 #include "base/win/scoped_gdi_object.h" |
8 #include "base/win/windows_version.h" | 8 #include "base/win/windows_version.h" |
9 #include "ui/aura/window.h" | 9 #include "ui/aura/window.h" |
10 #include "ui/gfx/screen.h" | 10 #include "ui/gfx/screen.h" |
| 11 #include "ui/gfx/win/dpi.h" |
11 #include "ui/views/widget/desktop_aura/desktop_window_tree_host_win.h" | 12 #include "ui/views/widget/desktop_aura/desktop_window_tree_host_win.h" |
12 #include "ui/views/win/hwnd_util.h" | 13 #include "ui/views/win/hwnd_util.h" |
13 | 14 |
14 #if defined(USE_ASH) | 15 #if defined(USE_ASH) |
15 aura::Window* GetLocalProcessWindowAtPointAsh( | 16 aura::Window* GetLocalProcessWindowAtPointAsh( |
16 const gfx::Point& screen_point, | 17 const gfx::Point& screen_point, |
17 const std::set<aura::Window*>& ignore); | 18 const std::set<aura::Window*>& ignore); |
18 #endif | 19 #endif |
19 | 20 |
20 namespace { | 21 namespace { |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 // Stop iterating if the region contains the point. | 120 // Stop iterating if the region contains the point. |
120 return !!is_point_in_region; | 121 return !!is_point_in_region; |
121 } | 122 } |
122 | 123 |
123 private: | 124 private: |
124 TopMostFinder(HWND window, | 125 TopMostFinder(HWND window, |
125 const gfx::Point& screen_loc, | 126 const gfx::Point& screen_loc, |
126 const std::set<HWND>& ignore) | 127 const std::set<HWND>& ignore) |
127 : BaseWindowFinder(ignore), | 128 : BaseWindowFinder(ignore), |
128 target_(window), | 129 target_(window), |
129 screen_loc_(screen_loc), | |
130 is_top_most_(false), | 130 is_top_most_(false), |
131 tmp_region_(CreateRectRgn(0, 0, 0, 0)) { | 131 tmp_region_(CreateRectRgn(0, 0, 0, 0)) { |
| 132 screen_loc_ = gfx::win::DIPToScreenPoint(screen_loc); |
132 EnumWindows(WindowCallbackProc, as_lparam()); | 133 EnumWindows(WindowCallbackProc, as_lparam()); |
133 } | 134 } |
134 | 135 |
135 // The window we're looking for. | 136 // The window we're looking for. |
136 HWND target_; | 137 HWND target_; |
137 | 138 |
138 // Location of window to find. | 139 // Location of window to find in pixel coordinates. |
139 gfx::Point screen_loc_; | 140 gfx::Point screen_loc_; |
140 | 141 |
141 // Is target_ the top most window? This is initially false but set to true | 142 // Is target_ the top most window? This is initially false but set to true |
142 // in ShouldStopIterating if target_ is passed in. | 143 // in ShouldStopIterating if target_ is passed in. |
143 bool is_top_most_; | 144 bool is_top_most_; |
144 | 145 |
145 base::win::ScopedRegion tmp_region_; | 146 base::win::ScopedRegion tmp_region_; |
146 | 147 |
147 DISALLOW_COPY_AND_ASSIGN(TopMostFinder); | 148 DISALLOW_COPY_AND_ASSIGN(TopMostFinder); |
148 }; | 149 }; |
149 | 150 |
150 // WindowFinder --------------------------------------------------------------- | 151 // WindowFinder --------------------------------------------------------------- |
151 | 152 |
152 // Helper class to determine if a particular point contains a window from our | 153 // Helper class to determine if a particular point contains a window from our |
153 // process. | 154 // process. |
154 class LocalProcessWindowFinder : public BaseWindowFinder { | 155 class LocalProcessWindowFinder : public BaseWindowFinder { |
155 public: | 156 public: |
156 // Returns the hwnd from our process at screen_loc that is not obscured by | 157 // Returns the hwnd from our process at screen_loc that is not obscured by |
157 // another window. Returns NULL otherwise. | 158 // another window. Returns NULL otherwise. |
158 static gfx::NativeWindow GetProcessWindowAtPoint( | 159 static gfx::NativeWindow GetProcessWindowAtPoint( |
159 const gfx::Point& screen_loc, | 160 const gfx::Point& screen_loc, |
160 const std::set<HWND>& ignore) { | 161 const std::set<HWND>& ignore) { |
161 LocalProcessWindowFinder finder(screen_loc, ignore); | 162 LocalProcessWindowFinder finder(screen_loc, ignore); |
162 // Windows 8 has a window that appears first in the list of iterated | 163 // Windows 8 has a window that appears first in the list of iterated |
163 // windows, yet is not visually on top of everything. | 164 // windows, yet is not visually on top of everything. |
164 // TODO(sky): figure out a better way to ignore this window. | 165 // TODO(sky): figure out a better way to ignore this window. |
165 if (finder.result_ && | 166 if (finder.result_ && |
166 ((base::win::OSInfo::GetInstance()->version() >= | 167 ((base::win::OSInfo::GetInstance()->version() >= |
167 base::win::VERSION_WIN8) || | 168 base::win::VERSION_WIN8) || |
168 TopMostFinder::IsTopMostWindowAtPoint(finder.result_, screen_loc, | 169 TopMostFinder::IsTopMostWindowAtPoint(finder.result_, |
| 170 screen_loc, |
169 ignore))) { | 171 ignore))) { |
170 return views::DesktopWindowTreeHostWin::GetContentWindowForHWND( | 172 return views::DesktopWindowTreeHostWin::GetContentWindowForHWND( |
171 finder.result_); | 173 finder.result_); |
172 } | 174 } |
173 return NULL; | 175 return NULL; |
174 } | 176 } |
175 | 177 |
176 protected: | 178 protected: |
177 virtual bool ShouldStopIterating(HWND hwnd) { | 179 virtual bool ShouldStopIterating(HWND hwnd) { |
178 RECT r; | 180 RECT r; |
179 if (IsWindowVisible(hwnd) && GetWindowRect(hwnd, &r) && | 181 if (IsWindowVisible(hwnd) && GetWindowRect(hwnd, &r) && |
180 PtInRect(&r, screen_loc_.ToPOINT())) { | 182 PtInRect(&r, screen_loc_.ToPOINT())) { |
181 result_ = hwnd; | 183 result_ = hwnd; |
182 return true; | 184 return true; |
183 } | 185 } |
184 return false; | 186 return false; |
185 } | 187 } |
186 | 188 |
187 private: | 189 private: |
188 LocalProcessWindowFinder(const gfx::Point& screen_loc, | 190 LocalProcessWindowFinder(const gfx::Point& screen_loc, |
189 const std::set<HWND>& ignore) | 191 const std::set<HWND>& ignore) |
190 : BaseWindowFinder(ignore), | 192 : BaseWindowFinder(ignore), |
191 screen_loc_(screen_loc), | |
192 result_(NULL) { | 193 result_(NULL) { |
| 194 screen_loc_ = gfx::win::DIPToScreenPoint(screen_loc); |
193 EnumThreadWindows(GetCurrentThreadId(), WindowCallbackProc, as_lparam()); | 195 EnumThreadWindows(GetCurrentThreadId(), WindowCallbackProc, as_lparam()); |
194 } | 196 } |
195 | 197 |
196 // Position of the mouse. | 198 // Position of the mouse in pixel coordinates. |
197 gfx::Point screen_loc_; | 199 gfx::Point screen_loc_; |
198 | 200 |
199 // The resulting window. This is initially null but set to true in | 201 // The resulting window. This is initially null but set to true in |
200 // ShouldStopIterating if an appropriate window is found. | 202 // ShouldStopIterating if an appropriate window is found. |
201 HWND result_; | 203 HWND result_; |
202 | 204 |
203 DISALLOW_COPY_AND_ASSIGN(LocalProcessWindowFinder); | 205 DISALLOW_COPY_AND_ASSIGN(LocalProcessWindowFinder); |
204 }; | 206 }; |
205 | 207 |
206 std::set<HWND> RemapIgnoreSet(const std::set<gfx::NativeView>& ignore) { | 208 std::set<HWND> RemapIgnoreSet(const std::set<gfx::NativeView>& ignore) { |
(...skipping 13 matching lines...) Expand all Loading... |
220 chrome::HostDesktopType host_desktop_type, | 222 chrome::HostDesktopType host_desktop_type, |
221 const gfx::Point& screen_point, | 223 const gfx::Point& screen_point, |
222 const std::set<aura::Window*>& ignore) { | 224 const std::set<aura::Window*>& ignore) { |
223 #if defined(USE_ASH) | 225 #if defined(USE_ASH) |
224 if (host_desktop_type == chrome::HOST_DESKTOP_TYPE_ASH) | 226 if (host_desktop_type == chrome::HOST_DESKTOP_TYPE_ASH) |
225 return GetLocalProcessWindowAtPointAsh(screen_point, ignore); | 227 return GetLocalProcessWindowAtPointAsh(screen_point, ignore); |
226 #endif | 228 #endif |
227 return LocalProcessWindowFinder::GetProcessWindowAtPoint( | 229 return LocalProcessWindowFinder::GetProcessWindowAtPoint( |
228 screen_point, RemapIgnoreSet(ignore)); | 230 screen_point, RemapIgnoreSet(ignore)); |
229 } | 231 } |
OLD | NEW |