/*
* Copyright 2014 Canonical Ltd.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*
* Authors:
* Yuan-Chen Cheng
*/
#include
#include
#include
#include
#include
#include "ib-brightness-powerd-control.h"
GDBusProxy*
powerd_get_proxy(void)
{
GError *error = NULL;
GDBusProxy* powerd_proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
"com.canonical.powerd",
"/com/canonical/powerd",
"com.canonical.powerd",
NULL,
&error);
if (error != NULL) {
g_debug ("could not connect to powerd: %s", error->message);
g_error_free (error);
return NULL;
}
return powerd_proxy;
}
static gboolean
getBrightnessParams(GDBusProxy* powerd_proxy, int *min, int *max, int *dflt, gboolean *ab_supported)
{
GVariant *ret = NULL;
GError *error = NULL;
ret = g_dbus_proxy_call_sync(powerd_proxy,
"getBrightnessParams",
NULL,
G_DBUS_CALL_FLAGS_NONE,
-1, NULL, &error);
if (!ret) {
g_warning("getBrightnessParams failed: %s", error->message);
g_error_free(error);
return FALSE;
}
g_variant_get(ret, "((iiib))", min, max, dflt, ab_supported);
g_variant_unref(ret);
return TRUE;
}
static gboolean setUserBrightness(GDBusProxy* powerd_proxy, int brightness)
{
GVariant *ret = NULL;
GError *error = NULL;
ret = g_dbus_proxy_call_sync(powerd_proxy,
"setUserBrightness",
g_variant_new("(i)", brightness),
G_DBUS_CALL_FLAGS_NONE,
-1, NULL, &error);
if (!ret) {
g_warning("setUserBrightness failed: %s", error->message);
g_error_free(error);
return FALSE;
} else {
g_variant_unref(ret);
return TRUE;
}
}
struct _IbBrightnessPowerdControl
{
gboolean inited;
GDBusProxy *powerd_proxy;
int min;
int max;
int dflt;
gboolean ab_supported;
int current;
};
static void ib_brightness_init(IbBrightnessPowerdControl *control)
{
gboolean ret = getBrightnessParams(control->powerd_proxy, &(control->min),
&(control->max), &(control->dflt), &(control->ab_supported));
if (! ret)
return;
control->inited = TRUE;
ib_brightness_powerd_control_set_value(control, control->max * 8 / 10);
}
IbBrightnessPowerdControl*
ib_brightness_powerd_control_new (GDBusProxy* powerd_proxy)
{
IbBrightnessPowerdControl *control;
control = g_new0 (IbBrightnessPowerdControl, 1);
control->inited = FALSE;
control->powerd_proxy = powerd_proxy;
ib_brightness_init(control);
return control;
}
void
ib_brightness_powerd_control_set_value (IbBrightnessPowerdControl* self, gint value)
{
gboolean ret;
if (! self->inited)
return;
if (value > self->max)
{
value = self->max;
}
else if (value < self->min)
{
value = self->min;
}
ret = setUserBrightness(self->powerd_proxy, value);
if (ret)
{
self->current = value;
}
}
gint
ib_brightness_powerd_control_get_value (IbBrightnessPowerdControl* self)
{
if (! self->inited)
return 0;
return self->current;
}
gint
ib_brightness_powerd_control_get_max_value (IbBrightnessPowerdControl* self)
{
if (! self->inited)
return 0;
return self->max;
}
void
ib_brightness_powerd_control_free (IbBrightnessPowerdControl *self)
{
g_object_unref (self->powerd_proxy);
g_free (self);
}