--- trunk/src/osm-gps-map.c 2009/09/20 19:26:29 121 +++ trunk/src/osm-gps-map.c 2009/12/12 12:54:37 238 @@ -158,7 +158,6 @@ guint is_disposed : 1; guint dragging : 1; - guint center_coord_set : 1; }; #define OSM_GPS_MAP_PRIVATE(o) (OSM_GPS_MAP (o)->priv) @@ -1248,13 +1247,23 @@ { OsmGpsMapPrivate *priv = map->priv; + /* on diablo the map comes up at 1x1 pixel size and */ + /* isn't really usable. we'll just ignore this ... */ + if((GTK_WIDGET(map)->allocation.width < 2) || + (GTK_WIDGET(map)->allocation.height < 2)) { + printf("not a useful sized map yet ...\n"); + return FALSE; + } + priv->idle_map_redraw = 0; +#ifdef ENABLE_OSD /* don't redraw the entire map while the OSD is doing */ /* some animation or the like. This is to keep the animation */ /* fluid */ if (priv->osd->busy(priv->osd)) return FALSE; +#endif #ifdef DRAG_DEBUG printf("trying redraw\n"); @@ -1274,8 +1283,7 @@ priv->redraw_cycle++; /* draw white background to initialise pixmap */ - gdk_draw_rectangle ( - priv->pixmap, + gdk_draw_rectangle (priv->pixmap, GTK_WIDGET(map)->style->white_gc, TRUE, 0, 0, @@ -1309,6 +1317,18 @@ priv->idle_map_redraw = g_idle_add ((GSourceFunc)osm_gps_map_map_redraw, map); } +static void +center_coord_update(GtkWidget *widget) { + OsmGpsMapPrivate *priv = OSM_GPS_MAP_PRIVATE(widget); + + // pixel_x,y, offsets + gint pixel_x = priv->map_x + widget->allocation.width/2; + gint pixel_y = priv->map_y + widget->allocation.height/2; + + priv->center_rlon = pixel2lon(priv->map_zoom, pixel_x); + priv->center_rlat = pixel2lat(priv->map_zoom, pixel_y); +} + #ifdef OSM_GPS_MAP_KEYS static gboolean on_window_key_press(GtkWidget *widget, @@ -1348,7 +1368,7 @@ #ifdef OSM_GPS_MAP_KEY_UP case OSM_GPS_MAP_KEY_UP: priv->map_y -= step; - priv->center_coord_set = FALSE; + center_coord_update(widget); osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); handled = TRUE; break; @@ -1357,7 +1377,7 @@ #ifdef OSM_GPS_MAP_KEY_DOWN case OSM_GPS_MAP_KEY_DOWN: priv->map_y += step; - priv->center_coord_set = FALSE; + center_coord_update(widget); osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); handled = TRUE; break; @@ -1366,7 +1386,7 @@ #ifdef OSM_GPS_MAP_KEY_LEFT case OSM_GPS_MAP_KEY_LEFT: priv->map_x -= step; - priv->center_coord_set = FALSE; + center_coord_update(widget); osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); handled = TRUE; break; @@ -1375,7 +1395,7 @@ #ifdef OSM_GPS_MAP_KEY_RIGHT case OSM_GPS_MAP_KEY_RIGHT: priv->map_x += step; - priv->center_coord_set = FALSE; + center_coord_update(widget); osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); handled = TRUE; break; @@ -1428,7 +1448,7 @@ #ifndef LIBSOUP22 //Change naumber of concurrent connections option? - priv->soup_session = + priv->soup_session = soup_session_async_new_with_options(SOUP_SESSION_USER_AGENT, USER_AGENT, NULL); #else @@ -1436,7 +1456,6 @@ /* set it seperately as an extra header field for each reuest */ priv->soup_session = soup_session_async_new(); #endif - //Hash table which maps tile d/l URIs to SoupMessage requests priv->tile_queue = g_hash_table_new (g_str_hash, g_str_equal); @@ -1646,11 +1665,11 @@ break; case PROP_MAP_X: priv->map_x = g_value_get_int (value); - priv->center_coord_set = FALSE; + center_coord_update(GTK_WIDGET(object)); break; case PROP_MAP_Y: priv->map_y = g_value_get_int (value); - priv->center_coord_set = FALSE; + center_coord_update(GTK_WIDGET(object)); break; case PROP_GPS_TRACK_WIDTH: priv->ui_gps_track_width = g_value_get_int (value); @@ -1813,28 +1832,28 @@ switch(but) { case OSD_UP: priv->map_y -= step; - priv->center_coord_set = FALSE; + center_coord_update(widget); g_object_set(G_OBJECT(widget), "auto-center", FALSE, NULL); osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); break; case OSD_DOWN: priv->map_y += step; - priv->center_coord_set = FALSE; + center_coord_update(widget); g_object_set(G_OBJECT(widget), "auto-center", FALSE, NULL); osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); break; case OSD_LEFT: priv->map_x -= step; - priv->center_coord_set = FALSE; + center_coord_update(widget); g_object_set(G_OBJECT(widget), "auto-center", FALSE, NULL); osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); break; case OSD_RIGHT: priv->map_x += step; - priv->center_coord_set = FALSE; + center_coord_update(widget); g_object_set(G_OBJECT(widget), "auto-center", FALSE, NULL); osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); break; @@ -1883,7 +1902,7 @@ priv->map_x += (priv->drag_start_mouse_x - (int) event->x); priv->map_y += (priv->drag_start_mouse_y - (int) event->y); - priv->center_coord_set = FALSE; + center_coord_update(widget); osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); } @@ -1978,6 +1997,13 @@ widget->allocation.height + EXTRA_BORDER * 2, -1); + // pixel_x,y, offsets + gint pixel_x = lon2pixel(priv->map_zoom, priv->center_rlon); + gint pixel_y = lat2pixel(priv->map_zoom, priv->center_rlat); + + priv->map_x = pixel_x - widget->allocation.width/2; + priv->map_y = pixel_y - widget->allocation.height/2; + #ifdef ENABLE_OSD #ifdef OSD_DOUBLE_BUFFER @@ -2550,7 +2576,6 @@ priv->center_rlat = deg2rad(latitude); priv->center_rlon = deg2rad(longitude); - priv->center_coord_set = TRUE; // pixel_x,y, offsets pixel_x = lon2pixel(priv->map_zoom, priv->center_rlon); @@ -2582,17 +2607,8 @@ //constrain zoom min_zoom -> max_zoom priv->map_zoom = CLAMP(zoom, priv->min_zoom, priv->max_zoom); - if (priv->center_coord_set) - { - priv->map_x = lon2pixel(priv->map_zoom, priv->center_rlon) - width_center; - priv->map_y = lat2pixel(priv->map_zoom, priv->center_rlat) - height_center; - } - else - { - factor = exp(priv->map_zoom * M_LN2)/exp(zoom_old * M_LN2); - priv->map_x = ((priv->map_x + width_center) * factor) - width_center; - priv->map_y = ((priv->map_y + height_center) * factor) - height_center; - } + priv->map_x = lon2pixel(priv->map_zoom, priv->center_rlon) - width_center; + priv->map_y = lat2pixel(priv->map_zoom, priv->center_rlat) - height_center; g_debug("Zoom changed from %d to %d factor:%f x:%d", zoom_old, priv->map_zoom, factor, priv->map_x); @@ -2730,7 +2746,7 @@ priv->map_x = pixel_x - GTK_WIDGET(map)->allocation.width/2; priv->map_y = pixel_y - GTK_WIDGET(map)->allocation.height/2; - priv->center_coord_set = FALSE; + center_coord_update(GTK_WIDGET(map)); } } @@ -2804,9 +2820,9 @@ g_return_if_fail (OSM_IS_GPS_MAP (map)); priv = map->priv; - priv->center_coord_set = FALSE; priv->map_x += dx; priv->map_y += dy; + center_coord_update(GTK_WIDGET(map)); #ifdef ENABLE_OSD /* OSD may contain a coordinate, so we may have to re-render it */ @@ -2836,12 +2852,16 @@ osm_gps_map_map_redraw_idle(map); } -osm_gps_map_osd_t *osm_gps_map_osd_get(OsmGpsMap *map) { +osm_gps_map_osd_t * +osm_gps_map_osd_get(OsmGpsMap *map) +{ g_return_val_if_fail (OSM_IS_GPS_MAP (map), NULL); return map->priv->osd; } -void osm_gps_map_register_osd(OsmGpsMap *map, osm_gps_map_osd_t *osd) { +void +osm_gps_map_register_osd(OsmGpsMap *map, osm_gps_map_osd_t *osd) +{ OsmGpsMapPrivate *priv; g_return_if_fail (OSM_IS_GPS_MAP (map)); @@ -2853,8 +2873,20 @@ } void -osm_gps_map_repaint (OsmGpsMap *map) { +osm_gps_map_repaint (OsmGpsMap *map) +{ osm_gps_map_expose (GTK_WIDGET(map), NULL); } +coord_t * +osm_gps_map_get_gps (OsmGpsMap *map) +{ + g_return_val_if_fail (OSM_IS_GPS_MAP (map), NULL); + + if(!map->priv->gps_valid) + return NULL; + + return map->priv->gps; +} + #endif