Diff of /trunk/src/osm-gps-map-osd-classic.c

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

revision 136 by harbaum, Mon Oct 19 13:02:41 2009 UTC revision 201 by harbaum, Fri Nov 20 20:16:04 2009 UTC
# Line 135  typedef struct { Line 135  typedef struct {
135    
136  #define CLOSE_BUTTON_RADIUS   (BALLOON_CORNER_RADIUS)  #define CLOSE_BUTTON_RADIUS   (BALLOON_CORNER_RADIUS)
137    
138    #if 0
139    #define FIN   printf("entering function %s\n", __func__);
140    #define FOUT  printf("leaving function %s\n", __func__);
141    #else
142    #define FIN   ;
143    #define FOUT  ;
144    #endif
145    
146  /* draw the bubble shape. this is used twice, once for the shape and once */  /* draw the bubble shape. this is used twice, once for the shape and once */
147  /* for the shadow */  /* for the shadow */
# Line 142  static void Line 149  static void
149  osm_gps_map_draw_balloon_shape (cairo_t *cr, int x0, int y0, int x1, int y1,  osm_gps_map_draw_balloon_shape (cairo_t *cr, int x0, int y0, int x1, int y1,
150         gboolean bottom, int px, int py, int px0, int px1) {         gboolean bottom, int px, int py, int px0, int px1) {
151    
152        FIN;
153    
154      cairo_move_to (cr, x0, y0 + BALLOON_CORNER_RADIUS);      cairo_move_to (cr, x0, y0 + BALLOON_CORNER_RADIUS);
155      cairo_arc (cr, x0 + BALLOON_CORNER_RADIUS, y0 + BALLOON_CORNER_RADIUS,      cairo_arc (cr, x0 + BALLOON_CORNER_RADIUS, y0 + BALLOON_CORNER_RADIUS,
156                 BALLOON_CORNER_RADIUS, -M_PI, -M_PI/2);                 BALLOON_CORNER_RADIUS, -M_PI, -M_PI/2);
# Line 170  osm_gps_map_draw_balloon_shape (cairo_t Line 179  osm_gps_map_draw_balloon_shape (cairo_t
179                 BALLOON_CORNER_RADIUS, M_PI/2, M_PI);                 BALLOON_CORNER_RADIUS, M_PI/2, M_PI);
180    
181      cairo_close_path (cr);      cairo_close_path (cr);
182    
183        FOUT;
184  }  }
185    
186  static void  static void
187  osd_render_balloon(osm_gps_map_osd_t *osd) {  osd_render_balloon(osm_gps_map_osd_t *osd) {
188        FIN;
189    
190      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
191    
192        if(!priv->balloon.surface)
193            return;
194    
195      /* get zoom */      /* get zoom */
196      gint zoom;      gint zoom;
197      g_object_get(OSM_GPS_MAP(osd->widget), "zoom", &zoom, NULL);      g_object_get(OSM_GPS_MAP(osd->widget), "zoom", &zoom, NULL);
# Line 236  osd_render_balloon(osm_gps_map_osd_t *os Line 252  osd_render_balloon(osm_gps_map_osd_t *os
252      priv->balloon.rect.w = x1 - x0 - 2*BALLOON_BORDER;      priv->balloon.rect.w = x1 - x0 - 2*BALLOON_BORDER;
253      priv->balloon.rect.h = y1 - y0 - 2*BALLOON_BORDER;      priv->balloon.rect.h = y1 - y0 - 2*BALLOON_BORDER;
254    
255        g_assert(priv->balloon.surface);
256      cairo_t *cr = cairo_create(priv->balloon.surface);      cairo_t *cr = cairo_create(priv->balloon.surface);
257      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
258      cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.0);      cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.0);
# Line 284  osd_render_balloon(osm_gps_map_osd_t *os Line 301  osd_render_balloon(osm_gps_map_osd_t *os
301      }      }
302    
303      cairo_destroy(cr);      cairo_destroy(cr);
304    
305        FOUT;
306  }  }
307    
308  /* return true if balloon is being displayed and if */  /* return true if balloon is being displayed and if */
# Line 291  osd_render_balloon(osm_gps_map_osd_t *os Line 310  osd_render_balloon(osm_gps_map_osd_t *os
310  static gboolean  static gboolean
311  osd_balloon_check(osm_gps_map_osd_t *osd, gboolean click, gboolean down, gint x, gint y)  osd_balloon_check(osm_gps_map_osd_t *osd, gboolean click, gboolean down, gint x, gint y)
312  {  {
313        FIN;
314    
315      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
316    
317      if(!priv->balloon.surface)      if(!priv->balloon.surface)
# Line 340  osd_balloon_check(osm_gps_map_osd_t *osd Line 361  osd_balloon_check(osm_gps_map_osd_t *osd
361              priv->balloon.cb(&event, priv->balloon.data);              priv->balloon.cb(&event, priv->balloon.data);
362          }          }
363      }      }
364        FOUT;
365      return is_in;      return is_in;
366  }  }
367    
368  void osm_gps_map_osd_clear_balloon (OsmGpsMap *map) {  void osm_gps_map_osd_clear_balloon (OsmGpsMap *map) {
369        FIN;
370    
371      g_return_if_fail (OSM_IS_GPS_MAP (map));      g_return_if_fail (OSM_IS_GPS_MAP (map));
372    
373      osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);      osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);
# Line 360  void osm_gps_map_osd_clear_balloon (OsmG Line 383  void osm_gps_map_osd_clear_balloon (OsmG
383          priv->balloon.lon = OSM_GPS_MAP_INVALID;          priv->balloon.lon = OSM_GPS_MAP_INVALID;
384      }      }
385      osm_gps_map_redraw(map);      osm_gps_map_redraw(map);
386        FOUT;
387  }  }
388    
389  void  void
390  osm_gps_map_osd_draw_balloon (OsmGpsMap *map, float latitude, float longitude,  osm_gps_map_osd_draw_balloon (OsmGpsMap *map, float latitude, float longitude,
391                                OsmGpsMapBalloonCallback cb, gpointer data) {                                OsmGpsMapBalloonCallback cb, gpointer data) {
392        FIN;
393      g_return_if_fail (OSM_IS_GPS_MAP (map));      g_return_if_fail (OSM_IS_GPS_MAP (map));
394    
395      osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);      osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);
# Line 391  osm_gps_map_osd_draw_balloon (OsmGpsMap Line 416  osm_gps_map_osd_draw_balloon (OsmGpsMap
416      osd_render_balloon(osd);      osd_render_balloon(osd);
417    
418      osm_gps_map_redraw(map);      osm_gps_map_redraw(map);
419        FOUT;
420  }  }
421    
422  #endif // OSD_BALLOON  #endif // OSD_BALLOON
# Line 535  osd_shape(cairo_t *cr) { Line 561  osd_shape(cairo_t *cr) {
561  static gboolean  static gboolean
562  osm_gps_map_in_circle(gint x, gint y, gint cx, gint cy, gint rad)  osm_gps_map_in_circle(gint x, gint y, gint cx, gint cy, gint rad)
563  {  {
564        FIN;
565      return( pow(cx - x, 2) + pow(cy - y, 2) < rad * rad);      return( pow(cx - x, 2) + pow(cy - y, 2) < rad * rad);
566  }  }
567    
# Line 625  osd_check_zoom(gint x, gint y) { Line 652  osd_check_zoom(gint x, gint y) {
652  /* internal value to draw the arrow on the "puller" */  /* internal value to draw the arrow on the "puller" */
653  #define OSD_S_D0  (OSD_S_RAD/2)  #define OSD_S_D0  (OSD_S_RAD/2)
654  #ifndef OSD_FONT_SIZE  #ifndef OSD_FONT_SIZE
655  #define OSD_FONT_SIZE 16.0  #define OSD_FONT_SIZE (16.0)
656  #endif  #endif
657  #define OSD_TEXT_BORDER   (OSD_FONT_SIZE/2)  #define OSD_TEXT_BORDER   (OSD_FONT_SIZE/2)
658  #define OSD_TEXT_SKIP     (OSD_FONT_SIZE/8)  #define OSD_TEXT_SKIP     (OSD_FONT_SIZE/8)
# Line 733  osd_source_content(osm_gps_map_osd_t *os Line 760  osd_source_content(osm_gps_map_osd_t *os
760    
761  static void  static void
762  osd_render_source_sel(osm_gps_map_osd_t *osd, gboolean force_rerender) {  osd_render_source_sel(osm_gps_map_osd_t *osd, gboolean force_rerender) {
763        FIN;
764    
765      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
766    
767      if(priv->source_sel.rendered && !force_rerender)      if(!priv->source_sel.surface ||
768           (priv->source_sel.rendered && !force_rerender))
769          return;          return;
770    
771      priv->source_sel.rendered = TRUE;      priv->source_sel.rendered = TRUE;
# Line 747  osd_render_source_sel(osm_gps_map_osd_t Line 777  osd_render_source_sel(osm_gps_map_osd_t
777  #endif  #endif
778    
779      /* draw source selector */      /* draw source selector */
780        g_assert(priv->source_sel.surface);
781      cairo_t *cr = cairo_create(priv->source_sel.surface);      cairo_t *cr = cairo_create(priv->source_sel.surface);
782      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
783      cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.0);      cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.0);
# Line 779  osd_render_source_sel(osm_gps_map_osd_t Line 810  osd_render_source_sel(osm_gps_map_osd_t
810      cairo_stroke (cr);      cairo_stroke (cr);
811    
812      cairo_destroy(cr);      cairo_destroy(cr);
813        FOUT;
814  }  }
815    
816  /* re-allocate the buffer used to draw the menu. This is used */  /* re-allocate the buffer used to draw the menu. This is used */
817  /* to collapse/expand the buffer */  /* to collapse/expand the buffer */
818  static void  static void
819  osd_source_reallocate(osm_gps_map_osd_t *osd) {  osd_source_reallocate(osm_gps_map_osd_t *osd) {
820        FIN;
821      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
822    
823      /* re-allocate offscreen bitmap */      /* re-allocate offscreen bitmap */
# Line 795  osd_source_reallocate(osm_gps_map_osd_t Line 828  osd_source_reallocate(osm_gps_map_osd_t
828          cairo_text_extents_t extents;          cairo_text_extents_t extents;
829    
830          /* determine content size */          /* determine content size */
831            g_assert(priv->source_sel.surface);
832          cairo_t *cr = cairo_create(priv->source_sel.surface);          cairo_t *cr = cairo_create(priv->source_sel.surface);
833          cairo_select_font_face (cr, "Sans",          cairo_select_font_face (cr, "Sans",
834                                  CAIRO_FONT_SLANT_NORMAL,                                  CAIRO_FONT_SLANT_NORMAL,
# Line 825  osd_source_reallocate(osm_gps_map_osd_t Line 859  osd_source_reallocate(osm_gps_map_osd_t
859          cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w+2, h+2);          cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w+2, h+2);
860    
861      osd_render_source_sel(osd, TRUE);      osd_render_source_sel(osd, TRUE);
862        FOUT;
863  }  }
864    
865  #define OSD_HZ      15  #define OSD_HZ      15
866  #define OSD_TIME    500  #define OSD_TIME    500
867    
868  static gboolean osd_source_animate(gpointer data) {  static gboolean osd_source_animate(gpointer data) {
869        FIN;
870      osm_gps_map_osd_t *osd = (osm_gps_map_osd_t*)data;      osm_gps_map_osd_t *osd = (osm_gps_map_osd_t*)data;
871      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
872      int diff = OSD_S_EXP_W - OSD_S_W - OSD_S_X;      int diff = OSD_S_EXP_W - OSD_S_W - OSD_S_X;
# Line 869  static gboolean osd_source_animate(gpoin Line 905  static gboolean osd_source_animate(gpoin
905      if(done)      if(done)
906          priv->source_sel.handler_id = 0;          priv->source_sel.handler_id = 0;
907    
908        FOUT;
909      return !done;      return !done;
910  }  }
911    
# Line 876  static gboolean osd_source_animate(gpoin Line 913  static gboolean osd_source_animate(gpoin
913  static void  static void
914  osd_source_toggle(osm_gps_map_osd_t *osd)  osd_source_toggle(osm_gps_map_osd_t *osd)
915  {  {
916        FIN;
917      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
918    
919      /* ignore clicks while animation is running */      /* ignore clicks while animation is running */
# Line 901  osd_source_toggle(osm_gps_map_osd_t *osd Line 939  osd_source_toggle(osm_gps_map_osd_t *osd
939      /* start timer to handle animation */      /* start timer to handle animation */
940      priv->source_sel.handler_id = gtk_timeout_add(OSD_TIME/OSD_HZ,      priv->source_sel.handler_id = gtk_timeout_add(OSD_TIME/OSD_HZ,
941                                                    osd_source_animate, osd);                                                    osd_source_animate, osd);
942        FOUT;
943  }  }
944    
945  /* check if the user clicked inside the source selection area */  /* check if the user clicked inside the source selection area */
946  static osd_button_t  static osd_button_t
947  osd_source_check(osm_gps_map_osd_t *osd, gboolean down, gint x, gint y) {  osd_source_check(osm_gps_map_osd_t *osd, gboolean down, gint x, gint y) {
948        FIN;
949      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
950    
951      if(!priv->source_sel.expanded)      if(!priv->source_sel.expanded)
# Line 963  osd_source_check(osm_gps_map_osd_t *osd, Line 1003  osd_source_check(osm_gps_map_osd_t *osd,
1003                      osm_gps_map_repaint(OSM_GPS_MAP(osd->widget));                      osm_gps_map_repaint(OSM_GPS_MAP(osd->widget));
1004                  }                  }
1005              }              }
1006    
1007              /* return "clicked in OSD background" to prevent further */              /* return "clicked in OSD background" to prevent further */
1008              /* processing by application */              /* processing by application */
1009              return OSD_BG;              return OSD_BG;
1010          }          }
1011      }      }
1012    
1013        FOUT;
1014      return OSD_NONE;      return OSD_NONE;
1015  }  }
1016  #endif // OSD_SOURCE_SEL  #endif // OSD_SOURCE_SEL
1017    
 static osd_button_t  
 osd_check_int(osm_gps_map_osd_t *osd, gboolean click, gboolean down, gint x, gint y) {  
     osd_button_t but = OSD_NONE;  
   
 #ifdef OSD_BALLOON  
     if(down) {  
         /* needed to handle balloons that are created at click */  
         osd_priv_t *priv = (osd_priv_t*)osd->priv;  
         priv->balloon.just_created = FALSE;  
     }  
 #endif  
   
 #ifdef OSD_SOURCE_SEL  
     /* the source selection area is handles internally */  
     but = osd_source_check(osd, down, x, y);  
 #endif  
   
     if(but == OSD_NONE) {  
         gint mx = x - OSD_X;  
         gint my = y - OSD_Y;  
   
         if(OSD_X < 0)  
             mx -= (osd->widget->allocation.width - OSD_W);  
   
         if(OSD_Y < 0)  
             my -= (osd->widget->allocation.height - OSD_H);  
   
         /* first do a rough test for the OSD area. */  
         /* this is just to avoid an unnecessary detailed test */  
         if(mx > 0 && mx < OSD_W && my > 0 && my < OSD_H) {  
 #ifndef OSD_NO_DPAD  
             but = osd_check_dpad(mx, my);  
 #endif  
         }  
   
         if(but == OSD_NONE)  
             but = osd_check_zoom(mx, my);  
     }  
   
 #ifdef OSD_BALLOON  
     if(but == OSD_NONE) {  
         /* check if user clicked into balloon */  
         if(osd_balloon_check(osd, click, down, x, y))  
             but = OSD_BG;  
     }  
 #endif  
   
     return but;  
 }  
   
