- Updated the time zone map images
- Updated the city data from geonames.org - Fix a memory leak and potential crash with the locations list - Cycle through a smaller list of map locations on repeated clicks
This commit is contained in:
		
							parent
							
								
									ff29a1dbae
								
							
						
					
					
						commit
						28bd411837
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +1,3 @@ | ||||
| /libtimezonemap_0.4.1.tar.gz | ||||
| /libtimezonemap_0.4.2.tar.gz | ||||
| /timezone_pngs.tar.gz | ||||
|  | ||||
| @ -0,0 +1,71 @@ | ||||
| From 604173ca272ffcdffb2c1846232bb6613a10e28f Mon Sep 17 00:00:00 2001 | ||||
| From: David Shea <dshea@redhat.com> | ||||
| Date: Tue, 24 Mar 2015 10:04:53 -0400 | ||||
| Subject: [PATCH 1/2] Fix a memory leak and potential crash with the locations | ||||
|  list | ||||
| 
 | ||||
| Store the head of the locations list separately so that the references | ||||
| to list elements are not lost as the list is iterated over. If the end | ||||
| of the list of reached, restart at the beginning. | ||||
| ---
 | ||||
|  src/cc-timezone-map.c | 19 +++++++++++++------ | ||||
|  1 file changed, 13 insertions(+), 6 deletions(-) | ||||
| 
 | ||||
| diff --git a/src/cc-timezone-map.c b/src/cc-timezone-map.c
 | ||||
| index 993f379..3de453e 100644
 | ||||
| --- a/src/cc-timezone-map.c
 | ||||
| +++ b/src/cc-timezone-map.c
 | ||||
| @@ -68,6 +68,8 @@ struct _CcTimezoneMapPrivate
 | ||||
|    CcTimezoneLocation *location; | ||||
|    GHashTable *alias_db; | ||||
|    GList *distances; | ||||
| +  /* Store the head of the list separately so it can be freed later */
 | ||||
| +  GList *distances_head;
 | ||||
|   | ||||
|    gint previous_x; | ||||
|    gint previous_y; | ||||
| @@ -594,9 +596,10 @@ cc_timezone_map_dispose (GObject *object)
 | ||||
|        g_hash_table_destroy (priv->alias_db); | ||||
|        priv->alias_db = NULL; | ||||
|      } | ||||
| -  if (priv->distances)
 | ||||
| +  if (priv->distances_head)
 | ||||
|      { | ||||
| -      g_list_free (priv->distances);
 | ||||
| +      g_list_free (priv->distances_head);
 | ||||
| +      priv->distances_head = NULL;
 | ||||
|        priv->distances = NULL; | ||||
|      } | ||||
|   | ||||
| @@ -991,10 +994,13 @@ get_loc_for_xy (GtkWidget * widget, gint x, gint y)
 | ||||
