summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2021-05-29 12:24:08 +0300
committerDmitry Shachnev <mitya57@debian.org>2021-09-04 19:43:25 +0100
commitcac1217fd1bf619fe8304a6be6cf65ac70b28846 (patch)
tree4aa4eced6d99c3523549e9d289b5701fa5d99a2f
parente7513ce33ea29ff881ff5efef5b3d27ad8781026 (diff)
clock: store GWeatherTimezone in ClockLocationPrivate
Also make sure that clock_location_get_gweather_timezone returns new reference. gweather_location_get_parent is transfer full and might return newly created GWeatherLocation and gweather_location_get_timezone is transfer none meaning that timezone might be destroyed when we will unref location. https://gitlab.gnome.org/GNOME/gnome-panel/-/issues/33 (cherry picked from commit 5be0672d7f316b17506db3f5d6f36716781812f6) Gbp-Pq: Name store_gweather_timezone.patch
-rw-r--r--modules/clock/clock-location.c43
1 files changed, 17 insertions, 26 deletions
diff --git a/modules/clock/clock-location.c b/modules/clock/clock-location.c
index cabc00816..d0f26cb83 100644
--- a/modules/clock/clock-location.c
+++ b/modules/clock/clock-location.c
@@ -27,6 +27,8 @@ struct _ClockLocationPrivate {
GWeatherLocation *world;
GWeatherLocation *loc;
+ GWeatherTimezone *wtz;
+
gdouble latitude;
gdouble longitude;
@@ -86,6 +88,8 @@ clock_location_new (GnomeWallClock *wall_clock,
gweather_location_get_coords (priv->loc, &priv->latitude, &priv->longitude);
}
+ priv->wtz = clock_location_get_gweather_timezone (this);
+
setup_weather_updates (this);
return this;
@@ -168,6 +172,8 @@ clock_location_finalize (GObject *g_obj)
gweather_location_unref (priv->world);
gweather_location_unref (priv->loc);
+ gweather_timezone_unref (priv->wtz);
+
if (priv->weather_timeout)
g_source_remove (priv->weather_timeout);
@@ -244,9 +250,12 @@ clock_location_get_gweather_timezone (ClockLocation *loc)
gweather_location_get_name (loc->priv->loc));
return gweather_timezone_get_utc ();
}
+
tz = gweather_location_get_timezone (gloc);
+ tz = gweather_timezone_ref (tz);
gweather_location_unref (gloc);
} else {
+ tz = gweather_timezone_ref (tz);
gweather_location_unref (gloc);
}
@@ -256,19 +265,13 @@ clock_location_get_gweather_timezone (ClockLocation *loc)
const gchar *
clock_location_get_timezone (ClockLocation *loc)
{
- GWeatherTimezone *tz;
-
- tz = clock_location_get_gweather_timezone (loc);
- return gweather_timezone_get_name (tz);
+ return gweather_timezone_get_name (loc->priv->wtz);
}
const gchar *
clock_location_get_tzname (ClockLocation *loc)
{
- GWeatherTimezone *tz;
-
- tz = clock_location_get_gweather_timezone (loc);
- return gweather_timezone_get_tzid (tz);
+ return gweather_timezone_get_tzid (loc->priv->wtz);
}
void
@@ -283,14 +286,11 @@ clock_location_get_coords (ClockLocation *loc,
GDateTime *
clock_location_localtime (ClockLocation *loc)
{
- GWeatherTimezone *wtz;
const char *tzid;
GTimeZone *tz;
GDateTime *dt;
- wtz = clock_location_get_gweather_timezone (loc);
- tzid = gweather_timezone_get_tzid (wtz);
-
+ tzid = gweather_timezone_get_tzid (loc->priv->wtz);
tz = g_time_zone_new_identifier (tzid);
if (tz == NULL) {
@@ -309,17 +309,14 @@ clock_location_localtime (ClockLocation *loc)
gboolean
clock_location_is_current_timezone (ClockLocation *loc)
{
- GWeatherTimezone *wtz;
GTimeZone *timezone;
const char *zone;
- wtz = clock_location_get_gweather_timezone (loc);
-
timezone = gnome_wall_clock_get_timezone (loc->priv->wall_clock);
zone = g_time_zone_get_identifier (timezone);
if (zone)
- return strcmp (zone, gweather_timezone_get_tzid (wtz)) == 0;
+ return strcmp (zone, gweather_timezone_get_tzid (loc->priv->wtz)) == 0;
else
return clock_location_get_offset (loc) == 0;
}
@@ -348,14 +345,10 @@ clock_location_is_current (ClockLocation *loc)
return FALSE;
}
-
glong
clock_location_get_offset (ClockLocation *loc)
{
- GWeatherTimezone *wtz;
-
- wtz = clock_location_get_gweather_timezone (loc);
- return gweather_timezone_get_offset (wtz);
+ return gweather_timezone_get_offset (loc->priv->wtz);
}
typedef struct {
@@ -405,7 +398,6 @@ clock_location_make_current (ClockLocation *loc,
GDestroyNotify destroy)
{
MakeCurrentData *mcdata;
- GWeatherTimezone *wtz;
if (loc == current_location) {
if (destroy)
@@ -436,10 +428,9 @@ clock_location_make_current (ClockLocation *loc,
mcdata->data = data;
mcdata->destroy = destroy;
- wtz = clock_location_get_gweather_timezone (loc);
- set_system_timezone_async (gweather_timezone_get_tzid (wtz),
- make_current_cb,
- mcdata);
+ set_system_timezone_async (gweather_timezone_get_tzid (loc->priv->wtz),
+ make_current_cb,
+ mcdata);
}
const gchar *