From fc5f8ad3860b1b0c350190cb8399b33d29b2e45f Mon Sep 17 00:00:00 2001 From: Kaj-Michael Lang Date: Thu, 20 Dec 2007 15:26:35 +0200 Subject: [PATCH] A bunch of small and large code changes: - Start to move all map widget stuff to map.c in preparation to make it into a proper widget. - Use g_snprintf instead of plain snprintf - Remove speed display position setting - Prepare compass widget to use private struct for non public variables - misc other stuff --- src/announcements.c | 7 + src/cb.c | 12 +- src/config-gconf.c | 22 +-- src/gtkcompass.c | 22 ++- src/map-download.c | 25 ++-- src/map-poi.c | 6 +- src/map-poi.h | 4 +- src/map-repo.c | 30 ++--- src/map.c | 317 +++++++++++++++++++++++++++----------------- src/map.h | 14 +- src/settings-gui.c | 18 +-- src/settings.h | 2 +- src/speak.c | 2 +- src/speed-display.c | 51 ------- src/ui-common.c | 75 +++-------- src/ui-common.h | 15 --- 16 files changed, 293 insertions(+), 329 deletions(-) diff --git a/src/announcements.c b/src/announcements.c index d31e17b..ff2ee87 100644 --- a/src/announcements.c +++ b/src/announcements.c @@ -55,6 +55,13 @@ if (enable_speach) speak_text(_("You have reached your destination.")); } +void +announce_speed_limit(guint limit) +{ +if (enable_speach) + speak_text("Warning, you are over speed limit!"); +} + #if 0 void diff --git a/src/cb.c b/src/cb.c index e988bb3..ab65113 100644 --- a/src/cb.c +++ b/src/cb.c @@ -667,7 +667,7 @@ switch (event->keyval) { set_action_activate("gps_info", !_gps_info); break; case CUSTOM_ACTION_TOGGLE_SPEEDLIMIT: - _speed_limit_on ^= 1; + _speed_on ^= 1; break; default: return FALSE; @@ -703,7 +703,7 @@ unit2latlon(unitx, unity, lat, lon); lat_format(lat, tmp1); lon_format(lon, tmp2); -snprintf(buffer, sizeof(buffer), +g_snprintf(buffer, sizeof(buffer), "%s: %s\n" "%s: %s", _("Latitude"), tmp1, _("Longitude"), tmp2); @@ -717,7 +717,7 @@ gchar buffer[80]; gdouble lat, lon; unit2latlon(unitx, unity, lat, lon); -snprintf(buffer, sizeof(buffer), "%.06f,%.06f", lat, lon); +g_snprintf(buffer, sizeof(buffer), "%.06f,%.06f", lat, lon); gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), buffer, -1); } @@ -734,7 +734,7 @@ unit2latlon(unitx, unity, lat, lon); g_ascii_formatd(strlat, 32, "%.06f", lat); g_ascii_formatd(strlon, 32, "%.06f", lon); -snprintf(buffer, sizeof(buffer), "%s, %s", strlat, strlon); +g_snprintf(buffer, sizeof(buffer), "%s, %s", strlat, strlon); route_download(buffer); } @@ -747,7 +747,7 @@ gdouble lat, lon; unit2latlon(unitx, unity, lat, lon); -snprintf(buffer, sizeof(buffer), "%s: %.02lf %s", _("Distance"), +g_snprintf(buffer, sizeof(buffer), "%s: %.02lf %s", _("Distance"), calculate_distance(_gps.lat, _gps.lon, lat, lon) * UNITS_CONVERT[_units], UNITS_TEXT[_units]); MACRO_BANNER_SHOW_INFO(_window, buffer); } @@ -1118,7 +1118,7 @@ if ((way = find_nearest_waypoint(x2unit(_cmenu_position_x), y2unit(_cmenu_positi gchar buffer[BUFFER_SIZE]; GtkWidget *confirm; - snprintf(buffer, sizeof(buffer), "%s:\n%s\n", _("Confirm delete of waypoint"), way->desc); + g_snprintf(buffer, sizeof(buffer), "%s:\n%s\n", _("Confirm delete of waypoint"), way->desc); confirm = hildon_note_new_confirmation(GTK_WINDOW(_window), buffer); if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) { diff --git a/src/config-gconf.c b/src/config-gconf.c index e22cec0..32a8870 100644 --- a/src/config-gconf.c +++ b/src/config-gconf.c @@ -277,16 +277,11 @@ gconf_client_set_string(gconf_client, DEG_FORMAT_TEXT[_degformat], NULL); /* Save Speed Limit On flag. */ -gconf_client_set_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, _speed_limit_on, NULL); +gconf_client_set_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, _speed_on, NULL); /* Save Speed Limit. */ gconf_client_set_int(gconf_client, GCONF_KEY_SPEED_LIMIT, _speed_limit, NULL); -/* Save Speed Location. */ -gconf_client_set_string(gconf_client, - GCONF_KEY_SPEED_LOCATION, - SPEED_LOCATION_TEXT[_speed_location], NULL); - /* Save Info Font Size. */ gconf_client_set_string(gconf_client, GCONF_KEY_INFO_FONT_SIZE, @@ -421,7 +416,6 @@ gconf_client_add_dir (gconf_client, GCONF_KEY_PREFIX, GCONF_CLIENT_PRELOAD_ONELE CenterMode _center_mode = CENTER_LEAD; UnitType _units = UNITS_KM; guint _degformat = DDPDDDDD; -SpeedLocation _speed_location = SPEED_LOCATION_TOP_RIGHT; InfoFontSize _info_font_size = INFO_FONT_MEDIUM; /* Initialize config_dir. */ @@ -538,24 +532,12 @@ _filter_osm = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_OSM, NUL } /* Get Speed Limit On flag. Default is FALSE. */ -_speed_limit_on = gconf_client_get_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, NULL); +_speed_on = gconf_client_get_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, NULL); /* Get Speed Limit */ _speed_limit = gconf_client_get_int(gconf_client, GCONF_KEY_SPEED_LIMIT, NULL); BOUND(_speed_limit, 1, 200); -/* Get Speed Location. Default is SPEED_LOCATION_TOP_LEFT. */ -{ - gchar *speed_location_str = gconf_client_get_string(gconf_client, - GCONF_KEY_SPEED_LOCATION, NULL); - guint i = 0; - if (speed_location_str) - for (i = SPEED_LOCATION_ENUM_COUNT - 1; i > 0; i--) - if (!strcmp(speed_location_str, SPEED_LOCATION_TEXT[i])) - break; - _speed_location = i; -} - /* Get Info Font Size. Default is INFO_FONT_MEDIUM. */ { gchar *info_font_size_str = gconf_client_get_string(gconf_client, GCONF_KEY_INFO_FONT_SIZE, NULL); diff --git a/src/gtkcompass.c b/src/gtkcompass.c index 77019ba..69b2104 100644 --- a/src/gtkcompass.c +++ b/src/gtkcompass.c @@ -45,12 +45,24 @@ static gboolean gtk_compass_refresh_cb(GtkWidget *widget); G_DEFINE_TYPE(GtkCompass, gtk_compass, GTK_TYPE_WIDGET); #define BOUND(x, a, b) { \ - if((x) < (a)) \ - (x) = (a); \ - else if((x) > (b)) \ - (x) = (b); \ + if((x) < (a)) \ + (x) = (a); \ + else if((x) > (b)) \ + (x) = (b); \ } +typedef struct _GtkCompassPriv GtkCompassPriv; + +struct _GtkCompassPriv +{ +PangoContext *context; +PangoLayout *layout; +PangoFontDescription *fontdesc; +}; + +#define GTK_COMPASS_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_COMPASS, GtkCompassPriv)) + static void gtk_compass_class_init (GtkCompassClass *class) { @@ -68,6 +80,8 @@ widget_class->size_request = gtk_compass_size_request; widget_class->expose_event = gtk_compass_expose; widget_class->realize = gtk_compass_realize; widget_class->size_allocate = gtk_compass_size_allocate; + +g_type_class_add_private (object_class, sizeof (GtkCompassPriv)); } static void diff --git a/src/map-download.c b/src/map-download.c index ef8668d..f0a082a 100644 --- a/src/map-download.c +++ b/src/map-download.c @@ -157,7 +157,7 @@ while (num_transfers < (BUF_WIDTH_TILES * BUF_HEIGHT_TILES) && g_tree_nnodes(_pu if (!(f = g_fopen(pui->dest_str, "w")) && errno == ENOENT) { /* Directory doesn't exist yet - create it, then we'll retry */ gchar buffer[BUFFER_SIZE]; - snprintf(buffer, sizeof(buffer), "%s/%u/%u", + g_snprintf(buffer, sizeof(buffer), "%s/%u/%u", pui->repo->cache_dir, pui->zoom, pui->tilex); g_mkdir_with_parents(buffer, 0775); f = g_fopen(pui->dest_str, "w"); @@ -184,7 +184,7 @@ while (num_transfers < (BUF_WIDTH_TILES * BUF_HEIGHT_TILES) && g_tree_nnodes(_pu } else { /* Unable to open tile file for writing. */ gchar buffer[BUFFER_SIZE]; - snprintf(buffer, sizeof(buffer), "%s:\n%s", + g_snprintf(buffer, sizeof(buffer), "%s:\n%s", _("Failed to open file for writing"), pui->dest_str); MACRO_BANNER_SHOW_INFO(_window, buffer); @@ -197,7 +197,7 @@ while (num_transfers < (BUF_WIDTH_TILES * BUF_HEIGHT_TILES) && g_tree_nnodes(_pu g_tree_steal(_pui_tree, pui); g_tree_insert(_downloading_tree, pui, pui); - snprintf(buffer, sizeof(buffer), "%s/%u/%u/%u.jpg", + g_snprintf(buffer, sizeof(buffer), "%s/%u/%u/%u.jpg", pui->repo->cache_dir, pui->zoom, pui->tilex, pui->tiley); g_unlink(buffer); @@ -255,19 +255,15 @@ srs[srsstre - srsstr - 4] = 0; gint dwidth = widthstr ? atoi(widthstr + 6) - TILE_SIZE_PIXELS : 0; gint dheight = heightstr ? atoi(heightstr + 7) - TILE_SIZE_PIXELS : 0; -unit2latlon(tile2zunit(tilex, zoomlevel) - - pixel2zunit(dwidth / 2, zoomlevel), - tile2zunit(tiley + 1, zoomlevel) - + pixel2zunit((dheight + 1) / 2, zoomlevel), lat1, lon1); +unit2latlon(tile2zunit(tilex, zoomlevel) - pixel2zunit(dwidth / 2, zoomlevel), + tile2zunit(tiley + 1, zoomlevel) + pixel2zunit((dheight + 1) / 2, zoomlevel), lat1, lon1); -unit2latlon(tile2zunit(tilex + 1, zoomlevel) - + pixel2zunit((dwidth + 1) / 2, zoomlevel), - tile2zunit(tiley, zoomlevel) - - pixel2zunit(dheight / 2, zoomlevel), lat2, lon2); +unit2latlon(tile2zunit(tilex + 1, zoomlevel) + pixel2zunit((dwidth + 1) / 2, zoomlevel), + tile2zunit(tiley, zoomlevel) - pixel2zunit(dheight / 2, zoomlevel), lat2, lon2); setlocale(LC_NUMERIC, "C"); -snprintf(cmd, sizeof(cmd), +g_snprintf(cmd, sizeof(cmd), "(echo \"%.6f %.6f\"; echo \"%.6f %.6f\") | " "/usr/bin/cs2cs +proj=longlat +datum=WGS84 +to +init=%s -f %%.6f " " > /tmp/tmpcs2cs ", lon1, lat1, lon2, lat2, srs); @@ -370,10 +366,7 @@ if (!pui->retries || g_file_test(pui->dest_str, G_FILE_TEST_EXISTS)) { for (tilex = pui->tilex << zoom_diff, tilex_end = tilex + (1 << zoom_diff); tilex < tilex_end; tilex++) { for (tiley = pui->tiley << zoom_diff, tiley_end = tiley + (1 << zoom_diff); tiley < tiley_end; tiley++) { if ((tilex - _base_tilex) < BUF_WIDTH_TILES && (tiley - _base_tiley) < BUF_HEIGHT_TILES) { - map_render_tile(tilex, tiley, - ((tilex - _base_tilex) << TILE_SIZE_P2), - ((tiley - _base_tiley) << TILE_SIZE_P2), - TRUE); + map_render_tile(tilex, tiley, ((tilex - _base_tilex) << TILE_SIZE_P2), ((tiley - _base_tiley) << TILE_SIZE_P2), TRUE); map_render_data(); gtk_widget_queue_draw_area (_map_widget, diff --git a/src/map-poi.c b/src/map-poi.c index 70024a7..dbf43b6 100644 --- a/src/map-poi.c +++ b/src/map-poi.c @@ -65,9 +65,9 @@ gboolean map_poi_init(GtkWidget *map_widget) { poi_icon_hash=g_hash_table_new(g_str_hash, g_str_equal); -context = gtk_widget_get_pango_context(map_widget); -layout = pango_layout_new(context); -fontdesc = pango_font_description_new(); +context=gtk_widget_get_pango_context(map_widget); +layout=pango_layout_new(context); +fontdesc=pango_font_description_new(); pango_font_description_set_family(fontdesc,"Sans Serif"); pango_font_description_set_size(fontdesc, POI_FONT_SIZE_SMALL*PANGO_SCALE); pango_layout_set_font_description (layout, fontdesc); diff --git a/src/map-poi.h b/src/map-poi.h index b8a93bb..2c10c49 100644 --- a/src/map-poi.h +++ b/src/map-poi.h @@ -26,8 +26,10 @@ #ifndef _MAPPER_MAP_POI_H #define _MAPPER_MAP_POI_H -gboolean map_poi_init(GtkWidget *map_widget); void map_render_poi(void); +void map_poi_cache_clear(void); + +gboolean map_poi_init(GtkWidget *map_widget); gboolean map_poi_find_at_latlon(gdouble lat, gdouble lon, guint *poi_id); #endif diff --git a/src/map-repo.c b/src/map-repo.c index 00c2cde..cbf1be6 100644 --- a/src/map-repo.c +++ b/src/map-repo.c @@ -181,7 +181,7 @@ repo_make_cache_dir(gchar * name, const gchar * cache_dir, GtkWidget * parent) if (g_mkdir_with_parents(cache_dir, 0755)) { /* Failed to create Map Cache directory. */ gchar buffer[BUFFER_SIZE]; - snprintf(buffer, sizeof(buffer), "%s: %s", + g_snprintf(buffer, sizeof(buffer), "%s: %s", _("Unable to create cache directory for repository"), name); popup_error(parent, buffer); return FALSE; @@ -287,7 +287,7 @@ gint active = gtk_combo_box_get_active(GTK_COMBO_BOX(rmi->cmb_repos)); return TRUE; } - snprintf(buffer, sizeof(buffer), "%s:\n%s\n", + g_snprintf(buffer, sizeof(buffer), "%s:\n%s\n", _("Confirm delete of repository"), gtk_combo_box_get_active_text(GTK_COMBO_BOX(rmi->cmb_repos))); confirm = hildon_note_new_confirmation(GTK_WINDOW(_window), buffer); @@ -788,10 +788,10 @@ mapman_by_area(gfloat start_lat, gfloat start_lon, } if (is_deleting) { - snprintf(buffer, sizeof(buffer), "%s %d %s", + g_snprintf(buffer, sizeof(buffer), "%s %d %s", _("Confirm DELETION of"), num_maps, _("maps ")); } else { - snprintf(buffer, sizeof(buffer), + g_snprintf(buffer, sizeof(buffer), "%s %d %s\n(%s %.2f MB)\n", _("Confirm download of"), num_maps, _("maps"), _("up to about"), num_maps * @@ -872,11 +872,11 @@ mapman_by_route(MapmanInfo * mapman_info, num_maps *= 0.625 * pow(radius + 1, 1.85); if (is_deleting) { - snprintf(buffer, sizeof(buffer), "%s %s %d %s", + g_snprintf(buffer, sizeof(buffer), "%s %s %d %s", _("Confirm DELETION of"), _("about"), num_maps, _("maps ")); } else { - snprintf(buffer, sizeof(buffer), + g_snprintf(buffer, sizeof(buffer), "%s %s %d %s\n(%s %.2f MB)\n", _("Confirm download of"), _("about"), num_maps, _("maps"), _("up to about"), @@ -1069,7 +1069,7 @@ gboolean menu_cb_mapman(GtkAction * action) 0, 4, 0, 1, GTK_FILL, 0, 4, 0); gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f); for (i = 0; i < MAX_ZOOM; i++) { - snprintf(buffer, sizeof(buffer), "%d", i); + g_snprintf(buffer, sizeof(buffer), "%d", i); gtk_table_attach(GTK_TABLE(table), mapman_info.chk_zoom_levels[i] = gtk_check_button_new_with_label(buffer), @@ -1178,28 +1178,28 @@ gboolean menu_cb_mapman(GtkAction * action) /* Initialize fields. Do no use g_ascii_formatd; these strings will be * output (and parsed) as locale-dependent. */ - snprintf(buffer, sizeof(buffer), "%.06f", _gps.lat); + g_snprintf(buffer, sizeof(buffer), "%.06f", _gps.lat); gtk_label_set_text(GTK_LABEL(lbl_gps_lat), buffer); - snprintf(buffer, sizeof(buffer), "%.06f", _gps.lon); + g_snprintf(buffer, sizeof(buffer), "%.06f", _gps.lon); gtk_label_set_text(GTK_LABEL(lbl_gps_lon), buffer); unit2latlon(_center.unitx, _center.unity, lat, lon); - snprintf(buffer, sizeof(buffer), "%.06f", lat); + g_snprintf(buffer, sizeof(buffer), "%.06f", lat); gtk_label_set_text(GTK_LABEL(lbl_center_lat), buffer); - snprintf(buffer, sizeof(buffer), "%.06f", lon); + g_snprintf(buffer, sizeof(buffer), "%.06f", lon); gtk_label_set_text(GTK_LABEL(lbl_center_lon), buffer); /* Initialize to the bounds of the screen. */ unit2latlon(x2unit(0), y2unit(0), lat, lon); - snprintf(buffer, sizeof(buffer), "%.06f", lat); + g_snprintf(buffer, sizeof(buffer), "%.06f", lat); gtk_entry_set_text(GTK_ENTRY(mapman_info.txt_topleft_lat), buffer); - snprintf(buffer, sizeof(buffer), "%.06f", lon); + g_snprintf(buffer, sizeof(buffer), "%.06f", lon); gtk_entry_set_text(GTK_ENTRY(mapman_info.txt_topleft_lon), buffer); unit2latlon(x2unit(_screen_width_pixels), y2unit(_screen_height_pixels), lat, lon); - snprintf(buffer, sizeof(buffer), "%.06f", lat); + g_snprintf(buffer, sizeof(buffer), "%.06f", lat); gtk_entry_set_text(GTK_ENTRY(mapman_info.txt_botright_lat), buffer); - snprintf(buffer, sizeof(buffer), "%.06f", lon); + g_snprintf(buffer, sizeof(buffer), "%.06f", lon); gtk_entry_set_text(GTK_ENTRY(mapman_info.txt_botright_lon), buffer); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mapman_info.chk_zoom_levels[_zoom]), TRUE); diff --git a/src/map.c b/src/map.c index 6c555f0..9488a88 100644 --- a/src/map.c +++ b/src/map.c @@ -84,14 +84,25 @@ static guint before[2] = { 0, 0 }; static guint map_drag_id = 0; /** VARIABLES FOR ACCESSING THE LOCATION/BOUNDS OF THE CURRENT MARK. */ -static gint _mark_x1; -static gint _mark_x2; -static gint _mark_y1; -static gint _mark_y2; -static gint _mark_minx; -static gint _mark_miny; -static gint _mark_width; -static gint _mark_height; +static gint mark_x1; +static gint mark_x2; +static gint mark_y1; +static gint mark_y2; +static gint mark_minx; +static gint mark_miny; +static gint mark_width; +static gint mark_height; + +static GdkRectangle scale_rect; +static PangoContext *scale_context; +static PangoFontDescription *scale_font; +static PangoLayout *scale_layout; + +static GdkGC *speed_gc1; +static GdkGC *speed_gc2; +static PangoContext *speed_context; +static PangoLayout *speed_layout; +static PangoFontDescription *speed_fontdesc; static gint zoom_timeout_sid=0; static gint map_mode=0; @@ -112,31 +123,87 @@ struct _map_tile_rdata { void map_render_paths(); void map_force_redraw(); -static void map_update_location(gdouble lat, gdouble lon, gboolean force); void map_draw_position_icon(Position *pos); +static void map_update_location(gdouble lat, gdouble lon, gboolean force); +static void map_speed_draw(void); +static gboolean map_cb_after_realize(GtkWidget *map_widget, gpointer data); +static gboolean map_cb_configure(GtkWidget *widget, GdkEventConfigure *event); +static gboolean map_cb_expose(GtkWidget * widget, GdkEventExpose * event); +static gboolean map_cb_button_press(GtkWidget * widget, GdkEventButton * event); +static gboolean map_cb_button_release(GtkWidget * widget, GdkEventButton * event); +static gboolean map_cb_scroll_event(GtkWidget * widget, GdkEventScroll * event); + /******************************************************************************/ GtkWidget * map_new(void) { -return GTK_WIDGET(gtk_drawing_area_new()); +GtkWidget *map_widget; + +map_widget=gtk_drawing_area_new(); +g_signal_connect_after(G_OBJECT(map_widget), "realize", G_CALLBACK(map_cb_after_realize), NULL); +g_signal_connect(G_OBJECT(map_widget), "configure_event", G_CALLBACK(map_cb_configure), NULL); +return map_widget; } -gboolean +static gboolean +map_cb_after_realize(GtkWidget *map_widget, gpointer data) +{ +GdkColor color; + +_map_pixmap=gdk_pixmap_new(map_widget->window, BUF_WIDTH_PIXELS, BUF_HEIGHT_PIXELS, -1); + +scale_context=gtk_widget_get_pango_context(map_widget); +scale_layout=pango_layout_new(scale_context); +scale_font=pango_font_description_new(); +pango_font_description_set_size(scale_font, 12 * PANGO_SCALE); +pango_layout_set_font_description(scale_layout, scale_font); + +/* Speed limit */ +speed_gc1=gdk_gc_new(map_widget->window); +color.red=0xffff; +color.green=0; +color.blue=0; +gdk_gc_set_rgb_fg_color(speed_gc1, &color); +color.red=0; +color.green=0; +color.blue=0; +speed_gc2=gdk_gc_new(map_widget->window); +gdk_gc_set_rgb_fg_color(speed_gc2, &color); +speed_context=gtk_widget_get_pango_context(map_widget); +speed_layout=pango_layout_new(speed_context); +speed_fontdesc=pango_font_description_new(); +pango_font_description_set_size(speed_fontdesc, 64 * PANGO_SCALE); +pango_layout_set_font_description(speed_layout, speed_fontdesc); +pango_layout_set_alignment(speed_layout, PANGO_ALIGN_CENTER); + +/* Signals */ +g_signal_connect(G_OBJECT(map_widget), "expose_event", G_CALLBACK(map_cb_expose), NULL); +g_signal_connect(G_OBJECT(map_widget), "button_press_event", G_CALLBACK(map_cb_button_press), NULL); +g_signal_connect(G_OBJECT(map_widget), "button_release_event",G_CALLBACK(map_cb_button_release), NULL); +g_signal_connect(G_OBJECT(map_widget), "scroll_event", G_CALLBACK(map_cb_scroll_event), NULL); + +gtk_widget_add_events(map_widget, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + | GDK_LEAVE_NOTIFY_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); + +map_poi_init(map_widget); + +return TRUE; +} + +static gboolean map_cb_configure(GtkWidget *widget, GdkEventConfigure *event) { + _screen_width_pixels = _map_widget->allocation.width; _screen_height_pixels = _map_widget->allocation.height; _screen_grids_halfwidth = pixel2grid(_screen_width_pixels) / 2; _screen_grids_halfheight = pixel2grid(_screen_height_pixels) / 2; -/* Set _scale_rect. */ -_scale_rect.x = (_screen_width_pixels - SCALE_WIDTH) / 2; -_scale_rect.width = SCALE_WIDTH; -pango_layout_set_text(_scale_layout, "0", -1); -pango_layout_get_pixel_size(_scale_layout, NULL, &_scale_rect.height); -_scale_rect.y = _screen_height_pixels - _scale_rect.height - 1; +/* Set scale_rect. */ +scale_rect.x = (_screen_width_pixels - SCALE_WIDTH) / 2; +scale_rect.width = SCALE_WIDTH; MACRO_RECALC_FOCUS_BASE(); MACRO_RECALC_FOCUS_SIZE(); @@ -146,8 +213,6 @@ _min_center.unity = pixel2unit(grid2pixel(_screen_grids_halfheight)); _max_center.unitx = WORLD_SIZE_UNITS - grid2unit(_screen_grids_halfwidth) - 1; _max_center.unity = WORLD_SIZE_UNITS - grid2unit(_screen_grids_halfheight) - 1; -map_center_unit(_center.unitx, _center.unity); - return TRUE; } @@ -159,9 +224,9 @@ static void map_draw_mark(void) { gdk_draw_arc(_map_widget->window, _conn_state == RCVR_FIXED ? _gc[COLORABLE_MARK] : _gc[COLORABLE_MARK_OLD], FALSE, - _mark_x1 - _draw_width, _mark_y1 - _draw_width, 2 * _draw_width, 2 * _draw_width, 0, 360 * 64); + mark_x1 - _draw_width, mark_y1 - _draw_width, 2 * _draw_width, 2 * _draw_width, 0, 360 * 64); gdk_draw_line(_map_widget->window, _conn_state == RCVR_FIXED ? (_show_velvec ? _gc[COLORABLE_MARK_VELOCITY] : _gc[COLORABLE_MARK]) : _gc[COLORABLE_MARK_OLD], - _mark_x1, _mark_y1, _mark_x2, _mark_y2); + mark_x1, mark_y1, mark_x2, mark_y2); } /** @@ -171,14 +236,14 @@ gdk_draw_line(_map_widget->window, _conn_state == RCVR_FIXED ? (_show_velvec ? _ void map_set_mark(void) { -_mark_x1 = unit2x(_pos.unitx); -_mark_y1 = unit2y(_pos.unity); -_mark_x2 = _mark_x1 + (_show_velvec ? _gps.vel_offsetx : 0); -_mark_y2 = _mark_y1 + (_show_velvec ? _gps.vel_offsety : 0); -_mark_minx = MIN(_mark_x1, _mark_x2) - (2 * _draw_width); -_mark_miny = MIN(_mark_y1, _mark_y2) - (2 * _draw_width); -_mark_width = abs(_mark_x1 - _mark_x2) + (4 * _draw_width); -_mark_height = abs(_mark_y1 - _mark_y2) + (4 * _draw_width); +mark_x1 = unit2x(_pos.unitx); +mark_y1 = unit2y(_pos.unity); +mark_x2 = mark_x1 + (_show_velvec ? _gps.vel_offsetx : 0); +mark_y2 = mark_y1 + (_show_velvec ? _gps.vel_offsety : 0); +mark_minx = MIN(mark_x1, mark_x2) - (2 * _draw_width); +mark_miny = MIN(mark_y1, mark_y2) - (2 * _draw_width); +mark_width = abs(mark_x1 - mark_x2) + (4 * _draw_width); +mark_height = abs(mark_y1 - mark_y2) + (4 * _draw_width); } /** @@ -266,7 +331,7 @@ gchar buffer[BUFFER_SIZE]; struct stat tstat; gint se; -snprintf(buffer, sizeof(buffer), "%s/%u/%u/%u.jpg", _curr_repo->cache_dir, _zoom + zoff, (tilex >> zoff), (tiley >> zoff)); +g_snprintf(buffer, sizeof(buffer), "%s/%u/%u/%u.jpg", _curr_repo->cache_dir, _zoom + zoff, (tilex >> zoff), (tiley >> zoff)); pixbuf=gdk_pixbuf_new_from_file(buffer, &error); if (error || !pixbuf) { @@ -304,9 +369,6 @@ map_render_tile(guint tilex, guint tiley, guint destx, guint desty, gboolean fas GdkPixbuf *pixbuf=NULL; gint zoff; -if (!GTK_WIDGET_MAPPED(_map_pixmap)) - return; - if (tilex<_world_size_tiles && tiley<_world_size_tiles) { /* The tile is possible. */ for (zoff = (_curr_repo->double_size ? 1 : 0); !pixbuf && (_zoom + zoff) <= MAX_ZOOM && zoff <= TILE_SIZE_P2; zoff += 1) { @@ -553,7 +615,7 @@ if (pos->valid==FALSE) _center_mode=CENTER_MANUAL; map_center_latlon(pos->lat, pos->lon); map_set_autozoom(FALSE); -g_idle_add((GSourceFunc)map_update_location_from_center, NULL); +g_idle_add_full(G_PRIORITY_HIGH_IDLE,(GSourceFunc)map_update_location_from_center, NULL, NULL); return TRUE; } @@ -568,14 +630,14 @@ map_move_mark(void) { /* Just queue the old and new draw areas. */ gtk_widget_queue_draw_area(_map_widget, - _mark_minx<0 ? 0 : _mark_minx, - _mark_miny<0 ? 0 : _mark_miny, - _mark_width, _mark_height); + mark_minx<0 ? 0 : mark_minx, + mark_miny<0 ? 0 : mark_miny, + mark_width, mark_height); map_set_mark(); gtk_widget_queue_draw_area(_map_widget, - _mark_minx<0 ? 0 : _mark_minx, - _mark_miny<0 ? 0 : _mark_miny, - _mark_width, _mark_height); + mark_minx<0 ? 0 : mark_minx, + mark_miny<0 ? 0 : mark_miny, + mark_width, mark_height); } gboolean @@ -657,19 +719,18 @@ guint new_center_unity; MACRO_RECALC_CENTER(new_center_unitx, new_center_unity); -if ((new_center_unitx - _focus.unitx) < _focus_unitwidth - && (new_center_unity - _focus.unity) < _focus_unitheight) +if ((new_center_unitx - _focus.unitx) < _focus_unitwidth && (new_center_unity - _focus.unity) < _focus_unitheight) /* We're not changing the view - just move the mark. */ map_move_mark(); else map_center_unit(new_center_unitx, new_center_unity); /* Draw speed info */ -if (_speed_limit_on) - speed_limit(); +if (_speed_on) + map_speed_draw(); if (_center_mode>0) - g_idle_add((GSourceFunc)map_update_location_from_gps, NULL); + g_idle_add_full(G_PRIORITY_HIGH_IDLE,(GSourceFunc)map_update_location_from_gps, NULL, NULL); } /** @@ -834,7 +895,37 @@ if (_key_zoom_new < _zoom) { return TRUE; } -void +static void +map_speed_draw(void) +{ +GdkGC *gc; +gfloat cur_speed; +gchar *buffer; +static guint x = 0, y = 0, width = 0, height = 0; + +cur_speed = _gps.speed * UNITS_CONVERT[_units]; + +if (cur_speed > _speed_limit) { + gc = speed_gc1; +} else { + gc = speed_gc2; +} + +buffer = g_strdup_printf("%0.0f", cur_speed); +pango_layout_set_text(speed_layout, buffer, -1); +pango_layout_get_pixel_size(speed_layout, &width, &height); + +gtk_widget_queue_draw_area(_map_widget, x - 5, y - 5, width * 3 + 15, height + 5); +gdk_window_process_all_updates(); + +x = 10; +y = 10; + +gdk_draw_layout(_map_widget->window, gc, x, y, speed_layout); +g_free(buffer); +} + +static void map_scale_draw(GdkEventExpose *event) { gchar buffer[16]; @@ -842,105 +933,93 @@ gdouble distance; gdouble lat1, lon1, lat2, lon2; gint width; -gdk_rectangle_intersect(&event->area, &_scale_rect, &event->area); +pango_layout_set_text(scale_layout, "0", -1); +pango_layout_get_pixel_size(scale_layout, NULL, &scale_rect.height); +scale_rect.y = _screen_height_pixels - scale_rect.height - 1; + +gdk_rectangle_intersect(&event->area, &scale_rect, &event->area); if (event->area.width && event->area.height) { gdk_draw_rectangle(_map_widget->window, - _map_widget->style-> - bg_gc[GTK_WIDGET_STATE(_map_widget)], - TRUE, _scale_rect.x, _scale_rect.y, - _scale_rect.width, - _scale_rect.height); + _map_widget->style->bg_gc[GTK_WIDGET_STATE(_map_widget)], + TRUE, scale_rect.x, scale_rect.y, + scale_rect.width, + scale_rect.height); gdk_draw_rectangle(_map_widget->window, - _map_widget->style-> - fg_gc[GTK_WIDGET_STATE(_map_widget)], - FALSE, _scale_rect.x, _scale_rect.y, - _scale_rect.width, - _scale_rect.height); + _map_widget->style->fg_gc[GTK_WIDGET_STATE(_map_widget)], + FALSE, scale_rect.x, scale_rect.y, + scale_rect.width, + scale_rect.height); /* Now calculate and draw the distance. */ unit2latlon(_center.unitx - pixel2unit(SCALE_WIDTH / 2 - 4), _center.unity, lat1, lon1); unit2latlon(_center.unitx + pixel2unit(SCALE_WIDTH / 2 - 4), _center.unity, lat2, lon2); - distance = calculate_distance(lat1, lon1, lat2, lon2) * UNITS_CONVERT[_units]; + distance=calculate_distance(lat1, lon1, lat2, lon2) * UNITS_CONVERT[_units]; if (distance < 1.f) - snprintf(buffer, sizeof(buffer), "%0.2f %s", distance, UNITS_TEXT[_units]); + g_snprintf(buffer, sizeof(buffer), "%0.2f %s", distance, UNITS_TEXT[_units]); else if (distance < 10.f) - snprintf(buffer, sizeof(buffer), "%0.1f %s", distance, UNITS_TEXT[_units]); + g_snprintf(buffer, sizeof(buffer), "%0.1f %s", distance, UNITS_TEXT[_units]); else - snprintf(buffer, sizeof(buffer), "%0.f %s", distance, UNITS_TEXT[_units]); + g_snprintf(buffer, sizeof(buffer), "%0.f %s", distance, UNITS_TEXT[_units]); - pango_layout_set_text(_scale_layout, buffer, -1); - pango_layout_get_pixel_size(_scale_layout, &width, NULL); + pango_layout_set_text(scale_layout, buffer, -1); + pango_layout_get_pixel_size(scale_layout, &width, NULL); /* Draw the layout itself. */ gdk_draw_layout(_map_widget->window, - _map_widget->style-> - fg_gc[GTK_WIDGET_STATE(_map_widget)], - _scale_rect.x + - (_scale_rect.width - width) / 2, - _scale_rect.y, _scale_layout); + _map_widget->style->fg_gc[GTK_WIDGET_STATE(_map_widget)], + scale_rect.x + (scale_rect.width - width) / 2, + scale_rect.y, scale_layout); /* Draw little hashes on the ends. */ gdk_draw_line(_map_widget->window, - _map_widget->style-> - fg_gc[GTK_WIDGET_STATE(_map_widget)], - _scale_rect.x + 4, - _scale_rect.y + - _scale_rect.height / 2 - 4, - _scale_rect.x + 4, - _scale_rect.y + - _scale_rect.height / 2 + 4); + _map_widget->style->fg_gc[GTK_WIDGET_STATE(_map_widget)], + scale_rect.x + 4, + scale_rect.y + scale_rect.height / 2 - 4, + scale_rect.x + 4, + scale_rect.y + scale_rect.height / 2 + 4); gdk_draw_line(_map_widget->window, - _map_widget->style-> - fg_gc[GTK_WIDGET_STATE(_map_widget)], - _scale_rect.x + 4, - _scale_rect.y + - _scale_rect.height / 2, - _scale_rect.x + - (_scale_rect.width - width) / 2 - 4, - _scale_rect.y + - _scale_rect.height / 2); + _map_widget->style->fg_gc[GTK_WIDGET_STATE(_map_widget)], + scale_rect.x + 4, + scale_rect.y + scale_rect.height / 2, + scale_rect.x + (scale_rect.width - width) / 2 - 4, + scale_rect.y + scale_rect.height / 2); gdk_draw_line(_map_widget->window, - _map_widget->style-> - fg_gc[GTK_WIDGET_STATE(_map_widget)], - _scale_rect.x + - _scale_rect.width - 4, - _scale_rect.y + - _scale_rect.height / 2 - 4, - _scale_rect.x + - _scale_rect.width - 4, - _scale_rect.y + - _scale_rect.height / 2 + 4); + _map_widget->style->fg_gc[GTK_WIDGET_STATE(_map_widget)], + scale_rect.x + scale_rect.width - 4, + scale_rect.y + scale_rect.height / 2 - 4, + scale_rect.x + scale_rect.width - 4, + scale_rect.y + scale_rect.height / 2 + 4); gdk_draw_line(_map_widget->window, - _map_widget->style-> - fg_gc[GTK_WIDGET_STATE(_map_widget)], - _scale_rect.x + - _scale_rect.width - 4, - _scale_rect.y + - _scale_rect.height / 2, - _scale_rect.x + - (_scale_rect.width + width) / 2 + 4, - _scale_rect.y + - _scale_rect.height / 2); + _map_widget->style->fg_gc[GTK_WIDGET_STATE(_map_widget)], + scale_rect.x + scale_rect.width - 4, + scale_rect.y + scale_rect.height / 2, + scale_rect.x + (scale_rect.width + width) / 2 + 4, + scale_rect.y + scale_rect.height / 2); } } -gboolean +static gboolean map_cb_expose(GtkWidget * widget, GdkEventExpose * event) { gdk_draw_drawable(GDK_DRAWABLE(_map_widget->window), - _gc[COLORABLE_MARK], - _map_pixmap, - event->area.x + _offsetx, event->area.y + _offsety, - event->area.x, event->area.y, - event->area.width, event->area.height); + _gc[COLORABLE_MARK], + _map_pixmap, + event->area.x + _offsetx, event->area.y + _offsety, + event->area.x, event->area.y, + event->area.width, event->area.height); map_draw_mark(); /* Draw scale, if necessary. */ if (_show_scale) map_scale_draw(event); +#if 0 +if (_speed_on) + map_speed_draw(); +#endif + return TRUE; } @@ -1024,10 +1103,10 @@ map_set_place_information(osm_way *s, osm_place *mp, osm_place *sp) gchar buffer[256]; if (!s && !mp && !sp) { - snprintf(buffer, sizeof(buffer), _("Unknown location")); + g_snprintf(buffer, sizeof(buffer), _("Unknown location")); } else { /* oh, fun */ - snprintf(buffer, sizeof(buffer), "%s%s%s%s%s%s%s%s%s%s", + g_snprintf(buffer, sizeof(buffer), "%s%s%s%s%s%s%s%s%s%s", s ? s->name ? s->name : "" : "", s ? s->ref ? ", " : "" : "", s ? s->ref ? s->ref : "" : "", @@ -1056,7 +1135,7 @@ if (_dest.valid) { dh=calculate_course(lat, lon, _dest.lat, _dest.lon); cdist=dt*UNITS_CONVERT[_units]; - snprintf(buffer, sizeof(buffer), "%.02f %s (%0.02f)", cdist, UNITS_TEXT[_units], dh<0 ? 360+dh : dh); + g_snprintf(buffer, sizeof(buffer), "%.02f %s (%0.02f)", cdist, UNITS_TEXT[_units], dh<0 ? 360+dh : dh); gtk_label_set_label(GTK_LABEL(info_banner.distance), buffer); if (dt<0.005 && dest_reached==FALSE) { @@ -1135,7 +1214,7 @@ inp=FALSE; /** * Mouse scroller zoom in/out callback */ -gboolean +static gboolean map_cb_scroll_event(GtkWidget * widget, GdkEventScroll * event) { if (event->direction == GDK_SCROLL_UP) { @@ -1197,7 +1276,7 @@ if (poi_info_dialog(poi_id)==FALSE) return FALSE; } -gboolean +static gboolean map_cb_button_press(GtkWidget * widget, GdkEventButton * event) { gdouble lat, lon; @@ -1245,7 +1324,7 @@ break; return FALSE; } -gboolean +static gboolean map_cb_button_release(GtkWidget *widget, GdkEventButton *event) { g_printf("BtnRelease\n"); @@ -1326,9 +1405,9 @@ g_object_set(G_OBJECT(txt_lon), HILDON_INPUT_MODE_HINT, HILDON_INPUT_MODE_HINT_N gchar buffer[32]; gdouble lat, lon; unit2latlon(_center.unitx, _center.unity, lat, lon); - snprintf(buffer, sizeof(buffer), "%.06f", lat); + g_snprintf(buffer, sizeof(buffer), "%.06f", lat); gtk_label_set_text(GTK_LABEL(txt_lat), buffer); - snprintf(buffer, sizeof(buffer), "%.06f", lon); + g_snprintf(buffer, sizeof(buffer), "%.06f", lon); gtk_label_set_text(GTK_LABEL(txt_lon), buffer); } diff --git a/src/map.h b/src/map.h index 7ecd9c0..db9354a 100644 --- a/src/map.h +++ b/src/map.h @@ -68,6 +68,12 @@ guint _key_zoom_timeout_sid; gboolean _map_location_known; gdouble _map_location_dist; +/** The widget that provides the visual display of the map. */ +GtkWidget *_map_widget; + +/** The backing pixmap of _map_widget. */ +GdkPixmap *_map_pixmap; + GtkWidget *map_new(void); gboolean map_key_zoom_timeout(); @@ -80,16 +86,12 @@ void map_move_mark(void); void map_set_mark(void); void map_render_data(void); +void map_render_tile(guint tilex, guint tiley, guint destx, guint desty, gboolean fast_fail); + void map_center_unit(guint new_center_unitx, guint new_center_unity); void map_center_latlon(gdouble lat, gdouble lon); gboolean map_goto_position(Position *pos); gboolean map_update_location_from_center(void); -gboolean map_cb_configure(GtkWidget * widget, GdkEventConfigure * event); -gboolean map_cb_expose(GtkWidget * widget, GdkEventExpose * event); -gboolean map_cb_button_press(GtkWidget * widget, GdkEventButton * event); -gboolean map_cb_button_release(GtkWidget * widget, GdkEventButton * event); -gboolean map_cb_scroll_event(GtkWidget * widget, GdkEventScroll * event); - #endif diff --git a/src/settings-gui.c b/src/settings-gui.c index 437ffd3..598d885 100644 --- a/src/settings-gui.c +++ b/src/settings-gui.c @@ -377,9 +377,8 @@ settings_dialog(void) GtkWidget *txt_mapper_db; GtkWidget *btn_browsedb; GtkWidget *num_poi_zoom; - GtkWidget *chk_speed_limit_on; + GtkWidget *chk_speed_on; GtkWidget *num_speed; - GtkWidget *cmb_speed_location; GtkWidget *cmb_info_font_size; BrowseInfo browse_info = { 0, 0 }; @@ -534,18 +533,11 @@ settings_dialog(void) /* Speed warner. */ gtk_table_attach(GTK_TABLE(table), hbox = gtk_hbox_new(FALSE, 4), 0, 3, 2, 3, GTK_FILL, 0, 2, 4); - gtk_box_pack_start(GTK_BOX(hbox), chk_speed_limit_on = gtk_check_button_new_with_label(_("Speed Limit")), FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), chk_speed_on = gtk_check_button_new_with_label(_("Display Speed")), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f), FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(label), num_speed = hildon_number_editor_new(0, 999)); - gtk_box_pack_start(GTK_BOX(hbox), label = gtk_label_new(_("Location")), FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f), FALSE, FALSE, 0); - gtk_container_add(GTK_CONTAINER(label), cmb_speed_location = gtk_combo_box_new_text()); - for (i = 0; i < SPEED_LOCATION_ENUM_COUNT; i++) - gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_speed_location), - SPEED_LOCATION_TEXT[i]); - /* Database page */ gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table = gtk_table_new(2, 3, FALSE), label = gtk_label_new(_("Database"))); @@ -589,10 +581,9 @@ settings_dialog(void) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_always_keep_on), !_always_keep_on); gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_units), _units); gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_degformat), _degformat); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_speed_limit_on), _speed_limit_on); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_speed_on), _speed_on); hildon_number_editor_set_range(HILDON_NUMBER_EDITOR(num_speed), 1, 300); hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_speed), _speed_limit); - gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_speed_location), _speed_location); gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_info_font_size), _info_font_size); gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 300); @@ -627,9 +618,8 @@ settings_dialog(void) _always_keep_on = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_always_keep_on)); _units = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_units)); _degformat = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_degformat)); - _speed_limit_on = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_speed_limit_on)); + _speed_on = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_speed_on)); _speed_limit = hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(num_speed)); - _speed_location = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_speed_location)); _info_font_size = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_info_font_size)); _announce_notice_ratio = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_announce_notice)); diff --git a/src/settings.h b/src/settings.h index bf8e36a..25033e4 100644 --- a/src/settings.h +++ b/src/settings.h @@ -44,7 +44,7 @@ guint _announce_notice_ratio; guint _voice_speed; guint _voice_pitch; -gboolean _speed_limit_on; +gboolean _speed_on; gboolean _speed_excess; guint _speed_limit; diff --git a/src/speak.c b/src/speak.c index 6d3943f..61d2cf7 100644 --- a/src/speak.c +++ b/src/speak.c @@ -85,7 +85,7 @@ switch (GST_MESSAGE_TYPE (msg)) { speak_ok=FALSE; break; case GST_MESSAGE_STATE_CHANGED: - + g_print ("GST: state changed\n"); break; default: g_printf("GST: %s\n", gst_message_type_get_name(GST_MESSAGE_TYPE(msg))); diff --git a/src/speed-display.c b/src/speed-display.c index 593a9b0..cd90b14 100644 --- a/src/speed-display.c +++ b/src/speed-display.c @@ -17,8 +17,6 @@ #include "ui-common.h" #include "speak.h" -gchar *SPEED_LOCATION_TEXT[SPEED_LOCATION_ENUM_COUNT]; - static gboolean speed_excess(void) { @@ -30,53 +28,4 @@ speak_text("Warning, you are over speed limit!"); return TRUE; } -void -speed_limit(void) -{ -GdkGC *gc; -gfloat cur_speed; -gchar *buffer; -static guint x = 0, y = 0, width = 0, height = 0; - -cur_speed = _gps.speed * UNITS_CONVERT[_units]; - -if (cur_speed > _speed_limit) { - gc = _speed_limit_gc1; - if (!_speed_excess) { - _speed_excess = TRUE; - g_timeout_add(5000, (GSourceFunc) speed_excess, NULL); - } -} else { - gc = _speed_limit_gc2; - _speed_excess = FALSE; -} - -buffer = g_strdup_printf("%0.0f", cur_speed); -pango_layout_set_text(_speed_limit_layout, buffer, -1); -pango_layout_get_pixel_size(_speed_limit_layout, &width, &height); - -gtk_widget_queue_draw_area(_map_widget, x - 5, y - 5, width * 3 + 15, height + 5); -gdk_window_process_all_updates(); -switch (_speed_location) { - case SPEED_LOCATION_TOP_RIGHT: - x = _map_widget->allocation.width - 10 - width; - y = 5; - break; - case SPEED_LOCATION_BOTTOM_RIGHT: - x = _map_widget->allocation.width - 10 - width; - y = _map_widget->allocation.height - 10 - height; - break; - case SPEED_LOCATION_BOTTOM_LEFT: - x = 10; - y = _map_widget->allocation.height - 10 - height; - break; - default: - x = 10; - y = 10; - break; -} - -gdk_draw_layout(_map_widget->window, gc, x, y, _speed_limit_layout); -g_free(buffer); -} diff --git a/src/ui-common.c b/src/ui-common.c index 8da365c..522cd5e 100644 --- a/src/ui-common.c +++ b/src/ui-common.c @@ -119,6 +119,9 @@ static const gchar *mapper_ui = " " " " " " +" " +" " +" " " " " " " " @@ -215,6 +218,8 @@ static GtkActionEntry ui_entries[] = { {"poi_add", GTK_STOCK_ADD, N_("_Add"), "A", NULL, G_CALLBACK(cb_poi_add) }, {"poi_quick_add", GTK_STOCK_ABOUT, N_("_Quick Add"), "E", NULL, G_CALLBACK(cb_poi_add) }, {"poi_search", GTK_STOCK_FIND, N_("_Search..."), NULL, NULL, G_CALLBACK(cb_poi_search) }, + {"poi_import", GTK_STOCK_OPEN, N_("_Import..."), NULL, NULL, NULL }, + {"poi_export", GTK_STOCK_SAVE, N_("_Export..."), NULL, NULL, NULL }, {"map", NULL, N_("_Map"), NULL, NULL, NULL }, {"map_maps", NULL, N_("_Maps"), NULL, NULL, NULL }, @@ -454,7 +459,6 @@ gtk_menu_append(submenu, _cmenu_loc_route_to_item= gtk_menu_item_new_with_label( gtk_menu_append(submenu, gtk_separator_menu_item_new()); gtk_menu_append(submenu, _cmenu_loc_add_route= gtk_menu_item_new_with_label(_("Add Route Point"))); gtk_menu_append(submenu, _cmenu_loc_add_way = gtk_menu_item_new_with_label(_("Add Waypoint..."))); -gtk_widget_set_sensitive(_cmenu_loc_add_poi, _db != NULL); gtk_menu_append(submenu, gtk_separator_menu_item_new()); gtk_menu_append(submenu, _cmenu_loc_set_gps = gtk_menu_item_new_with_label(_("Set as GPS Location"))); gtk_menu_append(submenu, _cmenu_loc_set_home = gtk_menu_item_new_with_label(_("Set as Home Location"))); @@ -633,16 +637,13 @@ GtkWidget *hbox, *mapvbox, *label, *vbox_main; GtkWidget *vbox; GtkWidget *sw; GtkNotebook *notebook; -GdkColor color; GtkToolItem *item; GtkTreeViewColumn *column; GtkCellRenderer *renderer; + #ifdef WITH_HILDON -/* Initialize _program. */ _program = HILDON_PROGRAM(hildon_program_get_instance()); - -/* Initialize _window. */ _window = GTK_WIDGET(hildon_window_new()); hildon_program_add_window(_program, HILDON_WINDOW(_window)); #else @@ -742,46 +743,17 @@ label = gtk_label_new("Map"); hbox = gtk_hpaned_new(); /* GPS Panel */ -_gps_widget = gps_info_panel(); +_gps_widget=gps_info_panel(); gtk_widget_set_size_request(GTK_WIDGET(_gps_widget), 180, 0); gtk_paned_add1(GTK_PANED(hbox), _gps_widget); -mapvbox = gtk_vbox_new(FALSE, 0); +mapvbox=gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(mapvbox), hbox, TRUE, TRUE, 0); ui_notebook.map=gtk_notebook_append_page(notebook, mapvbox, label); /* Map widget */ _map_widget = map_new(); gtk_paned_add2(GTK_PANED(hbox), _map_widget); -gtk_widget_realize(_map_widget); - -_scale_context = gtk_widget_get_pango_context(_map_widget); -_scale_layout = pango_layout_new(_scale_context); -_scale_font = pango_font_description_new(); -pango_font_description_set_size(_scale_font, 12 * PANGO_SCALE); -pango_layout_set_font_description(_scale_layout, _scale_font); - -/* Speed limit */ -_speed_limit_gc1 = gdk_gc_new(_map_widget->window); -color.red = 0xffff; -color.green = 0; -color.blue = 0; -gdk_gc_set_rgb_fg_color(_speed_limit_gc1, &color); -color.red = 0; -color.green = 0; -color.blue = 0; -_speed_limit_gc2 = gdk_gc_new(_map_widget->window); -gdk_gc_set_rgb_fg_color(_speed_limit_gc2, &color); -_speed_limit_context = gtk_widget_get_pango_context(_map_widget); -_speed_limit_layout = pango_layout_new(_speed_limit_context); -_speed_limit_fontdesc = pango_font_description_new(); -pango_font_description_set_size(_speed_limit_fontdesc, 64 * PANGO_SCALE); -pango_layout_set_font_description(_speed_limit_layout, _speed_limit_fontdesc); -pango_layout_set_alignment(_speed_limit_layout, PANGO_ALIGN_CENTER); - -map_poi_init(_map_widget); -/* -1: use bit depth of widget->window. */ -_map_pixmap = gdk_pixmap_new(_map_widget->window, BUF_WIDTH_PIXELS, BUF_HEIGHT_PIXELS, -1); /* GPS Tab */ vbox = gtk_vbox_new(FALSE, 0); @@ -832,12 +804,17 @@ ui_notebook.route=gtk_notebook_append_page(notebook, vbox, label); menu_maps_add_repos(); menu_init_cmenu(); -/* Initialize our line styles. */ -update_gcs(); - _last_spoken_phrase = g_strdup(""); memset(&_autoroute_data, 0, sizeof(_autoroute_data)); +g_signal_connect(G_OBJECT(_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); + +gtk_widget_show_all(GTK_WIDGET(vbox_main)); +gtk_widget_show_all(GTK_WIDGET(_window)); + +/* Initialize our line styles. */ +update_gcs(); + /* Set defaults for items */ set_action_activate("map_auto_download", _auto_download); set_action_activate("gps_enabled", _enable_gps); @@ -856,25 +833,12 @@ set_action_activate("view_track", _show_tracks & TRACKS_MASK); set_action_activate("view_route", _show_tracks & ROUTES_MASK); /* Connect signals. */ -g_signal_connect(G_OBJECT(_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(_window), "key_press_event", G_CALLBACK(window_cb_key_press), NULL); g_signal_connect(G_OBJECT(_window), "key_release_event", G_CALLBACK(window_cb_key_release), NULL); -g_signal_connect(G_OBJECT(_map_widget), "configure_event", G_CALLBACK(map_cb_configure), NULL); -g_signal_connect(G_OBJECT(_map_widget), "expose_event", G_CALLBACK(map_cb_expose), NULL); -g_signal_connect(G_OBJECT(_map_widget), "button_press_event", G_CALLBACK(map_cb_button_press), NULL); -g_signal_connect(G_OBJECT(_map_widget), "button_release_event",G_CALLBACK(map_cb_button_release), NULL); -g_signal_connect(G_OBJECT(_map_widget), "scroll_event", G_CALLBACK(map_cb_scroll_event), NULL); - -gtk_widget_add_events(_map_widget, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - | GDK_LEAVE_NOTIFY_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); - /* If we have a route, calculate the next point. */ route_find_nearest_point(); -gtk_widget_show_all(GTK_WIDGET(vbox_main)); -gtk_widget_show_all(GTK_WIDGET(_window)); - gps_show_info(); gtk_idle_add((GSourceFunc)window_present, NULL); @@ -889,12 +853,9 @@ dialog = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(dialog), title); gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(_window)); gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); -#ifdef WITH_HILDON -gtk_window_set_decorated(GTK_WINDOW(dialog), FALSE); -gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(title), TRUE, TRUE, 0); -#else gtk_window_set_deletable(GTK_WINDOW(dialog), FALSE); -#endif +/* gtk_window_set_decorated(GTK_WINDOW(dialog), FALSE); */ +gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(title), TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), progress, TRUE, TRUE, 0); gtk_widget_show_all(dialog); return dialog; diff --git a/src/ui-common.h b/src/ui-common.h index ac979c7..33a0f2f 100644 --- a/src/ui-common.h +++ b/src/ui-common.h @@ -32,12 +32,6 @@ /** The main GtkContainer of the application. */ GtkWidget *_window; -/** The widget that provides the visual display of the map. */ -GtkWidget *_map_widget; - -/** The backing pixmap of _map_widget. */ -GdkPixmap *_map_pixmap; - GtkWidget *_gps_widget; /* GPS Tab widget */ @@ -63,15 +57,6 @@ GtkWidget *_sdi_fqu; GtkWidget *_sdi_msp; /** Pango stuff. */ -GdkRectangle _scale_rect; -PangoContext *_scale_context; -PangoFontDescription *_scale_font; -PangoLayout *_scale_layout; -GdkGC *_speed_limit_gc1; -GdkGC *_speed_limit_gc2; -PangoContext *_speed_limit_context; -PangoLayout *_speed_limit_layout; -PangoFontDescription *_speed_limit_fontdesc; PangoContext *_sat_panel_context; PangoLayout *_sat_panel_layout; PangoFontDescription *_sat_panel_fontdesc; -- 2.39.5