diff options
author | Richard Hughes <richard@hughsie.com> | 2015-02-24 21:59:18 +0000 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2015-05-19 10:00:32 +0100 |
commit | e110c071f46056ca62df68574b7198c1484ee74a (patch) | |
tree | 10057a0076e6f5bab8d87d1839b0e958b02dfbc2 | |
parent | 008d7c1468854ec17a25397e353f987b858405cf (diff) | |
download | gnome-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.c | 99 |
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; |