14 #include <glib/gstdio.h>
17 #include <libgnomevfs/gnome-vfs.h>
18 #include <curl/multi.h>
19 #include <gconf/gconf-client.h>
20 #include <libxml/parser.h>
25 #include "hildon-mapper.h"
33 #include "mapper-types.h"
35 #include "ui-common.h"
38 #include "settings-gui.h"
44 #define WINDOW_SIZE_X 800
45 #define WINDOW_SIZE_Y 600
49 GtkWidget *_fix_banner=NULL;
52 * Update all GdkGC objects to reflect the current _draw_width.
54 #define UPDATE_GC(gc) \
55 gdk_gc_set_line_attributes(gc, \
56 _draw_width, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND);
60 printf("%s()\n", __PRETTY_FUNCTION__);
62 for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
63 gdk_color_alloc(gtk_widget_get_colormap(_map_widget),
66 g_object_unref(_gc[i]);
67 _gc[i] = gdk_gc_new(_map_pixmap);
68 gdk_gc_set_foreground(_gc[i], &_color[i]);
69 gdk_gc_set_line_attributes(_gc[i],
70 _draw_width, GDK_LINE_SOLID,
71 GDK_CAP_ROUND, GDK_JOIN_ROUND);
74 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
78 void force_min_visible_bars(HildonControlbar * control_bar, gint num_bars)
81 printf("%s()\n", __PRETTY_FUNCTION__);
82 memset(&val, 0, sizeof(val));
83 g_value_init(&val, G_TYPE_INT);
84 g_value_set_int(&val, num_bars);
85 g_object_set_property(G_OBJECT(control_bar), "minimum-visible-bars",
87 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
90 void force_min_visible_bars(void *a, gint b)
96 * Pop up a modal dialog box with simple error information in it.
98 void popup_error(GtkWidget * window, const gchar * error)
101 printf("%s(\"%s\")\n", __PRETTY_FUNCTION__, error);
103 dialog = hildon_note_new_information(GTK_WINDOW(window), error);
105 gtk_dialog_run(GTK_DIALOG(dialog));
106 gtk_widget_destroy(dialog);
108 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
111 void menu_maps_remove_repos()
114 printf("%s()\n", __PRETTY_FUNCTION__);
116 /* Delete one menu item for each repo. */
117 for (curr = _repo_list; curr; curr = curr->next) {
118 gtk_widget_destroy(gtk_container_get_children
119 (GTK_CONTAINER(_menu_maps_submenu))->data);
121 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
124 void menu_maps_add_repos()
127 GtkWidget *last_repo = NULL;
128 printf("%s()\n", __PRETTY_FUNCTION__);
130 for (curr = g_list_last(_repo_list); curr; curr = curr->prev) {
131 RepoData *rd = (RepoData *) curr->data;
132 GtkWidget *menu_item;
134 gtk_menu_prepend(_menu_maps_submenu, menu_item
136 gtk_radio_menu_item_new_with_label_from_widget
137 (GTK_RADIO_MENU_ITEM(last_repo),
140 gtk_menu_prepend(_menu_maps_submenu, menu_item
142 gtk_radio_menu_item_new_with_label
144 last_repo = menu_item;
146 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item),
148 rd->menu_item = menu_item;
151 /* Add signals (must be after entire menu is built). */
154 gtk_container_get_children(GTK_CONTAINER
155 (_menu_maps_submenu));
156 for (curr = _repo_list; curr;
157 curr = curr->next, currmi = currmi->next) {
158 g_signal_connect(G_OBJECT(currmi->data), "activate",
159 G_CALLBACK(menu_cb_maps_select),
164 gtk_widget_show_all(_menu_maps_submenu);
165 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
169 * Free a ProgressUpdateInfo data structure that was allocated during the
170 * auto-map-download process.
172 void progress_update_info_free(ProgressUpdateInfo * pui)
174 vprintf("%s()\n", __PRETTY_FUNCTION__);
176 g_free(pui->src_str);
177 g_free(pui->dest_str);
179 g_slice_free(ProgressUpdateInfo, pui);
181 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
185 * Call gtk_window_present() on Mapper. This also checks the
186 * configuration and brings up the Settings dialog if the GPS Receiver is
187 * not set up, the first time it is called.
189 gboolean window_present()
191 static gint been_here = 0;
192 static gint done_here = 0;
193 printf("%s()\n", __PRETTY_FUNCTION__);
196 /* Set connection state first, to avoid going into this if twice. */
197 if (!_rcvr_mac && _enable_gps) {
200 gtk_window_present(GTK_WINDOW(_window));
202 popup_error(_window, _("It looks like this is your first time running "
203 "Mapper. Press OK to continue."));
205 if (settings_dialog()) {
207 _("OpenStreetMap.org provides public, free-to-use maps. "
208 "You can also download a sample set of repositories from "
209 " the internet by using the \"Download...\" button."));
211 if (_curr_repo->type != REPOTYPE_NONE) {
212 confirm = hildon_note_new_confirmation
213 (GTK_WINDOW(_window),
214 _("You will now see a blank screen. You can download"
215 " maps using the \"Manage Maps\" menu item in the"
216 " \"Maps\" menu. Or, press OK to enable"
218 if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) {
219 gtk_check_menu_item_set_active
221 (_menu_auto_download_item),
224 gtk_widget_destroy(confirm);
229 /* Connect to receiver. */
233 done_here++; /* Don't ask... */
236 gtk_window_present(GTK_WINDOW(_window));
238 /* Re-enable any banners that might have been up. */
240 ConnState old_state = _conn_state;
241 set_conn_state(RCVR_OFF);
242 set_conn_state(old_state);
246 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
251 * Create the menu items needed for the drop down menu.
253 static void menu_init()
255 /* Create needed handles. */
257 GtkWidget *submenu_routes;
258 GtkWidget *submenu_track;
260 GtkWidget *menu_item;
261 GtkWidget *file_item;
262 printf("%s()\n", __PRETTY_FUNCTION__);
264 /* Get the menu of our view. */
265 menu = GTK_MENU(gtk_menu_new());
268 hildon_window_set_menu(HILDON_WINDOW(_window), menu);
270 file_item = gtk_menu_item_new_with_label("File");
271 gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_item), GTK_WIDGET(menu));
272 gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(file_item));
275 /* Create the menu items. */
277 /* The "Routes" submenu. */
278 menu_item = gtk_menu_item_new_with_label(_("Route"));
280 gtk_menu_append(menu, menu_item);
282 gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
284 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
285 gtk_menu_append(submenu, _menu_route_open_item = gtk_menu_item_new_with_label(_("Open...")));
286 gtk_menu_append(submenu, _menu_route_download_item = gtk_menu_item_new_with_label(_("Download...")));
287 gtk_menu_append(submenu, _menu_route_save_item = gtk_menu_item_new_with_label(_("Save...")));
288 gtk_menu_append(submenu, _menu_route_distnext_item = gtk_menu_item_new_with_label(_("Show Distance to Next Waypoint")));
289 gtk_menu_append(submenu, _menu_route_distlast_item = gtk_menu_item_new_with_label(_("Show Distance to End of Route")));
290 gtk_menu_append(submenu, _menu_route_reset_item = gtk_menu_item_new_with_label(_("Reset")));
291 gtk_menu_append(submenu, _menu_route_clear_item = gtk_menu_item_new_with_label(_("Clear")));
293 /* The "Track" submenu. */
294 menu_item = gtk_menu_item_new_with_label(_("Track"));
296 gtk_menu_append(menu, menu_item);
298 gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
300 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
301 gtk_menu_append(submenu, _menu_track_open_item = gtk_menu_item_new_with_label(_("Open...")));
302 gtk_menu_append(submenu, _menu_track_save_item = gtk_menu_item_new_with_label(_("Save...")));
303 gtk_menu_append(submenu, _menu_track_insert_break_item = gtk_menu_item_new_with_label(_("Insert Break")));
304 gtk_menu_append(submenu, _menu_track_insert_mark_item = gtk_menu_item_new_with_label(_("Insert Mark...")));
305 gtk_menu_append(submenu, _menu_track_distlast_item = gtk_menu_item_new_with_label(_("Show Distance from Last Mark")));
306 gtk_menu_append(submenu, _menu_track_distfirst_item = gtk_menu_item_new_with_label(_("Show Distance from Beginning")));
307 gtk_menu_append(submenu, _menu_track_clear_item = gtk_menu_item_new_with_label(_("Clear")));
308 gtk_menu_append(submenu, gtk_separator_menu_item_new());
309 gtk_menu_append(submenu, _menu_track_filter = gtk_menu_item_new_with_label(_("Filter...")));
311 /* The "Maps" submenu. */
312 menu_item = gtk_menu_item_new_with_label(_("Maps"));
314 gtk_menu_append(menu, menu_item);
316 gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
318 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), _menu_maps_submenu = gtk_menu_new());
319 gtk_menu_append(_menu_maps_submenu, gtk_separator_menu_item_new());
320 gtk_menu_append(_menu_maps_submenu, _menu_maps_mapman_item = gtk_menu_item_new_with_label(_("Manage Maps...")));
321 gtk_menu_append(_menu_maps_submenu, _menu_maps_repoman_item = gtk_menu_item_new_with_label(_("Manage Repositories...")));
322 gtk_menu_append(_menu_maps_submenu, _menu_auto_download_item = gtk_check_menu_item_new_with_label(_("Auto-Download")));
323 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_auto_download_item), _auto_download);
324 menu_maps_add_repos(_curr_repo);
326 gtk_menu_append(menu, gtk_separator_menu_item_new());
328 /* The "View" submenu. */
329 menu_item = gtk_menu_item_new_with_label(_("View"));
331 gtk_menu_append(menu, menu_item);
333 gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
335 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
336 gtk_menu_append(submenu, _menu_zoomin_item = gtk_menu_item_new_with_label(_("Zoom In")));
337 gtk_menu_append(submenu, _menu_zoomout_item = gtk_menu_item_new_with_label(_("Zoom Out")));
338 gtk_menu_append(submenu, _menu_fullscreen_item = gtk_check_menu_item_new_with_label(_("Full Screen")));
339 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_fullscreen_item), _fullscreen);
340 gtk_menu_append(submenu, gtk_separator_menu_item_new());
341 gtk_menu_append(submenu, _menu_show_scale_item = gtk_check_menu_item_new_with_label(_("Scale")));
342 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_show_scale_item), _show_scale);
343 gtk_menu_append(submenu, _menu_show_routes_item = gtk_check_menu_item_new_with_label(_("Route")));
344 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_show_routes_item), _show_tracks & ROUTES_MASK);
345 gtk_menu_append(submenu, _menu_show_tracks_item = gtk_check_menu_item_new_with_label(_("Track")));
346 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_show_tracks_item), _show_tracks & TRACKS_MASK);
347 gtk_menu_append(submenu, _menu_show_velvec_item = gtk_check_menu_item_new_with_label(_("Velocity Vector")));
348 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_show_velvec_item), _show_velvec);
349 gtk_menu_append(submenu, _menu_show_poi_item = gtk_check_menu_item_new_with_label(_("POIs")));
350 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_show_poi_item), _show_poi);
351 gtk_menu_append(submenu, _menu_poi_item = gtk_menu_item_new_with_label(_("POI Categories...")));
352 gtk_widget_set_sensitive(_menu_poi_item, _db != NULL);
354 /* The "Auto-Center" submenu. */
355 gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("Auto-Center")));
356 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
357 gtk_menu_append(submenu, _menu_ac_latlon_item = gtk_radio_menu_item_new_with_label(NULL, _("Lat/Lon")));
358 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_ac_latlon_item), _center_mode == CENTER_LATLON);
359 gtk_menu_append(submenu, _menu_ac_lead_item = gtk_radio_menu_item_new_with_label_from_widget
360 (GTK_RADIO_MENU_ITEM(_menu_ac_latlon_item), _("Lead")));
361 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_ac_lead_item), _center_mode == CENTER_LEAD);
362 gtk_menu_append(submenu, _menu_ac_none_item = gtk_radio_menu_item_new_with_label_from_widget
363 (GTK_RADIO_MENU_ITEM(_menu_ac_latlon_item), _("None")));
364 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_ac_none_item), _center_mode < 0);
366 /* The "Go to" submenu. */
367 menu_item = gtk_menu_item_new_with_label(_("Go to"));
369 gtk_menu_append(menu, menu_item);
371 gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
373 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
374 gtk_menu_append(submenu, _menu_goto_home = gtk_menu_item_new_with_label(_("Home")));
375 gtk_menu_append(submenu, _menu_goto_latlon = gtk_menu_item_new_with_label(_("Lat/Lon...")));
376 gtk_menu_append(submenu, _menu_goto_gps = gtk_menu_item_new_with_label(_("GPS Location")));
377 gtk_menu_append(submenu, _menu_goto_nextway = gtk_menu_item_new_with_label(_("Next Waypoint")));
378 gtk_menu_append(submenu, _menu_goto_nearpoi = gtk_menu_item_new_with_label(_("Nearest POI")));
380 /* The "GPS" submenu. */
381 menu_item = gtk_menu_item_new_with_label(_("GPS"));
383 gtk_menu_append(menu, menu_item);
385 gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
387 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
388 gtk_menu_append(submenu, _menu_enable_gps_item = gtk_check_menu_item_new_with_label(_("Enable GPS")));
389 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_enable_gps_item), _enable_gps);
390 gtk_menu_append(submenu, _menu_gps_show_info_item = gtk_check_menu_item_new_with_label(_("Show Information")));
391 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_gps_show_info_item), _gps_info);
392 gtk_menu_append(submenu, _menu_gps_details_item = gtk_menu_item_new_with_label(_("Details...")));
393 gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_details_item), _enable_gps);
394 gtk_menu_append(menu, gtk_separator_menu_item_new());
396 /* The other menu items. */
397 gtk_menu_append(menu, _menu_settings_item = gtk_menu_item_new_with_label(_("Settings...")));
398 gtk_menu_append(menu, gtk_separator_menu_item_new());
399 gtk_menu_append(menu, _menu_help_item = gtk_menu_item_new_with_label(_("Help...")));
400 gtk_menu_append(menu, _menu_about_item = gtk_menu_item_new_with_label(_("About...")));
401 gtk_menu_append(menu, _menu_close_item = gtk_menu_item_new_with_label(_("Quit")));
403 /* We need to show menu items. */
405 /* Connect the "Route" signals. */
406 g_signal_connect(G_OBJECT(_menu_route_open_item), "activate",
407 G_CALLBACK(menu_cb_route_open), NULL);
408 g_signal_connect(G_OBJECT(_menu_route_download_item), "activate",
409 G_CALLBACK(menu_cb_route_download), NULL);
410 g_signal_connect(G_OBJECT(_menu_route_save_item), "activate",
411 G_CALLBACK(menu_cb_route_save), NULL);
412 g_signal_connect(G_OBJECT(_menu_route_distnext_item), "activate",
413 G_CALLBACK(menu_cb_route_distnext), NULL);
414 g_signal_connect(G_OBJECT(_menu_route_distlast_item), "activate",
415 G_CALLBACK(menu_cb_route_distlast), NULL);
416 g_signal_connect(G_OBJECT(_menu_route_reset_item), "activate",
417 G_CALLBACK(menu_cb_route_reset), NULL);
418 g_signal_connect(G_OBJECT(_menu_route_clear_item), "activate",
419 G_CALLBACK(menu_cb_route_clear), NULL);
421 /* Connect the "Track" signals. */
422 g_signal_connect(G_OBJECT(_menu_track_open_item), "activate",
423 G_CALLBACK(menu_cb_track_open), NULL);
424 g_signal_connect(G_OBJECT(_menu_track_save_item), "activate",
425 G_CALLBACK(menu_cb_track_save), NULL);
426 g_signal_connect(G_OBJECT(_menu_track_insert_break_item), "activate",
427 G_CALLBACK(menu_cb_track_insert_break), NULL);
428 g_signal_connect(G_OBJECT(_menu_track_insert_mark_item), "activate",
429 G_CALLBACK(menu_cb_track_insert_mark), NULL);
430 g_signal_connect(G_OBJECT(_menu_track_distlast_item), "activate",
431 G_CALLBACK(menu_cb_track_distlast), NULL);
432 g_signal_connect(G_OBJECT(_menu_track_distfirst_item), "activate",
433 G_CALLBACK(menu_cb_track_distfirst), NULL);
434 g_signal_connect(G_OBJECT(_menu_track_clear_item), "activate",
435 G_CALLBACK(menu_cb_track_clear), NULL);
436 g_signal_connect(G_OBJECT(_menu_track_filter), "activate",
437 G_CALLBACK(menu_cb_track_filter), NULL);
439 /* Connect the "Maps" signals. */
440 g_signal_connect(G_OBJECT(_menu_maps_repoman_item), "activate",
441 G_CALLBACK(menu_cb_maps_repoman), NULL);
442 g_signal_connect(G_OBJECT(_menu_maps_mapman_item), "activate",
443 G_CALLBACK(menu_cb_mapman), NULL);
445 /* Connect the "View" signals. */
446 g_signal_connect(G_OBJECT(_menu_zoomin_item), "activate",
447 G_CALLBACK(cb_zoomin), NULL);
448 g_signal_connect(G_OBJECT(_menu_zoomout_item), "activate",
449 G_CALLBACK(cb_zoomout), NULL);
450 g_signal_connect(G_OBJECT(_menu_fullscreen_item), "toggled",
451 G_CALLBACK(cb_fullscreen), NULL);
452 g_signal_connect(G_OBJECT(_menu_show_tracks_item), "toggled",
453 G_CALLBACK(menu_cb_show_tracks), NULL);
454 g_signal_connect(G_OBJECT(_menu_show_scale_item), "toggled",
455 G_CALLBACK(menu_cb_show_scale), NULL);
456 g_signal_connect(G_OBJECT(_menu_show_routes_item), "toggled",
457 G_CALLBACK(menu_cb_show_routes), NULL);
458 g_signal_connect(G_OBJECT(_menu_show_velvec_item), "toggled",
459 G_CALLBACK(menu_cb_show_velvec), NULL);
460 g_signal_connect(G_OBJECT(_menu_show_poi_item), "toggled",
461 G_CALLBACK(menu_cb_show_poi), NULL);
462 g_signal_connect(G_OBJECT(_menu_poi_item), "activate",
463 G_CALLBACK(menu_cb_category), NULL);
465 /* Connect the "Auto-Center" signals. */
466 g_signal_connect(G_OBJECT(_menu_ac_latlon_item), "toggled",
467 G_CALLBACK(menu_cb_ac_latlon), NULL);
468 g_signal_connect(G_OBJECT(_menu_ac_lead_item), "toggled",
469 G_CALLBACK(menu_cb_ac_lead), NULL);
470 g_signal_connect(G_OBJECT(_menu_ac_none_item), "toggled",
471 G_CALLBACK(menu_cb_ac_none), NULL);
473 /* Connect the "Go to" signals. */
474 g_signal_connect(G_OBJECT(_menu_goto_home), "activate",
475 G_CALLBACK(menu_cb_goto_home), NULL);
476 g_signal_connect(G_OBJECT(_menu_goto_latlon), "activate",
477 G_CALLBACK(menu_cb_goto_latlon), NULL);
478 g_signal_connect(G_OBJECT(_menu_goto_gps), "activate",
479 G_CALLBACK(menu_cb_goto_gps), NULL);
480 g_signal_connect(G_OBJECT(_menu_goto_nextway), "activate",
481 G_CALLBACK(menu_cb_goto_nextway), NULL);
482 g_signal_connect(G_OBJECT(_menu_goto_nearpoi), "activate",
483 G_CALLBACK(menu_cb_goto_nearpoi), NULL);
485 /* Connect the "GPS" signals. */
486 g_signal_connect(G_OBJECT(_menu_enable_gps_item), "toggled",
487 G_CALLBACK(menu_cb_enable_gps), NULL);
488 g_signal_connect(G_OBJECT(_menu_gps_show_info_item), "toggled",
489 G_CALLBACK(menu_cb_gps_show_info), NULL);
490 g_signal_connect(G_OBJECT(_menu_gps_details_item), "activate",
491 G_CALLBACK(menu_cb_gps_details), NULL);
492 g_signal_connect(G_OBJECT(_menu_auto_download_item), "toggled",
493 G_CALLBACK(menu_cb_auto_download), NULL);
495 /* Connect the other menu item signals. */
496 g_signal_connect(G_OBJECT(_menu_settings_item), "activate",
497 G_CALLBACK(menu_cb_settings), NULL);
498 g_signal_connect(G_OBJECT(_menu_help_item), "activate",
499 G_CALLBACK(menu_cb_help), NULL);
500 g_signal_connect(G_OBJECT(_menu_about_item), "activate",
501 G_CALLBACK(menu_cb_about), NULL);
502 g_signal_connect(G_OBJECT(_menu_close_item), "activate",
503 G_CALLBACK(gtk_main_quit), NULL);
505 gtk_widget_show_all(GTK_WIDGET(menu));
507 gtk_widget_show_all(GTK_WIDGET(_menu_bar));
510 /* Setup the context menu. */
511 menu = GTK_MENU(gtk_menu_new());
513 /* Setup the map context menu. */
514 gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("Location")));
515 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
517 /* Setup the map context menu. */
518 gtk_menu_append(submenu, _cmenu_loc_show_latlon_item
519 = gtk_menu_item_new_with_label(_("Show Lat/Lon")));
520 gtk_menu_append(submenu, _cmenu_loc_clip_latlon_item
521 = gtk_menu_item_new_with_label(_("Copy Lat/Lon")));
522 gtk_menu_append(submenu, gtk_separator_menu_item_new());
523 gtk_menu_append(submenu, _cmenu_loc_distance_to_item
524 = gtk_menu_item_new_with_label(_("Show Distance to")));
525 gtk_menu_append(submenu, _cmenu_loc_route_to_item
526 = gtk_menu_item_new_with_label(_("Download Route to...")));
527 gtk_menu_append(submenu, gtk_separator_menu_item_new());
528 gtk_menu_append(submenu, _cmenu_loc_add_route
529 = gtk_menu_item_new_with_label(_("Add Route Point")));
530 gtk_menu_append(submenu, _cmenu_loc_add_way
531 = gtk_menu_item_new_with_label(_("Add Waypoint...")));
532 gtk_menu_append(submenu, _cmenu_loc_add_poi
533 = gtk_menu_item_new_with_label(_("Add POI...")));
534 gtk_widget_set_sensitive(_cmenu_loc_add_poi, _db != NULL);
535 gtk_menu_append(submenu, gtk_separator_menu_item_new());
536 gtk_menu_append(submenu, _cmenu_loc_set_gps =
537 gtk_menu_item_new_with_label(_("Set as GPS Location")));
538 gtk_menu_append(submenu, _cmenu_loc_set_home =
539 gtk_menu_item_new_with_label(_("Set as Home Location")));
541 /* Setup the waypoint context menu. */
542 gtk_menu_append(menu, menu_item
543 = gtk_menu_item_new_with_label(_("Waypoint")));
544 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
545 submenu = gtk_menu_new());
547 gtk_menu_append(submenu, _cmenu_way_show_latlon_item
548 = gtk_menu_item_new_with_label(_("Show Lat/Lon")));
549 gtk_menu_append(submenu, _cmenu_way_show_desc_item
550 = gtk_menu_item_new_with_label(_("Show Description")));
551 gtk_menu_append(submenu, _cmenu_way_clip_latlon_item
552 = gtk_menu_item_new_with_label(_("Copy Lat/Lon")));
553 gtk_menu_append(submenu, _cmenu_way_clip_desc_item
554 = gtk_menu_item_new_with_label(_("Copy Description")));
555 gtk_menu_append(submenu, gtk_separator_menu_item_new());
556 gtk_menu_append(submenu, _cmenu_way_distance_to_item
557 = gtk_menu_item_new_with_label(_("Show Distance to")));
558 gtk_menu_append(submenu, _cmenu_way_route_to_item
559 = gtk_menu_item_new_with_label(_("Download Route to...")));
560 gtk_menu_append(submenu, _cmenu_way_delete_item
561 = gtk_menu_item_new_with_label(_("Delete...")));
562 gtk_menu_append(submenu, gtk_separator_menu_item_new());
563 gtk_menu_append(submenu, _cmenu_way_add_poi = gtk_menu_item_new_with_label(_("Add POI...")));
564 gtk_widget_set_sensitive(_cmenu_way_add_poi, _db != NULL);
565 gtk_menu_append(submenu, gtk_separator_menu_item_new());
566 gtk_menu_append(submenu, _cmenu_way_goto_nextway = gtk_menu_item_new_with_label(_("Go to Next")));
568 /* Setup the POI context menu. */
569 gtk_menu_append(menu, _cmenu_poi = gtk_menu_item_new_with_label(_("POI")));
570 gtk_widget_set_sensitive(_cmenu_poi, _db != NULL);
571 gtk_menu_item_set_submenu(GTK_MENU_ITEM(_cmenu_poi), submenu = gtk_menu_new());
573 gtk_menu_append(submenu, _cmenu_poi_edit_poi
574 = gtk_menu_item_new_with_label(_("View/Edit...")));
575 gtk_menu_append(submenu, gtk_separator_menu_item_new());
576 gtk_menu_append(submenu, _cmenu_poi_distance_to_item
577 = gtk_menu_item_new_with_label(_("Show Distance to")));
578 gtk_menu_append(submenu, _cmenu_poi_route_to_item
579 = gtk_menu_item_new_with_label(_("Download Route to...")));
580 gtk_menu_append(submenu, gtk_separator_menu_item_new());
581 gtk_menu_append(submenu, _cmenu_poi_add_route
582 = gtk_menu_item_new_with_label(_("Add Route Point")));
583 gtk_menu_append(submenu, _cmenu_poi_add_way
584 = gtk_menu_item_new_with_label(_("Add Waypoint...")));
585 gtk_menu_append(submenu, gtk_separator_menu_item_new());
586 gtk_menu_append(submenu, _cmenu_poi_goto_nearpoi
587 = gtk_menu_item_new_with_label(_("Go to Nearest")));
589 /* Connect signals for context menu. */
590 g_signal_connect(G_OBJECT(_cmenu_loc_show_latlon_item), "activate",
591 G_CALLBACK(cmenu_cb_loc_show_latlon), NULL);
592 g_signal_connect(G_OBJECT(_cmenu_loc_clip_latlon_item), "activate",
593 G_CALLBACK(cmenu_cb_loc_clip_latlon), NULL);
594 g_signal_connect(G_OBJECT(_cmenu_loc_route_to_item), "activate",
595 G_CALLBACK(cmenu_cb_loc_route_to), NULL);
596 g_signal_connect(G_OBJECT(_cmenu_loc_distance_to_item), "activate",
597 G_CALLBACK(cmenu_cb_loc_distance_to), NULL);
598 g_signal_connect(G_OBJECT(_cmenu_loc_add_route), "activate",
599 G_CALLBACK(cmenu_cb_loc_add_route), NULL);
600 g_signal_connect(G_OBJECT(_cmenu_loc_add_way), "activate",
601 G_CALLBACK(cmenu_cb_loc_add_way), NULL);
602 g_signal_connect(G_OBJECT(_cmenu_loc_add_poi), "activate",
603 G_CALLBACK(cmenu_cb_loc_add_poi), NULL);
604 g_signal_connect(G_OBJECT(_cmenu_loc_set_gps), "activate",
605 G_CALLBACK(cmenu_cb_loc_set_gps), NULL);
606 g_signal_connect(G_OBJECT(_cmenu_loc_set_home), "activate",
607 G_CALLBACK(cmenu_cb_loc_set_home), NULL);
609 g_signal_connect(G_OBJECT(_cmenu_way_show_latlon_item), "activate",
610 G_CALLBACK(cmenu_cb_way_show_latlon), NULL);
611 g_signal_connect(G_OBJECT(_cmenu_way_show_desc_item), "activate",
612 G_CALLBACK(cmenu_cb_way_show_desc), NULL);
613 g_signal_connect(G_OBJECT(_cmenu_way_clip_latlon_item), "activate",
614 G_CALLBACK(cmenu_cb_way_clip_latlon), NULL);
615 g_signal_connect(G_OBJECT(_cmenu_way_clip_desc_item), "activate",
616 G_CALLBACK(cmenu_cb_way_clip_desc), NULL);
617 g_signal_connect(G_OBJECT(_cmenu_way_route_to_item), "activate",
618 G_CALLBACK(cmenu_cb_way_route_to), NULL);
619 g_signal_connect(G_OBJECT(_cmenu_way_distance_to_item), "activate",
620 G_CALLBACK(cmenu_cb_way_distance_to), NULL);
621 g_signal_connect(G_OBJECT(_cmenu_way_delete_item), "activate",
622 G_CALLBACK(cmenu_cb_way_delete), NULL);
623 g_signal_connect(G_OBJECT(_cmenu_way_add_poi), "activate",
624 G_CALLBACK(cmenu_cb_way_add_poi), NULL);
625 g_signal_connect(G_OBJECT(_cmenu_way_goto_nextway), "activate",
626 G_CALLBACK(menu_cb_goto_nextway), NULL);
628 g_signal_connect(G_OBJECT(_cmenu_poi_edit_poi), "activate",
629 G_CALLBACK(cmenu_cb_poi_edit_poi), NULL);
630 g_signal_connect(G_OBJECT(_cmenu_poi_route_to_item), "activate",
631 G_CALLBACK(cmenu_cb_poi_route_to), NULL);
632 g_signal_connect(G_OBJECT(_cmenu_poi_distance_to_item), "activate",
633 G_CALLBACK(cmenu_cb_poi_distance_to), NULL);
634 g_signal_connect(G_OBJECT(_cmenu_poi_add_route), "activate",
635 G_CALLBACK(cmenu_cb_poi_add_route), NULL);
636 g_signal_connect(G_OBJECT(_cmenu_poi_add_way), "activate",
637 G_CALLBACK(cmenu_cb_poi_add_way), NULL);
638 g_signal_connect(G_OBJECT(_cmenu_poi_goto_nearpoi), "activate",
639 G_CALLBACK(menu_cb_goto_nearpoi), NULL);
641 gtk_widget_show_all(GTK_WIDGET(menu));
643 #ifdef WITH_DEVICE_770
644 gtk_widget_tap_and_hold_setup(_map_widget, GTK_WIDGET(menu), NULL, 0);
649 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
652 static void toolbar_init(void)
656 item = gtk_tool_button_new_from_stock (GTK_STOCK_HOME);
657 g_signal_connect (item, "clicked", G_CALLBACK (menu_cb_goto_home), NULL);
658 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
660 item = gtk_tool_button_new_from_stock (GTK_STOCK_JUMP_TO);
661 g_signal_connect (item, "clicked", G_CALLBACK (menu_cb_goto_gps), NULL);
662 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
664 item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD);
665 g_signal_connect (item, "clicked", G_CALLBACK (menu_cb_goto_nextway), NULL);
666 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
668 item = gtk_separator_tool_item_new();
669 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
671 item = gtk_tool_button_new_from_stock (GTK_STOCK_ADD);
672 g_signal_connect (item, "clicked", G_CALLBACK (cb_add_poi), NULL);
673 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
675 #ifndef GTK_STOCK_INFO
676 #define GTK_STOCK_INFO GTK_STOCK_PROPERTIES
679 item = gtk_tool_button_new_from_stock (GTK_STOCK_INFO);
680 g_signal_connect (item, "clicked", G_CALLBACK (menu_cb_gps_details), NULL);
681 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
683 item = gtk_separator_tool_item_new();
684 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
686 item = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_IN);
687 g_signal_connect (item, "clicked", G_CALLBACK (cb_zoomin), NULL);
688 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
690 item = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_OUT);
691 g_signal_connect (item, "clicked", G_CALLBACK (cb_zoomout), NULL);
692 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
694 item = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_100);
695 g_signal_connect (item, "clicked", G_CALLBACK (cb_zoom_base), NULL);
696 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
698 item = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_FIT);
699 g_signal_connect (item, "clicked", G_CALLBACK (cb_zoom_autozoom), NULL);
700 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
702 item = gtk_separator_tool_item_new();
703 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
706 _toolbar_fullscreen_item = gtk_toggle_tool_button_new_from_stock (GTK_STOCK_FULLSCREEN);
707 g_signal_connect (_toolbar_fullscreen_item, "clicked", G_CALLBACK (cb_fullscreen_click), NULL);
708 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), _toolbar_fullscreen_item, -1);
711 item=gtk_separator_tool_item_new();
712 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
714 item=gtk_tool_item_new();
715 _progress_item=gtk_progress_bar_new();
716 gtk_container_add(item, _progress_item);
717 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
720 void mapper_init_variables(void)
722 /* Set enum-based constants. */
723 UNITS_TEXT[UNITS_KM] = _("km");
724 UNITS_TEXT[UNITS_MI] = _("mi.");
725 UNITS_TEXT[UNITS_NM] = _("n.m.");
727 INFO_FONT_TEXT[INFO_FONT_XXSMALL] = "xx-small";
728 INFO_FONT_TEXT[INFO_FONT_XSMALL] = "x-small";
729 INFO_FONT_TEXT[INFO_FONT_SMALL] = "small";
730 INFO_FONT_TEXT[INFO_FONT_MEDIUM] = "medium";
731 INFO_FONT_TEXT[INFO_FONT_LARGE] = "large";
732 INFO_FONT_TEXT[INFO_FONT_XLARGE] = "x-large";
733 INFO_FONT_TEXT[INFO_FONT_XXLARGE] = "xx-large";
735 CUSTOM_KEY_GCONF[CUSTOM_KEY_UP] = GCONF_KEY_PREFIX "/key_up";
736 CUSTOM_KEY_GCONF[CUSTOM_KEY_DOWN] = GCONF_KEY_PREFIX "/key_down";
737 CUSTOM_KEY_GCONF[CUSTOM_KEY_LEFT] = GCONF_KEY_PREFIX "/key_left";
738 CUSTOM_KEY_GCONF[CUSTOM_KEY_RIGHT] = GCONF_KEY_PREFIX "/key_right";
739 CUSTOM_KEY_GCONF[CUSTOM_KEY_SELECT] = GCONF_KEY_PREFIX "/key_select";
740 CUSTOM_KEY_GCONF[CUSTOM_KEY_INCREASE] =
741 GCONF_KEY_PREFIX "/key_increase";
742 CUSTOM_KEY_GCONF[CUSTOM_KEY_DECREASE] =
743 GCONF_KEY_PREFIX "/key_decrease";
744 CUSTOM_KEY_GCONF[CUSTOM_KEY_FULLSCREEN] =
745 GCONF_KEY_PREFIX "/key_fullscreen";
746 CUSTOM_KEY_GCONF[CUSTOM_KEY_ESC] = GCONF_KEY_PREFIX "/key_esc";
748 CUSTOM_KEY_ICON[CUSTOM_KEY_UP] = HWK_BUTTON_UP;
749 CUSTOM_KEY_ICON[CUSTOM_KEY_LEFT] = HWK_BUTTON_LEFT;
750 CUSTOM_KEY_ICON[CUSTOM_KEY_DOWN] = HWK_BUTTON_DOWN;
751 CUSTOM_KEY_ICON[CUSTOM_KEY_RIGHT] = HWK_BUTTON_RIGHT;
752 CUSTOM_KEY_ICON[CUSTOM_KEY_SELECT] = HWK_BUTTON_SELECT;
753 CUSTOM_KEY_ICON[CUSTOM_KEY_INCREASE] = HWK_BUTTON_INCREASE;
754 CUSTOM_KEY_ICON[CUSTOM_KEY_DECREASE] = HWK_BUTTON_DECREASE;
755 CUSTOM_KEY_ICON[CUSTOM_KEY_FULLSCREEN] = HWK_BUTTON_VIEW;
756 CUSTOM_KEY_ICON[CUSTOM_KEY_ESC] = HWK_BUTTON_CANCEL;
758 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_UP] = CUSTOM_ACTION_PAN_NORTH;
759 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_LEFT] = CUSTOM_ACTION_PAN_WEST;
760 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_DOWN] = CUSTOM_ACTION_PAN_SOUTH;
761 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_RIGHT] = CUSTOM_ACTION_PAN_EAST;
762 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_SELECT] = CUSTOM_ACTION_TOGGLE_AUTOCENTER;
763 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_INCREASE] = CUSTOM_ACTION_ZOOM_IN;
764 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_DECREASE] = CUSTOM_ACTION_ZOOM_OUT;
765 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_FULLSCREEN] =
766 CUSTOM_ACTION_TOGGLE_FULLSCREEN;
767 CUSTOM_KEY_DEFAULT[CUSTOM_KEY_ESC] = CUSTOM_ACTION_TOGGLE_TRACKS;
769 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_NORTH] = _("Pan North");
770 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_WEST] = _("Pan West");
771 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_SOUTH] = _("Pan South");
772 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_EAST] = _("Pan East");
773 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_AUTOCENTER]
774 = _("Toggle Auto-Center");
775 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_FULLSCREEN]
776 = _("Toggle Fullscreen");
777 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ZOOM_IN] = _("Zoom In");
778 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ZOOM_OUT] = _("Zoom Out");
779 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_TRACKS] = _("Toggle Tracks");
780 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_SCALE] = _("Toggle Scale");
781 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_POI] = _("Toggle POIs");
782 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_CHANGE_REPO] =
783 _("Select Next Repository");
784 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ROUTE_DISTNEXT]
785 = _("Show Distance to Next Waypoint");
786 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ROUTE_DISTLAST]
787 = _("Show Distance to End of Route");
788 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_BREAK] = _("Insert Track Break");
789 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_DISTLAST]
790 = _("Show Distance from Last Break");
791 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_DISTFIRST]
792 = _("Show Distance from Beginning");
793 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_GPS] = _("Toggle GPS");
794 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_GPSINFO] = _("Toggle GPS Info");
795 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_SPEEDLIMIT]
796 = _("Toggle Speed Limit");
797 CUSTOM_ACTION_TEXT[CUSTOM_ACTION_RESET_BLUETOOTH] =
798 _("Reset Bluetooth");
800 COLORABLE_GCONF[COLORABLE_MARK] = GCONF_KEY_PREFIX "/color_mark";
801 COLORABLE_GCONF[COLORABLE_MARK_VELOCITY]
802 = GCONF_KEY_PREFIX "/color_mark_velocity";
803 COLORABLE_GCONF[COLORABLE_MARK_OLD] =
804 GCONF_KEY_PREFIX "/color_mark_old";
805 COLORABLE_GCONF[COLORABLE_TRACK] = GCONF_KEY_PREFIX "/color_track";
806 COLORABLE_GCONF[COLORABLE_TRACK_MARK] =
807 GCONF_KEY_PREFIX "/color_track_mark";
808 COLORABLE_GCONF[COLORABLE_TRACK_BREAK]
809 = GCONF_KEY_PREFIX "/color_track_break";
810 COLORABLE_GCONF[COLORABLE_ROUTE] = GCONF_KEY_PREFIX "/color_route";
811 COLORABLE_GCONF[COLORABLE_ROUTE_WAY] =
812 GCONF_KEY_PREFIX "/color_route_way";
813 COLORABLE_GCONF[COLORABLE_ROUTE_BREAK]
814 = GCONF_KEY_PREFIX "/color_route_break";
815 COLORABLE_GCONF[COLORABLE_POI] = GCONF_KEY_PREFIX "/color_poi";
817 DEG_FORMAT_TEXT[DDPDDDDD] = "-dd.ddddd°";
818 DEG_FORMAT_TEXT[DD_MMPMMM] = "-dd°mm.mmm'";
819 DEG_FORMAT_TEXT[DD_MM_SSPS] = "-dd°mm'ss.s\"";
820 DEG_FORMAT_TEXT[DDPDDDDD_NSEW] = "dd.ddddd° S";
821 DEG_FORMAT_TEXT[DD_MMPMMM_NSEW] = "dd°mm.mmm' S";
822 DEG_FORMAT_TEXT[DD_MM_SSPS_NSEW] = "dd°mm'ss.s\" S";
824 SPEED_LOCATION_TEXT[SPEED_LOCATION_TOP_LEFT] = _("Top-Left");
825 SPEED_LOCATION_TEXT[SPEED_LOCATION_TOP_RIGHT] = _("Top-Right");
826 SPEED_LOCATION_TEXT[SPEED_LOCATION_BOTTOM_RIGHT] = _("Bottom-Right");
827 SPEED_LOCATION_TEXT[SPEED_LOCATION_BOTTOM_LEFT] = _("Bottom-Left");
831 * Initialize everything required in preparation for calling gtk_main().
833 void mapper_init(gint argc, gchar ** argv)
835 GtkWidget *hbox, *mapvbox, *label, *vbox, *vbox_main;
836 GtkWidget *notebook, *hbanner;
838 printf("%s()\n", __PRETTY_FUNCTION__);
840 mapper_init_variables();
842 /* Set up track array (must be done before config). */
843 memset(&_track, 0, sizeof(_track));
844 memset(&_route, 0, sizeof(_route));
845 MACRO_PATH_INIT(_track);
846 MACRO_PATH_INIT(_route);
850 g_set_application_name("Mapper");
853 /* Initialize _program. */
854 _program = HILDON_PROGRAM(hildon_program_get_instance());
856 /* Initialize _window. */
857 _window = GTK_WIDGET(hildon_window_new());
858 hildon_program_add_window(_program, HILDON_WINDOW(_window));
860 _window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
861 gtk_window_set_title(GTK_WINDOW(_window), "Mapper");
862 gtk_widget_set_size_request(GTK_WIDGET(_window), WINDOW_SIZE_X, WINDOW_SIZE_Y);
863 gtk_window_resize(GTK_WINDOW(_window), WINDOW_SIZE_X, WINDOW_SIZE_Y);
864 gtk_window_set_resizable(GTK_WINDOW(_window), TRUE);
867 _toolbar = gtk_toolbar_new();
870 notebook = gtk_notebook_new();
871 gtk_notebook_set_show_tabs(notebook, TRUE);
872 label = gtk_label_new("Map");
874 hbox = gtk_hpaned_new();
876 info_banner.container=gtk_hbox_new(FALSE, 0);
877 info_banner.location=gtk_label_new("");
878 info_banner.speed=gtk_label_new("");
879 gtk_label_set_max_width_chars(info_banner.speed, 16);
880 gtk_label_set_width_chars(info_banner.speed, 14);
881 gtk_box_pack_start(GTK_BOX(info_banner.container), info_banner.speed, FALSE, FALSE, 0);
882 gtk_box_pack_start(GTK_BOX(info_banner.container), info_banner.location, TRUE, TRUE, 0);
884 mapvbox = gtk_vbox_new(FALSE, 0);
887 /* Create and add widgets and supporting data. */
888 gtk_container_add(GTK_CONTAINER(_window), notebook);
889 hildon_program_set_common_toolbar(_program, _toolbar);
891 gtk_widget_show_all(notebook);
892 gtk_widget_show_all(_toolbar);
894 vbox_main = gtk_vbox_new(FALSE, 0);
895 gtk_container_add(GTK_CONTAINER(_window), vbox_main);
897 _menu_bar = gtk_menu_bar_new();
898 gtk_box_pack_start(GTK_BOX(vbox_main), _menu_bar, FALSE, FALSE, 0);
899 gtk_box_pack_start(GTK_BOX(vbox_main), _toolbar, FALSE, FALSE, 0);
900 gtk_box_pack_start(GTK_BOX(vbox_main), notebook, TRUE, TRUE, 0);
902 _status_bar = gtk_statusbar_new();
903 gtk_box_pack_start(GTK_BOX(vbox_main), _status_bar, FALSE, FALSE, 0);
905 gtk_widget_show_all(vbox_main);
908 /* gtk_widget_hide(_progress_item); */
910 gtk_box_pack_start(GTK_BOX(mapvbox), info_banner.container, FALSE, FALSE, 0);
912 gtk_box_pack_start(GTK_BOX(mapvbox), hbox, TRUE, TRUE, 0);
913 gtk_notebook_append_page(GTK_WIDGET(notebook), mapvbox, label);
914 gtk_widget_show_all(mapvbox);
916 vbox = gtk_vbox_new(FALSE, 0);
917 _gps_widget = gtk_frame_new("GPS Info");
918 gtk_container_add(GTK_CONTAINER(_gps_widget), vbox);
919 gtk_widget_set_size_request(GTK_WIDGET(_gps_widget), 180, 0);
920 gtk_paned_add1(hbox, _gps_widget);
922 label = gtk_label_new(" ");
923 gtk_widget_set_size_request(GTK_WIDGET(label), -1, 10);
924 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 0);
926 _text_lat = gtk_label_new(" --- ");
927 gtk_widget_set_size_request(GTK_WIDGET(_text_lat), -1, 30);
928 gtk_box_pack_start(GTK_BOX(vbox), _text_lat, FALSE, TRUE, 0);
930 _text_lon = gtk_label_new(" --- ");
931 gtk_widget_set_size_request(GTK_WIDGET(_text_lon), -1, 30);
932 gtk_box_pack_start(GTK_BOX(vbox), _text_lon, FALSE, TRUE, 0);
934 _text_speed = gtk_label_new(" --- ");
935 gtk_widget_set_size_request(GTK_WIDGET(_text_speed), -1, 30);
936 gtk_box_pack_start(GTK_BOX(vbox), _text_speed, FALSE, TRUE, 0);
938 _text_alt = gtk_label_new(" --- ");
939 gtk_widget_set_size_request(GTK_WIDGET(_text_alt), -1, 30);
940 gtk_box_pack_start(GTK_BOX(vbox), _text_alt, FALSE, TRUE, 0);
942 _text_dop = gtk_label_new(" --- ");
943 gtk_widget_set_size_request(GTK_WIDGET(_text_dop), -1, 30);
944 gtk_box_pack_start(GTK_BOX(vbox), _text_dop, FALSE, TRUE, 0);
946 label = gtk_label_new(" ");
947 gtk_widget_set_size_request(GTK_WIDGET(label), -1, 10);
948 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 0);
950 _sat_panel = gtk_drawing_area_new();
951 gtk_widget_set_size_request(_sat_panel, -1, 100);
952 gtk_box_pack_start(GTK_BOX(vbox), _sat_panel, TRUE, TRUE, 0);
954 label = gtk_label_new(" ");
955 gtk_widget_set_size_request(GTK_WIDGET(label), -1, 10);
956 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 0);
958 _text_time = gtk_label_new("--:--:--");
959 gtk_widget_set_size_request(GTK_WIDGET(_text_time), -1, 30);
960 gtk_box_pack_start(GTK_BOX(vbox), _text_time, FALSE, TRUE, 0);
962 _heading_panel = gtk_drawing_area_new();
963 gtk_widget_set_size_request(_heading_panel, -1, 100);
964 gtk_box_pack_start(GTK_BOX(vbox), _heading_panel, TRUE, TRUE, 0);
966 _map_widget = gtk_drawing_area_new();
967 gtk_paned_add2(hbox, _map_widget);
969 gtk_widget_show_all(hbox);
970 gps_show_info(); /* hides info, if necessary. */
971 gtk_widget_realize(_map_widget);
972 map_poi_init(_map_widget);
974 /* -1: use bit depth of widget->window. */
975 _map_pixmap = gdk_pixmap_new(_map_widget->window, BUF_WIDTH_PIXELS, BUF_HEIGHT_PIXELS, -1);
977 _curl_easy_queue = g_queue_new();
979 _pui_tree = g_tree_new_full((GCompareDataFunc) download_comparefunc,
981 (GDestroyNotify) progress_update_info_free,
983 _downloading_tree = g_tree_new_full((GCompareDataFunc) download_comparefunc, NULL,
984 (GDestroyNotify) progress_update_info_free, NULL);
986 _pui_by_easy = g_hash_table_new(g_direct_hash, g_direct_equal);
988 /* Connect signals. */
989 g_signal_connect(G_OBJECT(_sat_panel), "expose_event",
990 G_CALLBACK(sat_panel_expose), NULL);
991 g_signal_connect(G_OBJECT(_heading_panel), "expose_event",
992 G_CALLBACK(heading_panel_expose), NULL);
993 g_signal_connect(G_OBJECT(_window), "destroy",
994 G_CALLBACK(gtk_main_quit), NULL);
996 g_signal_connect(G_OBJECT(_window), "key_press_event",
997 G_CALLBACK(window_cb_key_press), NULL);
999 g_signal_connect(G_OBJECT(_window), "key_release_event",
1000 G_CALLBACK(window_cb_key_release), NULL);
1002 g_signal_connect(G_OBJECT(_map_widget), "configure_event",
1003 G_CALLBACK(map_cb_configure), NULL);
1005 g_signal_connect(G_OBJECT(_map_widget), "expose_event",
1006 G_CALLBACK(map_cb_expose), NULL);
1008 g_signal_connect(G_OBJECT(_map_widget), "button_press_event",
1009 G_CALLBACK(map_cb_button_press), NULL);
1011 g_signal_connect(G_OBJECT(_map_widget), "button_release_event",
1012 G_CALLBACK(map_cb_button_release), NULL);
1014 g_signal_connect(G_OBJECT(_map_widget), "scroll_event",
1015 G_CALLBACK(map_cb_scroll_event), NULL);
1017 gtk_widget_add_events(_map_widget,
1019 | GDK_BUTTON_PRESS_MASK
1020 | GDK_BUTTON_RELEASE_MASK
1021 | GDK_LEAVE_NOTIFY_MASK
1022 | GDK_POINTER_MOTION_MASK
1023 | GDK_POINTER_MOTION_HINT_MASK);
1026 osso_hw_set_event_cb(_osso, NULL, osso_cb_hw_state, NULL);
1029 /* Initialize data. */
1031 /* Cache some pango and GCs for drawing. */
1032 _scale_context = gtk_widget_get_pango_context(_map_widget);
1033 _scale_layout = pango_layout_new(_scale_context);
1034 _scale_font = pango_font_description_new();
1035 pango_font_description_set_size(_scale_font, 12 * PANGO_SCALE);
1036 pango_layout_set_font_description(_scale_layout, _scale_font);
1039 _speed_limit_gc1 = gdk_gc_new(_map_widget->window);
1043 gdk_gc_set_rgb_fg_color(_speed_limit_gc1, &color);
1047 _speed_limit_gc2 = gdk_gc_new(_map_widget->window);
1048 gdk_gc_set_rgb_fg_color(_speed_limit_gc2, &color);
1049 _speed_limit_context = gtk_widget_get_pango_context(_map_widget);
1050 _speed_limit_layout = pango_layout_new(_speed_limit_context);
1051 _speed_limit_fontdesc = pango_font_description_new();
1052 pango_font_description_set_size(_speed_limit_fontdesc,64 * PANGO_SCALE);
1053 pango_layout_set_font_description(_speed_limit_layout, _speed_limit_fontdesc);
1054 pango_layout_set_alignment(_speed_limit_layout, PANGO_ALIGN_CENTER);
1056 /* draw_sat_info() */
1057 _sat_info_gc1 = gdk_gc_new(_map_widget->window);
1061 gdk_gc_set_rgb_fg_color(_sat_info_gc1, &color);
1064 color.blue = 0xffff;
1065 _sat_info_gc2 = gdk_gc_new(_map_widget->window);
1066 gdk_gc_set_rgb_fg_color(_sat_info_gc2, &color);
1067 _sat_info_context = gtk_widget_get_pango_context(_map_widget);
1068 _sat_info_layout = pango_layout_new(_sat_info_context);
1069 _sat_info_fontdesc = pango_font_description_new();
1070 pango_font_description_set_family(_sat_info_fontdesc, "Sans Serif");
1071 pango_font_description_set_size(_sat_info_fontdesc, 8 * PANGO_SCALE);
1072 pango_layout_set_font_description(_sat_info_layout, _sat_info_fontdesc);
1073 pango_layout_set_alignment(_sat_info_layout, PANGO_ALIGN_CENTER);
1075 /* sat_panel_expose() */
1076 _sat_panel_context = gtk_widget_get_pango_context(_map_widget);
1077 _sat_panel_layout = pango_layout_new(_sat_panel_context);
1078 _sat_panel_fontdesc = pango_font_description_new();
1079 pango_font_description_set_family(_sat_panel_fontdesc, "Sans Serif");
1080 pango_font_description_set_size(_sat_panel_fontdesc, 14 * PANGO_SCALE);
1081 pango_layout_set_font_description(_sat_panel_layout, _sat_panel_fontdesc);
1083 /* heading_panel_expose() */
1084 _heading_panel_context = gtk_widget_get_pango_context(_map_widget);
1085 _heading_panel_layout = pango_layout_new(_heading_panel_context);
1086 _heading_panel_fontdesc = pango_font_description_new();
1087 pango_font_description_set_family(_heading_panel_fontdesc, "Sans Serif");
1089 /* draw_sat_details() */
1090 _sat_details_context = gtk_widget_get_pango_context(_map_widget);
1091 _sat_details_layout = pango_layout_new(_sat_details_context);
1092 _sat_details_fontdesc = pango_font_description_new();
1094 pango_font_description_set_family(_sat_details_fontdesc, "Sans Serif");
1095 pango_font_description_set_size(_sat_details_fontdesc, 10 * PANGO_SCALE);
1096 pango_layout_set_font_description(_sat_details_layout, _sat_details_fontdesc);
1097 pango_layout_set_alignment(_sat_details_layout, PANGO_ALIGN_CENTER);
1099 /* sat_details_panel_expose() */
1100 _sat_details_expose_context = gtk_widget_get_pango_context(_map_widget);
1101 _sat_details_expose_layout = pango_layout_new(_sat_details_expose_context);
1102 _sat_details_expose_fontdesc = pango_font_description_new();
1103 pango_font_description_set_family(_sat_details_expose_fontdesc, "Sans Serif");
1104 pango_layout_set_alignment(_sat_details_expose_layout, PANGO_ALIGN_CENTER);
1105 pango_font_description_set_size(_sat_details_expose_fontdesc,14 * PANGO_SCALE);
1106 pango_layout_set_font_description(_sat_details_expose_layout, _sat_details_expose_fontdesc);
1108 _last_spoken_phrase = g_strdup("");
1110 memset(&_autoroute_data, 0, sizeof(_autoroute_data));
1120 integerize_data(_vel_offsetx, _vel_offsety, _pos, _gps);
1122 /* Initialize our line styles. */
1129 /* If present, attempt to load the file specified on the command line. */
1131 GnomeVFSResult vfs_result;
1136 /* Get the selected filename. */
1137 file_uri = gnome_vfs_make_uri_from_shell_arg(argv[1]);
1141 gnome_vfs_read_entire_file(file_uri, &size, &buffer))) {
1142 gchar buffer[BUFFER_SIZE];
1143 snprintf(buffer, sizeof(buffer),
1145 _("Failed to open file for reading"),
1146 gnome_vfs_result_to_string(vfs_result));
1147 popup_error(_window, buffer);
1149 if (parse_gpx(&_route, buffer, size, 0)) {
1150 MACRO_BANNER_SHOW_INFO(_window, _("Route Opened"));
1152 popup_error(_window, _("Error parsing GPX file."));
1158 /* If we have a route, calculate the next point. */
1159 route_find_nearest_point();
1162 /* Add D-BUS signal handler for 'status_changed' */
1164 DBusConnection *dbus_conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
1165 gchar *filter_string = g_strdup_printf("interface=%s", ICD_DBUS_INTERFACE);
1167 dbus_bus_add_match(dbus_conn, filter_string, NULL);
1169 g_free(filter_string);
1171 /* add the callback */
1172 dbus_connection_add_filter(dbus_conn,
1173 get_connection_status_signal_cb,
1176 osso_iap_cb(iap_callback);
1179 DBusGConnection *dbus_conn;
1180 GError *error = NULL;
1182 /* Initialize D-Bus. */
1183 if (NULL == (dbus_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error))) {
1184 g_printerr("Failed to open connection to D-Bus: %s.\n",
1189 if (NULL == (_rfcomm_req_proxy =
1190 dbus_g_proxy_new_for_name(dbus_conn, BTCOND_SERVICE,
1192 BTCOND_REQ_INTERFACE))) {
1193 g_printerr("Failed to open connection to %s.\n",
1194 BTCOND_REQ_INTERFACE);
1199 gtk_idle_add((GSourceFunc) window_present, NULL);
1201 vprintf("%s(): return\n", __PRETTY_FUNCTION__);