aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/datetime-prefs.c52
1 files changed, 46 insertions, 6 deletions
diff --git a/src/datetime-prefs.c b/src/datetime-prefs.c
index b1335ca..4a32fd6 100644
--- a/src/datetime-prefs.c
+++ b/src/datetime-prefs.c
@@ -181,11 +181,12 @@ ntp_query_answered (GObject *object, GAsyncResult *res, gpointer user_data)
g_variant_unref (answers);
}
-static void
-sync_entry (const gchar * location)
+static gchar *
+get_zone_name (const gchar * location)
{
gchar * new_zone, * new_name;
gchar * old_zone, * old_name;
+ gchar * rv;
split_settings_location (location, &new_zone, &new_name);
@@ -199,15 +200,31 @@ sync_entry (const gchar * location)
// old_name is potentially a saved "pretty" version of a timezone name from
// geonames. So we prefer to use it if available and the zones match.
- if (g_strcmp0 (old_zone, new_zone) == 0)
- gtk_entry_set_text (GTK_ENTRY (tz_entry), old_name);
- else
- gtk_entry_set_text (GTK_ENTRY (tz_entry), new_name);
+ if (g_strcmp0 (old_zone, new_zone) == 0) {
+ rv = old_name;
+ old_name = NULL;
+ }
+ else {
+ rv = new_name;
+ new_name = NULL;
+ }
g_free (new_zone);
g_free (old_zone);
g_free (new_name);
g_free (old_name);
+
+ return rv;
+}
+
+static void
+sync_entry (const gchar * location)
+{
+ gchar * name = get_zone_name (location);
+ gtk_entry_set_text (GTK_ENTRY (tz_entry), name);
+ g_free (name);
+
+ gtk_entry_set_icon_from_stock (GTK_ENTRY (tz_entry), GTK_ENTRY_ICON_SECONDARY, NULL);
}
static void
@@ -580,6 +597,28 @@ timezone_selected (GtkEntryCompletion * widget, GtkTreeModel * model,
}
static gboolean
+entry_focus_out (GtkEntry * entry, GdkEventFocus * event)
+{
+ // If the name left in the entry doesn't match the current timezone name,
+ // show an error icon. It's always an error for the user to manually type in
+ // a timezone.
+ TzLocation * location = cc_timezone_map_get_location (tzmap);
+ if (location == NULL)
+ return FALSE;
+
+ gchar * name = get_zone_name (location->zone);
+ gboolean correct = (g_strcmp0 (gtk_entry_get_text (entry), name) == 0);
+ g_free (name);
+
+ gtk_entry_set_icon_from_stock (entry, GTK_ENTRY_ICON_SECONDARY,
+ correct ? NULL : GTK_STOCK_DIALOG_ERROR);
+ gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY,
+ _("You need to choose a location to change the time zone."));
+ gtk_entry_set_icon_activatable (entry, GTK_ENTRY_ICON_SECONDARY, FALSE);
+ return FALSE;
+}
+
+static gboolean
key_pressed (GtkWidget * widget, GdkEventKey * event, gpointer user_data)
{
switch (event->keyval) {
@@ -646,6 +685,7 @@ create_dialog (void)
TimezoneCompletion * completion = timezone_completion_new ();
timezone_completion_watch_entry (completion, GTK_ENTRY (WIG ("timezoneEntry")));
g_signal_connect (completion, "match-selected", G_CALLBACK (timezone_selected), NULL);
+ g_signal_connect (WIG ("timezoneEntry"), "focus-out-event", G_CALLBACK (entry_focus_out), NULL);
/* Set up settings bindings */
g_settings_bind (conf, SETTINGS_SHOW_CLOCK_S, WIG ("showClockCheck"),