OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/views/widget/desktop_aura/desktop_screen_x11.h" | 5 #include "ui/views/widget/desktop_aura/desktop_screen_x11.h" |
6 | 6 |
7 #include <X11/extensions/Xrandr.h> | 7 #include <X11/extensions/Xrandr.h> |
8 #include <X11/Xlib.h> | 8 #include <X11/Xlib.h> |
9 | 9 |
10 // It clashes with out RootWindow. | 10 // It clashes with out RootWindow. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 if (!gfx::Display::HasForceDeviceScaleFactor() && | 56 if (!gfx::Display::HasForceDeviceScaleFactor() && |
57 !ui::IsXDisplaySizeBlackListed(mm_width, mm_height)) { | 57 !ui::IsXDisplaySizeBlackListed(mm_width, mm_height)) { |
58 float device_scale_factor = GetDeviceScaleFactor(width, mm_width); | 58 float device_scale_factor = GetDeviceScaleFactor(width, mm_width); |
59 DCHECK_LE(1.0f, device_scale_factor); | 59 DCHECK_LE(1.0f, device_scale_factor); |
60 gfx_display.SetScaleAndBounds(device_scale_factor, bounds_in_pixels); | 60 gfx_display.SetScaleAndBounds(device_scale_factor, bounds_in_pixels); |
61 } | 61 } |
62 | 62 |
63 return std::vector<gfx::Display>(1, gfx_display); | 63 return std::vector<gfx::Display>(1, gfx_display); |
64 } | 64 } |
65 | 65 |
66 // Helper class to GetWindowAtScreenPoint() which returns the topmost window at | |
67 // the location passed to FindAt(). NULL is returned if a window which does not | |
68 // belong to Chromium is topmost at the passed in location. | |
69 class ToplevelWindowFinder : public ui::EnumerateWindowsDelegate { | |
70 public: | |
71 ToplevelWindowFinder() : toplevel_(NULL) { | |
72 } | |
73 | |
74 virtual ~ToplevelWindowFinder() { | |
75 } | |
76 | |
77 aura::Window* FindAt(const gfx::Point& screen_loc) { | |
78 screen_loc_ = screen_loc; | |
79 ui::EnumerateTopLevelWindows(this); | |
80 return toplevel_; | |
81 } | |
82 | |
83 protected: | |
84 virtual bool ShouldStopIterating(XID xid) OVERRIDE { | |
85 aura::Window* window = | |
86 views::DesktopWindowTreeHostX11::GetContentWindowForXID(xid); | |
87 if (window) { | |
88 if (window->IsVisible() && | |
89 window->GetBoundsInScreen().Contains(screen_loc_)) { | |
90 toplevel_ = window; | |
91 return true; | |
92 } | |
93 return false; | |
94 } | |
95 | |
96 if (ui::IsWindowVisible(xid) && | |
97 ui::WindowContainsPoint(xid, screen_loc_)) { | |
98 // toplevel_ = NULL | |
99 return true; | |
100 } | |
101 return false; | |
102 } | |
103 | |
104 gfx::Point screen_loc_; | |
105 aura::Window* toplevel_; | |
106 | |
107 DISALLOW_COPY_AND_ASSIGN(ToplevelWindowFinder); | |
108 }; | |
109 | |
110 } // namespace | 66 } // namespace |
111 | 67 |
112 namespace views { | 68 namespace views { |
113 | 69 |
114 //////////////////////////////////////////////////////////////////////////////// | 70 //////////////////////////////////////////////////////////////////////////////// |
115 // DesktopScreenX11, public: | 71 // DesktopScreenX11, public: |
116 | 72 |
117 DesktopScreenX11::DesktopScreenX11() | 73 DesktopScreenX11::DesktopScreenX11() |
118 : xdisplay_(base::MessagePumpX11::GetDefaultXDisplay()), | 74 : xdisplay_(base::MessagePumpX11::GetDefaultXDisplay()), |
119 x_root_window_(DefaultRootWindow(xdisplay_)), | 75 x_root_window_(DefaultRootWindow(xdisplay_)), |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 | 175 |
220 return gfx::Point(root_x, root_y); | 176 return gfx::Point(root_x, root_y); |
221 } | 177 } |
222 | 178 |
223 gfx::NativeWindow DesktopScreenX11::GetWindowUnderCursor() { | 179 gfx::NativeWindow DesktopScreenX11::GetWindowUnderCursor() { |
224 return GetWindowAtScreenPoint(GetCursorScreenPoint()); | 180 return GetWindowAtScreenPoint(GetCursorScreenPoint()); |
225 } | 181 } |
226 | 182 |
227 gfx::NativeWindow DesktopScreenX11::GetWindowAtScreenPoint( | 183 gfx::NativeWindow DesktopScreenX11::GetWindowAtScreenPoint( |
228 const gfx::Point& point) { | 184 const gfx::Point& point) { |
229 ToplevelWindowFinder finder; | 185 std::vector<aura::Window*> windows = |
230 return finder.FindAt(point); | 186 DesktopWindowTreeHostX11::GetAllOpenWindows(); |
| 187 |
| 188 for (std::vector<aura::Window*>::const_iterator it = windows.begin(); |
| 189 it != windows.end(); ++it) { |
| 190 if ((*it)->GetBoundsInScreen().Contains(point)) |
| 191 return *it; |
| 192 } |
| 193 |
| 194 return NULL; |
231 } | 195 } |
232 | 196 |
233 int DesktopScreenX11::GetNumDisplays() const { | 197 int DesktopScreenX11::GetNumDisplays() const { |
234 return displays_.size(); | 198 return displays_.size(); |
235 } | 199 } |
236 | 200 |
237 std::vector<gfx::Display> DesktopScreenX11::GetAllDisplays() const { | 201 std::vector<gfx::Display> DesktopScreenX11::GetAllDisplays() const { |
238 return displays_; | 202 return displays_; |
239 } | 203 } |
240 | 204 |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 ProcessDisplayChange(new_displays); | 382 ProcessDisplayChange(new_displays); |
419 } | 383 } |
420 | 384 |
421 //////////////////////////////////////////////////////////////////////////////// | 385 //////////////////////////////////////////////////////////////////////////////// |
422 | 386 |
423 gfx::Screen* CreateDesktopScreen() { | 387 gfx::Screen* CreateDesktopScreen() { |
424 return new DesktopScreenX11; | 388 return new DesktopScreenX11; |
425 } | 389 } |
426 | 390 |
427 } // namespace views | 391 } // namespace views |
OLD | NEW |