[Git][debian-gis-team/osm-gps-map][upstream] New upstream version 1.2.1

Bas Couwenberg (@sebastic) gitlab at salsa.debian.org
Sat Aug 15 09:04:17 BST 2026



Bas Couwenberg pushed to branch upstream at Debian GIS Project / osm-gps-map


Commits:
82fe2b3a by Bas Couwenberg at 2026-08-15T09:47:51+02:00
New upstream version 1.2.1
- - - - -


21 changed files:

- .github/workflows/ci.yml
- + .github/workflows/pages.yml
- − .travis.yml
- Makefile.am
- NEWS
- catalog.xml
- configure.ac
- docs/reference/Makefile.am
- examples/Makefile.am
- examples/mapviewer.py
- osmgpsmap-1.0.pc.in
- src/Makefile.am
- src/osm-gps-map-image.c
- src/osm-gps-map-osd.c
- src/osm-gps-map-polygon.c
- src/osm-gps-map-source.c
- src/osm-gps-map-source.h
- src/osm-gps-map-track.c
- src/osm-gps-map-track.h
- src/osm-gps-map-widget.c
- + tests/test.py


Changes:

=====================================
.github/workflows/ci.yml
=====================================
@@ -1,20 +1,21 @@
-name: C/C++ CI
+name: CI
 
 on:
   push:
-    branches: [ master ]
+    branches: [master]
   pull_request:
-    branches: [ master ]
+    branches: [master]
 
 jobs:
   build:
-
     runs-on: ubuntu-latest
-
     steps:
-      - name: install dependencies
+      - uses: actions/checkout at v5
+
+      - name: Install dependencies
         run: |
-          sudo apt-get -y install \
+          sudo apt-get update
+          sudo apt-get install -y \
             build-essential \
             autoconf \
             autoconf-archive \
@@ -23,14 +24,26 @@ jobs:
             gtk-doc-tools \
             libglib2.0-dev \
             libgtk-3-dev \
-            libsoup2.4-dev \
-            libgirepository1.0-dev
-      - uses: actions/checkout at v2
-      - name: autogen
-        run: ./autogen.sh
-      - name: make
-        run: make
+            libsoup-3.0-dev \
+            libgirepository1.0-dev \
+            python3-gi \
+            python3-cairo \
+            gir1.2-gtk-3.0 \
+            gir1.2-gdkpixbuf-2.0 \
+            xvfb
+
+      - name: Build
+        run: |
+          ./autogen.sh --prefix=/usr
+          make -j"$(nproc)"
+
       - name: make check
         run: make check
+
       - name: make distcheck
         run: make distcheck
+
+      - name: Install and run Python tests
+        run: |
+          sudo make install
+          xvfb-run --auto-servernum python3 -m unittest discover -v tests/


=====================================
.github/workflows/pages.yml
=====================================
@@ -0,0 +1,61 @@
+name: Pages
+
+# Deploy gtk-doc HTML to the gh-pages branch on every published release
+# (RC or final). Landing page + screenshots on gh-pages are preserved.
+on:
+  release:
+    types: [published]
+
+permissions:
+  contents: write
+
+jobs:
+  docs:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout release
+        uses: actions/checkout at v5
+
+      - name: Checkout gh-pages
+        uses: actions/checkout at v5
+        with:
+          ref: gh-pages
+          path: _gh-pages
+
+      - name: Install dependencies
+        run: |
+          sudo apt-get update
+          sudo apt-get install -y \
+            build-essential \
+            autoconf \
+            autoconf-archive \
+            automake \
+            libtool \
+            gtk-doc-tools \
+            libglib2.0-dev \
+            libgtk-3-dev \
+            libsoup-3.0-dev \
+            libgirepository1.0-dev
+
+      - name: Build documentation
+        run: |
+          ./autogen.sh --prefix=/usr --enable-gtk-doc
+          make -j"$(nproc)"
+
+      - name: Update API docs on gh-pages
+        run: |
+          set -e
+          test -d docs/reference/html
+          rm -rf _gh-pages/docs/reference/html
+          mkdir -p _gh-pages/docs/reference
+          cp -a docs/reference/html _gh-pages/docs/reference/
+          cd _gh-pages
+          git config user.name "github-actions[bot]"
+          git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
+          git add -A docs/reference/html
+          if git diff --staged --quiet; then
+            echo "No docs changes"
+            exit 0
+          fi
+          git commit -m "docs: API reference for ${{ github.event.release.tag_name }}"
+          git push origin HEAD:gh-pages


=====================================
.travis.yml deleted
=====================================
@@ -1,10 +0,0 @@
-language: c
-sudo: required
-dist: trusty
-before_install:
-- sudo apt-get -qq update
-- sudo apt-get -qq install gtk-doc-tools libglib2.0-dev libgtk-3-dev libsoup2.4-dev libgirepository1.0-dev
-before_script:
-- ./autogen.sh --enable-gtk-doc
-script:
-- make


=====================================
Makefile.am
=====================================
@@ -16,29 +16,30 @@ doc_DATA =                                      \
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = osmgpsmap-1.0.pc
 
+# Unit tests ship in the tarball (CI/git also run them in-tree).
+EXTRA_DIST = tests/test.py
+
 DISTCLEANFILES = gtk-doc.make
 
-# ChangeLog generation from nautils
+# Drop generated ChangeLog on VPATH distclean only.
 distclean-local:
 	if test "$(srcdir)" = "."; then :; else \
 		rm -f ChangeLog; \
 	fi
 
+# Build ChangeLog from full git history for dist. NEWS is the curated release notes.
 ChangeLog:
