| 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/base/x/x11_util.h" | 19 #include "ui/base/x/x11_util.h" |
| 20 #include "ui/display/x11/edid_parser_x11.h" | 20 #include "ui/display/x11/edid_parser_x11.h" |
| 21 #include "ui/events/platform/platform_event_source.h" |
| 21 #include "ui/gfx/display.h" | 22 #include "ui/gfx/display.h" |
| 22 #include "ui/gfx/display_observer.h" | 23 #include "ui/gfx/display_observer.h" |
| 23 #include "ui/gfx/native_widget_types.h" | 24 #include "ui/gfx/native_widget_types.h" |
| 24 #include "ui/gfx/screen.h" | 25 #include "ui/gfx/screen.h" |
| 25 #include "ui/gfx/x/x11_types.h" | 26 #include "ui/gfx/x/x11_types.h" |
| 26 #include "ui/views/widget/desktop_aura/desktop_screen.h" | 27 #include "ui/views/widget/desktop_aura/desktop_screen.h" |
| 27 #include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" | 28 #include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" |
| 28 | 29 |
| 29 namespace { | 30 namespace { |
| 30 | 31 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 int randr_version_minor = 0; | 130 int randr_version_minor = 0; |
| 130 has_xrandr_ = XRRQueryVersion( | 131 has_xrandr_ = XRRQueryVersion( |
| 131 xdisplay_, &randr_version_major, &randr_version_minor) && | 132 xdisplay_, &randr_version_major, &randr_version_minor) && |
| 132 randr_version_major == 1 && | 133 randr_version_major == 1 && |
| 133 randr_version_minor >= 3; | 134 randr_version_minor >= 3; |
| 134 | 135 |
| 135 if (has_xrandr_) { | 136 if (has_xrandr_) { |
| 136 int error_base_ignored = 0; | 137 int error_base_ignored = 0; |
| 137 XRRQueryExtension(xdisplay_, &xrandr_event_base_, &error_base_ignored); | 138 XRRQueryExtension(xdisplay_, &xrandr_event_base_, &error_base_ignored); |
| 138 | 139 |
| 139 base::MessagePumpX11::Current()->AddDispatcherForRootWindow(this); | 140 if (ui::PlatformEventSource::GetInstance()) |
| 141 ui::PlatformEventSource::GetInstance()->AddPlatformEventDispatcher(this); |
| 140 XRRSelectInput(xdisplay_, | 142 XRRSelectInput(xdisplay_, |
| 141 x_root_window_, | 143 x_root_window_, |
| 142 RRScreenChangeNotifyMask | RROutputChangeNotifyMask); | 144 RRScreenChangeNotifyMask | RROutputChangeNotifyMask); |
| 143 | 145 |
| 144 displays_ = BuildDisplaysFromXRandRInfo(); | 146 displays_ = BuildDisplaysFromXRandRInfo(); |
| 145 } else { | 147 } else { |
| 146 displays_ = GetFallbackDisplayList(); | 148 displays_ = GetFallbackDisplayList(); |
| 147 } | 149 } |
| 148 } | 150 } |
| 149 | 151 |
| 150 DesktopScreenX11::~DesktopScreenX11() { | 152 DesktopScreenX11::~DesktopScreenX11() { |
| 151 if (has_xrandr_) | 153 if (has_xrandr_ && ui::PlatformEventSource::GetInstance()) |
| 152 base::MessagePumpX11::Current()->RemoveDispatcherForRootWindow(this); | 154 ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); |
| 153 } | 155 } |
| 154 | 156 |
| 155 void DesktopScreenX11::ProcessDisplayChange( | 157 void DesktopScreenX11::ProcessDisplayChange( |
| 156 const std::vector<gfx::Display>& incoming) { | 158 const std::vector<gfx::Display>& incoming) { |
| 157 std::vector<gfx::Display> old_displays = displays_; | 159 std::vector<gfx::Display> old_displays = displays_; |
| 158 displays_ = incoming; | 160 displays_ = incoming; |
| 159 | 161 |
| 160 typedef std::vector<gfx::Display>::const_iterator DisplayIt; | 162 typedef std::vector<gfx::Display>::const_iterator DisplayIt; |
| 161 std::vector<gfx::Display>::const_iterator old_it = old_displays.begin(); | 163 std::vector<gfx::Display>::const_iterator old_it = old_displays.begin(); |
| 162 for (; old_it != old_displays.end(); ++old_it) { | 164 for (; old_it != old_displays.end(); ++old_it) { |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 } | 301 } |
| 300 | 302 |
| 301 void DesktopScreenX11::AddObserver(gfx::DisplayObserver* observer) { | 303 void DesktopScreenX11::AddObserver(gfx::DisplayObserver* observer) { |
| 302 observer_list_.AddObserver(observer); | 304 observer_list_.AddObserver(observer); |
| 303 } | 305 } |
| 304 | 306 |
| 305 void DesktopScreenX11::RemoveObserver(gfx::DisplayObserver* observer) { | 307 void DesktopScreenX11::RemoveObserver(gfx::DisplayObserver* observer) { |
| 306 observer_list_.RemoveObserver(observer); | 308 observer_list_.RemoveObserver(observer); |
| 307 } | 309 } |
| 308 | 310 |
| 309 uint32_t DesktopScreenX11::Dispatch(const base::NativeEvent& event) { | 311 bool DesktopScreenX11::CanDispatchEvent(const ui::PlatformEvent& event) { |
| 312 return event->type - xrandr_event_base_ == RRScreenChangeNotify || |
| 313 event->type - xrandr_event_base_ == RRNotify; |
| 314 } |
| 315 |
| 316 uint32_t DesktopScreenX11::DispatchEvent(const ui::PlatformEvent& event) { |
| 310 if (event->type - xrandr_event_base_ == RRScreenChangeNotify) { | 317 if (event->type - xrandr_event_base_ == RRScreenChangeNotify) { |
| 311 // Pass the event through to xlib. | 318 // Pass the event through to xlib. |
| 312 XRRUpdateConfiguration(event); | 319 XRRUpdateConfiguration(event); |
| 313 } else if (event->type - xrandr_event_base_ == RRNotify) { | 320 } else if (event->type - xrandr_event_base_ == RRNotify) { |
| 314 // There's some sort of observer dispatch going on here, but I don't think | 321 // There's some sort of observer dispatch going on here, but I don't think |
| 315 // it's the screen's? | 322 // it's the screen's? |
| 316 if (configure_timer_.get() && configure_timer_->IsRunning()) { | 323 if (configure_timer_.get() && configure_timer_->IsRunning()) { |
| 317 configure_timer_->Reset(); | 324 configure_timer_->Reset(); |
| 318 } else { | 325 } else { |
| 319 configure_timer_.reset(new base::OneShotTimer<DesktopScreenX11>()); | 326 configure_timer_.reset(new base::OneShotTimer<DesktopScreenX11>()); |
| 320 configure_timer_->Start( | 327 configure_timer_->Start( |
| 321 FROM_HERE, | 328 FROM_HERE, |
| 322 base::TimeDelta::FromMilliseconds(kConfigureDelayMs), | 329 base::TimeDelta::FromMilliseconds(kConfigureDelayMs), |
| 323 this, | 330 this, |
| 324 &DesktopScreenX11::ConfigureTimerFired); | 331 &DesktopScreenX11::ConfigureTimerFired); |
| 325 } | 332 } |
| 333 } else { |
| 334 NOTREACHED(); |
| 326 } | 335 } |
| 327 | 336 |
| 328 return POST_DISPATCH_NONE; | 337 return ui::POST_DISPATCH_NONE; |
| 329 } | 338 } |
| 330 | 339 |
| 331 //////////////////////////////////////////////////////////////////////////////// | 340 //////////////////////////////////////////////////////////////////////////////// |
| 332 // DesktopScreenX11, private: | 341 // DesktopScreenX11, private: |
| 333 | 342 |
| 334 DesktopScreenX11::DesktopScreenX11( | 343 DesktopScreenX11::DesktopScreenX11( |
| 335 const std::vector<gfx::Display>& test_displays) | 344 const std::vector<gfx::Display>& test_displays) |
| 336 : xdisplay_(base::MessagePumpX11::GetDefaultXDisplay()), | 345 : xdisplay_(base::MessagePumpX11::GetDefaultXDisplay()), |
| 337 x_root_window_(DefaultRootWindow(xdisplay_)), | 346 x_root_window_(DefaultRootWindow(xdisplay_)), |
| 338 has_xrandr_(false), | 347 has_xrandr_(false), |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 ProcessDisplayChange(new_displays); | 433 ProcessDisplayChange(new_displays); |
| 425 } | 434 } |
| 426 | 435 |
| 427 //////////////////////////////////////////////////////////////////////////////// | 436 //////////////////////////////////////////////////////////////////////////////// |
| 428 | 437 |
| 429 gfx::Screen* CreateDesktopScreen() { | 438 gfx::Screen* CreateDesktopScreen() { |
| 430 return new DesktopScreenX11; | 439 return new DesktopScreenX11; |
| 431 } | 440 } |
| 432 | 441 |
| 433 } // namespace views | 442 } // namespace views |
| OLD | NEW |