Compare commits

...

1 Commits

Author SHA1 Message Date
Richard Hughes
e110c071f4 power: Add support for dimming using an ambient light sensor 2015-05-19 10:00:32 +01:00

View File

@@ -2,7 +2,7 @@
*
* Copyright (C) 2010 Red Hat, Inc
* Copyright (C) 2008 William Jon McCann <jmccann@redhat.com>
* Copyright (C) 2010 Richard Hughes <richard@hughsie.com>
* Copyright (C) 2010-2015 Richard Hughes <richard@hughsie.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -97,6 +97,10 @@ struct _CcPowerPanelPrivate
GtkWidget *bt_switch;
GtkWidget *bt_row;
GDBusProxy *iio_proxy;
GtkWidget *als_switch;
GtkWidget *als_row;
#ifdef HAVE_NETWORK_MANAGER
NMClient *nm_client;
GtkWidget *wifi_switch;
@@ -139,6 +143,7 @@ cc_power_panel_dispose (GObject *object)
g_clear_object (&priv->up_client);
g_clear_object (&priv->bt_rfkill);
g_clear_object (&priv->bt_properties);
g_clear_object (&priv->iio_proxy);
#ifdef HAVE_NETWORK_MANAGER
g_clear_object (&priv->nm_client);
#endif
@@ -946,6 +951,52 @@ sync_screen_brightness (CcPowerPanel *self)
}
}
static void
als_switch_changed (GtkSwitch *sw,
GParamSpec *pspec,
CcPowerPanel *panel)
{
gboolean enabled;
enabled = gtk_switch_get_active (sw);
g_debug ("Setting ALS enabled %s", enabled ? "on" : "off");
g_settings_set_boolean (panel->priv->gsd_settings, "ambient-enabled", enabled);
}
static void
als_enabled_state_changed (CcPowerPanel *self)
{
CcPowerPanelPrivate *priv = self->priv;
gboolean enabled;
gboolean has_brightness = FALSE;
gboolean visible = FALSE;
GVariant *v;
if (priv->iio_proxy == NULL)
return;
v = g_dbus_proxy_get_cached_property (self->priv->screen_proxy, "Brightness");
if (v != NULL)
{
has_brightness = g_variant_get_int32 (v) >= 0.0;
g_variant_unref (v);
}
v = g_dbus_proxy_get_cached_property (priv->iio_proxy, "HasAmbientLight");
if (v != NULL)
{
visible = g_variant_get_boolean (v);
g_variant_unref (v);
}
enabled = g_settings_get_boolean (priv->gsd_settings, "ambient-enabled");
g_debug ("ALS enabled: %s", enabled ? "on" : "off");
g_signal_handlers_block_by_func (priv->als_switch, als_switch_changed, self);
gtk_switch_set_active (GTK_SWITCH (priv->als_switch), enabled);
gtk_widget_set_visible (priv->als_row, visible && has_brightness);
g_signal_handlers_unblock_by_func (priv->als_switch, als_switch_changed, self);
}
static void
on_screen_property_change (GDBusProxy *proxy,
GVariant *changed_properties,
@@ -1455,6 +1506,14 @@ add_brightness_row (CcPowerPanel *self,
return row;
}
static void
als_enabled_setting_changed (GSettings *settings,
const gchar *key,
CcPowerPanel *self)
{
als_enabled_state_changed (self);
}
static void
add_power_saving_section (CcPowerPanel *self)
{
@@ -1511,6 +1570,44 @@ add_power_saving_section (CcPowerPanel *self)
gtk_container_add (GTK_CONTAINER (widget), row);
gtk_size_group_add_widget (priv->row_sizegroup, row);
/* ambient light sensor */
priv->iio_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
"net.hadess.SensorProxy",
"/net/hadess/SensorProxy",
"net.hadess.SensorProxy",
NULL, NULL);
if (priv->iio_proxy)
{
g_signal_connect (priv->gsd_settings, "changed",
G_CALLBACK (als_enabled_setting_changed), self);
g_signal_connect_swapped (G_OBJECT (priv->iio_proxy), "g-properties-changed",
G_CALLBACK (als_enabled_state_changed), self);
priv->als_row = row = no_prelight_row_new ();
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 50);
gtk_container_add (GTK_CONTAINER (row), box);
label = gtk_label_new (_("Automatic brightness"));
gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
gtk_widget_set_margin_start (label, 20);
gtk_widget_set_margin_end (label, 20);
gtk_widget_set_margin_top (label, 6);
gtk_widget_set_margin_bottom (label, 6);
gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
priv->als_switch = sw = gtk_switch_new ();
gtk_widget_set_margin_start (sw, 20);
gtk_widget_set_margin_end (sw, 20);
gtk_widget_set_valign (sw, GTK_ALIGN_CENTER);
gtk_box_pack_start (GTK_BOX (box), sw, FALSE, TRUE, 0);
gtk_label_set_mnemonic_widget (GTK_LABEL (label), sw);
gtk_container_add (GTK_CONTAINER (widget), row);
gtk_size_group_add_widget (priv->row_sizegroup, row);
g_signal_connect (G_OBJECT (priv->als_switch), "notify::active",
G_CALLBACK (als_switch_changed), self);
}
row = add_brightness_row (self, _("_Keyboard brightness"), &priv->kbd_brightness_scale);
priv->kbd_brightness_row = row;