-	$(AM_V_GEN)if test -d "$(srcdir)/.git"; then \
-	  (GIT_DIR=$(top_srcdir)/.git ./missing --run git log 0.7.3.. --stat -M -C --name-status  --date=short --no-color) | fmt --split-only > $@.tmp \
+	$(AM_V_GEN)if test -d "$(top_srcdir)/.git"; then \
+	  (cd "$(top_srcdir)" && git log --stat -M -C --name-status --date=short --no-color) > $@.tmp \
 	  && mv -f $@.tmp $@ \
 	  || ($(RM) $@.tmp; \
-	      echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \
-	      (test -f $@ || echo git-log is required to generate this file >> $@)); \
+	      echo "Failed to generate ChangeLog, your ChangeLog may be outdated" >&2; \
+	      (test -f $@ || echo "git-log is required to generate this file" >> $@)); \
 	else \
 	  test -f $@ || \
-	  (echo A git checkout and git-log is required to generate ChangeLog >&2 && \
-	  echo A git checkout and git-log is required to generate this file >> $@); \
+	  (echo "A git checkout and git-log is required to generate ChangeLog" >&2 && \
+	   echo "A git checkout and git-log is required to generate this file" >> $@); \
 	fi
 
-release: dist
-	scp @PACKAGE at -@VERSION at .tar.gz root at greenbirdsystems.com:/var/www/johnstowers.co.nz/files/osm-gps-map/
-
 .PHONY: ChangeLog
 


=====================================
NEWS
=====================================
@@ -1,3 +1,19 @@
+Changes in 1.2.1
+  * Replace deprecated G_TYPE_INSTANCE_GET_PRIVATE and g_type_class_add_private (Patrick Salecker)
+  * Add python unit tests (Patrick Salecker)
+  * Fix python example addressing requiring map source (Jochen Sprickerhof)
+  * Fix setting custom map source (Patrick Salecker)
+  * Update catalog files (Davide Gessa)
+  * Make libsoup minimum version 2.42 (Hubert Kowalski)
+  * Manage segments across date change line (Paolo Benve)
+  * Remove unnecessary warning about 2nd setup (Tormod Volden)
+  * Add OpenTopoMap map source (Philipe Weyland)
+  * Port to libsoup-3 (Sébastien Noel)
+  * Fix pkg-config file (Sébastien Noel)
+  * Move libsoup-3.0 to Requires.private in pkg-config (Grimmauld)
+  * Make add_point a GObject Introspection method (loqs)
+  * Close PixbufLoader before get_pixbuf in unit tests; fixes Glycin test failure (loqs)
+
 Changes in 1.2.0
 ======================
   * Change max allowed zoom for various maps (Rolf Eike Beer, Philipe Weyland)


=====================================
catalog.xml
=====================================
@@ -13,4 +13,4 @@
     <glade-widget-group name="osmgpsmap" title="OsmGpsMap Widgets">
         <glade-widget-class-ref name="OsmGpsMap" />
     </glade-widget-group>
-</glade-catalog>
\ No newline at end of file
+</glade-catalog>


=====================================
configure.ac
=====================================
@@ -1,6 +1,6 @@
 AC_PREREQ([2.63])
 AC_INIT([osm-gps-map],
-        [1.2.0],
+        [1.2.1],
         [http://github.com/nzjrs/osm-gps-map/issues],
         [osm-gps-map])
 
@@ -25,7 +25,7 @@ AM_SILENT_RULES([yes])
 PKG_CHECK_MODULES(GLIB,     [glib-2.0 >= 2.16])
 PKG_CHECK_MODULES(GTK,      [gtk+-3.0 >= 3.0])
 PKG_CHECK_MODULES(CAIRO,    [cairo >= 1.8])
-PKG_CHECK_MODULES(SOUP24,   [libsoup-2.4])
+PKG_CHECK_MODULES(SOUP30,   [libsoup-3.0])
 
 # The mapviewer demo also calls g_thread_init, so it needs to link against
 # libgthread-2.0.
@@ -52,7 +52,7 @@ AM_CONDITIONAL(OS_WIN32, [test $os_win32 = yes])
 # - If binary compatibility has been broken (eg removed or changed interfaces)
 #   change to C+1:0:0
 # - If the interface is the same as the previous version, change to C:R+1:A
-LT_VERSION_INFO=2:0:1
+LT_VERSION_INFO=2:1:1
 AC_SUBST(LT_VERSION_INFO)
 
 GOBJECT_INTROSPECTION_REQS=0.10.0


=====================================
docs/reference/Makefile.am
=====================================
@@ -71,12 +71,12 @@ AM_CFLAGS=-I$(top_srcdir) -I$(top_builddir) \
 	$(GLIB_CFLAGS) \
 	$(GTK_CFLAGS) \
 	$(CAIRO_CFLAGS) \
-	$(SOUP24_CFLAGS)
+	$(SOUP30_CFLAGS)
 GTKDOC_LIBS=$(top_builddir)/src/libosmgpsmap-1.0.la \
 	$(GLIB_LIBS) \
 	$(GTK_LIBS) \
 	$(CAIRO_LIBS) \
-	$(SOUP24_LIBS)
+	$(SOUP30_LIBS)
 
 # This includes the standard gtk-doc make rules, copied by gtkdocize.
 include $(top_srcdir)/gtk-doc.make


=====================================
examples/Makefile.am
=====================================
@@ -4,13 +4,13 @@ OSMGPSMAP_CFLAGS =          \
     $(GLIB_CFLAGS)          \
     $(GTK_CFLAGS)           \
     $(CAIRO_CFLAGS)         \
-    $(SOUP24_CFLAGS)
+    $(SOUP30_CFLAGS)
 
 OSMGPSMAP_LIBS =            \
     $(GLIB_LIBS)            \
     $(GTK_LIBS)             \
     $(CAIRO_LIBS)           \
-    $(SOUP24_LIBS)
+    $(SOUP30_LIBS)
 
 ## Demo Application
 noinst_PROGRAMS = mapviewer polygon editable_track


=====================================
examples/mapviewer.py
=====================================
@@ -35,6 +35,7 @@ from gi.repository import (
 
 print(f"using library: {osmgpsmap.__file__} (version {osmgpsmap._version})")
 
+assert osmgpsmap._version == "1.0"
 
 class DummyMapNoGpsPoint(osmgpsmap.Map):
     def do_draw_gps_point(self, drawable):
@@ -84,6 +85,7 @@ class UI(Gtk.Window):
                              show_zoom=True,
                              show_crosshair=True)
         )
