[gnome-settings-daemon/benzea/night-light-preview: 25/25] color: Add DBus API to preview night light mode for a few seconds



commit 7196c244053304da221cd36fe6b8ebf96db623c7
Author: Benjamin Berg <bberg redhat com>
Date:   Wed Dec 12 14:52:53 2018 +0100

    color: Add DBus API to preview night light mode for a few seconds
    
    This API is meant for gnome-control-center so that the color temperature
    slider can preview the temperature even when night light is turned off.
    
    See also gnome-control-center issue #147

 plugins/color/gsd-color-manager.c | 68 ++++++++++++++++++++++++++++++++++++++-
 plugins/color/gsd-night-light.c   | 47 +++++++++++++++++++++++++++
 plugins/color/gsd-night-light.h   |  4 +++
 3 files changed, 118 insertions(+), 1 deletion(-)
---
diff --git a/plugins/color/gsd-color-manager.c b/plugins/color/gsd-color-manager.c
index d46c5925..c6011010 100644
--- a/plugins/color/gsd-color-manager.c
+++ b/plugins/color/gsd-color-manager.c
@@ -42,6 +42,9 @@
 static const gchar introspection_xml[] =
 "<node>"
 "  <interface name='org.gnome.SettingsDaemon.Color'>"
+"    <method name='NightLightPreview'>"
+"      <arg type='u' name='duration' direction='in'/>"
+"    </method>"
 "    <property name='NightLightActive' type='b' access='read'/>"
 "    <property name='Temperature' type='u' access='readwrite'/>"
 "    <property name='DisabledUntilTomorrow' type='b' access='readwrite'/>"
@@ -64,6 +67,8 @@ struct GsdColorManagerPrivate
         GsdColorProfiles  *profiles;
         GsdColorState     *state;
         GsdNightLight   *nlight;
+
+        guint            nlight_forced_timeout_id;
 };
 
 enum {
@@ -269,6 +274,9 @@ gsd_color_manager_finalize (GObject *object)
                 manager->priv->name_id = 0;
         }
 
+        if (manager->priv->nlight_forced_timeout_id)
+                g_source_remove (manager->priv->nlight_forced_timeout_id);
+
         g_clear_object (&manager->priv->calibrate);
         g_clear_object (&manager->priv->profiles);
         g_clear_object (&manager->priv->state);
@@ -277,6 +285,64 @@ gsd_color_manager_finalize (GObject *object)
         G_OBJECT_CLASS (gsd_color_manager_parent_class)->finalize (object);
 }
 
