OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "ui/gfx/screen_win.h" | 5 #include "ui/display/win/screen_win.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 #include <inttypes.h> | 8 #include <inttypes.h> |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 | 10 |
11 #include <cwchar> | 11 #include <cwchar> |
12 #include <memory> | 12 #include <memory> |
13 #include <string> | 13 #include <string> |
14 #include <unordered_map> | 14 #include <unordered_map> |
15 #include <vector> | 15 #include <vector> |
16 | 16 |
17 #include "base/macros.h" | 17 #include "base/macros.h" |
18 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 19 #include "ui/display/win/display_info.h" |
| 20 #include "ui/display/win/screen_win_display.h" |
19 #include "ui/gfx/display.h" | 21 #include "ui/gfx/display.h" |
20 #include "ui/gfx/geometry/rect.h" | 22 #include "ui/gfx/geometry/rect.h" |
21 #include "ui/gfx/screen.h" | 23 #include "ui/gfx/screen.h" |
22 #include "ui/gfx/test/display_util.h" | 24 #include "ui/gfx/test/display_util.h" |
23 #include "ui/gfx/win/display_info.h" | |
24 #include "ui/gfx/win/dpi.h" | 25 #include "ui/gfx/win/dpi.h" |
25 #include "ui/gfx/win/screen_win_display.h" | |
26 | 26 |
27 namespace gfx { | 27 namespace display { |
| 28 namespace win { |
28 | 29 |
29 namespace { | 30 namespace { |
30 | 31 |
31 MONITORINFOEX CreateMonitorInfo(gfx::Rect monitor, | 32 MONITORINFOEX CreateMonitorInfo(gfx::Rect monitor, |
32 gfx::Rect work, | 33 gfx::Rect work, |
33 std::wstring device_name) { | 34 std::wstring device_name) { |
34 MONITORINFOEX monitor_info; | 35 MONITORINFOEX monitor_info; |
35 ::ZeroMemory(&monitor_info, sizeof(monitor_info)); | 36 ::ZeroMemory(&monitor_info, sizeof(monitor_info)); |
36 monitor_info.cbSize = sizeof(monitor_info); | 37 monitor_info.cbSize = sizeof(monitor_info); |
37 monitor_info.rcMonitor = monitor.ToRECT(); | 38 monitor_info.rcMonitor = monitor.ToRECT(); |
38 monitor_info.rcWork = work.ToRECT(); | 39 monitor_info.rcWork = work.ToRECT(); |
39 size_t device_char_count = ARRAYSIZE(monitor_info.szDevice); | 40 size_t device_char_count = ARRAYSIZE(monitor_info.szDevice); |
40 wcsncpy(monitor_info.szDevice, device_name.c_str(), device_char_count); | 41 wcsncpy(monitor_info.szDevice, device_name.c_str(), device_char_count); |
41 monitor_info.szDevice[device_char_count-1] = L'\0'; | 42 monitor_info.szDevice[device_char_count-1] = L'\0'; |
42 return monitor_info; | 43 return monitor_info; |
43 } | 44 } |
44 | 45 |
45 class TestScreenWin : public gfx::ScreenWin { | 46 class TestScreenWin : public ScreenWin { |
46 public: | 47 public: |
47 TestScreenWin(const std::vector<gfx::win::DisplayInfo>& display_infos, | 48 TestScreenWin(const std::vector<DisplayInfo>& display_infos, |
48 const std::vector<MONITORINFOEX>& monitor_infos, | 49 const std::vector<MONITORINFOEX>& monitor_infos, |
49 const std::unordered_map<HWND, gfx::Rect>& hwnd_map) | 50 const std::unordered_map<HWND, gfx::Rect>& hwnd_map) |
50 : monitor_infos_(monitor_infos), | 51 : monitor_infos_(monitor_infos), |
51 hwnd_map_(hwnd_map) { | 52 hwnd_map_(hwnd_map) { |
52 UpdateFromDisplayInfos(display_infos); | 53 UpdateFromDisplayInfos(display_infos); |
53 } | 54 } |
54 | 55 |
55 ~TestScreenWin() override = default; | 56 ~TestScreenWin() override = default; |
56 | 57 |
57 protected: | 58 protected: |
58 // gfx::ScreenWin: | 59 // display::win::ScreenWin: |
59 HWND GetHWNDFromNativeView(NativeView window) const override { | 60 HWND GetHWNDFromNativeView(gfx::NativeView window) const override { |
60 // NativeView is only used as an identifier in this tests, so interchange | 61 // NativeView is only used as an identifier in this tests, so interchange |
61 // NativeView with an HWND for convenience. | 62 // NativeView with an HWND for convenience. |
62 return reinterpret_cast<HWND>(window); | 63 return reinterpret_cast<HWND>(window); |
63 } | 64 } |
64 | 65 |
65 NativeWindow GetNativeWindowFromHWND(HWND hwnd) const override { | 66 gfx::NativeWindow GetNativeWindowFromHWND(HWND hwnd) const override { |
66 // NativeWindow is only used as an identifier in this tests, so interchange | 67 // NativeWindow is only used as an identifier in this tests, so interchange |
67 // an HWND for a NativeWindow for convenience. | 68 // an HWND for a NativeWindow for convenience. |
68 return reinterpret_cast<NativeWindow>(hwnd); | 69 return reinterpret_cast<gfx::NativeWindow>(hwnd); |
69 } | 70 } |
70 | 71 |
71 private: | 72 private: |
72 void Initialize() override {} | 73 void Initialize() override {} |
73 | 74 |
74 MONITORINFOEX MonitorInfoFromScreenPoint(const gfx::Point& screen_point) const | 75 MONITORINFOEX MonitorInfoFromScreenPoint(const gfx::Point& screen_point) const |
75 override { | 76 override { |
76 for (const MONITORINFOEX& monitor_info : monitor_infos_) { | 77 for (const MONITORINFOEX& monitor_info : monitor_infos_) { |
77 if (gfx::Rect(monitor_info.rcMonitor).Contains(screen_point)) | 78 if (gfx::Rect(monitor_info.rcMonitor).Contains(screen_point)) |
78 return monitor_info; | 79 return monitor_info; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 HWND GetRootWindow(HWND hwnd) const override { | 121 HWND GetRootWindow(HWND hwnd) const override { |
121 return hwnd; | 122 return hwnd; |
122 } | 123 } |
123 | 124 |
124 std::vector<MONITORINFOEX> monitor_infos_; | 125 std::vector<MONITORINFOEX> monitor_infos_; |
125 std::unordered_map<HWND, gfx::Rect> hwnd_map_; | 126 std::unordered_map<HWND, gfx::Rect> hwnd_map_; |
126 | 127 |
127 DISALLOW_COPY_AND_ASSIGN(TestScreenWin); | 128 DISALLOW_COPY_AND_ASSIGN(TestScreenWin); |
128 }; | 129 }; |
129 | 130 |
130 Screen* GetScreen() { | 131 gfx::Screen* GetScreen() { |
131 return gfx::Screen::GetScreen(); | 132 return gfx::Screen::GetScreen(); |
132 } | 133 } |
133 | 134 |
134 } // namespace | |
135 | |
136 // Allows tests to specify the screen and associated state. | 135 // Allows tests to specify the screen and associated state. |
137 class TestScreenWinInitializer { | 136 class TestScreenWinInitializer { |
138 public: | 137 public: |
139 virtual void AddMonitor(const gfx::Rect& pixel_bounds, | 138 virtual void AddMonitor(const gfx::Rect& pixel_bounds, |
140 const gfx::Rect& pixel_work, | 139 const gfx::Rect& pixel_work, |
141 const wchar_t* device_name, | 140 const wchar_t* device_name, |
142 float device_scale_factor) = 0; | 141 float device_scale_factor) = 0; |
143 | 142 |
144 virtual HWND CreateFakeHwnd(const gfx::Rect& bounds) = 0; | 143 virtual HWND CreateFakeHwnd(const gfx::Rect& bounds) = 0; |
145 }; | 144 }; |
146 | 145 |
147 class TestScreenWinManager : public TestScreenWinInitializer { | 146 class TestScreenWinManager : public TestScreenWinInitializer { |
148 public: | 147 public: |
149 TestScreenWinManager() = default; | 148 TestScreenWinManager() = default; |
150 | 149 |
151 ~TestScreenWinManager() { | 150 ~TestScreenWinManager() { |
152 gfx::Screen::SetScreenInstance(nullptr); | 151 gfx::Screen::SetScreenInstance(nullptr); |
153 } | 152 } |
154 | 153 |
155 void AddMonitor(const gfx::Rect& pixel_bounds, | 154 void AddMonitor(const gfx::Rect& pixel_bounds, |
156 const gfx::Rect& pixel_work, | 155 const gfx::Rect& pixel_work, |
157 const wchar_t* device_name, | 156 const wchar_t* device_name, |
158 float device_scale_factor) override { | 157 float device_scale_factor) override { |
159 MONITORINFOEX monitor_info = CreateMonitorInfo(pixel_bounds, | 158 MONITORINFOEX monitor_info = CreateMonitorInfo(pixel_bounds, |
160 pixel_work, | 159 pixel_work, |
161 device_name); | 160 device_name); |
162 monitor_infos_.push_back(monitor_info); | 161 monitor_infos_.push_back(monitor_info); |
163 display_infos_.push_back(gfx::win::DisplayInfo(monitor_info, | 162 display_infos_.push_back(DisplayInfo(monitor_info, |
164 device_scale_factor, | 163 device_scale_factor, |
165 gfx::Display::ROTATE_0)); | 164 gfx::Display::ROTATE_0)); |
166 } | 165 } |
167 | 166 |
168 HWND CreateFakeHwnd(const gfx::Rect& bounds) override { | 167 HWND CreateFakeHwnd(const gfx::Rect& bounds) override { |
169 EXPECT_EQ(screen_win_, nullptr); | 168 EXPECT_EQ(screen_win_, nullptr); |
170 hwnd_map_.insert(std::pair<HWND, gfx::Rect>(++hwndLast_, bounds)); | 169 hwnd_map_.insert(std::pair<HWND, gfx::Rect>(++hwndLast_, bounds)); |
171 return hwndLast_; | 170 return hwndLast_; |
172 } | 171 } |
173 | 172 |
174 void InitializeScreenWin() { | 173 void InitializeScreenWin() { |
175 ASSERT_EQ(screen_win_, nullptr); | 174 ASSERT_EQ(screen_win_, nullptr); |
176 screen_win_.reset(new TestScreenWin(display_infos_, | 175 screen_win_.reset(new TestScreenWin(display_infos_, |
177 monitor_infos_, | 176 monitor_infos_, |
178 hwnd_map_)); | 177 hwnd_map_)); |
179 gfx::Screen::SetScreenInstance(screen_win_.get()); | 178 gfx::Screen::SetScreenInstance(screen_win_.get()); |
180 } | 179 } |
181 | 180 |
182 ScreenWin* GetScreenWin() { | 181 ScreenWin* GetScreenWin() { |
183 return screen_win_.get(); | 182 return screen_win_.get(); |
184 } | 183 } |
185 | 184 |
186 private: | 185 private: |
187 HWND hwndLast_ = nullptr; | 186 HWND hwndLast_ = nullptr; |
188 scoped_ptr<ScreenWin> screen_win_; | 187 scoped_ptr<ScreenWin> screen_win_; |
189 std::vector<MONITORINFOEX> monitor_infos_; | 188 std::vector<MONITORINFOEX> monitor_infos_; |
190 std::vector<gfx::win::DisplayInfo> display_infos_; | 189 std::vector<DisplayInfo> display_infos_; |
191 std::unordered_map<HWND, gfx::Rect> hwnd_map_; | 190 std::unordered_map<HWND, gfx::Rect> hwnd_map_; |
192 | 191 |
193 DISALLOW_COPY_AND_ASSIGN(TestScreenWinManager); | 192 DISALLOW_COPY_AND_ASSIGN(TestScreenWinManager); |
194 }; | 193 }; |
195 | 194 |
196 class ScreenWinTest : public testing::Test { | 195 class ScreenWinTest : public testing::Test { |
197 protected: | 196 protected: |
198 ScreenWinTest() = default; | 197 ScreenWinTest() = default; |
199 | 198 |
200 void SetUp() override { | 199 void SetUp() override { |
201 testing::Test::SetUp(); | 200 testing::Test::SetUp(); |
202 gfx::SetDefaultDeviceScaleFactor(1.0); | 201 gfx::SetDefaultDeviceScaleFactor(1.0); |
203 screen_win_initializer_.reset(new TestScreenWinManager()); | 202 screen_win_initializer_.reset(new TestScreenWinManager()); |
204 SetUpScreen(screen_win_initializer_.get()); | 203 SetUpScreen(screen_win_initializer_.get()); |
205 screen_win_initializer_->InitializeScreenWin(); | 204 screen_win_initializer_->InitializeScreenWin(); |
206 } | 205 } |
207 | 206 |
208 void TearDown() override { | 207 void TearDown() override { |
209 screen_win_initializer_.reset(); | 208 screen_win_initializer_.reset(); |
210 gfx::SetDefaultDeviceScaleFactor(1.0); | 209 gfx::SetDefaultDeviceScaleFactor(1.0); |
211 testing::Test::TearDown(); | 210 testing::Test::TearDown(); |
212 } | 211 } |
213 | 212 |
214 virtual void SetUpScreen(TestScreenWinInitializer* initializer) = 0; | 213 virtual void SetUpScreen(TestScreenWinInitializer* initializer) = 0; |
215 | 214 |
216 NativeWindow GetNativeWindowFromHWND(HWND hwnd) const { | 215 gfx::NativeWindow GetNativeWindowFromHWND(HWND hwnd) const { |
217 ScreenWin* screen_win = screen_win_initializer_->GetScreenWin(); | 216 ScreenWin* screen_win = screen_win_initializer_->GetScreenWin(); |
218 return screen_win->GetNativeWindowFromHWND(hwnd);; | 217 return screen_win->GetNativeWindowFromHWND(hwnd);; |
219 } | 218 } |
220 | 219 |
221 private: | 220 private: |
222 scoped_ptr<TestScreenWinManager> screen_win_initializer_; | 221 scoped_ptr<TestScreenWinManager> screen_win_initializer_; |
223 | 222 |
224 DISALLOW_COPY_AND_ASSIGN(ScreenWinTest); | 223 DISALLOW_COPY_AND_ASSIGN(ScreenWinTest); |
225 }; | 224 }; |
226 | 225 |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 EXPECT_EQ(right_display, | 771 EXPECT_EQ(right_display, |
773 screen->GetDisplayMatching(gfx::Rect(10139, 2299, 100, 100))); | 772 screen->GetDisplayMatching(gfx::Rect(10139, 2299, 100, 100))); |
774 } | 773 } |
775 | 774 |
776 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetPrimaryDisplay) { | 775 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetPrimaryDisplay) { |
777 gfx::Screen* screen = GetScreen(); | 776 gfx::Screen* screen = GetScreen(); |
778 gfx::Display primary = screen->GetPrimaryDisplay(); | 777 gfx::Display primary = screen->GetPrimaryDisplay(); |
779 EXPECT_EQ(gfx::Point(0, 0), primary.bounds().origin()); | 778 EXPECT_EQ(gfx::Point(0, 0), primary.bounds().origin()); |
780 } | 779 } |
781 | 780 |
782 } // namespace gfx | 781 } // namespace |
| 782 |
| 783 } // namespace win |
| 784 } // namespace display |
OLD | NEW |