--- trunk/src/osm-gps-map.c 2009/08/24 12:57:15 75 +++ trunk/src/osm-gps-map.c 2009/08/25 12:49:03 77 @@ -49,6 +49,23 @@ #define EXTRA_BORDER (TILESIZE / 2) +#define OSM_GPS_MAP_SCROLL_STEP 10 + +/* any defined key enables key support */ +#if (defined(OSM_GPS_MAP_KEY_FULLSCREEN) || \ + defined(OSM_GPS_MAP_KEY_ZOOMIN) || \ + defined(OSM_GPS_MAP_KEY_ZOOMOUT) || \ + defined(OSM_GPS_MAP_KEY_UP) || \ + defined(OSM_GPS_MAP_KEY_DOWN) || \ + defined(OSM_GPS_MAP_KEY_LEFT) || \ + defined(OSM_GPS_MAP_KEY_RIGHT)) +#define OSM_GPS_MAP_KEYS +#endif + +#ifdef OSM_GPS_MAP_KEYS +#include +#endif + struct _OsmGpsMapPrivate { GHashTable *tile_queue; @@ -116,6 +133,10 @@ GdkPixmap *dbuf_pixmap; #endif #endif + +#ifdef OSM_GPS_MAP_KEY_FULLSCREEN + gboolean fullscreen; +#endif //additional images or tracks added to the map GSList *tracks; @@ -1470,6 +1491,89 @@ priv->idle_map_redraw = g_idle_add ((GSourceFunc)osm_gps_map_map_redraw, map); } +#ifdef OSM_GPS_MAP_KEYS +static gboolean +on_window_key_press(GtkWidget *widget, + GdkEventKey *event, OsmGpsMapPrivate *priv) { + gboolean handled = FALSE; + int step = GTK_WIDGET(widget)->allocation.width/OSM_GPS_MAP_SCROLL_STEP; + + printf("key event with keyval %x\n", event->keyval); + + // the map handles some keys on its own ... + switch(event->keyval) { +#ifdef OSM_GPS_MAP_KEY_FULLSCREEN + case OSM_GPS_MAP_KEY_FULLSCREEN: { + GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(widget)); + if(!priv->fullscreen) + gtk_window_fullscreen(GTK_WINDOW(toplevel)); + else + gtk_window_unfullscreen(GTK_WINDOW(toplevel)); + + priv->fullscreen = !priv->fullscreen; + handled = TRUE; + } break; +#endif + +#ifdef OSM_GPS_MAP_KEY_ZOOMIN + case OSM_GPS_MAP_KEY_ZOOMIN: + osm_gps_map_set_zoom(OSM_GPS_MAP(widget), priv->map_zoom+1); + handled = TRUE; + break; +#endif + +#ifdef OSM_GPS_MAP_KEY_ZOOMOUT + case OSM_GPS_MAP_KEY_ZOOMOUT: + osm_gps_map_set_zoom(OSM_GPS_MAP(widget), priv->map_zoom-1); + handled = TRUE; + break; +#endif + +#ifdef OSM_GPS_MAP_KEY_UP + case OSM_GPS_MAP_KEY_UP: + priv->map_y -= step; + priv->center_coord_set = FALSE; + osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); + handled = TRUE; + break; +#endif + +#ifdef OSM_GPS_MAP_KEY_DOWN + case OSM_GPS_MAP_KEY_DOWN: + priv->map_y += step; + priv->center_coord_set = FALSE; + osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); + handled = TRUE; + break; +#endif + +#ifdef OSM_GPS_MAP_KEY_LEFT + case OSM_GPS_MAP_KEY_LEFT: + priv->map_x -= step; + priv->center_coord_set = FALSE; + osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); + handled = TRUE; + break; +#endif + +#ifdef OSM_GPS_MAP_KEY_RIGHT + case OSM_GPS_MAP_KEY_RIGHT: + priv->map_x += step; + priv->center_coord_set = FALSE; + osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); + handled = TRUE; + break; +#endif + + default: + printf("unhandled key event with keyval %x\n", event->keyval); + break; + } + + return handled; +} +#endif + static void osm_gps_map_init (OsmGpsMap *object) { @@ -1494,6 +1598,10 @@ priv->osd = NULL; #endif +#ifdef OSM_GPS_MAP_BUTTON_FULLSCREEN + priv->fullscreen = FALSE; +#endif + priv->tracks = NULL; priv->images = NULL; @@ -1538,23 +1646,13 @@ GTK_WIDGET_SET_FLAGS (object, GTK_CAN_FOCUS); g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MASK, my_log_handler, NULL); -} -#ifndef G_CHECKSUM_MD5 -/* simple hash algorithm hack if md5 is not present */ -static char *simple_hash(char *str) { - union { - char str[4]; - gulong val; - } hash = { .val = 0x55555555 }; - - while(*str) { - hash.str[(int)str & 3] ^= *str; - str++; - } - return g_strdup_printf("%08lX", hash.val); -} +#ifdef OSM_GPS_MAP_KEYS + // GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(object)); + g_signal_connect(G_OBJECT(object), "key_press_event", + G_CALLBACK(on_window_key_press), priv); #endif +} static GObject * osm_gps_map_constructor (GType gtype, guint n_properties, GObjectConstructParam *properties) @@ -1594,24 +1692,19 @@ } if (!priv->cache_dir_is_full_path) { -#ifdef G_CHECKSUM_MD5 - char *md5 = g_compute_checksum_for_string (G_CHECKSUM_MD5, priv->repo_uri, -1); -#else - char *md5 = simple_hash(priv->repo_uri); -#endif + const char *fname = osm_gps_map_source_get_friendly_name(priv->map_source); + if(!fname) fname = "_unknown_"; if (priv->cache_dir) { char *old = priv->cache_dir; //the new cachedir is the given cache dir + the md5 of the repo_uri - priv->cache_dir = g_strdup_printf("%s%c%s", old, G_DIR_SEPARATOR, md5); + priv->cache_dir = g_strdup_printf("%s%c%s", old, G_DIR_SEPARATOR, fname); g_debug("Adjusting cache dir %s -> %s", old, priv->cache_dir); g_free(old); } else { //the new cachedir is the current dir + the md5 of the repo_uri - priv->cache_dir = g_strdup(md5); + priv->cache_dir = g_strdup(fname); } - - g_free(md5); } inspect_map_uri(map); @@ -1894,34 +1987,37 @@ #endif #ifdef ENABLE_OSD - #define SCROLL_STEP 10 - /* pressed inside OSD control? */ if(priv->osd) { - osd_button_t but = priv->osd->check(event->x, event->y); + osd_button_t but = priv->osd->check(priv->osd, event->x, event->y); if(but != OSD_NONE) { + int step = GTK_WIDGET(widget)->allocation.width/OSM_GPS_MAP_SCROLL_STEP; priv->drag_counter = -1; switch(but) { case OSD_UP: - priv->map_y -= GTK_WIDGET(widget)->allocation.height/SCROLL_STEP; + priv->map_y -= step; priv->center_coord_set = FALSE; + osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); break; case OSD_DOWN: - priv->map_y += GTK_WIDGET(widget)->allocation.height/SCROLL_STEP; + priv->map_y += step; priv->center_coord_set = FALSE; + osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); break; case OSD_LEFT: - priv->map_x -= GTK_WIDGET(widget)->allocation.width/SCROLL_STEP; + priv->map_x -= step; priv->center_coord_set = FALSE; + osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); break; case OSD_RIGHT: - priv->map_x += GTK_WIDGET(widget)->allocation.width/SCROLL_STEP; + priv->map_x += step; priv->center_coord_set = FALSE; + osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); break; case OSD_IN: @@ -1939,8 +2035,6 @@ break; } - osm_gps_map_map_redraw_idle(OSM_GPS_MAP(widget)); - return FALSE; } }