]> git.street.me.uk Git - andy/viking.git/blobdiff - src/vikwindow.c
Scroll zoom keeps cursor over same spot on map
[andy/viking.git] / src / vikwindow.c
index cc170a661418d7b5f286b4e9649236c80f3f0900..eae61d96c6ff198ea4a825d22f2e1b9e97fd50db 100644 (file)
@@ -488,10 +488,29 @@ static void draw_scroll (VikWindow *vw, GdkEventScroll *event)
     else
       vik_viewport_set_center_screen ( vw->viking_vvp, vik_viewport_get_width(vw->viking_vvp)*2/3, vik_viewport_get_height(vw->viking_vvp)/2 );
   } else {
-    if ( event->direction == GDK_SCROLL_UP )
+    if ( event->direction == GDK_SCROLL_UP ) {
+      /* make sure mouse is still over the same point on the map when we zoom */
+      VikCoord coord;
+      gint x, y;
+      gint center_x = vik_viewport_get_width ( vw->viking_vvp ) / 2;
+      gint center_y = vik_viewport_get_height ( vw->viking_vvp ) / 2;
+      vik_viewport_screen_to_coord ( vw->viking_vvp, event->x, event->y, &coord );
       vik_viewport_zoom_in (vw->viking_vvp);
-    else
+      vik_viewport_coord_to_screen ( vw->viking_vvp, &coord, &x, &y );
+      vik_viewport_set_center_screen ( vw->viking_vvp, center_x + (x - event->x),
+                               center_y + (y - event->y) );
+    }
+    else {
+      VikCoord coord;
+      gint x, y;
+      gint center_x = vik_viewport_get_width ( vw->viking_vvp ) / 2;
+      gint center_y = vik_viewport_get_height ( vw->viking_vvp ) / 2;
+      vik_viewport_screen_to_coord ( vw->viking_vvp, event->x, event->y, &coord );
       vik_viewport_zoom_out(vw->viking_vvp);
+      vik_viewport_coord_to_screen ( vw->viking_vvp, &coord, &x, &y );
+      vik_viewport_set_center_screen ( vw->viking_vvp, center_x + (x - event->x),
+                               center_y + (y - event->y) );
+    }
   }
 
   draw_update(vw);