summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2015-02-24 21:59:18 +0000
committerRichard Hughes <richard@hughsie.com>2015-05-19 10:00:32 +0100
commite110c071f46056ca62df68574b7198c1484ee74a (patch)
tree10057a0076e6f5bab8d87d1839b0e958b02dfbc2
parent008d7c1468854ec17a25397e353f987b858405cf (diff)
downloadgnome-control-center-wip/rhughes/iio-proxy.tar.gz
power: Add support for dimming using an ambient light sensorwip/rhughes/iio-proxy
-rw-r--r--panels/power/cc-power-panel.c99
1 files changed, 98 insertions, 1 deletions
diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
index 641dc2f10..e0b56446c 100644
--- a/panels/power/cc-power-panel.c
+++ b/panels/power/cc-power-panel.c
@@ -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
@@ -947,6 +952,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,
GVariant *invalidated_properties,
@@ -1456,6 +1507,14 @@ add_brightness_row (CcPowerPanel *self,
}
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)
{
CcPowerPanelPrivate *priv = self->priv;
@@ -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;