Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(225)

Unified Diff: chromeos_brightness.cc

Issue 5640003: libcros: Watch for display brightness changes. (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/cros.git@master
Patch Set: update comment Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chromeos_brightness.h ('k') | chromeos_cros_api.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chromeos_brightness.cc
diff --git a/chromeos_brightness.cc b/chromeos_brightness.cc
new file mode 100644
index 0000000000000000000000000000000000000000..1e80421be7a09cb02ad96bd17ec6cb349183d86e
--- /dev/null
+++ b/chromeos_brightness.cc
@@ -0,0 +1,128 @@
+// Copyright (c) 2010 The Chromium OS 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 "chromeos_brightness.h"
+
+#include <string>
+
+#include <dbus/dbus-glib-lowlevel.h>
+
+#include "base/logging.h"
+#include "base/stringprintf.h"
+#include "chromeos/dbus/dbus.h"
+#include "chromeos/dbus/service_constants.h"
+
+using std::string;
+
+namespace {
+
+// Returns a string matching the D-Bus messages that we want to listen for.
+string GetDBusMatchString() {
+ return StringPrintf("type='signal', interface='%s', member='%s'",
+ power_manager::kPowerManagerInterface,
+ power_manager::kBrightnessChangedSignal);
+}
+
+} // namespace
+
+namespace chromeos {
+
+class OpaqueBrightnessConnection {
+ public:
+ OpaqueBrightnessConnection(const BrightnessMonitorFunction& monitor_function,
+ void* object)
+ : monitor_function_(monitor_function),
+ object_(object) {
+ }
+
+ // A D-Bus message filter to receive signals.
+ static DBusHandlerResult FilterDBusMessage(DBusConnection* dbus_conn,
+ DBusMessage* message,
+ void* data) {
+ BrightnessConnection self = static_cast<BrightnessConnection>(data);
+ if (dbus_message_is_signal(message,
+ power_manager::kPowerManagerInterface,
+ power_manager::kBrightnessChangedSignal)) {
+ DBusError error;
+ dbus_error_init(&error);
+ int brightness_level = 0;
+ if (dbus_message_get_args(message, &error,
+ DBUS_TYPE_INT32, &brightness_level,
+ DBUS_TYPE_INVALID)) {
+ self->monitor_function_(self->object_, brightness_level);
+ } else {
+ LOG(WARNING) << "Unable to read brightness level from "
+ << power_manager::kBrightnessChangedSignal << " signal";
+ }
+ return DBUS_HANDLER_RESULT_HANDLED;
+ } else {
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+ }
+
+ private:
+ // Function within Chrome that we invoke when the brightness changes.
+ BrightnessMonitorFunction monitor_function_;
+
+ // Opaque pointer supplied to ChromeOSMonitorBrightness() that we pass back
+ // via |monitor_function_|.
+ void* object_;
+};
+
+extern "C"
+BrightnessConnection ChromeOSMonitorBrightness(
+ BrightnessMonitorFunction monitor_function, void* object) {
+ BrightnessConnection connection =
+ new OpaqueBrightnessConnection(monitor_function, object);
+
+ // Snoop on D-Bus messages so we can get notified about brightness changes.
+ DBusConnection* dbus_conn =
+ dbus_g_connection_get_connection(
+ dbus::GetSystemBusConnection().g_connection());
+ DCHECK(dbus_conn);
+
+ DBusError error;
+ dbus_error_init(&error);
+ dbus_bus_add_match(dbus_conn, GetDBusMatchString().c_str(), &error);
+ if (dbus_error_is_set(&error)) {
+ LOG(DFATAL) << "Got error while adding D-Bus match rule: " << error.name
+ << " (" << error.message << ")";
+ }
+
+ if (!dbus_connection_add_filter(
+ dbus_conn,
+ &OpaqueBrightnessConnection::FilterDBusMessage,
+ connection, // user_data
+ NULL)) { // free_data_function
+ LOG(DFATAL) << "Unable to add D-Bus filter";
+ }
+
+ return connection;
+}
+
+extern "C"
+void ChromeOSDisconnectBrightness(BrightnessConnection connection) {
+ DCHECK(connection);
+
+ DBusConnection* dbus_conn =
+ dbus_g_connection_get_connection(
+ dbus::GetSystemBusConnection().g_connection());
+ DCHECK(dbus_conn);
+
+ dbus_connection_remove_filter(
+ dbus_conn,
+ &OpaqueBrightnessConnection::FilterDBusMessage,
+ connection);
+ delete connection;
+
+ DBusError error;
+ dbus_error_init(&error);
+ dbus_bus_remove_match(dbus_conn, GetDBusMatchString().c_str(), &error);
+ if (dbus_error_is_set(&error)) {
+ LOG(DFATAL) << "Got error while removing D-Bus match rule: " << error.name
+ << " (" << error.message << ")";
+ }
+}
+
+} // namespace chromeos
« no previous file with comments | « chromeos_brightness.h ('k') | chromeos_cros_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698