|    if (x == priv->previous_x && y == priv->previous_y)  | ||||
|      { | ||||
|        priv->distances = g_list_next (priv->distances); | ||||
| +      if (!priv->distances)
 | ||||
| +          priv->distances = priv->distances_head;
 | ||||
| +
 | ||||
|        location = (CcTimezoneLocation*) priv->distances->data; | ||||
|      } else { | ||||
| -      g_list_free (priv->distances);
 | ||||
| -      priv->distances = NULL;
 | ||||
| +      g_list_free (priv->distances_head);
 | ||||
| +      priv->distances_head = NULL;
 | ||||
|        for (i = 0; i < array->len; i++) | ||||
|          { | ||||
|            gdouble pointx, pointy, dx, dy; | ||||
| @@ -1007,9 +1013,10 @@ get_loc_for_xy (GtkWidget * widget, gint x, gint y)
 | ||||
|            dy = pointy - y; | ||||
|   | ||||
|            cc_timezone_location_set_dist(loc, (gdouble) dx * dx + dy * dy); | ||||
| -          priv->distances = g_list_prepend (priv->distances, loc);
 | ||||
| +          priv->distances_head = g_list_prepend (priv->distances_head, loc);
 | ||||
|          } | ||||
| -      priv->distances = g_list_sort (priv->distances, (GCompareFunc) sort_locations);
 | ||||
| +      priv->distances_head = g_list_sort (priv->distances_head, (GCompareFunc) sort_locations);
 | ||||
| +      priv->distances = priv->distances_head;
 | ||||
|        location = (CcTimezoneLocation*) priv->distances->data; | ||||
|        priv->previous_x = x; | ||||
|        priv->previous_y = y; | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 
 | ||||
							
								
								
									
										209
									
								
								0001-Remove-the-color-codes-map.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								0001-Remove-the-color-codes-map.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,209 @@ | ||||
| From c416784822821d7f69f77be6aa8814ab6f3c959f Mon Sep 17 00:00:00 2001 | ||||
| From: David Shea <dshea@redhat.com> | ||||
| Date: Mon, 2 Dec 2013 16:55:01 -0500 | ||||
| Subject: [PATCH 1/6] Remove the color codes map. | ||||
| 
 | ||||
| cc.png is used to map locations on a map (usually mouse clicks) to time zone | ||||
| offsets. However, in every case except one, the offset set by get_loc_for_xy() | ||||
| is immediately overwritten by set_location(). For the exception case | ||||
| (cc_timezone_map_get_timezone_at_coords), having the selected_offset property | ||||
| change during the call is an unexpected side effect. | ||||
| 
 | ||||
| Furthermore, the data in the color_codes array was not entirely in sync with | ||||
| the data in cc.png (e.g., no color_codes entry for UTC+14), and the borders | ||||
| between zones in cc.png are feathered instead of being zones of a single pixel | ||||
| value, so clicks around the borders would result in no zone being selected. If | ||||
| cc.png is ever revived, it needs to be regenerated from the SVG source. | ||||
| ---
 | ||||
|  src/Makefile.am       |   1 - | ||||
|  src/cc-timezone-map.c | 102 -------------------------------------------------- | ||||
|  src/data/cc.png       | Bin 53948 -> 0 bytes | ||||
|  3 files changed, 103 deletions(-) | ||||
|  delete mode 100644 src/data/cc.png | ||||
| 
 | ||||
| diff --git a/src/Makefile.am b/src/Makefile.am
 | ||||
| index 2eec6d7..fdf465c 100644
 | ||||
| --- a/src/Makefile.am
 | ||||
| +++ b/src/Makefile.am
 | ||||
| @@ -3,7 +3,6 @@ CLEANFILES =
 | ||||
|  uidir = $(pkgdatadir)/ui | ||||
|  dist_ui_DATA = \ | ||||
|  	data/bg.png \ | ||||
| -	data/cc.png \
 | ||||
|  	data/olsen_map.png \ | ||||
|  	data/pin.png \ | ||||
|  	data/timezone_0.png \ | ||||
| diff --git a/src/cc-timezone-map.c b/src/cc-timezone-map.c
 | ||||
| index 993f379..97d1221 100644
 | ||||
| --- a/src/cc-timezone-map.c
 | ||||
| +++ b/src/cc-timezone-map.c
 | ||||
| @@ -46,15 +46,10 @@ typedef struct
 | ||||
|  struct _CcTimezoneMapPrivate | ||||
|  { | ||||
|    GdkPixbuf *orig_background; | ||||
| -  GdkPixbuf *orig_color_map;
 | ||||
|   | ||||
|    GdkPixbuf *background; | ||||
| -  GdkPixbuf *color_map;
 | ||||
|    GdkPixbuf *olsen_map; | ||||
|   | ||||
| -  guchar *visible_map_pixels;
 | ||||
| -  gint visible_map_rowstride;
 | ||||
| -
 | ||||
|    gint olsen_map_channels; | ||||
|    guchar *olsen_map_pixels; | ||||
|    gint olsen_map_rowstride; | ||||
| @@ -86,50 +81,6 @@ enum {
 | ||||
|   | ||||
|  static guint signals[LAST_SIGNAL]; | ||||
|   | ||||
| -
 | ||||
| -static CcTimezoneMapOffset color_codes[] =
 | ||||
| -{
 | ||||
| -    {-11.0, 43, 0, 0, 255 },
 | ||||
| -    {-10.0, 85, 0, 0, 255 },
 | ||||
| -    {-9.5, 102, 255, 0, 255 },
 | ||||
| -    {-9.0, 128, 0, 0, 255 },
 | ||||
| -    {-8.0, 170, 0, 0, 255 },
 | ||||
| -    {-7.0, 212, 0, 0, 255 },
 | ||||
| -    {-6.0, 255, 0, 1, 255 }, // north
 | ||||
| -    {-6.0, 255, 0, 0, 255 }, // south
 | ||||
| -    {-5.0, 255, 42, 42, 255 },
 | ||||
| -    {-4.5, 192, 255, 0, 255 },
 | ||||
| -    {-4.0, 255, 85, 85, 255 },
 | ||||
| -    {-3.5, 0, 255, 0, 255 },
 | ||||
| -    {-3.0, 255, 128, 128, 255 },
 | ||||
| -    {-2.0, 255, 170, 170, 255 },
 | ||||
| -    {-1.0, 255, 213, 213, 255 },
 | ||||
| -    {0.0, 43, 17, 0, 255 },
 | ||||
| -    {1.0, 85, 34, 0, 255 },
 | ||||
| -    {2.0, 128, 51, 0, 255 },
 | ||||
| -    {3.0, 170, 68, 0, 255 },
 | ||||
| -    {3.5, 0, 255, 102, 255 },
 | ||||
| -    {4.0, 212, 85, 0, 255 },
 | ||||
| -    {4.5, 0, 204, 255, 255 },
 | ||||
| -    {5.0, 255, 102, 0, 255 },
 | ||||
| -    {5.5, 0, 102, 255, 255 },
 | ||||
| -    {5.75, 0, 238, 207, 247 },
 | ||||
| -    {6.0, 255, 127, 42, 255 },
 | ||||
| -    {6.5, 204, 0, 254, 254 },
 | ||||
| -    {7.0, 255, 153, 85, 255 },
 | ||||
| -    {8.0, 255, 179, 128, 255 },
 | ||||
| -    {9.0, 255, 204, 170, 255 },
 | ||||
| -    {9.5, 170, 0, 68, 250 },
 | ||||
| -    {10.0, 255, 230, 213, 255 },
 | ||||
| -    {10.5, 212, 124, 21, 250 },
 | ||||
| -    {11.0, 212, 170, 0, 255 },
 | ||||
| -    {11.5, 249, 25, 87, 253 },
 | ||||
| -    {12.0, 255, 204, 0, 255 },
 | ||||
| -    {12.75, 254, 74, 100, 248 },
 | ||||
| -    {13.0, 255, 85, 153, 250 },
 | ||||
| -    {-100, 0, 0, 0, 0 }
 | ||||
| -};
 | ||||
| -
 | ||||
|  static const gchar * olsen_map_timezones[] = { | ||||
|      "Africa/Abidjan", | ||||
|      "Africa/Accra", | ||||
| @@ -558,12 +509,6 @@ cc_timezone_map_dispose (GObject *object)
 | ||||
|        priv->orig_background = NULL; | ||||
|      } | ||||
|   | ||||
| -  if (priv->orig_color_map)
 | ||||
| -    {
 | ||||
| -      g_object_unref (priv->orig_color_map);
 | ||||
| -      priv->orig_color_map = NULL;
 | ||||
| -    }
 | ||||
| -
 | ||||
|    if (priv->olsen_map) | ||||
|      { | ||||
|        g_object_unref (priv->olsen_map); | ||||
| @@ -580,15 +525,6 @@ cc_timezone_map_dispose (GObject *object)
 | ||||
|        priv->background = NULL; | ||||
|      } | ||||
|   | ||||
| -  if (priv->color_map)
 | ||||
| -    {
 | ||||
| -      g_object_unref (priv->color_map);
 | ||||
| -      priv->color_map = NULL;
 | ||||
| -
 | ||||
| -      priv->visible_map_pixels = NULL;
 | ||||
| -      priv->visible_map_rowstride = 0;
 | ||||
| -    }
 | ||||
| -
 | ||||
|    if (priv->alias_db) | ||||
|      { | ||||
|        g_hash_table_destroy (priv->alias_db); | ||||
| @@ -671,17 +607,6 @@ cc_timezone_map_size_allocate (GtkWidget     *widget,
 | ||||
|                                                allocation->height, | ||||
|                                                GDK_INTERP_BILINEAR); | ||||
|   | ||||
| -  if (priv->color_map)
 | ||||
| -    g_object_unref (priv->color_map);
 | ||||
| -
 | ||||
| -  priv->color_map = gdk_pixbuf_scale_simple (priv->orig_color_map,
 | ||||
| -                                             allocation->width,
 | ||||
| -                                             allocation->height,
 | ||||
| -                                             GDK_INTERP_BILINEAR);
 | ||||
| -
 | ||||
| -  priv->visible_map_pixels = gdk_pixbuf_get_pixels (priv->color_map);
 | ||||
| -  priv->visible_map_rowstride = gdk_pixbuf_get_rowstride (priv->color_map);
 | ||||
| -
 | ||||
|    GTK_WIDGET_CLASS (cc_timezone_map_parent_class)->size_allocate (widget, | ||||
|                                                                    allocation); | ||||
|  } | ||||
| @@ -946,7 +871,6 @@ get_loc_for_xy (GtkWidget * widget, gint x, gint y)
 | ||||
|  { | ||||
|    CcTimezoneMapPrivate *priv = CC_TIMEZONE_MAP (widget)->priv; | ||||
|    guchar r, g, b, a; | ||||
| -  guchar *pixels;
 | ||||
|    gint rowstride; | ||||
|    gint i; | ||||
|   | ||||
| @@ -955,28 +879,11 @@ get_loc_for_xy (GtkWidget * widget, gint x, gint y)
 | ||||
|    GtkAllocation alloc; | ||||
|    CcTimezoneLocation* location; | ||||
|   | ||||
| -  rowstride = priv->visible_map_rowstride;
 | ||||
| -  pixels = priv->visible_map_pixels;
 | ||||
| -
 | ||||
| -  r = pixels[(rowstride * y + x * 4)];
 | ||||
| -  g = pixels[(rowstride * y + x * 4) + 1];
 | ||||
| -  b = pixels[(rowstride * y + x * 4) + 2];
 | ||||
| -  a = pixels[(rowstride * y + x * 4) + 3];
 | ||||
| -
 | ||||
| -
 | ||||
|    if ((x - priv->previous_x < 5 && x - priv->previous_x > -5) && | ||||
|        (y - priv->previous_y < 5 && y - priv->previous_y > -5)) { | ||||
|      x = priv->previous_x; | ||||
|      y = priv->previous_y; | ||||
|    } | ||||
| -  for (i = 0; color_codes[i].offset != -100; i++)
 | ||||
| -    {
 | ||||
| -       if (color_codes[i].red == r && color_codes[i].green == g
 | ||||
| -           && color_codes[i].blue == b && color_codes[i].alpha == a)
 | ||||
| -         {
 | ||||
| -           priv->selected_offset = color_codes[i].offset;
 | ||||
| -         }
 | ||||
| -    }
 | ||||
|   | ||||
|    gtk_widget_queue_draw (widget); | ||||
|   | ||||
| @@ -1106,15 +1013,6 @@ cc_timezone_map_init (CcTimezoneMap *self)
 | ||||
|        g_clear_error (&err); | ||||
|      } | ||||
|   | ||||
| -  priv->orig_color_map = gdk_pixbuf_new_from_file (DATADIR "/cc.png",
 | ||||
| -                                                   &err);
 | ||||
| -  if (!priv->orig_color_map)
 | ||||
| -    {
 | ||||
| -      g_warning ("Could not load background image: %s",
 | ||||
| -                 (err) ? err->message : "Unknown error");
 | ||||
| -      g_clear_error (&err);
 | ||||
| -    }
 | ||||
| -
 | ||||
|    priv->olsen_map = gdk_pixbuf_new_from_file (DATADIR "/olsen_map.png", | ||||
|                                                &err); | ||||
|    if (!priv->olsen_map) | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 
 | ||||
| @ -0,0 +1,56 @@ | ||||
| From ed19e892a5f1e22d3141f81c1da04f9f91719643 Mon Sep 17 00:00:00 2001 | ||||
| From: David Shea <dshea@redhat.com> | ||||
| 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 | ||||
| 
 | ||||
							
								
								
									
										48083
									
								
								0005-Import-the-latest-data-from-geonames.org.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48083
									
								
								0005-Import-the-latest-data-from-geonames.org.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										28
									
								
								0006-Removed-timezone_-5.5.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								0006-Removed-timezone_-5.5.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| From dae825d29bfaaad2226aa4ad4b122ef2f28fcf59 Mon Sep 17 00:00:00 2001 | ||||
| From: David Shea <dshea@redhat.com> | ||||
| Date: Tue, 3 Dec 2013 15:21:35 -0500 | ||||
| Subject: [PATCH 6/6] Removed timezone_-5.5. | ||||
| 
 | ||||
| There is no UTC-5:30 zone, and the file itself is a misnamed copy of | ||||
| timezone_-9.5.png. | ||||
| ---
 | ||||
|  src/Makefile.am            |   1 - | ||||
|  src/data/timezone_-5.5.png | Bin 437 -> 0 bytes | ||||
|  2 files changed, 1 deletion(-) | ||||
|  delete mode 100644 src/data/timezone_-5.5.png | ||||
| 
 | ||||
| diff --git a/src/Makefile.am b/src/Makefile.am
 | ||||
| index fdf465c..df23a83 100644
 | ||||
| --- a/src/Makefile.am
 | ||||
| +++ b/src/Makefile.am
 | ||||
| @@ -29,7 +29,6 @@ dist_ui_DATA = \
 | ||||
|  	data/timezone_4.5.png \ | ||||
|  	data/timezone_-5.png \ | ||||
|  	data/timezone_5.png \ | ||||
| -	data/timezone_-5.5.png \
 | ||||
|  	data/timezone_5.5.png \ | ||||
|  	data/timezone_5.75.png \ | ||||
|  	data/timezone_-6.png \ | ||||
| -- 
 | ||||
| 2.1.0 | ||||
| 
 | ||||
| @ -1,14 +1,27 @@ | ||||
| Name:           libtimezonemap | ||||
| Version:        0.4.2 | ||||
| Release:        5%{?dist} | ||||
| Release:        6%{?dist} | ||||
| Summary:        Time zone map widget for Gtk+ | ||||
| 
 | ||||
| Group:          System Environment/Libraries | ||||
| License:        GPLv3 | ||||
| URL:            https://launchpad.net/timezonemap | ||||
| Source0:        http://archive.ubuntu.com/ubuntu/pool/main/libt/libtimezonemap/%{name}_%{version}.tar.gz | ||||
| # The binary portion of lp:~dshea/timezonemap/pixmaps-update | ||||
| Source1:        timezone_pngs.tar.gz | ||||
| 
 | ||||
| # From lp:~dshea/timezonemap/glade-catalog | ||||
| Patch1:         0001-Added-a-glade-catalog-file.patch | ||||
| 
 | ||||
| # From lp:~dshea/timezonemap/pixmaps-update | ||||
| Patch2:         0001-Remove-the-color-codes-map.patch | ||||
| Patch3:         0005-Import-the-latest-data-from-geonames.org.patch | ||||
| Patch4:         0006-Removed-timezone_-5.5.patch | ||||
| 
 | ||||
| # From lp:~dshea/timezonemap/location-cycle | ||||
| Patch5:         0001-Fix-a-memory-leak-and-potential-crash-with-the-locat.patch | ||||
| Patch6:         0002-Cycle-through-a-smaller-list-of-map-locations-on-rep.patch | ||||
| 
 | ||||
| BuildRequires:  glib2-devel >= 2.26 | ||||
| BuildRequires:  gtk3-devel >= 3.1.4 | ||||
| BuildRequires:  json-glib-devel | ||||
| @ -34,7 +47,11 @@ files used for building applications that use %{name}. | ||||
| 
 | ||||
| %prep | ||||
| %setup -q | ||||
| %setup -a 1 | ||||
| %patch1 -p1 | ||||
| %patch2 -p1 | ||||
| %patch3 -p1 | ||||
| %patch4 -p1 | ||||
| 
 | ||||
| %build | ||||
| ./autogen.sh | ||||
| @ -64,6 +81,12 @@ rm -f %{buildroot}%{_libdir}/*.la | ||||
| %{_datadir}/glade/catalogs/TimezoneMap.xml | ||||
| 
 | ||||
| %changelog | ||||
| * Fri May  1 2015 David Shea <dshea@redhat.com> - 0.4.2-6 | ||||
| - Updated the time zone map images | ||||
| - Updated the city data from geonames.org | ||||
| - Fix a memory leak and potential crash with the locations list | ||||
| - Cycle through a smaller list of map locations on repeated clicks | ||||
| 
 | ||||
| * Wed Jan 28 2015 David Shea <dshea@redhat.com> - 0.4.2-5 | ||||
| - Use %license for the license file | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user