diff options
Diffstat (limited to 'chrome')
10 files changed, 158 insertions, 17 deletions
diff --git a/chrome/browser/chromeos/dbus/cros_dbus_service.cc b/chrome/browser/chromeos/dbus/cros_dbus_service.cc index a6f8b63..6ab8262 100644 --- a/chrome/browser/chromeos/dbus/cros_dbus_service.cc +++ b/chrome/browser/chromeos/dbus/cros_dbus_service.cc @@ -8,6 +8,7 @@ #include "base/chromeos/chromeos_version.h" #include "base/stl_util.h" #include "base/threading/platform_thread.h" +#include "chrome/browser/chromeos/dbus/display_power_service_provider.h" #include "chrome/browser/chromeos/dbus/liveness_service_provider.h" #include "chrome/browser/chromeos/dbus/printer_service_provider.h" #include "chrome/browser/chromeos/dbus/proxy_resolution_service_provider.h" @@ -111,6 +112,7 @@ void CrosDBusService::Initialize() { if (base::chromeos::IsRunningOnChromeOS() && bus) { CrosDBusServiceImpl* service = new CrosDBusServiceImpl(bus); service->RegisterServiceProvider(ProxyResolutionServiceProvider::Create()); + service->RegisterServiceProvider(new DisplayPowerServiceProvider); service->RegisterServiceProvider(new LivenessServiceProvider); service->RegisterServiceProvider(new PrinterServiceProvider); g_cros_dbus_service = service; diff --git a/chrome/browser/chromeos/dbus/display_power_service_provider.cc b/chrome/browser/chromeos/dbus/display_power_service_provider.cc new file mode 100644 index 0000000..6b92d44 --- /dev/null +++ b/chrome/browser/chromeos/dbus/display_power_service_provider.cc @@ -0,0 +1,66 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/chromeos/dbus/display_power_service_provider.h" + +#include "ash/shell.h" +#include "ash/wm/user_activity_detector.h" +#include "base/bind.h" +#include "chromeos/display/output_configurator.h" +#include "dbus/bus.h" +#include "dbus/message.h" +#include "third_party/cros_system_api/dbus/service_constants.h" + +namespace chromeos { + +DisplayPowerServiceProvider::DisplayPowerServiceProvider() + : weak_ptr_factory_(this) { +} + +DisplayPowerServiceProvider::~DisplayPowerServiceProvider() {} + +void DisplayPowerServiceProvider::Start( + scoped_refptr<dbus::ExportedObject> exported_object) { + exported_object->ExportMethod( + kLibCrosServiceInterface, + kSetDisplayPower, + base::Bind(&DisplayPowerServiceProvider::SetDisplayPower, + weak_ptr_factory_.GetWeakPtr()), + base::Bind(&DisplayPowerServiceProvider::OnExported, + weak_ptr_factory_.GetWeakPtr())); +} + +void DisplayPowerServiceProvider::OnExported(const std::string& interface_name, + const std::string& method_name, + bool success) { + if (!success) { + LOG(ERROR) << "Failed to export " << interface_name << "." + << method_name; + } +} + +void DisplayPowerServiceProvider::SetDisplayPower( + dbus::MethodCall* method_call, + dbus::ExportedObject::ResponseSender response_sender) { + dbus::MessageReader reader(method_call); + int int_state = 0; + if (reader.PopInt32(&int_state)) { + // Turning displays off when the device becomes idle or on just before + // we suspend may trigger a mouse move, which would then be incorrectly + // reported as user activity. Let the UserActivityDetector + // know so that it can ignore such events. + ash::Shell::GetInstance()->user_activity_detector()-> + OnDisplayPowerChanging(); + + DisplayPowerState state = static_cast<DisplayPowerState>(int_state); + ash::Shell::GetInstance()->output_configurator()->SetDisplayPower( + state, false); + } else { + LOG(ERROR) << "Unable to parse " << kSetDisplayPower << " request"; + } + + response_sender.Run(dbus::Response::FromMethodCall(method_call)); +} + +} // namespace chromeos diff --git a/chrome/browser/chromeos/dbus/display_power_service_provider.h b/chrome/browser/chromeos/dbus/display_power_service_provider.h new file mode 100644 index 0000000..196d870 --- /dev/null +++ b/chrome/browser/chromeos/dbus/display_power_service_provider.h @@ -0,0 +1,56 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_CHROMEOS_DBUS_DISPLAY_POWER_SERVICE_PROVIDER_H_ +#define CHROME_BROWSER_CHROMEOS_DBUS_DISPLAY_POWER_SERVICE_PROVIDER_H_ + +#include <string> + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/chromeos/dbus/cros_dbus_service.h" +#include "dbus/exported_object.h" + +namespace dbus { +class MethodCall; +class Response; +} + +namespace chromeos { + +// This class exports a "SetDisplayPower" D-Bus method that the power +// manager calls to instruct Chrome to turn various displays on or off. +class DisplayPowerServiceProvider + : public CrosDBusService::ServiceProviderInterface { + public: + DisplayPowerServiceProvider(); + virtual ~DisplayPowerServiceProvider(); + + // CrosDBusService::ServiceProviderInterface overrides: + virtual void Start( + scoped_refptr<dbus::ExportedObject> exported_object) OVERRIDE; + + private: + // Called from ExportedObject when SetDisplayPower() is exported as a D-Bus + // method or failed to be exported. + void OnExported(const std::string& interface_name, + const std::string& method_name, + bool success); + + // Called on UI thread in response to a D-Bus request. + void SetDisplayPower(dbus::MethodCall* method_call, + dbus::ExportedObject::ResponseSender response_sender); + + // Keep this last so that all weak pointers will be invalidated at the + // beginning of destruction. + base::WeakPtrFactory<DisplayPowerServiceProvider> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(DisplayPowerServiceProvider); +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_DBUS_DISPLAY_POWER_SERVICE_PROVIDER_H_ diff --git a/chrome/browser/chromeos/dbus/org.chromium.LibCrosService.conf b/chrome/browser/chromeos/dbus/org.chromium.LibCrosService.conf index 454a021..28be79c 100644 --- a/chrome/browser/chromeos/dbus/org.chromium.LibCrosService.conf +++ b/chrome/browser/chromeos/dbus/org.chromium.LibCrosService.conf @@ -22,15 +22,15 @@ <!-- tlsdate needs to query proxy config. --> <policy user="proxystate"> <allow send_destination="org.chromium.LibCrosService"/> - </policy> + </policy> - <!-- update_engine uses this service to resolve the proxy config. --> - <policy user="root"> + <!-- powerd needs to change display power states. --> + <policy user="power"> <allow send_destination="org.chromium.LibCrosService"/> </policy> - <policy context="default"> - <deny send_type="method_call" - send_destination="org.chromium.LibCrosService"/> + <!-- update_engine uses this service to resolve the proxy config. --> + <policy user="root"> + <allow send_destination="org.chromium.LibCrosService"/> </policy> </busconfig> diff --git a/chrome/browser/chromeos/power/output_observer.cc b/chrome/browser/chromeos/power/output_observer.cc index 24e573e..0cbe05d 100644 --- a/chrome/browser/chromeos/power/output_observer.cc +++ b/chrome/browser/chromeos/power/output_observer.cc @@ -20,16 +20,24 @@ OutputObserver::~OutputObserver() { } void OutputObserver::ScreenPowerSet(bool power_on, bool all_displays) { - if (!power_on && all_displays) { - // All displays are turned off when the device becomes idle, which - // may trigger a mouse move. Let the UserActivityDetector know so - // that it can ignore such events. - ash::Shell::GetInstance()->user_activity_detector()-> - OnAllOutputsTurnedOff(); - } - - ash::Shell::GetInstance()->output_configurator()-> - ScreenPowerSet(power_on, all_displays); + // Turning displays off when the device becomes idle or on just before we + // suspend may trigger a mouse move, which would then be incorrectly + // reported as user activity. Let the UserActivityDetector know so that + // it can ignore such events. + ash::Shell::GetInstance()->user_activity_detector()->OnDisplayPowerChanging(); + + DisplayPowerState state = DISPLAY_POWER_ALL_ON; + if (power_on && all_displays) + state = DISPLAY_POWER_ALL_ON; + else if (power_on && !all_displays) + state = DISPLAY_POWER_INTERNAL_ON_EXTERNAL_OFF; + else if (!power_on && all_displays) + state = DISPLAY_POWER_ALL_OFF; + else if (!power_on && !all_displays) + state = DISPLAY_POWER_INTERNAL_OFF_EXTERNAL_ON; + + ash::Shell::GetInstance()->output_configurator()->SetDisplayPower( + state, false); } } // namespace chromeos diff --git a/chrome/browser/chromeos/power/output_observer.h b/chrome/browser/chromeos/power/output_observer.h index a9b80f2..da0b90e 100644 --- a/chrome/browser/chromeos/power/output_observer.h +++ b/chrome/browser/chromeos/power/output_observer.h @@ -13,6 +13,8 @@ namespace chromeos { // This observer listens for when video outputs have been turned off so that the // corresponding CRTCs can be disabled to force the connected output off. +// TODO(derat): Remove this class after powerd is calling the method +// exported by DisplayPowerServiceProvider instead. class OutputObserver : public PowerManagerClient::Observer { public: // This class registers/unregisters itself as an observer in ctor/dtor. diff --git a/chrome/browser/chromeos/power/resume_observer.cc b/chrome/browser/chromeos/power/resume_observer.cc index f28f14c..16d4a42 100644 --- a/chrome/browser/chromeos/power/resume_observer.cc +++ b/chrome/browser/chromeos/power/resume_observer.cc @@ -4,8 +4,10 @@ #include "chrome/browser/chromeos/power/resume_observer.h" +#include "ash/shell.h" #include "chrome/browser/extensions/api/system_private/system_private_api.h" #include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/display/output_configurator.h" namespace chromeos { @@ -19,6 +21,7 @@ ResumeObserver::~ResumeObserver() { void ResumeObserver::SystemResumed(const base::TimeDelta& sleep_duration) { extensions::DispatchWokeUpEvent(); + ash::Shell::GetInstance()->output_configurator()->ResumeDisplays(); } } // namespace chromeos diff --git a/chrome/browser/chromeos/power/suspend_observer.cc b/chrome/browser/chromeos/power/suspend_observer.cc index d177ded..95cabe9 100644 --- a/chrome/browser/chromeos/power/suspend_observer.cc +++ b/chrome/browser/chromeos/power/suspend_observer.cc @@ -4,6 +4,8 @@ #include "chrome/browser/chromeos/power/suspend_observer.h" +#include "ash/shell.h" +#include "ash/wm/user_activity_detector.h" #include "base/prefs/pref_service.h" #include "chrome/browser/chromeos/login/user_manager.h" #include "chrome/browser/extensions/api/system_private/system_private_api.h" @@ -42,6 +44,7 @@ void SuspendObserver::SuspendImminent() { session_client_->RequestLockScreen(); } + ash::Shell::GetInstance()->user_activity_detector()->OnDisplayPowerChanging(); ash::Shell::GetInstance()->output_configurator()->SuspendDisplays(); } diff --git a/chrome/browser/chromeos/power/suspend_observer.h b/chrome/browser/chromeos/power/suspend_observer.h index 47e7924..273b7dc 100644 --- a/chrome/browser/chromeos/power/suspend_observer.h +++ b/chrome/browser/chromeos/power/suspend_observer.h @@ -5,7 +5,6 @@ #ifndef CHROME_BROWSER_CHROMEOS_POWER_SUSPEND_OBSERVER_H_ #define CHROME_BROWSER_CHROMEOS_POWER_SUSPEND_OBSERVER_H_ -#include "ash/shell.h" #include "base/basictypes.h" #include "base/callback.h" #include "base/compiler_specific.h" diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi index b3c7c52..f2f7aeb 100644 --- a/chrome/chrome_browser_chromeos.gypi +++ b/chrome/chrome_browser_chromeos.gypi @@ -193,6 +193,8 @@ 'browser/chromeos/display/primary_display_switch_observer.h', 'browser/chromeos/dbus/cros_dbus_service.cc', 'browser/chromeos/dbus/cros_dbus_service.h', + 'browser/chromeos/dbus/display_power_service_provider.cc', + 'browser/chromeos/dbus/display_power_service_provider.h', 'browser/chromeos/dbus/liveness_service_provider.cc', 'browser/chromeos/dbus/liveness_service_provider.h', 'browser/chromeos/dbus/printer_service_provider.cc', |