diff options
-rw-r--r-- | src/rotation-lock.cpp | 85 |
1 files changed, 32 insertions, 53 deletions
diff --git a/src/rotation-lock.cpp b/src/rotation-lock.cpp index 9523358..55919d2 100644 --- a/src/rotation-lock.cpp +++ b/src/rotation-lock.cpp @@ -130,14 +130,7 @@ public: gclue_simple_new ("ayatana-indicator-display", GCLUE_ACCURACY_LEVEL_CITY, NULL, onGeoClueLoaded, this); } - GVariant *pProfile = g_settings_get_value (this->m_settings, "color-temp-profile"); - guint nProfile = g_variant_get_uint16 (pProfile); - - if (nProfile != 0) - { - this->nCallback = g_timeout_add_seconds (60, updateColorTemp, this); - } - + this->nCallback = g_timeout_add_seconds (60, updateColorTemp, this); updateColorTemp (this); } #endif @@ -145,6 +138,11 @@ public: ~Impl() { + if (nCallback) + { + g_source_remove (nCallback); + } + g_signal_handlers_disconnect_by_data(m_settings, this); g_clear_object(&m_action_group); g_clear_object(&m_settings); @@ -169,16 +167,14 @@ private: static gboolean updateColorTemp (gpointer pData) { RotationLockIndicator::Impl *pImpl = (RotationLockIndicator::Impl*) pData; - guint nTemperature = 6500; - GVariant *pProfile = g_settings_get_value (pImpl->m_settings, "color-temp-profile"); - guint nProfile = g_variant_get_uint16 (pProfile); - GVariant *pBrightness = g_settings_get_value (pImpl->m_settings, "brightness"); - gdouble fBrightness = g_variant_get_double (pBrightness); + guint nProfile = 0; + g_settings_get (pImpl->m_settings, "color-temp-profile", "q", &nProfile); + gdouble fBrightness = g_settings_get_double (pImpl->m_settings, "brightness"); + guint nTemperature = 0; if (nProfile == 0) { - GVariant *pTemperature = g_settings_get_value (pImpl->m_settings, "color-temp"); - nTemperature = g_variant_get_uint16 (pTemperature); + g_settings_get (pImpl->m_settings, "color-temp", "q", &nTemperature); g_debug("%i", nTemperature); } @@ -203,21 +199,26 @@ private: g_debug("%f, %f, %i", fShifting, fElevation, nTemperature); } - GAction *pAction = g_action_map_lookup_action (G_ACTION_MAP (pImpl->m_action_group), "color-temp"); - GVariant *pTemperature = g_variant_new_double (nTemperature); - g_action_change_state (pAction, pTemperature); + if (pImpl->fLastBrightness != fBrightness || pImpl->nLasColorTemp != nTemperature) + { + GAction *pAction = g_action_map_lookup_action (G_ACTION_MAP (pImpl->m_action_group), "color-temp"); + GVariant *pTemperature = g_variant_new_double (nTemperature); + g_action_change_state (pAction, pTemperature); - GError *pError = NULL; - gchar *sCommand = g_strdup_printf ("xsct %u %f", nTemperature, fBrightness); - gboolean bSuccess = g_spawn_command_line_sync (sCommand, NULL, NULL, NULL, &pError); + GError *pError = NULL; + gchar *sCommand = g_strdup_printf ("xsct %u %f", nTemperature, fBrightness); + gboolean bSuccess = g_spawn_command_line_sync (sCommand, NULL, NULL, NULL, &pError); - if (!bSuccess) - { - g_error ("The call to '%s' failed: %s", sCommand, pError->message); - g_error_free (pError); - } + if (!bSuccess) + { + g_error ("The call to '%s' failed: %s", sCommand, pError->message); + g_error_free (pError); + } - g_free (sCommand); + pImpl->fLastBrightness = fBrightness; + pImpl->nLasColorTemp = nTemperature; + g_free (sCommand); + } return G_SOURCE_CONTINUE; } @@ -250,30 +251,6 @@ private: updateColorTemp (pData); } - static void onBrightnessSettings (GSettings *pSettings, const gchar *sKey, gpointer pData) - { - updateColorTemp (pData); - } - - static void onColorTempProfile (GSettings *pSettings, const gchar *sKey, gpointer pData) - { - RotationLockIndicator::Impl *pImpl = (RotationLockIndicator::Impl*) pData; - GVariant *pProfile = g_settings_get_value (pImpl->m_settings, "color-temp-profile"); - guint nProfile = g_variant_get_uint16 (pProfile); - - if (nProfile == 0 && pImpl->nCallback != 0) - { - g_source_remove (pImpl->nCallback); - pImpl->nCallback = 0; - } - else if (nProfile != 0 && pImpl->nCallback == 0) - { - pImpl->nCallback = g_timeout_add_seconds (60, updateColorTemp, pImpl); - } - - updateColorTemp (pImpl); - } - static gboolean settingsIntToActionStateString (GValue *pValue, GVariant *pVariant, gpointer pData) { guint16 nVariant = g_variant_get_uint16 (pVariant); @@ -380,7 +357,7 @@ private: g_settings_bind_with_mapping (this->m_settings, "color-temp-profile", action, "state", G_SETTINGS_BIND_DEFAULT, settingsIntToActionStateString, actionStateStringToSettingsInt, NULL, NULL); g_action_map_add_action(G_ACTION_MAP(group), G_ACTION(action)); g_object_unref(G_OBJECT(action)); - g_signal_connect (m_settings, "changed::color-temp-profile", G_CALLBACK (onColorTempProfile), this); + g_signal_connect_swapped (m_settings, "changed::color-temp-profile", G_CALLBACK (updateColorTemp), this); pVariantType = g_variant_type_new("d"); action = g_simple_action_new_stateful ("brightness", pVariantType, g_variant_new_double (0)); @@ -388,7 +365,7 @@ private: g_settings_bind_with_mapping (m_settings, "brightness", action, "state", G_SETTINGS_BIND_DEFAULT, settings_to_action_state, action_state_to_settings, NULL, NULL); g_action_map_add_action (G_ACTION_MAP (group), G_ACTION (action)); g_object_unref (G_OBJECT (action)); - g_signal_connect (m_settings, "changed::brightness", G_CALLBACK (onBrightnessSettings), this); + g_signal_connect_swapped (m_settings, "changed::brightness", G_CALLBACK (updateColorTemp), this); } #endif @@ -568,6 +545,8 @@ private: gdouble fLongitude = -0.0076589; gboolean bAutoSliderUpdate = FALSE; guint nCallback = 0; + gdouble fLastBrightness = 0.0; + guint nLasColorTemp = 0; #endif }; |