From ed19e892a5f1e22d3141f81c1da04f9f91719643 Mon Sep 17 00:00:00 2001 From: David Shea Date: Tue, 24 Mar 2015 10:36:51 -0400 Subject: [PATCH 2/2] Cycle through a smaller list of map locations on repeated clicks. Cycling through the entire map causes erratic jumps between locations, especially if starting in a sparsely populated area. Limit the candidate locations to those within 50px of the mouse click, or the nearest location if no location is within 50px. --- src/cc-timezone-map.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/cc-timezone-map.c b/src/cc-timezone-map.c index 3de453e..ed80a01 100644 --- a/src/cc-timezone-map.c +++ b/src/cc-timezone-map.c @@ -999,6 +999,8 @@ get_loc_for_xy (GtkWidget * widget, gint x, gint y) location = (CcTimezoneLocation*) priv->distances->data; } else { + GList *node; + g_list_free (priv->distances_head); priv->distances_head = NULL; for (i = 0; i < array->len; i++) @@ -1016,6 +1018,25 @@ get_loc_for_xy (GtkWidget * widget, gint x, gint y) priv->distances_head = g_list_prepend (priv->distances_head, loc); } priv->distances_head = g_list_sort (priv->distances_head, (GCompareFunc) sort_locations); + + /* Remove locations from the list with a distance of greater than 50px, + * so that repeated clicks cycle through a smaller area instead of + * jumping all over the map. Start with the second element to ensure + * that at least one element stays in the list. + */ + node = priv->distances_head->next; + while (node != NULL) + { + if (cc_timezone_location_get_dist(node->data) > (50 * 50)) + { + /* Cut the list off here */ + node->prev->next = NULL; + g_list_free(node); + } + + node = g_list_next(node); + } + priv->distances = priv->distances_head; location = (CcTimezoneLocation*) priv->distances->data; priv->previous_x = x; -- 2.1.0