| 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 "chromeos/display/output_configurator.h" | 5 #include "chromeos/display/output_configurator.h" |
| 6 | 6 |
| 7 #include <X11/Xlib.h> | 7 #include <X11/Xlib.h> |
| 8 #include <X11/extensions/dpms.h> | 8 #include <X11/extensions/dpms.h> |
| 9 #include <X11/extensions/Xrandr.h> | 9 #include <X11/extensions/Xrandr.h> |
| 10 | 10 |
| 11 // Xlib defines Status as int which causes our include of dbus/bus.h to fail | 11 // Xlib defines Status as int which causes our include of dbus/bus.h to fail |
| 12 // when it tries to name an enum Status. Thus, we need to undefine it (note | 12 // when it tries to name an enum Status. Thus, we need to undefine it (note |
| 13 // that this will cause a problem if code needs to use the Status type). | 13 // that this will cause a problem if code needs to use the Status type). |
| 14 // RootWindow causes similar problems in that there is a Chromium type with that | 14 // RootWindow causes similar problems in that there is a Chromium type with that |
| 15 // name. | 15 // name. |
| 16 #undef Status | 16 #undef Status |
| 17 #undef RootWindow | 17 #undef RootWindow |
| 18 | 18 |
| 19 #include "base/bind.h" | 19 #include "base/bind.h" |
| 20 #include "base/chromeos/chromeos_version.h" | 20 #include "base/chromeos/chromeos_version.h" |
| 21 #include "base/logging.h" | 21 #include "base/logging.h" |
| 22 #include "base/message_pump_aurax11.h" | 22 #include "base/message_pump_aurax11.h" |
| 23 #include "base/metrics/histogram.h" | 23 #include "base/metrics/histogram.h" |
| 24 #include "base/perftimer.h" | 24 #include "base/perftimer.h" |
| 25 #include "chromeos/dbus/dbus_thread_manager.h" | 25 #include "chromeos/dbus/dbus_thread_manager.h" |
| 26 #include "dbus/bus.h" | 26 #include "chromeos/dbus/power_manager_client.h" |
| 27 #include "dbus/exported_object.h" | |
| 28 #include "dbus/message.h" | |
| 29 #include "dbus/object_path.h" | |
| 30 #include "dbus/object_proxy.h" | |
| 31 #include "third_party/cros_system_api/dbus/service_constants.h" | |
| 32 | 27 |
| 33 namespace chromeos { | 28 namespace chromeos { |
| 34 | 29 |
| 35 namespace { | 30 namespace { |
| 36 // DPI measurements. | 31 // DPI measurements. |
| 37 const float kMmInInch = 25.4; | 32 const float kMmInInch = 25.4; |
| 38 const float kDpi96 = 96.0; | 33 const float kDpi96 = 96.0; |
| 39 const float kPixelsToMmScale = kMmInInch / kDpi96; | 34 const float kPixelsToMmScale = kMmInInch / kDpi96; |
| 40 | 35 |
| 41 // The DPI threshold to detech high density screen. | 36 // The DPI threshold to detech high density screen. |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 is_extended_display_enabled_(is_extended_display_enabled), | 223 is_extended_display_enabled_(is_extended_display_enabled), |
| 229 output_count_(0), | 224 output_count_(0), |
| 230 output_cache_(NULL), | 225 output_cache_(NULL), |
| 231 mirror_supported_(false), | 226 mirror_supported_(false), |
| 232 primary_output_index_(-1), | 227 primary_output_index_(-1), |
| 233 secondary_output_index_(-1), | 228 secondary_output_index_(-1), |
| 234 xrandr_event_base_(0), | 229 xrandr_event_base_(0), |
| 235 output_state_(STATE_INVALID) { | 230 output_state_(STATE_INVALID) { |
| 236 if (!is_running_on_chrome_os_) | 231 if (!is_running_on_chrome_os_) |
| 237 return; | 232 return; |
| 238 // Send the signal to powerd to tell it that we will take over output | |
| 239 // control. | |
| 240 // Note that this can be removed once the legacy powerd support is removed. | |
| 241 chromeos::DBusThreadManager* manager = chromeos::DBusThreadManager::Get(); | |
| 242 dbus::Bus* bus = manager->GetSystemBus(); | |
| 243 if (bus) { | |
| 244 dbus::ExportedObject* remote_object = bus->GetExportedObject( | |
| 245 dbus::ObjectPath(power_manager::kPowerManagerServicePath)); | |
| 246 dbus::Signal signal(power_manager::kPowerManagerInterface, | |
| 247 power_manager::kUseNewMonitorConfigSignal); | |
| 248 CHECK(signal.raw_message() != NULL); | |
| 249 remote_object->SendSignal(&signal); | |
| 250 } | |
| 251 | 233 |
| 252 // Cache the initial output state. | 234 // Cache the initial output state. |
| 253 Display* display = base::MessagePumpAuraX11::GetDefaultXDisplay(); | 235 Display* display = base::MessagePumpAuraX11::GetDefaultXDisplay(); |
| 254 CHECK(display != NULL); | 236 CHECK(display != NULL); |
| 255 XGrabServer(display); | 237 XGrabServer(display); |
| 256 Window window = DefaultRootWindow(display); | 238 Window window = DefaultRootWindow(display); |
| 257 XRRScreenResources* screen = XRRGetScreenResources(display, window); | 239 XRRScreenResources* screen = XRRGetScreenResources(display, window); |
| 258 CHECK(screen != NULL); | 240 CHECK(screen != NULL); |
| 259 bool did_detect_outputs = TryRecacheOutputs(display, screen); | 241 bool did_detect_outputs = TryRecacheOutputs(display, screen); |
| 260 CHECK(did_detect_outputs); | 242 CHECK(did_detect_outputs); |
| (...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 for (int i = 0; i < output_count_; ++i) { | 826 for (int i = 0; i < output_count_; ++i) { |
| 845 if (output_cache_[i].is_connected) { | 827 if (output_cache_[i].is_connected) { |
| 846 connected_output_count += 1; | 828 connected_output_count += 1; |
| 847 has_internal_output |= output_cache_[i].is_internal; | 829 has_internal_output |= output_cache_[i].is_internal; |
| 848 } | 830 } |
| 849 } | 831 } |
| 850 | 832 |
| 851 // "Projecting" is defined as having more than 1 output connected while at | 833 // "Projecting" is defined as having more than 1 output connected while at |
| 852 // least one of them is an internal output. | 834 // least one of them is an internal output. |
| 853 bool is_projecting = has_internal_output && (connected_output_count > 1); | 835 bool is_projecting = has_internal_output && (connected_output_count > 1); |
| 854 chromeos::DBusThreadManager* manager = chromeos::DBusThreadManager::Get(); | 836 chromeos::DBusThreadManager::Get()->GetPowerManagerClient() |
| 855 dbus::Bus* bus = manager->GetSystemBus(); | 837 ->SetIsProjecting(is_projecting); |
| 856 if (bus) { | |
| 857 dbus::ObjectProxy* power_manager_proxy = bus->GetObjectProxy( | |
| 858 power_manager::kPowerManagerServiceName, | |
| 859 dbus::ObjectPath(power_manager::kPowerManagerServicePath)); | |
| 860 dbus::MethodCall method_call( | |
| 861 power_manager::kPowerManagerInterface, | |
| 862 power_manager::kSetIsProjectingMethod); | |
| 863 dbus::MessageWriter writer(&method_call); | |
| 864 writer.AppendBool(is_projecting); | |
| 865 power_manager_proxy->CallMethod( | |
| 866 &method_call, | |
| 867 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | |
| 868 dbus::ObjectProxy::EmptyResponseCallback()); | |
| 869 } | |
| 870 } | 838 } |
| 871 | 839 |
| 872 void OutputConfigurator::NotifyOnDisplayChanged() { | 840 void OutputConfigurator::NotifyOnDisplayChanged() { |
| 873 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayModeChanged()); | 841 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayModeChanged()); |
| 874 } | 842 } |
| 875 | 843 |
| 876 } // namespace chromeos | 844 } // namespace chromeos |
| OLD | NEW |