+        self.osm.set_property("map-source", osmgpsmap.MapSource_t.OPENSTREETMAP)
         self.osm.layer_add(DummyLayer())
 
         self.last_image = None
@@ -217,7 +219,6 @@ from in the box below. Special metacharacters may be included in this url
                 self.osm = osmgpsmap.Map()
 
             self.vbox.pack_start(self.osm, True, True, 0)
-            self.osm.connect("button_release_event", self.map_clicked)
             self.osm.show()
 
     def print_tiles(self):


=====================================
osmgpsmap-1.0.pc.in
=====================================
@@ -6,6 +6,7 @@ includedir=@includedir@
 Name: @PACKAGE_NAME@
 Description: Moving map widget using openstreet map data
 Version: @PACKAGE_VERSION@
-Requires: gtk+-3.0 libsoup-2.4
+Requires: gtk+-3.0
+Requires.private: libsoup-3.0
 Libs: -L${libdir} -losmgpsmap-1.0
 Cflags: -I${includedir}/osmgpsmap-1.0


=====================================
src/Makefile.am
=====================================
@@ -5,13 +5,13 @@ OSMGPSMAP_CFLAGS =          \
 	$(GLIB_CFLAGS)          \
 	$(GTK_CFLAGS)           \
 	$(CAIRO_CFLAGS)         \
-    $(SOUP24_CFLAGS)
+    $(SOUP30_CFLAGS)
 
 OSMGPSMAP_LIBS =            \
     $(GLIB_LIBS)            \
     $(GTK_LIBS)             \
     $(CAIRO_LIBS)           \
-    $(SOUP24_LIBS)
+    $(SOUP30_LIBS)
 
 ## Shared library
 libosmgpsmap_1_0_la_CFLAGS =    \


=====================================
src/osm-gps-map-image.c
=====================================
@@ -34,8 +34,6 @@
 #include "osm-gps-map-track.h"
 #include "osm-gps-map-image.h"
 
-G_DEFINE_TYPE (OsmGpsMapImage, osm_gps_map_image, G_TYPE_OBJECT)
-
 enum
 {
     PROP_0,
@@ -59,6 +57,8 @@ struct _OsmGpsMapImagePrivate
     float           rotation;
 };
 
+G_DEFINE_TYPE_WITH_PRIVATE (OsmGpsMapImage, osm_gps_map_image, G_TYPE_OBJECT)
+
 static void
 osm_gps_map_image_get_property (GObject    *object,
                                 guint       property_id,
@@ -149,8 +149,6 @@ osm_gps_map_image_class_init (OsmGpsMapImageClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-    g_type_class_add_private (klass, sizeof (OsmGpsMapImagePrivate));
-
     object_class->get_property = osm_gps_map_image_get_property;
     object_class->set_property = osm_gps_map_image_set_property;
     object_class->dispose = osm_gps_map_image_dispose;
@@ -216,7 +214,7 @@ osm_gps_map_image_class_init (OsmGpsMapImageClass *klass)
 static void
 osm_gps_map_image_init (OsmGpsMapImage *self)
 {
-    self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self), OSM_TYPE_GPS_MAP_IMAGE, OsmGpsMapImagePrivate);
+    self->priv = osm_gps_map_image_get_instance_private (self);
 }
 
 OsmGpsMapImage *


=====================================
src/osm-gps-map-osd.c
=====================================
@@ -29,10 +29,6 @@
 
 static void osm_gps_map_osd_interface_init (OsmGpsMapLayerIface *iface);
 
-G_DEFINE_TYPE_WITH_CODE (OsmGpsMapOsd, osm_gps_map_osd, G_TYPE_OBJECT,
-         G_IMPLEMENT_INTERFACE (OSM_TYPE_GPS_MAP_LAYER,
-                                osm_gps_map_osd_interface_init));
-
 enum
 {
 	PROP_0,
@@ -104,6 +100,11 @@ struct _OsmGpsMapOsdPrivate
 	gboolean            show_copyright;
 };
 
+G_DEFINE_TYPE_WITH_CODE (OsmGpsMapOsd, osm_gps_map_osd, G_TYPE_OBJECT,
+         G_ADD_PRIVATE(OsmGpsMapOsd)
+         G_IMPLEMENT_INTERFACE (OSM_TYPE_GPS_MAP_LAYER,
+                                osm_gps_map_osd_interface_init));
+
 static void                 osm_gps_map_osd_render       (OsmGpsMapLayer *osd, OsmGpsMap *map);
 static void                 osm_gps_map_osd_draw         (OsmGpsMapLayer *osd, OsmGpsMap *map, cairo_t *cr);
 static gboolean             osm_gps_map_osd_busy         (OsmGpsMapLayer *osd);
@@ -322,8 +323,6 @@ osm_gps_map_osd_class_init (OsmGpsMapOsdClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-	g_type_class_add_private (klass, sizeof (OsmGpsMapOsdPrivate));
-
 	object_class->get_property = osm_gps_map_osd_get_property;
 	object_class->set_property = osm_gps_map_osd_set_property;
 	object_class->constructor = osm_gps_map_osd_constructor;
@@ -473,9 +472,7 @@ osm_gps_map_osd_class_init (OsmGpsMapOsdClass *klass)
 static void
 osm_gps_map_osd_init (OsmGpsMapOsd *self)
 {
-	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
-	                                          OSM_TYPE_GPS_MAP_OSD,
-	                                          OsmGpsMapOsdPrivate);
+	self->priv = osm_gps_map_osd_get_instance_private (self);
 }
 
 static void