1018  #ifndef OSD_NO_DPAD  #ifndef OSD_NO_DPAD
1019  static void  static void
1020  osd_dpad_labels(cairo_t *cr, gint x, gint y) {  osd_dpad_labels(cairo_t *cr, gint x, gint y) {
# Line 1097  osd_zoom_labels(cairo_t *cr, gint x, gin Line 1088  osd_zoom_labels(cairo_t *cr, gint x, gin
1088  #ifdef OSD_COORDINATES  #ifdef OSD_COORDINATES
1089    
1090  #ifndef OSD_COORDINATES_FONT_SIZE  #ifndef OSD_COORDINATES_FONT_SIZE
1091  #define OSD_COORDINATES_FONT_SIZE 12  #define OSD_COORDINATES_FONT_SIZE (12.0)
1092  #endif  #endif
1093    
1094  #define OSD_COORDINATES_OFFSET (OSD_COORDINATES_FONT_SIZE/6)  #define OSD_COORDINATES_OFFSET (OSD_COORDINATES_FONT_SIZE/6)
# Line 1164  static char Line 1155  static char
1155  /* render a string at the given screen position */  /* render a string at the given screen position */
1156  static int  static int
1157  osd_render_centered_text(cairo_t *cr, int y, int width, char *text) {  osd_render_centered_text(cairo_t *cr, int y, int width, char *text) {
1158      char *p = g_strdup(text);      FIN;
1159    
1160        if(!text) return y;
1161    
1162        char *p = g_malloc(strlen(text)+4);  // space for "...\n"
1163        strcpy(p, text);
1164    
1165      cairo_text_extents_t extents;      cairo_text_extents_t extents;
1166        memset(&extents, 0, sizeof(cairo_text_extents_t));
1167      cairo_text_extents (cr, p, &extents);      cairo_text_extents (cr, p, &extents);
1168        g_assert(extents.width != 0.0);
1169    
1170      /* check if text needs to be truncated */      /* check if text needs to be truncated */
1171      int len = strlen(text)-2;      int trunc_at = strlen(text);
1172      while(extents.width > width) {      while(extents.width > width) {
1173          len--;  
1174          strcpy(p+len, "...");          /* cut off all utf8 multibyte remains so the actual */
1175            /* truncation only deals with one byte */
1176            while((p[trunc_at-1] & 0xc0) == 0x80) {
1177                trunc_at--;
1178                g_assert(trunc_at > 0);
1179            }
1180    
1181            trunc_at--;
1182            g_assert(trunc_at > 0);
1183    
1184            strcpy(p+trunc_at, "...");
1185          cairo_text_extents (cr, p, &extents);          cairo_text_extents (cr, p, &extents);
1186      }      }
1187    
# Line 1188  osd_render_centered_text(cairo_t *cr, in Line 1197  osd_render_centered_text(cairo_t *cr, in
1197    
1198      g_free(p);      g_free(p);
1199    
1200      /* skip + 1/4 line */      /* skip + 1/5 line */
1201      return y + 5*OSD_COORDINATES_FONT_SIZE/4;      FOUT;
1202        return y + 6*OSD_COORDINATES_FONT_SIZE/5;
1203  }  }
1204    
1205  static void  static void
1206  osd_render_coordinates(osm_gps_map_osd_t *osd)  osd_render_coordinates(osm_gps_map_osd_t *osd)
1207  {  {
1208        FIN;
1209      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
1210    
1211        if(!priv->coordinates.surface)
1212            return;
1213    
1214      /* get current map position */      /* get current map position */
1215      gfloat lat, lon;      gfloat lat, lon;
1216      g_object_get(osd->widget, "latitude", &lat, "longitude", &lon, NULL);      g_object_get(osd->widget, "latitude", &lat, "longitude", &lon, NULL);
# Line 1212  osd_render_coordinates(osm_gps_map_osd_t Line 1226  osd_render_coordinates(osm_gps_map_osd_t
1226      priv->coordinates.lon = lon;      priv->coordinates.lon = lon;
1227    
1228      /* first fill with transparency */      /* first fill with transparency */
1229    
1230        g_assert(priv->coordinates.surface);
1231      cairo_t *cr = cairo_create(priv->coordinates.surface);      cairo_t *cr = cairo_create(priv->coordinates.surface);
1232      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
1233      //    cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.5);      //    cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.5);
# Line 1235  osd_render_coordinates(osm_gps_map_osd_t Line 1251  osd_render_coordinates(osm_gps_map_osd_t
1251      g_free(longitude);      g_free(longitude);
1252    
1253      cairo_destroy(cr);      cairo_destroy(cr);
1254        FOUT;
1255  }  }
1256  #endif  // OSD_COORDINATES  #endif  // OSD_COORDINATES
1257    
# Line 1262  static float get_distance(float lat1, fl Line 1279  static float get_distance(float lat1, fl
1279  static void  static void
1280  osd_render_nav(osm_gps_map_osd_t *osd)  osd_render_nav(osm_gps_map_osd_t *osd)
1281  {  {
1282        FIN;
1283      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
1284    
1285      if(!priv->nav.surface || isnan(priv->nav.lat) || isnan(priv->nav.lon))      if(!priv->nav.surface || isnan(priv->nav.lat) || isnan(priv->nav.lon))
1286          return;          return;
1287    
1288      /* first fill with transparency */      /* first fill with transparency */
1289        g_assert(priv->nav.surface);
1290      cairo_t *cr = cairo_create(priv->nav.surface);      cairo_t *cr = cairo_create(priv->nav.surface);
1291      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
1292      cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.0);      cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.0);
# Line 1366  osd_render_nav(osm_gps_map_osd_t *osd) Line 1385  osd_render_nav(osm_gps_map_osd_t *osd)
1385      }      }
1386    
1387      cairo_destroy(cr);      cairo_destroy(cr);
1388        FOUT;
1389    }
1390    
1391    /* check if the user clicked inside the source selection area */
1392    static osd_button_t
1393    osd_nav_check(osm_gps_map_osd_t *osd, gboolean down, gint x, gint y) {
1394        FIN;
1395        osd_priv_t *priv = (osd_priv_t*)osd->priv;
1396    
1397        if(!priv->nav.surface || down)
1398            return OSD_NONE;
1399    
1400        x -= OSD_X;
1401        if(OSD_X < 0)
1402            x -= (osd->widget->allocation.width - OSD_NAV_W);
1403    
1404        y -= (osd->widget->allocation.height - OSD_NAV_H)/2;
1405    
1406        if(x >= 0 && y >= 0 && x <= OSD_NAV_W && y <= OSD_NAV_H) {
1407            printf("***************************\n");
1408            printf("clicked inside nav: %d %d\n", x, y);
1409            printf("***************************\n");
1410        }
1411    
1412        return OSD_NONE;
1413  }  }
1414    
1415  void osm_gps_map_osd_clear_nav (OsmGpsMap *map) {  void osm_gps_map_osd_clear_nav (OsmGpsMap *map) {
1416        FIN;
1417      g_return_if_fail (OSM_IS_GPS_MAP (map));      g_return_if_fail (OSM_IS_GPS_MAP (map));
1418    
1419      osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);      osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);
# Line 1385  void osm_gps_map_osd_clear_nav (OsmGpsMa Line 1430  void osm_gps_map_osd_clear_nav (OsmGpsMa
1430          if(priv->nav.name) g_free(priv->nav.name);          if(priv->nav.name) g_free(priv->nav.name);
1431      }      }
1432      osm_gps_map_redraw(map);      osm_gps_map_redraw(map);
1433        FOUT;
1434  }  }
1435    
1436  void  void
1437  osm_gps_map_osd_draw_nav (OsmGpsMap *map, gboolean imperial,  osm_gps_map_osd_draw_nav (OsmGpsMap *map, gboolean imperial,
1438                            float latitude, float longitude, char *name) {                            float latitude, float longitude, char *name) {
1439        FIN;
1440      g_return_if_fail (OSM_IS_GPS_MAP (map));      g_return_if_fail (OSM_IS_GPS_MAP (map));
1441    
1442      osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);      osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);
# Line 1413  osm_gps_map_osd_draw_nav (OsmGpsMap *map Line 1460  osm_gps_map_osd_draw_nav (OsmGpsMap *map
1460      osd_render_nav(osd);      osd_render_nav(osd);
1461    
1462      osm_gps_map_redraw(map);      osm_gps_map_redraw(map);
1463        FOUT;
1464  }  }
1465    
1466  #endif // OSD_NAV  #endif // OSD_NAV
1467    
1468    static osd_button_t
1469    osd_check_int(osm_gps_map_osd_t *osd, gboolean click, gboolean down, gint x, gint y) {
1470        FIN;
1471        osd_button_t but = OSD_NONE;
1472    
1473    #ifdef OSD_BALLOON
1474        if(down) {
1475            /* needed to handle balloons that are created at click */
1476            osd_priv_t *priv = (osd_priv_t*)osd->priv;
1477            priv->balloon.just_created = FALSE;
1478        }
1479    #endif
1480    
1481    #ifdef OSD_SOURCE_SEL
1482        /* the source selection area is handles internally */
1483        but = osd_source_check(osd, down, x, y);
1484    #endif
1485    
1486    #ifdef OSD_NAV
1487        if(but == OSD_NONE) {
1488            /* the source selection area is handles internally */
1489            but = osd_nav_check(osd, down, x, y);
1490        }
1491    #endif
1492    
1493        if(but == OSD_NONE) {
1494            gint mx = x - OSD_X;
1495            gint my = y - OSD_Y;
1496    
1497            if(OSD_X < 0)
1498                mx -= (osd->widget->allocation.width - OSD_W);
1499    
1500            if(OSD_Y < 0)
1501                my -= (osd->widget->allocation.height - OSD_H);
1502    
1503            /* first do a rough test for the OSD area. */
1504            /* this is just to avoid an unnecessary detailed test */
1505            if(mx > 0 && mx < OSD_W && my > 0 && my < OSD_H) {
1506    #ifndef OSD_NO_DPAD
1507                but = osd_check_dpad(mx, my);
1508    #endif
1509            }
1510    
1511            if(but == OSD_NONE)
1512                but = osd_check_zoom(mx, my);
1513        }
1514    
1515    #ifdef OSD_BALLOON
1516        if(but == OSD_NONE) {
1517            /* check if user clicked into balloon */
1518            if(osd_balloon_check(osd, click, down, x, y))
1519                but = OSD_BG;
1520        }
1521    #endif
1522    
1523        FOUT;
1524        return but;
1525    }
1526    
1527    
1528  #ifdef OSD_CROSSHAIR  #ifdef OSD_CROSSHAIR
1529    
# Line 1431  osm_gps_map_osd_draw_nav (OsmGpsMap *map Line 1538  osm_gps_map_osd_draw_nav (OsmGpsMap *map
1538    
1539  static void  static void
1540  osd_render_crosshair_shape(cairo_t *cr) {  osd_render_crosshair_shape(cairo_t *cr) {
1541        FIN;
1542      cairo_arc (cr, OSD_CROSSHAIR_W/2, OSD_CROSSHAIR_H/2,      cairo_arc (cr, OSD_CROSSHAIR_W/2, OSD_CROSSHAIR_H/2,
1543                 OSD_CROSSHAIR_RADIUS, 0,  2*M_PI);                 OSD_CROSSHAIR_RADIUS, 0,  2*M_PI);
1544    
# Line 1449  osd_render_crosshair_shape(cairo_t *cr) Line 1557  osd_render_crosshair_shape(cairo_t *cr)
1557      cairo_rel_line_to (cr, 0, OSD_CROSSHAIR_TICK);      cairo_rel_line_to (cr, 0, OSD_CROSSHAIR_TICK);
1558    
1559      cairo_stroke (cr);      cairo_stroke (cr);
1560        FOUT;
1561  }  }
1562    
1563  static void  static void
1564  osd_render_crosshair(osm_gps_map_osd_t *osd)  osd_render_crosshair(osm_gps_map_osd_t *osd)
1565  {  {
1566        FIN;
1567      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
1568    
1569      if(priv->crosshair.rendered)      if(!priv->crosshair.surface || priv->crosshair.rendered)
1570          return;          return;
1571    
1572      priv->crosshair.rendered = TRUE;      priv->crosshair.rendered = TRUE;
1573    
1574      /* first fill with transparency */      /* first fill with transparency */
1575        g_assert(priv->crosshair.surface);
1576      cairo_t *cr = cairo_create(priv->crosshair.surface);      cairo_t *cr = cairo_create(priv->crosshair.surface);
1577      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
1578      cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.0);      cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.0);
# Line 1479  osd_render_crosshair(osm_gps_map_osd_t * Line 1590  osd_render_crosshair(osm_gps_map_osd_t *
1590      osd_render_crosshair_shape(cr);      osd_render_crosshair_shape(cr);
1591    
1592      cairo_destroy(cr);      cairo_destroy(cr);
1593        FOUT;
1594  }  }
1595  #endif  #endif
1596    
1597  #ifdef OSD_SCALE  #ifdef OSD_SCALE
1598    
1599  #ifndef OSD_SCALE_FONT_SIZE  #ifndef OSD_SCALE_FONT_SIZE
1600  #define OSD_SCALE_FONT_SIZE 12  #define OSD_SCALE_FONT_SIZE (12.0)
1601  #endif  #endif
1602  #define OSD_SCALE_W   (10*OSD_SCALE_FONT_SIZE)  #define OSD_SCALE_W   (10*OSD_SCALE_FONT_SIZE)
1603  #define OSD_SCALE_H   (5*OSD_SCALE_FONT_SIZE/2)  #define OSD_SCALE_H   (5*OSD_SCALE_FONT_SIZE/2)
# Line 1500  osd_render_crosshair(osm_gps_map_osd_t * Line 1612  osd_render_crosshair(osm_gps_map_osd_t *
1612  static void  static void
1613  osd_render_scale(osm_gps_map_osd_t *osd)  osd_render_scale(osm_gps_map_osd_t *osd)
1614  {  {
1615        FIN;
1616      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
1617    
1618        if(!priv->scale.surface)
1619            return;
1620    
1621      /* this only needs to be rendered if the zoom has changed */      /* this only needs to be rendered if the zoom has changed */
1622      gint zoom;      gint zoom;
1623      g_object_get(OSM_GPS_MAP(osd->widget), "zoom", &zoom, NULL);      g_object_get(OSM_GPS_MAP(osd->widget), "zoom", &zoom, NULL);
# Line 1513  osd_render_scale(osm_gps_map_osd_t *osd) Line 1629  osd_render_scale(osm_gps_map_osd_t *osd)
1629      float m_per_pix = osm_gps_map_get_scale(OSM_GPS_MAP(osd->widget));      float m_per_pix = osm_gps_map_get_scale(OSM_GPS_MAP(osd->widget));
1630    
1631      /* first fill with transparency */      /* first fill with transparency */
1632        g_assert(priv->scale.surface);
1633      cairo_t *cr = cairo_create(priv->scale.surface);      cairo_t *cr = cairo_create(priv->scale.surface);
1634      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
1635      cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.0);      cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.0);
# Line 1623  osd_render_scale(osm_gps_map_osd_t *osd) Line 1740  osd_render_scale(osm_gps_map_osd_t *osd)
1740      cairo_stroke(cr);      cairo_stroke(cr);
1741    
1742      cairo_destroy(cr);      cairo_destroy(cr);
1743        FOUT;
1744  }  }
1745  #endif  #endif
1746    
1747  static void  static void
1748  osd_render_controls(osm_gps_map_osd_t *osd)  osd_render_controls(osm_gps_map_osd_t *osd)
1749  {  {
1750        FIN;
1751      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
1752    
1753        if(!priv->controls.surface)
1754            return;
1755    
1756      if(priv->controls.rendered      if(priv->controls.rendered
1757  #ifdef OSD_GPS_BUTTON  #ifdef OSD_GPS_BUTTON
1758         && (priv->controls.gps_enabled == (osd->cb != NULL))         && (priv->controls.gps_enabled == (osd->cb != NULL))
# Line 1650  osd_render_controls(osm_gps_map_osd_t *o Line 1772  osd_render_controls(osm_gps_map_osd_t *o
1772  #endif  #endif
1773    
1774      /* first fill with transparency */      /* first fill with transparency */
1775        g_assert(priv->controls.surface);
1776      cairo_t *cr = cairo_create(priv->controls.surface);      cairo_t *cr = cairo_create(priv->controls.surface);
1777      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
1778      cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.0);      cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.0);
# Line 1902  osd_draw(osm_gps_map_osd_t *osd, GdkDraw Line 2025  osd_draw(osm_gps_map_osd_t *osd, GdkDraw
2025  #endif  #endif
2026    
2027      cairo_destroy(cr);      cairo_destroy(cr);
2028        FOUT;
2029  }  }
2030    
2031  static void  static void
2032  osd_free(osm_gps_map_osd_t *osd)  osd_free(osm_gps_map_osd_t *osd)
2033  {  {
2034        FIN;
2035      osd_priv_t *priv = (osd_priv_t *)(osd->priv);      osd_priv_t *priv = (osd_priv_t *)(osd->priv);
2036    
2037      if (priv->controls.surface)      if (priv->controls.surface)
# Line 1946  osd_free(osm_gps_map_osd_t *osd) Line 2071  osd_free(osm_gps_map_osd_t *osd)
2071  #endif  #endif
2072    
2073      g_free(priv);      g_free(priv);
2074        FOUT;
2075  }  }
2076    
2077  static gboolean  static gboolean
2078  osd_busy(osm_gps_map_osd_t *osd)  osd_busy(osm_gps_map_osd_t *osd)
2079  {  {
2080        FIN;
2081  #ifdef OSD_SOURCE_SEL  #ifdef OSD_SOURCE_SEL
2082      osd_priv_t *priv = (osd_priv_t *)(osd->priv);      osd_priv_t *priv = (osd_priv_t *)(osd->priv);
2083      return (priv->source_sel.handler_id != 0);      return (priv->source_sel.handler_id != 0);
# Line 1961  osd_busy(osm_gps_map_osd_t *osd) Line 2088  osd_busy(osm_gps_map_osd_t *osd)
2088    
2089  static osd_button_t  static osd_button_t
2090  osd_check(osm_gps_map_osd_t *osd, gboolean down, gint x, gint y) {  osd_check(osm_gps_map_osd_t *osd, gboolean down, gint x, gint y) {
2091        FIN;
2092      return osd_check_int(osd, TRUE, down, x, y);      return osd_check_int(osd, TRUE, down, x, y);
2093  }  }
2094    
# Line 1983  static osm_gps_map_osd_t osd_classic = { Line 2111  static osm_gps_map_osd_t osd_classic = {
2111  void  void
2112  osm_gps_map_osd_classic_init(OsmGpsMap *map)  osm_gps_map_osd_classic_init(OsmGpsMap *map)
2113  {  {
2114        FIN;
2115      osd_priv_t *priv = osd_classic.priv = g_new0(osd_priv_t, 1);      osd_priv_t *priv = osd_classic.priv = g_new0(osd_priv_t, 1);
2116    
2117  #ifdef OSD_BALLOON  #ifdef OSD_BALLOON
# Line 1993  osm_gps_map_osd_classic_init(OsmGpsMap * Line 2122  osm_gps_map_osd_classic_init(OsmGpsMap *
2122      osd_classic.priv = priv;      osd_classic.priv = priv;
2123    
2124      osm_gps_map_register_osd(map, &osd_classic);      osm_gps_map_register_osd(map, &osd_classic);
2125        FOUT;
2126  }  }
2127    
2128  #ifdef OSD_GPS_BUTTON  #ifdef OSD_GPS_BUTTON
# Line 2000  osm_gps_map_osd_classic_init(OsmGpsMap * Line 2130  osm_gps_map_osd_classic_init(OsmGpsMap *
2130  /* but instead are to be used by the main application */  /* but instead are to be used by the main application */
2131  void osm_gps_map_osd_enable_gps (OsmGpsMap *map, OsmGpsMapOsdCallback cb,  void osm_gps_map_osd_enable_gps (OsmGpsMap *map, OsmGpsMapOsdCallback cb,
2132                                   gpointer data) {                                   gpointer data) {
2133        FIN;
2134      osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);      osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);
2135      g_return_if_fail (osd);      g_return_if_fail (osd);
2136    
# Line 2011  void osm_gps_map_osd_enable_gps (OsmGpsM Line 2142  void osm_gps_map_osd_enable_gps (OsmGpsM
2142      osd->render(osd);      osd->render(osd);
2143    
2144      osm_gps_map_redraw(map);      osm_gps_map_redraw(map);
2145        FOUT;
2146  }  }
2147  #endif  #endif
2148    
2149  osd_button_t  osd_button_t
2150  osm_gps_map_osd_check(OsmGpsMap *map, gint x, gint y) {  osm_gps_map_osd_check(OsmGpsMap *map, gint x, gint y) {
2151        FIN;
2152      osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);      osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);
2153      g_return_val_if_fail (osd, OSD_NONE);      g_return_val_if_fail (osd, OSD_NONE);
2154    

Legend:
Removed from v.136  
changed lines
  Added in v.201