summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/chromeos/dbus/cros_dbus_service.cc2
-rw-r--r--chrome/browser/chromeos/dbus/display_power_service_provider.cc66
-rw-r--r--chrome/browser/chromeos/dbus/display_power_service_provider.h56
-rw-r--r--chrome/browser/chromeos/dbus/org.chromium.LibCrosService.conf12
-rw-r--r--chrome/browser/chromeos/power/output_observer.cc28
-rw-r--r--chrome/browser/chromeos/power/output_observer.h2
-rw-r--r--chrome/browser/chromeos/power/resume_observer.cc3
-rw-r--r--chrome/browser/chromeos/power/suspend_observer.cc3
-rw-r--r--chrome/browser/chromeos/power/suspend_observer.h1
-rw-r--r--chrome/chrome_browser_chromeos.gypi2
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',