diff -up evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c.weather-update-units evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c
--- evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c.weather-update-units 2016-03-07 13:58:10.305155925 +0100
+++ evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c 2016-03-07 13:58:10.336155765 +0100
@@ -67,13 +67,16 @@ struct _ECalBackendWeatherPrivate {
guint reload_timeout_id;
guint is_loading : 1;
- /* Flags */
- gboolean opened;
-
/* Weather source */
EWeatherSource *source;
guint begin_retrival_id;
+
+ gulong source_changed_id;
+
+ GMutex last_used_mutex;
+ ESourceWeatherUnits last_used_units;
+ gchar *last_used_location;
};
static gboolean
@@ -87,7 +90,6 @@ reload_cb (gpointer user_data)
return TRUE;
cbw->priv->reload_timeout_id = 0;
- cbw->priv->opened = TRUE;
begin_retrieval_cb (cbw);
return FALSE;
@@ -200,13 +202,21 @@ finished_retrieval_cb (GWeatherInfo *inf
source = e_backend_get_source (E_BACKEND (cbw));
weather_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEATHER_BACKEND);
- if (e_source_weather_get_units (weather_extension) == E_SOURCE_WEATHER_UNITS_CENTIGRADE)
+ g_mutex_lock (&priv->last_used_mutex);
+
+ priv->last_used_units = e_source_weather_get_units (weather_extension);
+ g_free (priv->last_used_location);
+ priv->last_used_location = e_source_weather_dup_location (weather_extension);
+
+ if (priv->last_used_units == E_SOURCE_WEATHER_UNITS_CENTIGRADE)
unit = GWEATHER_TEMP_UNIT_CENTIGRADE;
- else if (e_source_weather_get_units (weather_extension) == E_SOURCE_WEATHER_UNITS_KELVIN)
+ else if (priv->last_used_units == E_SOURCE_WEATHER_UNITS_KELVIN)
unit = GWEATHER_TEMP_UNIT_KELVIN;
else /* E_SOURCE_WEATHER_UNITS_FAHRENHEIT */
unit = GWEATHER_TEMP_UNIT_FAHRENHEIT;
+ g_mutex_unlock (&priv->last_used_mutex);
+
/* update cache */
comps = e_cal_backend_store_get_components (priv->store);
@@ -713,28 +723,29 @@ e_cal_backend_weather_open (ECalBackendS
}
static void
-e_cal_backend_weather_refresh (ECalBackendSync *backend,
- EDataCal *cal,
- GCancellable *cancellable,
- GError **perror)
+e_cal_backend_weather_refresh_content (ECalBackendWeather *cbw)
{
- ECalBackendWeather *cbw;
- ECalBackendWeatherPrivate *priv;
+ g_return_if_fail (E_IS_CAL_BACKEND_WEATHER (cbw));
- cbw = E_CAL_BACKEND_WEATHER (backend);
- priv = cbw->priv;
-
- if (!priv->opened ||
- priv->is_loading)
+ if (!e_cal_backend_is_opened (E_CAL_BACKEND (cbw)) ||
+ cbw->priv->is_loading)
return;
- if (priv->reload_timeout_id)
- g_source_remove (priv->reload_timeout_id);
- priv->reload_timeout_id = 0;
+ if (cbw->priv->reload_timeout_id)
+ g_source_remove (cbw->priv->reload_timeout_id);
+ cbw->priv->reload_timeout_id = 0;
/* wait a second, then start reloading */
- priv->reload_timeout_id =
- e_named_timeout_add_seconds (1, reload_cb, cbw);
+ cbw->priv->reload_timeout_id = e_named_timeout_add_seconds (1, reload_cb, cbw);
+}
+
+static void
+e_cal_backend_weather_refresh (ECalBackendSync *backend,
+ EDataCal *cal,
+ GCancellable *cancellable,
+ GError **perror)
+{
+ e_cal_backend_weather_refresh_content (E_CAL_BACKEND_WEATHER (backend));
}
static void
@@ -945,6 +956,54 @@ e_cal_backend_weather_notify_online_cb (
}
static void
+e_cal_backend_weather_source_changed_cb (ESource *source,
+ ECalBackendWeather *cbw)
+{
+ ESourceWeather *weather_extension;
+ gchar *location;
+
+ g_return_if_fail (E_IS_SOURCE (source));
+ g_return_if_fail (E_IS_CAL_BACKEND_WEATHER (cbw));
+
+ weather_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEATHER_BACKEND);
+ location = e_source_weather_dup_location (weather_extension);
+
+ g_mutex_lock (&cbw->priv->last_used_mutex);
+
+ if (cbw->priv->last_used_units != e_source_weather_get_units (weather_extension) ||
+ g_strcmp0 (location, cbw->priv->last_used_location) != 0) {
+ g_mutex_unlock (&cbw->priv->last_used_mutex);
+
+ e_cal_backend_weather_refresh_content (cbw);
+ } else {
+ g_mutex_unlock (&cbw->priv->last_used_mutex);
+ }
+
+ g_free (location);
+}
+
+static void
+e_cal_backend_weather_constructed (GObject *object)
+{
+ ECalBackendWeather *cbw;
+ ESource *source;
+ ESourceWeather *weather_extension;
+
+ /* Chain up to parent's method. */
+ G_OBJECT_CLASS (e_cal_backend_weather_parent_class)->constructed (object);
+
+ cbw = E_CAL_BACKEND_WEATHER (object);
+ source = e_backend_get_source (E_BACKEND (cbw));
+
+ g_return_if_fail (source != NULL);
+
+ weather_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEATHER_BACKEND);
+
+ cbw->priv->last_used_units = e_source_weather_get_units (weather_extension);
+ cbw->priv->source_changed_id = g_signal_connect (source, "changed", G_CALLBACK (e_cal_backend_weather_source_changed_cb), cbw);
+}
+
+static void
e_cal_backend_weather_dispose (GObject *object)
{
ECalBackendWeatherPrivate *priv;
@@ -961,6 +1020,17 @@ e_cal_backend_weather_dispose (GObject *
priv->begin_retrival_id = 0;
}
+ if (priv->source_changed_id) {
+ ESource *source;
+
+ source = e_backend_get_source (E_BACKEND (object));
+ if (source) {
+ g_signal_handler_disconnect (source, priv->source_changed_id);
+ }
+
+ priv->source_changed_id = 0;
+ }
+
g_clear_object (&priv->source);
/* Chain up to parent's dispose() method. */
@@ -979,6 +1049,8 @@ e_cal_backend_weather_finalize (GObject
priv->store = NULL;
}
+ g_mutex_clear (&priv->last_used_mutex);
+
/* Chain up to parent's finalize() method. */
G_OBJECT_CLASS (e_cal_backend_weather_parent_class)->finalize (object);
}
@@ -989,6 +1061,8 @@ e_cal_backend_weather_init (ECalBackendW
{
cbw->priv = E_CAL_BACKEND_WEATHER_GET_PRIVATE (cbw);
+ g_mutex_init (&cbw->priv->last_used_mutex);
+
g_signal_connect (
cbw, "notify::online",
G_CALLBACK (e_cal_backend_weather_notify_online_cb), NULL);
@@ -1008,6 +1082,7 @@ e_cal_backend_weather_class_init (ECalBa
backend_class = (ECalBackendClass *) class;
sync_class = (ECalBackendSyncClass *) class;
+ object_class->constructed = e_cal_backend_weather_constructed;
object_class->dispose = e_cal_backend_weather_dispose;
object_class->finalize = e_cal_backend_weather_finalize;