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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chromeos_brightness.h ('k') | chromeos_cros_api.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chromeos_brightness.h"
6
7 #include <string>
8
9 #include <dbus/dbus-glib-lowlevel.h>
10
11 #include "base/logging.h"
12 #include "base/stringprintf.h"
13 #include "chromeos/dbus/dbus.h"
14 #include "chromeos/dbus/service_constants.h"
15
16 using std::string;
17
18 namespace {
19
20 // Returns a string matching the D-Bus messages that we want to listen for.
21 string GetDBusMatchString() {
22 return StringPrintf("type='signal', interface='%s', member='%s'",
23 power_manager::kPowerManagerInterface,
24 power_manager::kBrightnessChangedSignal);
25 }
26
27 } // namespace
28
29 namespace chromeos {
30
31 class OpaqueBrightnessConnection {
32 public:
33 OpaqueBrightnessConnection(const BrightnessMonitorFunction& monitor_function,
34 void* object)
35 : monitor_function_(monitor_function),
36 object_(object) {
37 }
38
39 // A D-Bus message filter to receive signals.
40 static DBusHandlerResult FilterDBusMessage(DBusConnection* dbus_conn,
41 DBusMessage* message,
42 void* data) {
43 BrightnessConnection self = static_cast<BrightnessConnection>(data);
44 if (dbus_message_is_signal(message,
45 power_manager::kPowerManagerInterface,
46 power_manager::kBrightnessChangedSignal)) {
47 DBusError error;
48 dbus_error_init(&error);
49 int brightness_level = 0;
50 if (dbus_message_get_args(message, &error,
51 DBUS_TYPE_INT32, &brightness_level,
52 DBUS_TYPE_INVALID)) {
53 self->monitor_function_(self->object_, brightness_level);
54 } else {
55 LOG(WARNING) << "Unable to read brightness level from "
56 << power_manager::kBrightnessChangedSignal << " signal";
57 }
58 return DBUS_HANDLER_RESULT_HANDLED;
59 } else {
60 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
61 }
62 }
63
64 private:
65 // Function within Chrome that we invoke when the brightness changes.
66 BrightnessMonitorFunction monitor_function_;
67
68 // Opaque pointer supplied to ChromeOSMonitorBrightness() that we pass back
69 // via |monitor_function_|.
70 void* object_;
71 };
72
73 extern "C"
74 BrightnessConnection ChromeOSMonitorBrightness(
75 BrightnessMonitorFunction monitor_function, void* object) {
76 BrightnessConnection connection =
77 new OpaqueBrightnessConnection(monitor_function, object);
78
79 // Snoop on D-Bus messages so we can get notified about brightness changes.
80 DBusConnection* dbus_conn =
81 dbus_g_connection_get_connection(
82 dbus::GetSystemBusConnection().g_connection());
83 DCHECK(dbus_conn);
84
85 DBusError error;
86 dbus_error_init(&error);
87 dbus_bus_add_match(dbus_conn, GetDBusMatchString().c_str(), &error);
88 if (dbus_error_is_set(&error)) {
89 LOG(DFATAL) << "Got error while adding D-Bus match rule: " << error.name
90 << " (" << error.message << ")";
91 }
92
93 if (!dbus_connection_add_filter(
94 dbus_conn,
95 &OpaqueBrightnessConnection::FilterDBusMessage,
96 connection, // user_data
97 NULL)) { // free_data_function
98 LOG(DFATAL) << "Unable to add D-Bus filter";
99 }
100
101 return connection;
102 }
103
104 extern "C"
105 void ChromeOSDisconnectBrightness(BrightnessConnection connection) {
106 DCHECK(connection);
107
108 DBusConnection* dbus_conn =
109 dbus_g_connection_get_connection(
110 dbus::GetSystemBusConnection().g_connection());
111 DCHECK(dbus_conn);
112
113 dbus_connection_remove_filter(
114 dbus_conn,
115 &OpaqueBrightnessConnection::FilterDBusMessage,
116 connection);
117 delete connection;
118
119 DBusError error;
120 dbus_error_init(&error);
121 dbus_bus_remove_match(dbus_conn, GetDBusMatchString().c_str(), &error);
122 if (dbus_error_is_set(&error)) {
123 LOG(DFATAL) << "Got error while removing D-Bus match rule: " << error.name
124 << " (" << error.message << ")";
125 }
126 }
127
128 } // namespace chromeos
OLDNEW
« 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