[gnome-settings-daemon/benzea/night-light-preview: 25/25] color: Add DBus API to preview night light mode for a few seconds
- From: Benjamin Berg <bberg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon/benzea/night-light-preview: 25/25] color: Add DBus API to preview night light mode for a few seconds
- Date: Mon, 17 Dec 2018 17:15:03 +0000 (UTC)
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]