aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/datetime-prefs-locations.c62
-rw-r--r--src/datetime-prefs.c31
2 files changed, 63 insertions, 30 deletions
diff --git a/src/datetime-prefs-locations.c b/src/datetime-prefs-locations.c
index 9c71f8e..c0452d0 100644
--- a/src/datetime-prefs-locations.c
+++ b/src/datetime-prefs-locations.c
@@ -164,9 +164,10 @@ handle_edit (GtkCellRendererText * renderer, gchar * path, gchar * new_text,
// edit), so we set the error icon here if needed. Common way to get to
// this code path is to lose entry focus.
if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (store), &iter, path)) {
- const gchar * name;
+ gchar * name;
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, COL_NAME, &name, -1);
gboolean correct = g_strcmp0 (name, new_text) == 0;
+ g_free (name);
gtk_list_store_set (store, &iter,
COL_VISIBLE_NAME, new_text,
@@ -179,32 +180,36 @@ static gboolean
timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model,
GtkTreeIter * iter, GtkWidget * dlg)
{
- const gchar * zone, * name;
+ gchar * zone = NULL;
+ gchar * name = NULL;
gtk_tree_model_get (model, iter,
CC_TIMEZONE_COMPLETION_ZONE, &zone,
CC_TIMEZONE_COMPLETION_NAME, &name,
-1);
- if (zone == NULL || zone[0] == 0) {
- const gchar * strlon, * strlat;
- gdouble lon = 0.0, lat = 0.0;
+ /* if no explicit timezone, try to determine one from latlon */
+ if (!zone || !*zone)
+ {
+ gchar * strlat = NULL;
+ gchar * strlon = NULL;
+ gdouble lat = 0;
+ gdouble lon = 0;
gtk_tree_model_get (model, iter,
- CC_TIMEZONE_COMPLETION_LONGITUDE, &strlon,
CC_TIMEZONE_COMPLETION_LATITUDE, &strlat,
+ CC_TIMEZONE_COMPLETION_LONGITUDE, &strlon,
-1);
- if (strlon != NULL && strlon[0] != 0) {
- lon = strtod(strlon, NULL);
- }
-
- if (strlat != NULL && strlat[0] != 0) {
- lat = strtod(strlat, NULL);
- }
+ if (strlat && *strlat) lat = atof(strlat);
+ if (strlon && *strlon) lon = atof(strlon);
CcTimezoneMap * tzmap = CC_TIMEZONE_MAP (g_object_get_data (G_OBJECT (widget), "tzmap"));
- zone = cc_timezone_map_get_timezone_at_coords (tzmap, lon, lat);
+ g_free (zone);
+ zone = g_strdup (cc_timezone_map_get_timezone_at_coords (tzmap, lon, lat));
+
+ g_free (strlat);
+ g_free (strlon);
}
GtkListStore * store = GTK_LIST_STORE (g_object_get_data (G_OBJECT (widget), "store"));
@@ -219,6 +224,10 @@ timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model,
update_times (dlg);
+ /* cleanup */
+ g_free (name);
+ g_free (zone);
+
return FALSE; // Do normal action too
}
@@ -280,11 +289,11 @@ update_times (GtkWidget * dlg)
GtkTreeIter iter;
if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) {
do {
- const gchar * strzone;
+ gchar * strzone;
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, COL_ZONE, &strzone, -1);
- if (strzone != NULL && strzone[0] != 0) {
+ if (strzone && *strzone) {
GTimeZone * tz = g_time_zone_new (strzone);
GDateTime * now_tz = g_date_time_to_timezone (now, tz);
gchar * format = generate_format_string_at_time (now_tz);
@@ -297,6 +306,7 @@ update_times (GtkWidget * dlg)
g_date_time_unref (now_tz);
g_time_zone_unref (tz);
}
+ g_free (strzone);
} while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter));
}
@@ -343,21 +353,23 @@ save_to_settings (GObject * store, GSettings * conf)
GtkTreeIter iter;
if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) {
+ GString * gstr = g_string_new (NULL);
do {
- const gchar * strzone, * strname;
-
+ gchar * strname;
+ gchar * strzone;
gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
COL_NAME, &strname,
COL_ZONE, &strzone,
-1);
-
- if (strzone != NULL && strzone[0] != 0 && strname != NULL && strname[0] != 0) {
- gchar * settings_string = g_strdup_printf("%s %s", strzone, strname);
- g_variant_builder_add (&builder, "s", settings_string);
- g_free (settings_string);
+ if (strzone && *strzone && strname && *strname) {
+ g_string_printf (gstr, "%s %s", strzone, strname);
+ g_variant_builder_add (&builder, "s", gstr->str);
empty = FALSE;
}
+ g_free (strname);
+ g_free (strzone);
} while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter));
+ g_string_free (gstr, TRUE);
}
if (empty) {
@@ -366,9 +378,7 @@ save_to_settings (GObject * store, GSettings * conf)
g_settings_set_strv (conf, SETTINGS_LOCATIONS_S, NULL);
}
else {
- GVariant * locations = g_variant_builder_end (&builder);
- g_settings_set_strv (conf, SETTINGS_LOCATIONS_S, g_variant_get_strv (locations, NULL));
- g_variant_unref (locations);
+ g_settings_set_value (conf, SETTINGS_LOCATIONS_S, g_variant_builder_end (&builder));
}
}
diff --git a/src/datetime-prefs.c b/src/datetime-prefs.c
index bfe75c0..fbb8ea1 100644
--- a/src/datetime-prefs.c
+++ b/src/datetime-prefs.c
@@ -70,6 +70,8 @@ struct _IndicatorDatetimePanelPrivate
gboolean changing_time;
GtkWidget * loc_dlg;
CcTimezoneCompletion * completion;
+ GCancellable * tz_query_cancel;
+ GCancellable * ntp_query_cancel;
};
struct _IndicatorDatetimePanelClass
@@ -214,6 +216,8 @@ ntp_query_answered (GObject *object, GAsyncResult *res, IndicatorDatetimePanel *
GError * error = NULL;
GVariant * answers = g_dbus_proxy_call_finish (G_DBUS_PROXY (object), res, &error);
+ g_clear_object (&self->priv->ntp_query_cancel);
+
if (error != NULL) {
g_warning("Could not query DBus proxy for SettingsDaemon: %s", error->message);
g_error_free(error);
@@ -265,6 +269,8 @@ tz_query_answered (GObject *object, GAsyncResult *res, IndicatorDatetimePanel *
GError * error = NULL;
GVariant * answers = g_dbus_proxy_call_finish (G_DBUS_PROXY (object), res, &error);
+ g_clear_object (&self->priv->tz_query_cancel);
+
if (error != NULL) {
g_warning("Could not query DBus proxy for SettingsDaemon: %s", error->message);
g_error_free(error);
@@ -286,6 +292,7 @@ static void
proxy_ready (GObject *object, GAsyncResult *res, IndicatorDatetimePanel * self)
{
GError * error = NULL;
+ IndicatorDatetimePanelPrivate * priv = self->priv;
self->priv->proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
@@ -296,10 +303,16 @@ proxy_ready (GObject *object, GAsyncResult *res, IndicatorDatetimePanel * self)
}
/* And now, do initial proxy configuration */
- g_dbus_proxy_call (self->priv->proxy, "GetUsingNtp", NULL, G_DBUS_CALL_FLAGS_NONE, -1,
- NULL, (GAsyncReadyCallback)ntp_query_answered, self);
- g_dbus_proxy_call (self->priv->proxy, "GetTimezone", NULL, G_DBUS_CALL_FLAGS_NONE, -1,
- NULL, (GAsyncReadyCallback)tz_query_answered, self);
+ if (priv->ntp_query_cancel == NULL) {
+ priv->ntp_query_cancel = g_cancellable_new();
+ g_dbus_proxy_call (priv->proxy, "GetUsingNtp", NULL, G_DBUS_CALL_FLAGS_NONE, -1,
+ priv->ntp_query_cancel, (GAsyncReadyCallback)ntp_query_answered, self);
+ }
+ if (priv->tz_query_cancel == NULL); {
+ priv->tz_query_cancel = g_cancellable_new();
+ g_dbus_proxy_call (priv->proxy, "GetTimezone", NULL, G_DBUS_CALL_FLAGS_NONE, -1,
+ priv->tz_query_cancel, (GAsyncReadyCallback)tz_query_answered, self);
+ }
}
static void
@@ -784,6 +797,16 @@ indicator_datetime_panel_dispose (GObject * object)
g_clear_object (&priv->builder);
g_clear_object (&priv->proxy);
+ if (priv->tz_query_cancel != NULL) {
+ g_cancellable_cancel (priv->tz_query_cancel);
+ g_clear_object (&priv->tz_query_cancel);
+ }
+
+ if (priv->ntp_query_cancel != NULL) {
+ g_cancellable_cancel (priv->ntp_query_cancel);
+ g_clear_object (&priv->ntp_query_cancel);
+ }
+
if (priv->loc_dlg) {
gtk_widget_destroy (priv->loc_dlg);
priv->loc_dlg = NULL;