66 |
#include <gdk/gdkkeysyms.h> |
#include <gdk/gdkkeysyms.h> |
67 |
#endif |
#endif |
68 |
|
|
69 |
|
#define USER_AGENT "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11" |
70 |
|
|
71 |
struct _OsmGpsMapPrivate |
struct _OsmGpsMapPrivate |
72 |
{ |
{ |
73 |
GHashTable *tile_queue; |
GHashTable *tile_queue; |
97 |
char *proxy_uri; |
char *proxy_uri; |
98 |
|
|
99 |
//where downloaded tiles are cached |
//where downloaded tiles are cached |
100 |
|
char *tile_dir; |
101 |
char *cache_dir; |
char *cache_dir; |
102 |
|
|
103 |
//contains flags indicating the various special characters |
//contains flags indicating the various special characters |
351 |
inspect_map_uri(OsmGpsMap *map) |
inspect_map_uri(OsmGpsMap *map) |
352 |
{ |
{ |
353 |
OsmGpsMapPrivate *priv = map->priv; |
OsmGpsMapPrivate *priv = map->priv; |
354 |
|
priv->uri_format = 0; |
355 |
|
priv->the_google = FALSE; |
356 |
|
|
357 |
if (g_strrstr(priv->repo_uri, URI_MARKER_X)) |
if (g_strrstr(priv->repo_uri, URI_MARKER_X)) |
358 |
priv->uri_format |= URI_HAS_X; |
priv->uri_format |= URI_HAS_X; |
1099 |
} |
} |
1100 |
} |
} |
1101 |
|
|
1102 |
|
#ifdef LIBSOUP22 |
1103 |
|
soup_message_headers_append(msg->request_headers, |
1104 |
|
"User-Agent", USER_AGENT); |
1105 |
|
#endif |
1106 |
|
|
1107 |
g_hash_table_insert (priv->tile_queue, dl->uri, msg); |
g_hash_table_insert (priv->tile_queue, dl->uri, msg); |
1108 |
soup_session_queue_message (priv->soup_session, msg, osm_gps_map_tile_download_complete, dl); |
soup_session_queue_message (priv->soup_session, msg, osm_gps_map_tile_download_complete, dl); |
1109 |
} else { |
} else { |
1456 |
|
|
1457 |
priv->idle_map_redraw = 0; |
priv->idle_map_redraw = 0; |
1458 |
|
|
1459 |
|
/* don't redraw the entire map while the OSD is doing */ |
1460 |
|
/* some animation or the like. This is to keep the animation */ |
1461 |
|
/* fluid */ |
1462 |
|
if (priv->osd->busy(priv->osd)) |
1463 |
|
return FALSE; |
1464 |
|
|
1465 |
/* the motion_notify handler uses priv->pixmap to redraw the area; if we |
/* the motion_notify handler uses priv->pixmap to redraw the area; if we |
1466 |
* change it while we are dragging, we will end up showing it in the wrong |
* change it while we are dragging, we will end up showing it in the wrong |
1467 |
* place. This could be fixed by carefully recompute the coordinates, but |
* place. This could be fixed by carefully recompute the coordinates, but |
1512 |
gboolean handled = FALSE; |
gboolean handled = FALSE; |
1513 |
int step = GTK_WIDGET(widget)->allocation.width/OSM_GPS_MAP_SCROLL_STEP; |
int step = GTK_WIDGET(widget)->allocation.width/OSM_GPS_MAP_SCROLL_STEP; |
1514 |
|
|
|
printf("key event with keyval %x\n", event->keyval); |
|
|
|
|
1515 |
// the map handles some keys on its own ... |
// the map handles some keys on its own ... |
1516 |
switch(event->keyval) { |
switch(event->keyval) { |
1517 |
#ifdef OSM_GPS_MAP_KEY_FULLSCREEN |
#ifdef OSM_GPS_MAP_KEY_FULLSCREEN |
1578 |
#endif |
#endif |
1579 |
|
|
1580 |
default: |
default: |
|
printf("unhandled key event with keyval %x\n", event->keyval); |
|
1581 |
break; |
break; |
1582 |
} |
} |
1583 |
|
|
1629 |
|
|
1630 |
#ifndef LIBSOUP22 |
#ifndef LIBSOUP22 |
1631 |
//Change naumber of concurrent connections option? |
//Change naumber of concurrent connections option? |
1632 |
priv->soup_session = soup_session_async_new_with_options( |
priv->soup_session = |
1633 |
SOUP_SESSION_USER_AGENT, |
soup_session_async_new_with_options(SOUP_SESSION_USER_AGENT, |
1634 |
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11", |
USER_AGENT, NULL); |
|
NULL); |
|
1635 |
#else |
#else |
1636 |
/* libsoup-2.2 seems not to be able to set the user agent */ |
/* libsoup-2.2 has no special way to set the user agent, so we */ |
1637 |
|
/* set it seperately as an extra header field for each reuest */ |
1638 |
priv->soup_session = soup_session_async_new(); |
priv->soup_session = soup_session_async_new(); |
1639 |
#endif |
#endif |
1640 |
|
|
1659 |
g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MASK, my_log_handler, NULL); |
g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MASK, my_log_handler, NULL); |
1660 |
|
|
1661 |
#ifdef OSM_GPS_MAP_KEYS |
#ifdef OSM_GPS_MAP_KEYS |
|
// GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(object)); |
|
1662 |
g_signal_connect(G_OBJECT(object), "key_press_event", |
g_signal_connect(G_OBJECT(object), "key_press_event", |
1663 |
G_CALLBACK(on_window_key_press), priv); |
G_CALLBACK(on_window_key_press), priv); |
1664 |
#endif |
#endif |
1665 |
} |
} |
1666 |
|
|
1667 |
static GObject * |
static void |
1668 |
osm_gps_map_constructor (GType gtype, guint n_properties, GObjectConstructParam *properties) |
osm_gps_map_setup(OsmGpsMapPrivate *priv) { |
|
{ |
|
|
GObject *object; |
|
|
OsmGpsMapPrivate *priv; |
|
|
OsmGpsMap *map; |
|
1669 |
const char *uri; |
const char *uri; |
1670 |
|
|
|
//Always chain up to the parent constructor |
|
|
object = G_OBJECT_CLASS(osm_gps_map_parent_class)->constructor(gtype, n_properties, properties); |
|
|
map = OSM_GPS_MAP(object); |
|
|
priv = OSM_GPS_MAP_PRIVATE(object); |
|
|
|
|
1671 |
//user can specify a map source ID, or a repo URI as the map source |
//user can specify a map source ID, or a repo URI as the map source |
1672 |
uri = osm_gps_map_source_get_repo_uri(OSM_GPS_MAP_SOURCE_NULL); |
uri = osm_gps_map_source_get_repo_uri(OSM_GPS_MAP_SOURCE_NULL); |
1673 |
if ( (priv->map_source == 0) || (strcmp(priv->repo_uri, uri) == 0) ) { |
if ( (priv->map_source == 0) || (strcmp(priv->repo_uri, uri) == 0) ) { |
1695 |
const char *fname = osm_gps_map_source_get_friendly_name(priv->map_source); |
const char *fname = osm_gps_map_source_get_friendly_name(priv->map_source); |
1696 |
if(!fname) fname = "_unknown_"; |
if(!fname) fname = "_unknown_"; |
1697 |
|
|
1698 |
if (priv->cache_dir) { |
if (priv->tile_dir) { |
1699 |
char *old = priv->cache_dir; |
//the new cachedir is the given cache dir + the friendly name of the repo_uri |
1700 |
//the new cachedir is the given cache dir + the md5 of the repo_uri |
priv->cache_dir = g_strdup_printf("%s%c%s", priv->tile_dir, G_DIR_SEPARATOR, fname); |
1701 |
priv->cache_dir = g_strdup_printf("%s%c%s", old, G_DIR_SEPARATOR, fname); |
g_debug("Adjusting cache dir %s -> %s", priv->tile_dir, priv->cache_dir); |
|
g_debug("Adjusting cache dir %s -> %s", old, priv->cache_dir); |
|
|
g_free(old); |
|
1702 |
} |
} |
1703 |
|
} |
1704 |
|
|
1705 |
|
static GObject * |
1706 |
|
osm_gps_map_constructor (GType gtype, guint n_properties, GObjectConstructParam *properties) |
1707 |
|
{ |
1708 |
|
//Always chain up to the parent constructor |
1709 |
|
GObject *object = |
1710 |
|
G_OBJECT_CLASS(osm_gps_map_parent_class)->constructor(gtype, n_properties, properties); |
1711 |
|
|
1712 |
inspect_map_uri(map); |
osm_gps_map_setup(OSM_GPS_MAP_PRIVATE(object)); |
1713 |
|
|
1714 |
|
inspect_map_uri(OSM_GPS_MAP(object)); |
1715 |
|
|
1716 |
return object; |
return object; |
1717 |
} |
} |
1773 |
OsmGpsMap *map = OSM_GPS_MAP(object); |
OsmGpsMap *map = OSM_GPS_MAP(object); |
1774 |
OsmGpsMapPrivate *priv = map->priv; |
OsmGpsMapPrivate *priv = map->priv; |
1775 |
|
|
1776 |
g_free(priv->cache_dir); |
if(priv->tile_dir) |
1777 |
|
g_free(priv->tile_dir); |
1778 |
|
|
1779 |
|
if(priv->cache_dir) |
1780 |
|
g_free(priv->cache_dir); |
1781 |
|
|
1782 |
g_free(priv->repo_uri); |
g_free(priv->repo_uri); |
1783 |
g_free(priv->image_format); |
g_free(priv->image_format); |
1784 |
|
|
1835 |
break; |
break; |
1836 |
case PROP_TILE_CACHE_DIR: |
case PROP_TILE_CACHE_DIR: |
1837 |
if ( g_value_get_string(value) ) |
if ( g_value_get_string(value) ) |
1838 |
priv->cache_dir = g_value_dup_string (value); |
priv->tile_dir = g_value_dup_string (value); |
1839 |
break; |
break; |
1840 |
case PROP_ZOOM: |
case PROP_ZOOM: |
1841 |
priv->map_zoom = g_value_get_int (value); |
priv->map_zoom = g_value_get_int (value); |
1863 |
case PROP_GPS_POINT_R2: |
case PROP_GPS_POINT_R2: |
1864 |
priv->ui_gps_point_outer_radius = g_value_get_int (value); |
priv->ui_gps_point_outer_radius = g_value_get_int (value); |
1865 |
break; |
break; |
1866 |
case PROP_MAP_SOURCE: |
case PROP_MAP_SOURCE: { |
1867 |
|
gint old = priv->map_source; |
1868 |
priv->map_source = g_value_get_int (value); |
priv->map_source = g_value_get_int (value); |
1869 |
break; |
if(old >= OSM_GPS_MAP_SOURCE_NULL && |
1870 |
|
priv->map_source != old && |
1871 |
|
priv->map_source >= OSM_GPS_MAP_SOURCE_NULL && |
1872 |
|
priv->map_source <= OSM_GPS_MAP_SOURCE_LAST) { |
1873 |
|
|
1874 |
|
/* we now have to switch the entire map */ |
1875 |
|
|
1876 |
|
/* flush the ram cache */ |
1877 |
|
g_hash_table_remove_all(priv->tile_cache); |
1878 |
|
|
1879 |
|
osm_gps_map_setup(priv); |
1880 |
|
|
1881 |
|
inspect_map_uri(map); |
1882 |
|
|
1883 |
|
/* adjust zoom if necessary */ |
1884 |
|
if(priv->map_zoom > priv->max_zoom) |
1885 |
|
osm_gps_map_set_zoom(map, priv->max_zoom); |
1886 |
|
|
1887 |
|
if(priv->map_zoom < priv->min_zoom) |
1888 |
|
osm_gps_map_set_zoom(map, priv->min_zoom); |
1889 |
|
|
1890 |
|
} } break; |
1891 |
case PROP_IMAGE_FORMAT: |
case PROP_IMAGE_FORMAT: |
1892 |
priv->image_format = g_value_dup_string (value); |
priv->image_format = g_value_dup_string (value); |
1893 |
break; |
break; |
2221 |
GdkDrawable *drawable = widget->window; |
GdkDrawable *drawable = widget->window; |
2222 |
#endif |
#endif |
2223 |
|
|
2224 |
if (!priv->dragging) |
if (!priv->dragging && event) |
2225 |
{ |
{ |
2226 |
gdk_draw_drawable (drawable, |
gdk_draw_drawable (drawable, |
2227 |
widget->style->fg_gc[GTK_WIDGET_STATE (widget)], |
widget->style->fg_gc[GTK_WIDGET_STATE (widget)], |
2491 |
-1, /* minimum property value */ |
-1, /* minimum property value */ |
2492 |
G_MAXINT, /* maximum property value */ |
G_MAXINT, /* maximum property value */ |
2493 |
-1, |
-1, |
2494 |
G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); |
G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT)); |
2495 |
|
|
2496 |
g_object_class_install_property (object_class, |
g_object_class_install_property (object_class, |
2497 |
PROP_IMAGE_FORMAT, |
PROP_IMAGE_FORMAT, |
2510 |
case OSM_GPS_MAP_SOURCE_NULL: |
case OSM_GPS_MAP_SOURCE_NULL: |
2511 |
return "None"; |
return "None"; |
2512 |
case OSM_GPS_MAP_SOURCE_OPENSTREETMAP: |
case OSM_GPS_MAP_SOURCE_OPENSTREETMAP: |
2513 |
return "OpenStreetMap"; |
return "OpenStreetMap I"; |
2514 |
case OSM_GPS_MAP_SOURCE_OPENSTREETMAP_RENDERER: |
case OSM_GPS_MAP_SOURCE_OPENSTREETMAP_RENDERER: |
2515 |
return "OpenStreetMap Renderer"; |
return "OpenStreetMap II"; |
2516 |
case OSM_GPS_MAP_SOURCE_OPENCYCLEMAP: |
case OSM_GPS_MAP_SOURCE_OPENCYCLEMAP: |
2517 |
return "OpenCycleMap"; |
return "OpenCycleMap"; |
2518 |
case OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE: |
case OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE: |
2597 |
case OSM_GPS_MAP_SOURCE_OPENSTREETMAP_RENDERER: |
case OSM_GPS_MAP_SOURCE_OPENSTREETMAP_RENDERER: |
2598 |
case OSM_GPS_MAP_SOURCE_OPENCYCLEMAP: |
case OSM_GPS_MAP_SOURCE_OPENCYCLEMAP: |
2599 |
return "png"; |
return "png"; |
2600 |
|
case OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE: |
2601 |
case OSM_GPS_MAP_SOURCE_GOOGLE_STREET: |
case OSM_GPS_MAP_SOURCE_GOOGLE_STREET: |
2602 |
|
case OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE: |
2603 |
case OSM_GPS_MAP_SOURCE_GOOGLE_HYBRID: |
case OSM_GPS_MAP_SOURCE_GOOGLE_HYBRID: |
2604 |
case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_STREET: |
case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_STREET: |
2605 |
case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE: |
case OSM_GPS_MAP_SOURCE_VIRTUAL_EARTH_SATELLITE: |
2607 |
case OSM_GPS_MAP_SOURCE_YAHOO_STREET: |
case OSM_GPS_MAP_SOURCE_YAHOO_STREET: |
2608 |
case OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE: |
case OSM_GPS_MAP_SOURCE_YAHOO_SATELLITE: |
2609 |
case OSM_GPS_MAP_SOURCE_YAHOO_HYBRID: |
case OSM_GPS_MAP_SOURCE_YAHOO_HYBRID: |
|
case OSM_GPS_MAP_SOURCE_MAPS_FOR_FREE: |
|
|
case OSM_GPS_MAP_SOURCE_GOOGLE_SATELLITE: |
|
2610 |
return "jpg"; |
return "jpg"; |
2611 |
default: |
default: |
2612 |
return "bin"; |
return "bin"; |
3057 |
priv->osd = osd; |
priv->osd = osd; |
3058 |
} |
} |
3059 |
|
|
3060 |
|
void |
3061 |
|
osm_gps_map_repaint (OsmGpsMap *map) { |
3062 |
|
osm_gps_map_expose (GTK_WIDGET(map), NULL); |
3063 |
|
} |
3064 |
|
|
3065 |
#endif |
#endif |