=====================================
src/osm-gps-map-polygon.c
=====================================
@@ -21,8 +21,6 @@
 #include "converter.h"
 #include "osm-gps-map-polygon.h"
 
-G_DEFINE_TYPE (OsmGpsMapPolygon, osm_gps_map_polygon, G_TYPE_OBJECT)
-
 enum
 {
     PROP_0,
@@ -44,6 +42,8 @@ struct _OsmGpsMapPolygonPrivate
     gboolean breakable;
 };
 
+G_DEFINE_TYPE_WITH_PRIVATE (OsmGpsMapPolygon, osm_gps_map_polygon, G_TYPE_OBJECT)
+
 #define DEFAULT_R   (60000)
 #define DEFAULT_G   (0)
 #define DEFAULT_B   (0)
@@ -136,8 +136,6 @@ osm_gps_map_polygon_class_init (OsmGpsMapPolygonClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-    g_type_class_add_private (klass, sizeof (OsmGpsMapPolygonPrivate));
-
     object_class->get_property = osm_gps_map_polygon_get_property;
     object_class->set_property = osm_gps_map_polygon_set_property;
     object_class->dispose = osm_gps_map_polygon_dispose;
@@ -198,7 +196,7 @@ osm_gps_map_polygon_class_init (OsmGpsMapPolygonClass *klass)
 static void
 osm_gps_map_polygon_init (OsmGpsMapPolygon *self)
 {
-    self->priv = G_TYPE_INSTANCE_GET_PRIVATE((self), OSM_TYPE_GPS_MAP_POLYGON, OsmGpsMapPolygonPrivate);
+    self->priv = osm_gps_map_polygon_get_instance_private(self);
 	self->priv->track = osm_gps_map_track_new();
 }
 


=====================================
src/osm-gps-map-source.c
=====================================
@@ -35,6 +35,8 @@ osm_gps_map_source_get_friendly_name(OsmGpsMapSource_t source)
             return "OpenAerialMap";
         case OSM_GPS_MAP_SOURCE_OPENCYCLEMAP:
             return "OpenCycleMap";
+        case OSM_GPS_MAP_SOURCE_OPENTOPOMAP: 
+            return "OpenTopoMap";
         case OSM_GPS_MAP_SOURCE_OSM_PUBLIC_TRANSPORT:
             return "Public Transport";
         case OSM_GPS_MAP_SOURCE_OSMC_TRAILS:
@@ -75,6 +77,8 @@ osm_gps_map_source_get_copyright(OsmGpsMapSource_t source)
             return "Maps © ÖPNVKarte, Data © OpenStreetMap contributors";
         case OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE:
             return "Maps © Maps-For-Free";
+        case OSM_GPS_MAP_SOURCE_OPENTOPOMAP:
+            return "© OpenTopoMap (CC-BY-SA)";
         case OSM_GPS_MAP_SOURCE_GOOGLE_STREET:
             return "Map provided by Google";
         case OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE:
@@ -124,6 +128,8 @@ osm_gps_map_source_get_repo_uri(OsmGpsMapSource_t source)
             return NULL;
         case OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE:
             return "https://maps-for-free.com/layer/relief/z#Z/row#Y/#Z_#X-#Y.jpg";
+        case OSM_GPS_MAP_SOURCE_OPENTOPOMAP:
+            return "https://a.tile.opentopomap.org/#Z/#X/#Y.png";
         case OSM_GPS_MAP_SOURCE_GOOGLE_STREET:
             return "http://mt#R.google.com/vt/lyrs=m&hl=en&x=#X&s=&y=#Y&z=#Z";
         case OSM_GPS_MAP_SOURCE_GOOGLE_HYBRID:
@@ -153,6 +159,7 @@ osm_gps_map_source_get_image_format(OsmGpsMapSource_t source)
         case OSM_GPS_MAP_SOURCE_OPENCYCLEMAP:
         case OSM_GPS_MAP_SOURCE_OSM_PUBLIC_TRANSPORT:
         case OSM_GPS_MAP_SOURCE_OSMC_TRAILS:
+        case OSM_GPS_MAP_SOURCE_OPENTOPOMAP:
             return "png";
         case OSM_GPS_MAP_SOURCE_OPENAERIALMAP:
         case OSM_GPS_MAP_SOURCE_GOOGLE_STREET:
@@ -191,6 +198,7 @@ osm_gps_map_source_get_max_zoom(OsmGpsMapSource_t source)
             return OSM_MAX_ZOOM;
         case OSM_GPS_MAP_SOURCE_OPENSTREETMAP_RENDERER:
         case OSM_GPS_MAP_SOURCE_OPENAERIALMAP:
+        case OSM_GPS_MAP_SOURCE_OPENTOPOMAP:
             return 17;
         case OSM_GPS_MAP_SOURCE_GOOGLE_STREET:
         case OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE:


=====================================
src/osm-gps-map-source.h
=====================================
@@ -31,6 +31,7 @@ typedef enum {
     OSM_GPS_MAP_SOURCE_OPENAERIALMAP,
     OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE,
     OSM_GPS_MAP_SOURCE_OPENCYCLEMAP,
+    OSM_GPS_MAP_SOURCE_OPENTOPOMAP,
     OSM_GPS_MAP_SOURCE_OSM_PUBLIC_TRANSPORT,
     OSM_GPS_MAP_SOURCE_GOOGLE_STREET,
     OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE,


=====================================
src/osm-gps-map-track.c
=====================================
@@ -34,8 +34,6 @@
 #include "converter.h"
 #include "osm-gps-map-track.h"
 
-G_DEFINE_TYPE (OsmGpsMapTrack, osm_gps_map_track, G_TYPE_OBJECT)
-
 enum
 {
     PROP_0,
@@ -68,6 +66,8 @@ struct _OsmGpsMapTrackPrivate
     gboolean editable;
 };
 
+G_DEFINE_TYPE_WITH_PRIVATE(OsmGpsMapTrack, osm_gps_map_track, G_TYPE_OBJECT)
+
 #define DEFAULT_R   (0.6)
 #define DEFAULT_G   (0)
 #define DEFAULT_B   (0)
@@ -168,8 +168,6 @@ osm_gps_map_track_class_init (OsmGpsMapTrackClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-    g_type_class_add_private (klass, sizeof (OsmGpsMapTrackPrivate));
-
     object_class->get_property = osm_gps_map_track_get_property;
     object_class->set_property = osm_gps_map_track_set_property;
     object_class->dispose = osm_gps_map_track_dispose;
@@ -282,7 +280,7 @@ osm_gps_map_track_class_init (OsmGpsMapTrackClass *klass)
 static void
 osm_gps_map_track_init (OsmGpsMapTrack *self)
 {
-    self->priv = G_TYPE_INSTANCE_GET_PRIVATE((self), OSM_TYPE_GPS_MAP_TRACK, OsmGpsMapTrackPrivate);
+    self->priv = osm_gps_map_track_get_instance_private(self);
 
     self->priv->color.red = DEFAULT_R;
     self->priv->color.green = DEFAULT_G;


=====================================
src/osm-gps-map-track.h
=====================================
@@ -72,7 +72,7 @@ GType osm_gps_map_track_get_type (void) G_GNUC_CONST;
 OsmGpsMapTrack *    osm_gps_map_track_new           (void);
 /**
  * osm_gps_map_track_add_point:
- * @track: (inout): a #OsmGpsMapTrack
+ * @track: (in): a #OsmGpsMapTrack
  * @point: (in): a #OsmGpsMapPoint point to add
  *
  * Add a point to track


=====================================
src/osm-gps-map-widget.c
=====================================
@@ -150,15 +150,6 @@
 #define MAX_DOWNLOAD_TILES          10000
 #define DOT_RADIUS                  4.0
 
-#ifndef SOUP_CHECK_VERSION
-// SOUP_CHECK_VERSION was introduced only in 2.42
-#define SOUP_CHECK_VERSION(x, y, z) false
-#endif
-
-#if !SOUP_CHECK_VERSION(2, 42, 0)
-#define SOUP_OLD_SESSION
-#endif
-
 struct _OsmGpsMapPrivate
 {
     GHashTable *tile_queue;
@@ -317,14 +308,14 @@ enum
     PROP_SHOW_GPS_POINT
 };
 
-G_DEFINE_TYPE (OsmGpsMap, osm_gps_map, GTK_TYPE_DRAWING_AREA);
+G_DEFINE_TYPE_WITH_PRIVATE (OsmGpsMap, osm_gps_map, GTK_TYPE_DRAWING_AREA);
 
 /*
  * Drawing function forward defintions
  */
 static gchar    *replace_string(const gchar *src, const gchar *from, const gchar *to);
 static gchar    *replace_map_uri(OsmGpsMap *map, const gchar *uri, int zoom, int x, int y);
-static void     osm_gps_map_tile_download_complete (SoupSession *session, SoupMessage *msg, gpointer user_data);
+static void     osm_gps_map_tile_download_complete (SoupSession *session, GAsyncResult *result, gpointer user_data);
 static void     osm_gps_map_download_tile (OsmGpsMap *map, int zoom, int x, int y, gboolean redraw);
 static GdkPixbuf* osm_gps_map_render_tile_upscaled (OsmGpsMap *map, GdkPixbuf *tile, int tile_zoom, int zoom, int x, int y);
 
@@ -740,12 +731,10 @@ osm_gps_map_blit_tile(OsmGpsMap *map, GdkPixbuf *pixbuf, cairo_t *cr, int offset
     }
 }
 
-#define MSG_RESPONSE_BODY(a)    ((a)->response_body->data)
-#define MSG_RESPONSE_LEN(a)     ((a)->response_body->length)
 #define MSG_RESPONSE_LEN_FORMAT "%"G_GOFFSET_FORMAT
 
 static void
-osm_gps_map_tile_download_complete (SoupSession *session, SoupMessage *msg, gpointer user_data)
+osm_gps_map_tile_download_complete (SoupSession *session, GAsyncResult *result, gpointer user_data)
 {
     FILE *file;
     OsmTileDownload *dl = (OsmTileDownload *)user_data;
@@ -753,15 +742,23 @@ osm_gps_map_tile_download_complete (SoupSession *session, SoupMessage *msg, gpoi
     OsmGpsMapPrivate *priv = map->priv;
     gboolean file_saved = FALSE;
 
-    if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
+    GError *error = NULL;
+    SoupMessage *msg = soup_session_get_async_result_message(session, result);
+    SoupStatus soup_status = soup_message_get_status(msg);
+    GBytes *body = soup_session_send_and_read_finish (session, result, &error);
+
+    GCancellable *cancellable = (GCancellable *)g_hash_table_lookup(priv->tile_queue, dl->uri);
+    g_object_unref (cancellable);
+
+    if (SOUP_STATUS_IS_SUCCESSFUL (soup_status)) {
         /* save tile into cachedir if one has been specified */
         if (priv->cache_dir) {
             if (g_mkdir_with_parents(dl->folder,0700) == 0) {
                 file = g_fopen(dl->filename, "wb");
                 if (file != NULL) {
-                    fwrite (MSG_RESPONSE_BODY(msg), 1, MSG_RESPONSE_LEN(msg), file);
+                    fwrite (g_bytes_get_data(body, NULL), 1, g_bytes_get_size(body), file);
                     file_saved = TRUE;
-                    g_debug("Wrote "MSG_RESPONSE_LEN_FORMAT" bytes to %s", MSG_RESPONSE_LEN(msg), dl->filename);
+                    g_debug("Wrote "MSG_RESPONSE_LEN_FORMAT" bytes to %s", g_bytes_get_size(body), dl->filename);
                     fclose (file);
 
                 }
@@ -786,7 +783,7 @@ osm_gps_map_tile_download_complete (SoupSession *session, SoupMessage *msg, gpoi
                 /* parse file directly from memory */
                 if (extension) {
                     loader = gdk_pixbuf_loader_new_with_type (extension+1, NULL);
-                    if (!gdk_pixbuf_loader_write (loader, (unsigned char*)MSG_RESPONSE_BODY(msg), MSG_RESPONSE_LEN(msg), NULL))
+                    if (!gdk_pixbuf_loader_write (loader, (unsigned char*)g_bytes_get_data(body, NULL), g_bytes_get_size(body), NULL))
                     {
                         g_warning("Error: Decoding of image failed");
                     }
@@ -824,21 +821,21 @@ osm_gps_map_tile_download_complete (SoupSession *session, SoupMessage *msg, gpoi
         g_free(dl->filename);
         g_free(dl);
     } else {
-        if ((msg->status_code == SOUP_STATUS_NOT_FOUND) || (msg->status_code == SOUP_STATUS_FORBIDDEN)) {
+        if ((soup_status == SOUP_STATUS_NOT_FOUND) || (soup_status == SOUP_STATUS_FORBIDDEN)) {
             g_hash_table_insert(priv->missing_tiles, dl->uri, NULL);
             g_hash_table_remove(priv->tile_queue, dl->uri);
             g_object_notify(G_OBJECT(map), "tiles-queued");
-        } else if (msg->status_code == SOUP_STATUS_CANCELLED) {
+        } else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
             /* called as application exit or after osm_gps_map_download_cancel_all */
             g_hash_table_remove(priv->tile_queue, dl->uri);
             g_object_notify(G_OBJECT(map), "tiles-queued");
         } else {
-            g_warning("Error downloading tile: %d - %s", msg->status_code, msg->reason_phrase);
-            dl->ttl--;
-            if (dl->ttl) {
-                soup_session_requeue_message(session, msg);
-                return;
-            }
+            g_warning("Error downloading tile: %d - %s", soup_status, soup_status_get_phrase(soup_status));
+            //dl->ttl--;
+            //if (dl->ttl) {
+            //    soup_session_requeue_message(session, msg);
+            //    return;
+            //}
 
             g_hash_table_remove(priv->tile_queue, dl->uri);
             g_object_notify(G_OBJECT(map), "tiles-queued");
@@ -888,21 +885,26 @@ osm_gps_map_download_tile (OsmGpsMap *map, int zoom, int x, int y, gboolean redr
             if (priv->is_google) {
                 //Set maps.google.com as the referrer
                 g_debug("Setting Google Referrer");
-                soup_message_headers_append(msg->request_headers, "Referer", "http://maps.google.com/");
+                soup_message_headers_append(soup_message_get_request_headers(msg), "Referer", "http://maps.google.com/");
                 //For google satelite also set the appropriate cookie value
                 if (priv->uri_format & URI_HAS_Q) {
                     const char *cookie = g_getenv("GOOGLE_COOKIE");
                     if (cookie) {
                         g_debug("Adding Google Cookie");
-                        soup_message_headers_append(msg->request_headers, "Cookie", cookie);
+                        soup_message_headers_append(soup_message_get_request_headers(msg), "Cookie", cookie);
                     }
                 }
             }
 
-            g_hash_table_insert (priv->tile_queue, dl->uri, msg);
+            GCancellable *cancellable = g_cancellable_new ();
+            g_hash_table_insert (priv->tile_queue, dl->uri, cancellable);
             g_object_notify (G_OBJECT (map), "tiles-queued");
             /* the soup session unrefs the message when the download finishes */
-            soup_session_queue_message (priv->soup_session, msg, osm_gps_map_tile_download_complete, dl);
+            soup_session_send_and_read_async(priv->soup_session, msg,
+                                    G_PRIORITY_DEFAULT,
+                                    cancellable,
+                                    (GAsyncReadyCallback)osm_gps_map_tile_download_complete,
+                                    dl);
         } else {
             g_warning("Could not create soup message");
             g_free(dl->uri);
@@ -1051,7 +1053,7 @@ osm_gps_map_load_tile (OsmGpsMap *map, cairo_t *cr, int zoom, int x, int y, int
 
     g_debug("Load actual tile %d,%d (%d,%d) z:%d", x, y, offset_x, offset_y, zoom);
 
-    if (priv->map_source == OSM_GPS_MAP_SOURCE_NULL) {
+    if (priv->map_source == OSM_GPS_MAP_SOURCE_NULL && priv->repo_uri == NULL) {
         osm_gps_map_blit_tile(map, priv->null_tile, cr, offset_x, offset_y,
                               priv->map_zoom, target_x, target_y);
         return;
@@ -1181,6 +1183,10 @@ osm_gps_map_print_track (OsmGpsMap *map, OsmGpsMapTrack *track, cairo_t *cr)
     map_y0 = priv->map_y - EXTRA_BORDER;
 
     int last_x = 0, last_y = 0;
+    int x_pi = lon2pixel(priv->map_zoom, M_PI) - map_x0;
+    int x_minus_pi = lon2pixel(priv->map_zoom, - M_PI) - map_x0;
+    int double_pi = x_pi - x_minus_pi;
+    float last_lon;
     for(pt = points; pt != NULL; pt = pt->next)
     {
         OsmGpsMapPoint *tp = pt->data;
@@ -1190,7 +1196,33 @@ osm_gps_map_print_track (OsmGpsMap *map, OsmGpsMapTrack *track, cairo_t *cr)
 
         /* first time through loop */
         if (pt == points)
+        {
             cairo_move_to(cr, x, y);
+        }
+        else if (fabs(tp->rlon - last_lon) > M_PI && x != last_x)
+        {
+            /* instead of drawing to (x, y), draw a first segment to the date change line,
+               and a second segment from the other date change line to (x, y) */
+            int interm_y;
+            if (last_lon > 0)
+            {
+                /* tp->rlon is < 0 */
+                interm_y = (int)(last_y + (float)(y - last_y) / (float)((x + double_pi) - last_x) * (float)(x_pi - last_x));
+                cairo_line_to(cr, x_pi, interm_y);
+                cairo_stroke(cr);
+                cairo_move_to(cr, x_minus_pi, interm_y);
+            }
+            else
+            {
+                /* tp->rlon is > 0 */
+                interm_y = (int)(last_y + (float)(y - last_y) / (float)((x - double_pi) - last_x) * (float)(x_minus_pi - last_x));
+                cairo_line_to(cr, x_minus_pi, interm_y);
+                cairo_stroke(cr);
+                cairo_move_to(cr, x_pi, interm_y);
+            }
+            max_x = x_pi;
+            min_x = x_minus_pi;
+        }
 
         cairo_line_to(cr, x, y);
         cairo_stroke(cr);
@@ -1217,6 +1249,7 @@ osm_gps_map_print_track (OsmGpsMap *map, OsmGpsMapTrack *track, cairo_t *cr)
 
         last_x = x;
         last_y = y;
+        last_lon = tp->rlon;
     }
 
     gtk_widget_queue_draw_area (
@@ -1643,7 +1676,7 @@ osm_gps_map_init (OsmGpsMap *object)
     int i;
     OsmGpsMapPrivate *priv;
 
-    priv = G_TYPE_INSTANCE_GET_PRIVATE (object, OSM_TYPE_GPS_MAP, OsmGpsMapPrivate);
+    priv = osm_gps_map_get_instance_private (object);
     object->priv = priv;
 
     priv->pixmap = NULL;
@@ -1680,18 +1713,8 @@ osm_gps_map_init (OsmGpsMap *object)
 
 
     /* set the user agent */
-#ifdef SOUP_OLD_SESSION
-    // libsoup pre 2.42.0 had explicit syn/async session
-    priv->soup_session =
-        soup_session_async_new_with_options(SOUP_SESSION_USER_AGENT,
-                                            USER_AGENT, NULL);
-#else
-    // lisoup since 2.42.0 has universal session, only methods can be sync/async
-    // and we use async
-    priv->soup_session =
-        soup_session_new_with_options(SOUP_SESSION_USER_AGENT,
-                                            USER_AGENT, NULL);
-#endif
+    priv->soup_session = soup_session_new ();
+    soup_session_set_user_agent (priv->soup_session, USER_AGENT);
 
     /* Hash table which maps tile d/l URIs to SoupMessage requests, the hashtable
        must free the key, the soup session unrefs the message */
@@ -1922,10 +1945,10 @@ osm_gps_map_set_property (GObject *object, guint prop_id, const GValue *value, G
                 g_debug("Setting proxy server: %s", priv->proxy_uri);
 
                 GValue val = {0};
-                SoupURI* uri = soup_uri_new(priv->proxy_uri);
-                g_value_init(&val, SOUP_TYPE_URI);
+                GUri* uri = g_uri_parse(priv->proxy_uri, SOUP_HTTP_URI_FLAGS, NULL);
+                g_value_init(&val, G_TYPE_URI);
                 g_value_take_boxed(&val, uri);
-                g_object_set_property(G_OBJECT(priv->soup_session),SOUP_SESSION_PROXY_URI,&val);
+                g_object_set_property(G_OBJECT(priv->soup_session),"proxy-resolver",&val);
 
             } else {
                 g_free(priv->proxy_uri);
@@ -1945,7 +1968,7 @@ osm_gps_map_set_property (GObject *object, guint prop_id, const GValue *value, G
                 priv->user_agent = NULL;
                 g_value_set_string (&full_user_agent, USER_AGENT);
             }
-            g_object_set_property(G_OBJECT(priv->soup_session),SOUP_SESSION_USER_AGENT, &full_user_agent);
+            g_object_set_property(G_OBJECT(priv->soup_session),"user-agent", &full_user_agent);
             break;
         case PROP_TILE_CACHE_DIR:
             if ( g_value_get_string(value) ) {
@@ -2010,9 +2033,6 @@ osm_gps_map_set_property (GObject *object, guint prop_id, const GValue *value, G
                priv->map_source >= OSM_GPS_MAP_SOURCE_NULL &&
                priv->map_source <= OSM_GPS_MAP_SOURCE_LAST) {
 
-                if (!priv->is_constructed)
-                    g_critical("Map source setup called twice");
-
                 /* we now have to switch the entire map */
                 osm_gps_map_setup(map);
 
@@ -2509,8 +2529,6 @@ osm_gps_map_class_init (OsmGpsMapClass *klass)
     GObjectClass* object_class;
     GtkWidgetClass *widget_class;
 
-    g_type_class_add_private (klass, sizeof (OsmGpsMapPrivate));
-
     object_class = G_OBJECT_CLASS (klass);
     object_class->dispose = osm_gps_map_dispose;
     object_class->finalize = osm_gps_map_finalize;
@@ -2987,9 +3005,9 @@ osm_gps_map_download_maps (OsmGpsMap *map, OsmGpsMapPoint *pt1, OsmGpsMapPoint *
 }
 
 static void
-cancel_message (char *key, SoupMessage *value, SoupSession *user_data)
+cancel_message (char *key, GCancellable *cancellable, void *userdata)
 {
-    soup_session_cancel_message (user_data, value, SOUP_STATUS_CANCELLED);
+    g_cancellable_cancel(cancellable);
 }
 
 /**
@@ -2997,7 +3015,7 @@ cancel_message (char *key, SoupMessage *value, SoupSession *user_data)
  * @map: a #OsmGpsMap widget
  *
  * Cancels all tiles currently being downloaded. Typically used if you wish to
- * cacel a large number of tiles queued using osm_gps_map_download_maps()
+ * cancel a large number of tiles queued using osm_gps_map_download_maps()
  *
  * Since: 0.7.0
  **/
@@ -3005,7 +3023,7 @@ void
 osm_gps_map_download_cancel_all (OsmGpsMap *map)
 {
     OsmGpsMapPrivate *priv = map->priv;
-    g_hash_table_foreach (priv->tile_queue, (GHFunc)cancel_message, priv->soup_session);
+    g_hash_table_foreach (priv->tile_queue, (GHFunc)cancel_message, NULL);
 }
 
 /**


=====================================
tests/test.py
=====================================
@@ -0,0 +1,126 @@
+#!/usr/bin/env python3
+import unittest
+import cairo
+import io
+
+import gi
+gi.require_version('OsmGpsMap', '1.0')
+
+from gi.repository import OsmGpsMap
+from gi.repository import Gdk, GdkPixbuf, Gtk
+
+class TestOsmGpsMap(unittest.TestCase):
+	def setUp(self):
+		self.lat = 50
+		self.lon = 13
+		self.zoom = 15
+		self.osm = OsmGpsMap.Map(user_agent="test/0.1")
+		
+	def test_map(self):
+		test_window = Gtk.Window()
+		test_window.set_title("OsmGpsMap")
+		test_window.connect("destroy", Gtk.main_quit)
+		test_window.show()
+		test_window.set_size_request(640, 480)
+		test_window.add(self.osm)
+		test_window.show_all()
+		
+		self.osm.set_zoom(self.zoom)
+		self.assertEqual(self.osm.get_property('zoom'), self.zoom)
+		self.osm.zoom_in()
+		self.assertEqual(self.osm.get_property('zoom'), self.zoom+1)
+		self.osm.zoom_out()
+		self.assertEqual(self.osm.get_property('zoom'), self.zoom)
+		
+		self.osm.set_center_and_zoom(self.lat, self.lon, self.zoom)
+		self.assertEqual(self.osm.get_property("latitude"), self.lat)
+		self.assertEqual(self.osm.get_property("longitude"), self.lon)
+		
+		self.lat += 1
+		self.lon += 1
+		self.osm.set_center(self.lat, self.lon)
+		self.assertEqual(self.osm.get_property("latitude"), self.lat)
+		self.assertEqual(self.osm.get_property("longitude"), self.lon)
+		
+		self.osm.set_property("map-source", OsmGpsMap.MapSource_t.OPENCYCLEMAP)
+		self.osm.set_property("map-source", OsmGpsMap.MapSource_t.OPENSTREETMAP)
+		
+		self.osm.set_property("auto-center", False)
+		self.osm.set_property("auto-center", True)
+
+		self.osm.set_property("user-agent", "test/0.2")
+		self.assertEqual(self.osm.get_property("user-agent"), "test/0.2")
+		self.osm.set_property("user-agent", None)
+		self.assertEqual(self.osm.get_property("user-agent"), None)
+		
+		self.osm.gps_add(self.lat, self.lon, heading=OsmGpsMap.MAP_INVALID);
+		track = self.osm.gps_get_track()
+		self.assertEqual(type(track), OsmGpsMap.MapTrack)
+		self.osm.gps_clear()
+		
+	def test_layer(self):
+		osd = OsmGpsMap.MapOsd(show_zoom=True, show_coordinates=False, show_scale=False, show_dpad=True, show_gps_in_dpad=True)
+		self.osm.layer_add(osd)
+		self.osm.layer_remove(osd)
+		
+	def test_image(self):
+		size = 16
+		drawable = cairo.ImageSurface(cairo.FORMAT_RGB24, size, size)
+		ctx = cairo.Context(drawable)
+		# transparent background
+		ctx.set_source_rgba(1, 1, 1, 1)
+		ctx.rectangle(0, 0, size, size)
+		ctx.fill()
+		ctx.stroke()
+		# red arc
+		ctx.set_source_rgb(1, 0, 0)
+		ctx.arc(size/2, size/2, size/2-1, 0, 3.14*2)
+		ctx.fill()
+		ctx.stroke()
+		
+		# convert the cairo context to a GdkPixbuf
+		buffer = io.BytesIO()
+		drawable.write_to_png(buffer)
+		loader = GdkPixbuf.PixbufLoader.new_with_type('png')
+		loader.write(buffer.getvalue())
+		buffer.close()
+		loader.close()
+		pixbuf = loader.get_pixbuf()
+		image = pixbuf.add_alpha(True , 255, 255, 255)
+		
+		for x in range(0, 5):
+			pointer = self.osm.image_add(self.lat+x, self.lon+x, image)
+		
+		self.osm.image_remove(pointer)
+		self.osm.image_remove_all()
+		
+	def test_track(self):
+		track = OsmGpsMap.MapTrack()
+		self.osm.track_add(track)
+		
+		color = Gdk.RGBA(1, 0, 1, 0)
+		track.set_property('color', color)
+		color2 = track.get_color()
+		self.assertEqual(color, color2)
+		
+		points = []
+		for x in range(0, 5):
+			point = OsmGpsMap.MapPoint.new_degrees(self.lat+x, self.lon+x)
+			track.add_point(point)
+			points.append(point)
+		
+		self.assertEqual(track.n_points(), 5)
+		self.assertEqual(track.get_length(), 522318.175858659)
+		
+		track.remove_point(3)
+		self.assertEqual(track.n_points(), 4)
+		
+		self.assertEqual(type(track.get_point(3)), OsmGpsMap.MapPoint)
+		
+		returned_points = track.get_points()
+		self.assertEqual(len(returned_points), 4)
+		
+		self.osm.track_remove(track)
+
+if __name__ == "__main__":
+	unittest.main()



View it on GitLab: https://salsa.debian.org/debian-gis-team/osm-gps-map/-/commit/82fe2b3a9af652993df7c91d9f0aa7558c6ae238

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/osm-gps-map/-/commit/82fe2b3a9af652993df7c91d9f0aa7558c6ae238
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260815/d7fd15c0/attachment-0001.htm>


More information about the Pkg-grass-devel mailing list