+static gboolean
+nlight_forced_timeout_cb (gpointer user_data)
+{
+        GsdColorManager *manager = GSD_COLOR_MANAGER (user_data);
+        GsdColorManagerPrivate *priv = manager->priv;
+
+        priv->nlight_forced_timeout_id = 0;
+        gsd_night_light_set_forced (priv->nlight, FALSE);
+
+        return G_SOURCE_REMOVE;
+}
+
+static void
+handle_method_call (GDBusConnection       *connection,
+                    const gchar           *sender,
+                    const gchar           *object_path,
+                    const gchar           *interface_name,
+                    const gchar           *method_name,
+                    GVariant              *parameters,
+                    GDBusMethodInvocation *invocation,
+                    gpointer               user_data)
+{
+        GsdColorManager *manager = GSD_COLOR_MANAGER (user_data);
+        GsdColorManagerPrivate *priv = manager->priv;
+
+        if (g_strcmp0 (method_name, "NightLightPreview") == 0) {
+                guint32 duration = 0;
+
+                if (!priv->nlight) {
+                        g_dbus_method_invocation_return_error_literal (invocation,
+                                                                       G_IO_ERROR, 
G_IO_ERROR_NOT_INITIALIZED,
+                                                                       "Night-light is currently 
unavailable");
+
+                        return;
+                }
+
+                g_variant_get (parameters, "(u)", &duration);
+
+                if (duration == 0 || duration > 120) {
+                        g_dbus_method_invocation_return_error_literal (invocation,
+                                                                       G_IO_ERROR, 
G_IO_ERROR_INVALID_ARGUMENT,
+                                                                       "Duration is out of the range 
(0-120].");
+
+                        return;
+                }
+
+                if (priv->nlight_forced_timeout_id)
+                        g_source_remove (priv->nlight_forced_timeout_id);
+                priv->nlight_forced_timeout_id = g_timeout_add_seconds (duration, nlight_forced_timeout_cb, 
manager);
+
+                gsd_night_light_set_forced (priv->nlight, TRUE);
+
+                g_dbus_method_invocation_return_value (invocation, NULL);
+        } else {
+                g_assert_not_reached ();
+        }
+}
+
 static GVariant *
 handle_get_property (GDBusConnection *connection,
                      const gchar *sender,
@@ -371,7 +437,7 @@ handle_set_property (GDBusConnection *connection,
 
 static const GDBusInterfaceVTable interface_vtable =
 {
-        NULL,
+        handle_method_call,
         handle_get_property,
         handle_set_property
 };
diff --git a/plugins/color/gsd-night-light.c b/plugins/color/gsd-night-light.c
index 1becb1b5..acbcecbc 100644
--- a/plugins/color/gsd-night-light.c
+++ b/plugins/color/gsd-night-light.c
@@ -33,6 +33,7 @@
 struct _GsdNightLight {
         GObject            parent;
         GSettings         *settings;
+        gboolean           forced;
         gboolean           disabled_until_tmw;
         GDateTime         *disabled_until_tmw_dt;
         gboolean           geoclue_enabled;
@@ -60,6 +61,7 @@ enum {
         PROP_SUNSET,
         PROP_TEMPERATURE,
         PROP_DISABLED_UNTIL_TMW,
+        PROP_FORCED,
         PROP_LAST
 };
 
@@ -255,6 +257,14 @@ night_light_recheck (GsdNightLight *self)
         guint temp_smeared;
         g_autoptr(GDateTime) dt_now = gsd_night_light_get_date_time_now (self);
 
+        /* Forced mode, just set the temperature to night light.
+         * Proper rechecking will happen once forced mode is disabled again */
+        if (self->forced) {
+                temperature = g_settings_get_uint (self->settings, "night-light-temperature");
+                gsd_night_light_set_temperature (self, temperature);
+                return;
+        }
+
         /* enabled */
         if (!g_settings_get_boolean (self->settings, "night-light-enabled")) {
                 g_debug ("night light disabled, resetting");
@@ -542,6 +552,29 @@ gsd_night_light_get_disabled_until_tmw (GsdNightLight *self)
         return self->disabled_until_tmw;
 }
 
+void
+gsd_night_light_set_forced (GsdNightLight *self, gboolean value)
+{
+        if (self->forced == value)
+                return;
+
+        self->forced = value;
+        g_object_notify (G_OBJECT (self), "forced");
+
+        /* A simple recheck might not reset the temperature if
+         * night light is currently disabled. */
+        if (!self->forced && !self->cached_active)
+                gsd_night_light_set_temperature (self, GSD_COLOR_TEMPERATURE_DEFAULT);
+
+        night_light_recheck (self);
+}
+
+gboolean
+gsd_night_light_get_forced (GsdNightLight *self)
+{
+        return self->forced;
+}
+
 gboolean
 gsd_night_light_get_active (GsdNightLight *self)
 {
@@ -633,6 +666,9 @@ gsd_night_light_set_property (GObject      *object,
         case PROP_DISABLED_UNTIL_TMW:
                 gsd_night_light_set_disabled_until_tmw (self, g_value_get_boolean (value));
                 break;
+        case PROP_FORCED:
+                gsd_night_light_set_forced (self, g_value_get_boolean (value));
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
         }
@@ -662,6 +698,9 @@ gsd_night_light_get_property (GObject    *object,
         case PROP_DISABLED_UNTIL_TMW:
                 g_value_set_boolean (value, gsd_night_light_get_disabled_until_tmw (self));
                 break;
+        case PROP_FORCED:
+                g_value_set_boolean (value, gsd_night_light_get_forced (self));
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
         }
@@ -722,6 +761,14 @@ gsd_night_light_class_init (GsdNightLightClass *klass)
                                                                FALSE,
                                                                G_PARAM_READWRITE));
 
+        g_object_class_install_property (object_class,
+                                         PROP_FORCED,
+                                         g_param_spec_boolean ("forced",
+                                                               "Forced",
+                                                               "Whether night light should be forced on, 
useful for previewing",
+                                                               FALSE,
+                                                               G_PARAM_READWRITE));
+
 }
 
 static void
diff --git a/plugins/color/gsd-night-light.h b/plugins/color/gsd-night-light.h
index 4f086dc6..8803c338 100644
--- a/plugins/color/gsd-night-light.h
+++ b/plugins/color/gsd-night-light.h
@@ -41,6 +41,10 @@ gboolean         gsd_night_light_get_disabled_until_tmw (GsdNightLight *self);
 void             gsd_night_light_set_disabled_until_tmw (GsdNightLight *self,
                                                          gboolean       value);
 
+gboolean         gsd_night_light_get_forced             (GsdNightLight *self);
+void             gsd_night_light_set_forced             (GsdNightLight *self,
+                                                         gboolean       value);
+
 /* only for the self test program */
 void             gsd_night_light_set_geoclue_enabled    (GsdNightLight *self,
                                                          gboolean       enabled);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]