1 // Copyright (c) 2013 Intel Corporation. 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.
5 #include "power/power_instance_desktop.h"
10 #include "common/picojson.h"
12 #define DEVICE "/sys/class/backlight/acpi_video0"
14 static double kMaxBrightness = 0;
16 static int readInt(const char* pathname) {
18 file.open(pathname, std::ios::in);
30 static void writeInt(const char* pathname, int value) {
32 file.open(pathname, std::ios::out);
38 snprintf(buf, sizeof(buf), "%d", value);
40 file.seekp(0, std::ios::beg);
45 void OnScreenProxyCreatedThunk(GObject* source, GAsyncResult* res,
47 PowerInstanceDesktop* instance = static_cast<PowerInstanceDesktop*>(data);
48 // Returns 0 in case of failure.
49 instance->screen_proxy_ = g_dbus_proxy_new_for_bus_finish(res, /* error */ 0);
52 PowerInstanceDesktop::PowerInstanceDesktop() {
53 kMaxBrightness = readInt(DEVICE "/max_brightness");
55 g_dbus_proxy_new_for_bus(G_BUS_TYPE_SESSION,
56 G_DBUS_PROXY_FLAGS_NONE,
57 NULL, /* GDBusInterfaceInfo */
58 "org.gnome.SettingsDaemon",
59 "/org/gnome/SettingsDaemon/Power",
60 "org.gnome.SettingsDaemon.Power.Screen",
61 NULL, /* GCancellable */
62 OnScreenProxyCreatedThunk,
66 PowerInstanceDesktop::~PowerInstanceDesktop() {
68 g_object_unref(screen_proxy_);
71 void PowerInstanceDesktop::HandleMessage(const char* message) {
75 picojson::parse(v, message, message + strlen(message), &err);
77 std::cout << "Ignoring message.\n";
81 std::string cmd = v.get("cmd").to_str();
82 if (cmd == "PowerRequest") {
84 } else if (cmd == "PowerRelease") {
86 } else if (cmd == "PowerSetScreenBrightness") {
87 // value of -1 means restore to default value.
88 HandleSetScreenBrightness(v);
89 } else if (cmd == "PowerSetScreenEnabled") {
90 HandleSetScreenEnabled(v);
92 std::cout << "ASSERT NOT REACHED.\n";
96 void PowerInstanceDesktop::HandleSyncMessage(const char* message) {
100 picojson::parse(v, message, message + strlen(message), &err);
102 std::cout << "Ignoring message.\n";
106 std::string cmd = v.get("cmd").to_str();
107 if (cmd == "PowerGetScreenBrightness") {
108 HandleGetScreenBrightness();
109 } else if (cmd == "PowerGetScreenState") {
110 HandleGetScreenState();
112 std::cout << "ASSERT NOT REACHED.\n";
116 void PowerInstanceDesktop::OnScreenStateChanged(ResourceState state) {
117 picojson::value::object o;
118 o["cmd"] = picojson::value("ScreenStateChanged");
119 o["state"] = picojson::value(static_cast<double>(state));
121 picojson::value v(o);
122 PostMessage(v.serialize().c_str());
125 void PowerInstanceDesktop::HandleRequest(const picojson::value& msg) {
126 std::string resource = msg.get("resource").to_str();
127 ResourceState state = static_cast<ResourceState>(
128 msg.get("state").get<double>());
135 OnScreenStateChanged(state);
142 void PowerInstanceDesktop::HandleRelease(const picojson::value& msg) {
143 std::string resource = msg.get("resource").to_str();
146 void PowerInstanceDesktop::HandleSetScreenBrightness(
147 const picojson::value& msg) {
148 double value = msg.get("value").get<double>();
150 // Attempt using the GNOME SettingsDaemon service.
152 g_dbus_proxy_call(screen_proxy_,
154 g_variant_new("(u)", static_cast<int>(value * 100)),
155 G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, this);
159 // Fallback to manual (requires root).
160 if (kMaxBrightness < 1)
163 writeInt(DEVICE "/brightness", value * kMaxBrightness);
166 void PowerInstanceDesktop::HandleGetScreenBrightness() {
167 char brightnessAsString[32] = "0.0";
169 double value = readInt(DEVICE "/brightness");
170 if (kMaxBrightness > 0 && value >= 0)
171 snprintf(brightnessAsString, sizeof(brightnessAsString),
172 "%g", value / kMaxBrightness);
174 SendSyncReply(brightnessAsString);
177 void PowerInstanceDesktop::HandleSetScreenEnabled(const picojson::value& msg) {
178 bool isEnabled = msg.get("value").get<bool>();
181 void PowerInstanceDesktop::HandleGetScreenState() {
182 picojson::value::object o;
183 o["state"] = picojson::value(
184 static_cast<double>(SCREEN_NORMAL));
185 picojson::value v(o);
186 SendSyncReply(v.serialize().c_str());