| 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. |
| 11 #undef RootWindow | 11 #undef RootWindow |
| 12 | 12 |
| 13 #include "base/debug/trace_event.h" | 13 #include "base/debug/trace_event.h" |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "ui/aura/window.h" | 15 #include "ui/aura/window.h" |
| 16 #include "ui/aura/window_event_dispatcher.h" | 16 #include "ui/aura/window_event_dispatcher.h" |
| 17 #include "ui/aura/window_tree_host.h" | 17 #include "ui/aura/window_tree_host.h" |
| 18 #include "ui/base/layout.h" | 18 #include "ui/base/layout.h" |
| 19 #include "ui/display/util/display_util.h" | 19 #include "ui/display/util/display_util.h" |
| 20 #include "ui/display/util/x11/edid_parser_x11.h" | 20 #include "ui/display/util/x11/edid_parser_x11.h" |
| 21 #include "ui/events/platform/platform_event_source.h" | 21 #include "ui/events/platform/platform_event_source.h" |
| 22 #include "ui/gfx/display.h" | 22 #include "ui/gfx/display.h" |
| 23 #include "ui/gfx/display_observer.h" | |
| 24 #include "ui/gfx/native_widget_types.h" | 23 #include "ui/gfx/native_widget_types.h" |
| 25 #include "ui/gfx/screen.h" | 24 #include "ui/gfx/screen.h" |
| 26 #include "ui/gfx/x/x11_types.h" | 25 #include "ui/gfx/x/x11_types.h" |
| 27 #include "ui/views/widget/desktop_aura/desktop_screen.h" | 26 #include "ui/views/widget/desktop_aura/desktop_screen.h" |
| 28 #include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" | 27 #include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" |
| 29 #include "ui/views/widget/desktop_aura/x11_topmost_window_finder.h" | 28 #include "ui/views/widget/desktop_aura/x11_topmost_window_finder.h" |
| 30 | 29 |
| 31 namespace { | 30 namespace { |
| 32 | 31 |
| 33 // The delay to perform configuration after RRNotify. See the comment | 32 // The delay to perform configuration after RRNotify. See the comment |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 } else { | 102 } else { |
| 104 displays_ = GetFallbackDisplayList(); | 103 displays_ = GetFallbackDisplayList(); |
| 105 } | 104 } |
| 106 } | 105 } |
| 107 | 106 |
| 108 DesktopScreenX11::~DesktopScreenX11() { | 107 DesktopScreenX11::~DesktopScreenX11() { |
| 109 if (has_xrandr_ && ui::PlatformEventSource::GetInstance()) | 108 if (has_xrandr_ && ui::PlatformEventSource::GetInstance()) |
| 110 ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); | 109 ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); |
| 111 } | 110 } |
| 112 | 111 |
| 113 void DesktopScreenX11::ProcessDisplayChange( | |
| 114 const std::vector<gfx::Display>& incoming) { | |
| 115 std::vector<gfx::Display> old_displays = displays_; | |
| 116 displays_ = incoming; | |
| 117 | |
| 118 typedef std::vector<gfx::Display>::const_iterator DisplayIt; | |
| 119 std::vector<gfx::Display>::const_iterator old_it = old_displays.begin(); | |
| 120 for (; old_it != old_displays.end(); ++old_it) { | |
| 121 bool found = false; | |
| 122 for (std::vector<gfx::Display>::const_iterator new_it = | |
| 123 displays_.begin(); new_it != displays_.end(); ++new_it) { | |
| 124 if (old_it->id() == new_it->id()) { | |
| 125 found = true; | |
| 126 break; | |
| 127 } | |
| 128 } | |
| 129 | |
| 130 if (!found) { | |
| 131 FOR_EACH_OBSERVER(gfx::DisplayObserver, observer_list_, | |
| 132 OnDisplayRemoved(*old_it)); | |
| 133 } | |
| 134 } | |
| 135 | |
| 136 std::vector<gfx::Display>::const_iterator new_it = displays_.begin(); | |
| 137 for (; new_it != displays_.end(); ++new_it) { | |
| 138 bool found = false; | |
| 139 for (std::vector<gfx::Display>::const_iterator old_it = | |
| 140 old_displays.begin(); old_it != old_displays.end(); ++old_it) { | |
| 141 if (new_it->id() != old_it->id()) | |
| 142 continue; | |
| 143 | |
| 144 uint32_t metrics = gfx::DisplayObserver::DISPLAY_METRIC_NONE; | |
| 145 | |
| 146 if (new_it->bounds() != old_it->bounds()) | |
| 147 metrics |= gfx::DisplayObserver::DISPLAY_METRIC_BOUNDS; | |
| 148 | |
| 149 if (new_it->rotation() != old_it->rotation()) | |
| 150 metrics |= gfx::DisplayObserver::DISPLAY_METRIC_ROTATION; | |
| 151 | |
| 152 if (new_it->work_area() != old_it->work_area()) | |
| 153 metrics |= gfx::DisplayObserver::DISPLAY_METRIC_WORK_AREA; | |
| 154 | |
| 155 if (new_it->device_scale_factor() != old_it->device_scale_factor()) | |
| 156 metrics |= gfx::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR; | |
| 157 | |
| 158 if (metrics != gfx::DisplayObserver::DISPLAY_METRIC_NONE) { | |
| 159 FOR_EACH_OBSERVER(gfx::DisplayObserver, | |
| 160 observer_list_, | |
| 161 OnDisplayMetricsChanged(*new_it, metrics)); | |
| 162 } | |
| 163 | |
| 164 found = true; | |
| 165 break; | |
| 166 } | |
| 167 | |
| 168 if (!found) { | |
| 169 FOR_EACH_OBSERVER(gfx::DisplayObserver, observer_list_, | |
| 170 OnDisplayAdded(*new_it)); | |
| 171 } | |
| 172 } | |
| 173 } | |
| 174 | |
| 175 //////////////////////////////////////////////////////////////////////////////// | 112 //////////////////////////////////////////////////////////////////////////////// |
| 176 // DesktopScreenX11, gfx::Screen implementation: | 113 // DesktopScreenX11, gfx::Screen implementation: |
| 177 | 114 |
| 178 bool DesktopScreenX11::IsDIPEnabled() { | 115 bool DesktopScreenX11::IsDIPEnabled() { |
| 179 return true; | 116 return true; |
| 180 } | 117 } |
| 181 | 118 |
| 182 gfx::Point DesktopScreenX11::GetCursorScreenPoint() { | 119 gfx::Point DesktopScreenX11::GetCursorScreenPoint() { |
| 183 TRACE_EVENT0("views", "DesktopScreenX11::GetCursorScreenPoint()"); | 120 TRACE_EVENT0("views", "DesktopScreenX11::GetCursorScreenPoint()"); |
| 184 | 121 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 } | 203 } |
| 267 // Fallback to the primary display if there is no matching display. | 204 // Fallback to the primary display if there is no matching display. |
| 268 return matching ? *matching : GetPrimaryDisplay(); | 205 return matching ? *matching : GetPrimaryDisplay(); |
| 269 } | 206 } |
| 270 | 207 |
| 271 gfx::Display DesktopScreenX11::GetPrimaryDisplay() const { | 208 gfx::Display DesktopScreenX11::GetPrimaryDisplay() const { |
| 272 return displays_.front(); | 209 return displays_.front(); |
| 273 } | 210 } |
| 274 | 211 |
| 275 void DesktopScreenX11::AddObserver(gfx::DisplayObserver* observer) { | 212 void DesktopScreenX11::AddObserver(gfx::DisplayObserver* observer) { |
| 276 observer_list_.AddObserver(observer); | 213 observer_delegate_.AddObserver(observer); |
| 277 } | 214 } |
| 278 | 215 |
| 279 void DesktopScreenX11::RemoveObserver(gfx::DisplayObserver* observer) { | 216 void DesktopScreenX11::RemoveObserver(gfx::DisplayObserver* observer) { |
| 280 observer_list_.RemoveObserver(observer); | 217 observer_delegate_.RemoveObserver(observer); |
| 281 } | 218 } |
| 282 | 219 |
| 283 bool DesktopScreenX11::CanDispatchEvent(const ui::PlatformEvent& event) { | 220 bool DesktopScreenX11::CanDispatchEvent(const ui::PlatformEvent& event) { |
| 284 return event->type - xrandr_event_base_ == RRScreenChangeNotify || | 221 return event->type - xrandr_event_base_ == RRScreenChangeNotify || |
| 285 event->type - xrandr_event_base_ == RRNotify; | 222 event->type - xrandr_event_base_ == RRNotify; |
| 286 } | 223 } |
| 287 | 224 |
| 288 uint32_t DesktopScreenX11::DispatchEvent(const ui::PlatformEvent& event) { | 225 uint32_t DesktopScreenX11::DispatchEvent(const ui::PlatformEvent& event) { |
| 289 if (event->type - xrandr_event_base_ == RRScreenChangeNotify) { | 226 if (event->type - xrandr_event_base_ == RRScreenChangeNotify) { |
| 290 // Pass the event through to xlib. | 227 // Pass the event through to xlib. |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 | 346 |
| 410 XRRFreeScreenResources(resources); | 347 XRRFreeScreenResources(resources); |
| 411 | 348 |
| 412 if (displays.empty()) | 349 if (displays.empty()) |
| 413 return GetFallbackDisplayList(); | 350 return GetFallbackDisplayList(); |
| 414 | 351 |
| 415 return displays; | 352 return displays; |
| 416 } | 353 } |
| 417 | 354 |
| 418 void DesktopScreenX11::ConfigureTimerFired() { | 355 void DesktopScreenX11::ConfigureTimerFired() { |
| 419 std::vector<gfx::Display> new_displays = BuildDisplaysFromXRandRInfo(); | 356 std::vector<gfx::Display> old_displays = displays_; |
| 420 ProcessDisplayChange(new_displays); | 357 displays_ = BuildDisplaysFromXRandRInfo(); |
| 358 |
| 359 observer_delegate_.NotifyDisplaysChanged(old_displays, displays_); |
| 421 } | 360 } |
| 422 | 361 |
| 423 //////////////////////////////////////////////////////////////////////////////// | 362 //////////////////////////////////////////////////////////////////////////////// |
| 424 | 363 |
| 425 gfx::Screen* CreateDesktopScreen() { | 364 gfx::Screen* CreateDesktopScreen() { |
| 426 return new DesktopScreenX11; | 365 return new DesktopScreenX11; |
| 427 } | 366 } |
| 428 | 367 |
| 429 } // namespace views | 368 } // namespace views |
| OLD | NEW |