Diff of /trunk/src/map-tool.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 133 by harbaum, Mon Oct 12 20:27:55 2009 UTC revision 144 by harbaum, Tue Oct 27 08:38:31 2009 UTC
# Line 80  static const char *get_proxy_uri(appdata Line 80  static const char *get_proxy_uri(appdata
80    
81  static void  static void
82  cb_map_gps(osd_button_t but, map_context_t *context) {  cb_map_gps(osd_button_t but, map_context_t *context) {
83    
84    if(but == OSD_GPS) {    if(but == OSD_GPS) {
85      pos_t *refpos = get_pos(context->appdata);      pos_t *refpos = get_pos(context->appdata);
86      if(refpos && !isnan(refpos->lat) && !isnan(refpos->lon)) {      if(refpos && !isnan(refpos->lat) && !isnan(refpos->lon)) {
# Line 139  static gboolean map_gps_update(gpointer Line 140  static gboolean map_gps_update(gpointer
140    return TRUE;    return TRUE;
141  }  }
142    
143    static void map_draw_cache(GtkWidget *map, cache_t *cache) {
144      GdkPixbuf *icon = icon_get(ICON_CACHE_TYPE, cache->type);
145    
146      /* check if there's also an overwritten coordinate */
147      if(cache->notes && cache->notes->override) {
148        GdkPixbuf *over = icon_get(ICON_MISC, 1);
149    
150        osm_gps_map_add_image(OSM_GPS_MAP(map),
151              cache->notes->pos.lat, cache->notes->pos.lon, icon);
152    
153        osm_gps_map_add_image(OSM_GPS_MAP(map),
154              cache->notes->pos.lat, cache->notes->pos.lon, over);
155      } else {
156        if(!isnan(cache->pos.lat) && !isnan(cache->pos.lon))
157          osm_gps_map_add_image(OSM_GPS_MAP(map),
158                                cache->pos.lat, cache->pos.lon, icon);
159      }
160    }
161    
162    static void map_draw_gpx(appdata_t *appdata, GtkWidget *map, gpx_t *gpx) {
163      if(!gpx->notes_loaded) {
164        notes_load_all(appdata, gpx);
165        gpx->notes_loaded = TRUE;
166      }
167    
168      cache_t *cache = gpx->cache;
169      while(cache) {
170        map_draw_cache(map, cache);
171        cache = cache->next;
172      }
173    }
174    
175    /* draw geocaches and set window title */
176    static void map_setup(map_context_t *context) {
177      char *name = NULL;
178    
179      if(!context->appdata->cur_gpx && !context->appdata->cur_cache) {
180        if(context->state != MAP_ALL) {
181          printf("map_setup(ALL)\n");
182    
183    #ifdef OSD_NAV
184          /* no navigation in this mode */
185          osm_gps_map_osd_clear_nav (OSM_GPS_MAP(context->widget));
186    #endif
187    
188          /* clear all existing ccahe images */
189          osm_gps_map_clear_images (OSM_GPS_MAP(context->widget));
190    
191          /* draw all geocaches */
192          gpx_t *gpx = context->appdata->gpx;
193          while(gpx) {
194            map_draw_gpx(context->appdata, context->widget, gpx);
195            gpx = gpx->next;
196          }
197          name = g_strdup(_("all"));
198          context->state = MAP_ALL;
199        }
200      } else if(!context->appdata->cur_cache) {
201        if(context->state != MAP_GPX) {
202          printf("map_setup(GPX)\n");
203    
204    #ifdef OSD_NAV
205          /* no navigation in this mode */
206          osm_gps_map_osd_clear_nav (OSM_GPS_MAP(context->widget));
207    #endif
208    
209          /* clear all existing ccahe images */
210          osm_gps_map_clear_images (OSM_GPS_MAP(context->widget));
211    
212          map_draw_gpx(context->appdata, context->widget,
213                       context->appdata->cur_gpx);
214          name = g_strdup(context->appdata->cur_gpx->name);
215          context->state = MAP_GPX;
216        }
217      } else {
218        cache_t *cache = context->appdata->cur_cache;
219    
220        printf("map_setp(CACHE)\n");
221    
222        /* no balloons in this mode */
223        context->balloon = NULL;
224        osm_gps_map_osd_clear_balloon (OSM_GPS_MAP(context->widget));
225    
226        /* clear all existing ccahe images */
227        osm_gps_map_clear_images (OSM_GPS_MAP(context->widget));
228    
229        map_draw_cache(context->widget, cache);
230        name = g_strdup(cache->name);
231        context->state = MAP_CACHE;
232    
233        /* navigation in this mode! */
234        pos_t cpos = gpx_cache_pos(cache);
235    
236    #ifdef OSD_NAV
237        osm_gps_map_osd_draw_nav (OSM_GPS_MAP(context->widget),
238                                  context->appdata->imperial,
239                                  cpos.lat, cpos.lon, cache->name);
240    #else
241    #warning OSD_NAV not defined!
242    #endif
243      }
244    
245      if(name) {
246        char *title = g_strdup_printf(_("Map - %s"), name);
247        g_free(name);
248    
249        gtk_window_set_title(GTK_WINDOW(context->window), title);
250    
251        g_free(title);
252      } else
253        printf("map_setup(keep)\n");
254    }
255    
256  static gboolean on_map_configure(GtkWidget *widget,  static gboolean on_map_configure(GtkWidget *widget,
257                                   GdkEventConfigure *event,                                   GdkEventConfigure *event,
258                                   map_context_t *context) {                                   map_context_t *context) {
259    
260    if(!context->map_complete) {    /* for some reason there's a configure event with 1/1 */
261      /* on diablo. We just ignore this! */
262    
263      printf("on_map_configure %d %d\n",
264             widget->allocation.width,
265             widget->allocation.height);
266    
267      if(!context->map_complete &&
268         (widget->allocation.width > 100) &&
269         (widget->allocation.height > 100)) {
270    
271        /* setup cache state */
272        map_setup(context);
273    
274      /* set default values if they are invalid */      /* set default values if they are invalid */
275      if(!context->appdata->map.zoom ||      if(!context->appdata->map.zoom ||
# Line 153  static gboolean on_map_configure(GtkWidg Line 279  static gboolean on_map_configure(GtkWidg
279    
280        pos_t *refpos = get_pos(context->appdata);        pos_t *refpos = get_pos(context->appdata);
281        if(refpos && !isnan(refpos->lat) && !isnan(refpos->lon)) {        if(refpos && !isnan(refpos->lat) && !isnan(refpos->lon)) {
282            printf("use refpos\n");
283    
284          /* use gps position if present */          /* use gps position if present */
285          context->appdata->map.pos = *refpos;          context->appdata->map.pos = *refpos;
286          context->appdata->map.zoom = GPS_DEFAULT_ZOOM;          context->appdata->map.zoom = GPS_DEFAULT_ZOOM;
287        } else {        } else {
288            printf("use zero pos\n");
289    
290          /* use world map otherwise */          /* use world map otherwise */
291          context->appdata->map.pos.lat = 0.0;          context->appdata->map.pos.lat = 0.0;
292          context->appdata->map.pos.lon = 0.0;          context->appdata->map.pos.lon = 0.0;
# Line 165  static gboolean on_map_configure(GtkWidg Line 295  static gboolean on_map_configure(GtkWidg
295      }      }
296    
297      /* jump to initial position */      /* jump to initial position */
298        printf("osm_gps_map_set_mapcenter(%f,%f,%d)\n",
299               context->appdata->map.pos.lat,
300               context->appdata->map.pos.lon,
301               context->appdata->map.zoom);
302    
303      osm_gps_map_set_mapcenter(OSM_GPS_MAP(context->widget),      osm_gps_map_set_mapcenter(OSM_GPS_MAP(context->widget),
304                                context->appdata->map.pos.lat,                                context->appdata->map.pos.lat,
305                                context->appdata->map.pos.lon,                                context->appdata->map.pos.lon,
# Line 175  static gboolean on_map_configure(GtkWidg Line 310  static gboolean on_map_configure(GtkWidg
310    return FALSE;    return FALSE;
311  }  }
312    
 static void map_draw_cache(GtkWidget *map, cache_t *cache) {  
   GdkPixbuf *icon = icon_get(ICON_CACHE_TYPE, cache->type);  
   
   /* check if there's also an overwritten coordinate */  
   if(cache->notes && cache->notes->override) {  
     GdkPixbuf *over = icon_get(ICON_MISC, 1);  
   
     osm_gps_map_add_image(OSM_GPS_MAP(map),  
           cache->notes->pos.lat, cache->notes->pos.lon, icon);  
   
     osm_gps_map_add_image(OSM_GPS_MAP(map),  
           cache->notes->pos.lat, cache->notes->pos.lon, over);  
   } else  
     osm_gps_map_add_image(OSM_GPS_MAP(map),  
                           cache->pos.lat, cache->pos.lon, icon);  
   
 }  
   
 static void map_draw_gpx(appdata_t *appdata, GtkWidget *map, gpx_t *gpx) {  
   if(!gpx->notes_loaded) {  
     notes_load_all(appdata, gpx);  
     gpx->notes_loaded = TRUE;  
   }  
   
   cache_t *cache = gpx->cache;  
   while(cache) {  
     map_draw_cache(map, cache);  
     cache = cache->next;  
   }  
 }  
   
313  static void  static void
314  map_cachelist_nearest(cache_t *cache, pos_t *pos,  map_cachelist_nearest(cache_t *cache, pos_t *pos,
315                        cache_t **result, float *distance) {                        cache_t **result, float *distance) {
316    
317    while(cache) {    while(cache) {
318      pos_t cpos = gpx_cache_pos(cache);      pos_t cpos = gpx_cache_pos(cache);
319    
# Line 258  pos_t coord2pos(coord_t coo) { Line 363  pos_t coord2pos(coord_t coo) {
363  static gboolean  static gboolean
364  on_map_button_press_event(GtkWidget *widget,  on_map_button_press_event(GtkWidget *widget,
365                              GdkEventButton *event, map_context_t *context) {                              GdkEventButton *event, map_context_t *context) {
366    
367    OsmGpsMap *map = OSM_GPS_MAP(context->widget);    OsmGpsMap *map = OSM_GPS_MAP(context->widget);
368    
369    /* check if we actually clicked parts of the OSD */    /* check if we actually clicked parts of the OSD */
370    if(osm_gps_map_osd_check(map, event->x, event->y) != OSD_NONE)    if(osm_gps_map_osd_check(map, event->x, event->y) != OSD_NONE)
371      return FALSE;      return FALSE;
372    
373    /* got a press event without release event? eat it! */    /* got a press event without release event? eat it! */
# Line 315  cairo_draw_pixbuf(cairo_t *cr, GdkPixbuf Line 421  cairo_draw_pixbuf(cairo_t *cr, GdkPixbuf
421  #endif  #endif
422    
423  static void  static void
424  balloon_draw_cb(cairo_t *cr, OsmGpsMapRect_t *rect, gpointer data) {  balloon_cb(osm_gps_map_balloon_event_t *event, gpointer data) {
425    cache_t *cache = (cache_t*)data;    printf("balloon event: ");
426    
427  #if 0    map_context_t *context = (map_context_t*)data;
428    /* draw pink background to check clipping */    cache_t *cache = context->balloon;
   cairo_rectangle (cr, rect->x-20, rect->y-20, rect->w+40, rect->h+40);  
   cairo_set_source_rgba (cr, 1, 0, 0, 0.3);  
   cairo_fill_preserve (cr);  
   cairo_set_line_width (cr, 0);  
   cairo_stroke (cr);  
 #endif  
   
   /* leave a little border top and left */  
   gint x = rect->x, y = rect->y;  
   
   /* draw the cache type icon ... */  
   GdkPixbuf *icon = icon_get(ICON_CACHE_TYPE, cache->type);  
   cairo_draw_pixbuf(cr, icon, x, y);  
   
   if(cache->notes && cache->notes->override) {  
     GdkPixbuf *over = icon_get(ICON_MISC, 1);  
     cairo_draw_pixbuf(cr, over, x, y);  
   }  
429    
430    /* ... and right of it the waypoint id */    if(event->type == OSM_GPS_MAP_BALLOON_EVENT_TYPE_DRAW) {
431    cairo_text_extents_t extents;      printf("draw\n");
432    
433    if(cache->id) {  #if 0
434      cairo_select_font_face (cr, "Sans",      /* draw pink background to check clipping */
435                              CAIRO_FONT_SLANT_NORMAL,      cairo_rectangle (event->data.draw.cr,
436                              CAIRO_FONT_WEIGHT_BOLD);                       event->data.draw.rect->x-20, event->data.draw.rect->y-20,
437                         event->data.draw.rect->w+40, event->data.draw.rect->h+40);
438        cairo_set_source_rgba (event->data.draw.cr, 1, 0, 0, 0.3);
439        cairo_fill_preserve (event->data.draw.cr);
440        cairo_set_line_width (event->data.draw.cr, 0);
441        cairo_stroke (event->data.draw.cr);
442    #endif
443    
444        /* leave a little border top and left */
445        gint x = event->data.draw.rect->x, y = event->data.draw.rect->y;
446    
447        /* draw the cache type icon ... */
448        GdkPixbuf *icon = icon_get(ICON_CACHE_TYPE, cache->type);
449        cairo_draw_pixbuf(event->data.draw.cr, icon, x, y);
450    
451        if(cache->notes && cache->notes->override) {
452          GdkPixbuf *over = icon_get(ICON_MISC, 1);
453          cairo_draw_pixbuf(event->data.draw.cr, over, x, y);
454        }
455    
456        /* ... and right of it the waypoint id */
457        cairo_text_extents_t extents;
458    
459        if(cache->id) {
460          cairo_select_font_face (event->data.draw.cr, "Sans",
461                                  CAIRO_FONT_SLANT_NORMAL,
462                                  CAIRO_FONT_WEIGHT_BOLD);
463    
464  #ifndef BIG_BALLOONS  #ifndef BIG_BALLOONS
465      cairo_set_font_size (cr, 20.0);        cairo_set_font_size (event->data.draw.cr, 20.0);
466  #else  #else
467      cairo_set_font_size (cr, 36.0);        cairo_set_font_size (event->data.draw.cr, 36.0);
468  #endif  #endif
469    
470      cairo_text_extents (cr, cache->id, &extents);        cairo_text_extents (event->data.draw.cr, cache->id, &extents);
471    
472      /* display id right of icon vertically centered */        /* display id right of icon vertically centered */
473      x += gdk_pixbuf_get_width(icon) + 5;        x += gdk_pixbuf_get_width(icon) + 5;
474      y += (gdk_pixbuf_get_height(icon) + extents.height)/2;        y += (gdk_pixbuf_get_height(icon) + extents.height)/2;
475      cairo_move_to (cr, x, y);        cairo_move_to (event->data.draw.cr, x, y);
476      cairo_set_source_rgba (cr, 0, 0, 0, 1);        cairo_set_source_rgba (event->data.draw.cr, 0, 0, 0, 1);
477      cairo_show_text (cr, cache->id);        cairo_show_text (event->data.draw.cr, cache->id);
478      cairo_stroke (cr);        cairo_stroke (event->data.draw.cr);
479    
480      y += (gdk_pixbuf_get_height(icon) - extents.height)/2 + LINE_SKIP;        y += (gdk_pixbuf_get_height(icon) - extents.height)/2 + LINE_SKIP;
481    } else      } else
482      y += gdk_pixbuf_get_height(icon);        y += gdk_pixbuf_get_height(icon);
483    
484    /* return to the left border and below icon/text */      /* return to the left border and below icon/text */
485    x = rect->x;      x = event->data.draw.rect->x;
486    
487    /* everything from here uses the same font */      /* everything from here uses the same font */
488    cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL,      cairo_select_font_face (event->data.draw.cr, "Sans", CAIRO_FONT_SLANT_NORMAL,
489                            CAIRO_FONT_WEIGHT_NORMAL);                              CAIRO_FONT_WEIGHT_NORMAL);
490  #ifndef BIG_BALLOONS  #ifndef BIG_BALLOONS
491    cairo_set_font_size (cr, 14.0);      cairo_set_font_size (event->data.draw.cr, 14.0);
492  #else  #else
493    cairo_set_font_size (cr, 22.0);      cairo_set_font_size (event->data.draw.cr, 22.0);
494  #endif  #endif
495    
496    if(cache->name) {      if(cache->name) {
497      /* draw cache name */        /* draw cache name */
498      cairo_text_extents (cr, cache->name, &extents);        cairo_text_extents (event->data.draw.cr, cache->name, &extents);
499      y += extents.height;        y += extents.height;
500      cairo_move_to (cr, x, y);        cairo_move_to (event->data.draw.cr, x, y);
501      cairo_set_source_rgba (cr, 0, 0, 0, 1);        cairo_set_source_rgba (event->data.draw.cr, 0, 0, 0, 1);
502      cairo_show_text (cr, cache->name);        cairo_show_text (event->data.draw.cr, cache->name);
503      cairo_stroke (cr);        cairo_stroke (event->data.draw.cr);
504    
505      /* return to the left border and below text */        /* return to the left border and below text */
506      y += LINE_SKIP;        y += LINE_SKIP;
507      x = rect->x;        x = event->data.draw.rect->x;
508    }      }
509    
510    if(cache->terrain) {      if(cache->terrain) {
511      /* draw cache rating */        /* draw cache rating */
512      const char *terrain = "Terrain:";        const char *terrain = "Terrain:";
513      icon = icon_get(ICON_STARS, (int)(cache->terrain*2-2));        icon = icon_get(ICON_STARS, (int)(cache->terrain*2-2));
514      cairo_text_extents (cr, _(terrain), &extents);        cairo_text_extents (event->data.draw.cr, _(terrain), &extents);
515      y += (gdk_pixbuf_get_height(icon) + extents.height)/2;        y += (gdk_pixbuf_get_height(icon) + extents.height)/2;
516    
517      /* draw "Terrain:" string */        /* draw "Terrain:" string */
518      cairo_move_to (cr, x, y);        cairo_move_to (event->data.draw.cr, x, y);
519      cairo_set_source_rgba (cr, 0, 0, 0, 1);        cairo_set_source_rgba (event->data.draw.cr, 0, 0, 0, 1);
520      cairo_show_text (cr, _(terrain));        cairo_show_text (event->data.draw.cr, _(terrain));
521      cairo_stroke (cr);        cairo_stroke (event->data.draw.cr);
522      x += extents.width + 2;        x += extents.width + 2;
523    
524      /* draw terrain stars */        /* draw terrain stars */
525      cairo_draw_pixbuf(cr, icon, x, y -        cairo_draw_pixbuf(event->data.draw.cr, icon, x, y -
526                        (gdk_pixbuf_get_height(icon) + extents.height)/2);                          (gdk_pixbuf_get_height(icon) + extents.height)/2);
527    
528      x += gdk_pixbuf_get_width(icon) + LINE_SKIP;        x += gdk_pixbuf_get_width(icon) + LINE_SKIP;
529      y -= (gdk_pixbuf_get_height(icon) + extents.height)/2;      y -= (gdk_pixbuf_get_height(icon) + extents.height)/2;
530    }      }
   
   if(cache->difficulty) {  
     const char *difficulty = "Difficulty:";  
     cairo_text_extents (cr, _(difficulty), &extents);  
     y += (gdk_pixbuf_get_height(icon) + extents.height)/2;  
   
     /* draw "Difficulty:" string */  
     cairo_move_to (cr, x, y);  
     cairo_set_source_rgba (cr, 0, 0, 0, 1);  
     cairo_show_text (cr, _(difficulty));  
     cairo_stroke (cr);  
     x += extents.width + 2;  
531    
532      icon = icon_get(ICON_STARS, (int)(cache->difficulty*2-2));      if(cache->difficulty) {
533      cairo_draw_pixbuf(cr, icon, x, y -        const char *difficulty = "Difficulty:";
534          cairo_text_extents (event->data.draw.cr, _(difficulty), &extents);
535          y += (gdk_pixbuf_get_height(icon) + extents.height)/2;
536    
537          /* draw "Difficulty:" string */
538          cairo_move_to (event->data.draw.cr, x, y);
539          cairo_set_source_rgba (event->data.draw.cr, 0, 0, 0, 1);
540          cairo_show_text (event->data.draw.cr, _(difficulty));
541          cairo_stroke (event->data.draw.cr);
542          x += extents.width + 2;
543    
544          icon = icon_get(ICON_STARS, (int)(cache->difficulty*2-2));
545          cairo_draw_pixbuf(event->data.draw.cr, icon, x, y -
546                        (gdk_pixbuf_get_height(icon) + extents.height)/2);                        (gdk_pixbuf_get_height(icon) + extents.height)/2);
547        }
548      } else if(event->type == OSM_GPS_MAP_BALLOON_EVENT_TYPE_CLICK) {
549        printf("click %s event at %d %d\n",
550               event->data.click.down?"down":"up",
551               event->data.click.x, event->data.click.y);
552    
553        /* make the main screen jump to that cache */
554        if(!event->data.click.down) {
555          if(context->appdata->cur_cache) {
556            printf("ERROR: no current cache should be visible!\n");
557          } else {
558            gpx_t *is_in = NULL;
559    
560            if(!context->appdata->cur_gpx) {
561              printf("click while in \"all\" view\n");
562    
563              /* we first need to figure out which gpx file this cache */
564              /* is in so we can open it first */
565              gpx_t *gpx = context->appdata->gpx;
566              while(gpx && !is_in) {
567                cache_t *cur = gpx->cache;
568                while(cur && !is_in) {
569                  if(cur == cache)
570                    is_in = gpx;
571                  cur = cur->next;
572                }
573                gpx = gpx->next;
574              }
575    
576              if(is_in)
577                gpxlist_goto_cachelist(context->appdata, is_in);
578    
579            } else
580              /* the simple case: there already is an open gpx file and */
581              /* we just jump into the "cache" view */
582              is_in = context->appdata->cur_gpx;
583    
584            if(is_in) {
585              printf("selecting %s in %s\n",
586                     cache->id,
587                     context->appdata->cur_gpx->name);
588    
589              cachelist_goto_cache(context->appdata, cache);
590    
591              /* give focus to main screen (important for maemo) */
592              printf("raising main window\n");
593              gtk_window_present(GTK_WINDOW(context->appdata->window));
594            }
595          }
596        }
597      } else if(event->type == OSM_GPS_MAP_BALLOON_EVENT_TYPE_REMOVED) {
598        printf("removed\n");
599        context->balloon = NULL;
600    }    }
601  }  }
602    
# Line 456  on_map_button_release_event(GtkWidget *w Line 623  on_map_button_release_event(GtkWidget *w
623        float dist = gpx_pos_get_distance(pos, cpos, FALSE);        float dist = gpx_pos_get_distance(pos, cpos, FALSE);
624        if(dist2pixel(context, dist, cpos.lat) < CLICK_FUZZ) {        if(dist2pixel(context, dist, cpos.lat) < CLICK_FUZZ) {
625    
626            context->balloon = nearest;
627          osm_gps_map_osd_draw_balloon(map, cpos.lat, cpos.lon,          osm_gps_map_osd_draw_balloon(map, cpos.lat, cpos.lon,
628                                       balloon_draw_cb, nearest);                                       balloon_cb, context);
629        }        }
630      }      }
631      context->press_on = NULL;      context->press_on = NULL;
# Line 475  on_map_button_release_event(GtkWidget *w Line 643  on_map_button_release_event(GtkWidget *w
643  static void on_window_destroy(GtkWidget *widget, map_context_t *context) {  static void on_window_destroy(GtkWidget *widget, map_context_t *context) {
644    appdata_t *appdata = context->appdata;    appdata_t *appdata = context->appdata;
645    
   printf("destroy map window\n");  
   
646    /* save map parameters */    /* save map parameters */
647    OsmGpsMap *map = OSM_GPS_MAP(context->widget);    OsmGpsMap *map = OSM_GPS_MAP(context->widget);
648    gint zoom;    gint zoom;
# Line 522  on_window_realize(GtkWidget *widget, gpo Line 688  on_window_realize(GtkWidget *widget, gpo
688  }  }
689  #endif  #endif
690    
691  /* draw geocaches and set window title */  /* on maemo a window is either on top or completely invisible. this */
692  static void map_setup(map_context_t *context) {  /* means that we only need to update the map window if its raised.  */
693    char *name = NULL;  /* on ordinary desktops this is different and we always update */
   
   if(!context->appdata->cur_gpx && !context->appdata->cur_cache) {  
     if(context->state != MAP_ALL) {  
       printf("map_setp(ALL)\n");  
   
       /* no navigation in this mode */  
       osm_gps_map_osd_clear_nav (OSM_GPS_MAP(context->widget));  
   
       /* clear all existing ccahe images */  
       osm_gps_map_clear_images (OSM_GPS_MAP(context->widget));  
   
       /* draw all geocaches */  
       gpx_t *gpx = context->appdata->gpx;  
       while(gpx) {  
         map_draw_gpx(context->appdata, context->widget, gpx);  
         gpx = gpx->next;  
       }  
       name = g_strdup(_("all"));  
       context->state = MAP_ALL;  
     }  
   } else if(!context->appdata->cur_cache) {  
     if(context->state != MAP_GPX) {  
       printf("map_setp(GPX)\n");  
   
       /* no navigation in this mode */  
       osm_gps_map_osd_clear_nav (OSM_GPS_MAP(context->widget));  
   
       /* clear all existing ccahe images */  
       osm_gps_map_clear_images (OSM_GPS_MAP(context->widget));  
   
       map_draw_gpx(context->appdata, context->widget,  
                    context->appdata->cur_gpx);  
       name = g_strdup(context->appdata->cur_gpx->name);  
       context->state = MAP_GPX;  
     }  
   } else {  
     cache_t *cache = context->appdata->cur_cache;  
   
     printf("map_setp(CACHE)\n");  
   
     /* no balloons in this mode */  
     osm_gps_map_osd_clear_balloon (OSM_GPS_MAP(context->widget));  
   
     /* clear all existing ccahe images */  
     osm_gps_map_clear_images (OSM_GPS_MAP(context->widget));  
   
     map_draw_cache(context->widget, cache);  
     name = g_strdup(cache->name);  
     context->state = MAP_CACHE;  
   
     /* navigation in this mode! */  
     pos_t cpos = gpx_cache_pos(cache);  
     osm_gps_map_osd_draw_nav (OSM_GPS_MAP(context->widget),  
                               context->appdata->imperial,  
                               cpos.lat, cpos.lon, cache->name);  
   }  
   
   if(name) {  
     char *title = g_strdup_printf(_("Map - %s"), name);  
     g_free(name);  
   
     gtk_window_set_title(GTK_WINDOW(context->window), title);  
   
     g_free(title);  
   } else  
     printf("map_setup(keep)\n");  
 }  
694    
 /* on maemo a window is either on top or completely invisible. this means that */  
 /* we only need to update the map window if its raised. on ordinary desktops this */  
 /* is different and we always update */  
695  static gboolean on_focus_in(GtkWidget *widget, GdkEventFocus *event,  static gboolean on_focus_in(GtkWidget *widget, GdkEventFocus *event,
696                           gpointer data) {                           gpointer data) {
697    printf("map got focus\n");    printf("map got focus\n");
# Line 604  static gboolean on_focus_in(GtkWidget *w Line 700  static gboolean on_focus_in(GtkWidget *w
700  }  }
701    
702  void map_update(appdata_t *appdata) {  void map_update(appdata_t *appdata) {
703      printf("map_update\n");
704  #ifndef USE_MAEMO  #ifndef USE_MAEMO
705    if(appdata->map.context)    if(appdata->map.context)
706      map_setup(appdata->map.context);      map_setup(appdata->map.context);
# Line 682  void map(appdata_t *appdata) { Line 779  void map(appdata_t *appdata) {
779    context->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);    context->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
780  #endif  #endif
781    
   /* setup cache state */  
   map_setup(context);  
   
782  #ifndef USE_MAEMO  #ifndef USE_MAEMO
783    gtk_window_set_default_size(GTK_WINDOW(context->window), 640, 480);    gtk_window_set_default_size(GTK_WINDOW(context->window), 640, 480);
784  #endif  #endif

Legend:
Removed from v.133  
changed lines
  Added in v.144