]> err.no Git - mapper/blobdiff - src/ui-common.c
Map widget:
[mapper] / src / ui-common.c
index 0abb97648d93357015cb221cf7b731035ce34c36..d4ca92d827991638ed3f48f9a2a999e6dcc06241 100644 (file)
@@ -1,7 +1,5 @@
 #include <config.h>
 
-#define _GNU_SOURCE
-
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
 #include <fcntl.h>
 #include <libgnomevfs/gnome-vfs.h>
 #include <curl/multi.h>
-#include <gconf/gconf-client.h>
-#include <libxml/parser.h>
-#include <libintl.h>
-#include <locale.h>
-#include <sqlite3.h>
+#include <glib/gi18n.h>
+
+#include "gtkgps.h"
+#include "gtkcompass.h"
 
 #include "hildon-mapper.h"
 
 #include "utils.h"
 #include "poi.h"
+#include "path.h"
 #include "route.h"
+#include "track.h"
 #include "settings.h"
 #include "gps.h"
 #include "map.h"
 #include "mapper-types.h"
-#include "bt.h"
 #include "ui-common.h"
 #include "db.h"
-
+#include "gps-panels.h"
+#include "gps-conn.h"
+#include "filter.h"
+#include "dialogs.h"
 #include "settings-gui.h"
+#include "map-repo.h"
+#include "poi-gui.h"
+
+#ifdef WITH_GST
+#include "audio-note.h"
+#endif
 
 /* Callbacks */
 #include "cb.h"
 
 /* Default size */
 #define WINDOW_SIZE_X 800
-#define WINDOW_SIZE_Y 600
+#define WINDOW_SIZE_Y 480
 
-GtkWidget *_menu_bar;
-GtkWidget *_toolbar;
+static GtkWidget *menu_bar;
 GtkWidget *_fix_banner=NULL;
 
+static GtkActionGroup *actions;
+static GtkActionGroup *map_repos_action_group;
+static GtkUIManager *ui;
+
+struct ui_notebook_struct {
+       GtkWidget *notebook;
+       gint map;
+       gint gps;
+       gint heading;
+       gint route;
+       gint track;
+       gint qpoi;
+       gint audio;
+};
+struct ui_notebook_struct ui_notebook;
+
+static poi_quick_data tqp;
+
+/* A GPS icon would be nice.. anyone ? */
+
+#ifndef GTK_STOCK_INFO
+#define GTK_STOCK_INFO GTK_STOCK_PROPERTIES
+#endif
+
+static gboolean mapper_cb_quit(GtkWidget *widget, GdkEvent *event, gpointer data);
+
 /**
- * Update all GdkGC objects to reflect the current _draw_width.
+ * Action groups and UI
  */
-#define UPDATE_GC(gc) \
-    gdk_gc_set_line_attributes(gc, \
-            _draw_width, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND);
-void update_gcs()
+static const gchar *mapper_ui =
+"<ui>"
+"  <menubar name='MenuBar'>"
+"    <menu action='file'>"
+"      <menu action='file_settings'>"
+"       <menuitem action='file_settings_gps'/>"
+"       <menuitem action='file_settings_generic'/>"
+"       <menuitem action='file_settings_colors'/>"
+"       <separator/>"
+"       <menuitem action='file_settings_osm'/>"
+#ifdef WITH_DEVICE_770
+"       <separator/>"
+"       <menuitem action='file_settings_keys'/>"
+#endif
+"         </menu>"
+"      <separator/>"
+"      <menuitem action='file_import_osm'/>"
+"      <menuitem action='file_quit'/>"
+"    </menu>"
+"    <menu action='map' name='map'>"
+"      <menu action='map_maps' name='map_maps'>"
+"      </menu>"
+"      <separator/>"
+"      <menuitem action='map_manager'/>"
+"      <menuitem action='map_repositories'/>"
+"      <separator/>"
+"      <menuitem action='map_auto_download'/>"
+"      <separator/>"
+"     <menu action='autocenter'>"
+"      <menuitem action='autocenter_latlon'/>"
+"      <menuitem action='autocenter_lead'/>"
+"      <menuitem action='autocenter_none'/>"
+"     </menu>"
+"    </menu>"
+"    <menu action='search'>"
+"      <menuitem action='search_address'/>"
+"    </menu>"
+"    <menu action='track'>"
+"      <menuitem action='track_open'/>"
+"      <menuitem action='track_save'/>"
+"      <menuitem action='track_clear'/>"
+"      <separator/>"
+"      <menuitem action='track_insert_break'/>"
+"      <menuitem action='track_insert_mark'/>"
+"      <separator/>"
+"      <menuitem action='track_dist_last_mark'/>"
+"      <menuitem action='track_dist_first'/>"
+"      <separator/>"
+"      <menuitem action='track_filter'/>"
+"    </menu>"
+"    <menu action='route'>"
+"      <menuitem action='route_open'/>"
+"      <menuitem action='route_save'/>"
+"      <menuitem action='route_download'/>"
+"      <separator/>"
+"      <menuitem action='route_dist_next'/>"
+"      <menuitem action='route_dist_last'/>"
+"      <separator/>"
+"      <menuitem action='route_reset'/>"
+"      <menuitem action='route_clear'/>"
+"    </menu>"
+"    <menu action='poi'>"
+"      <menuitem action='poi_categories'/>"
+"      <menuitem action='poi_search'/>"
+#if 0
+"      <separator/>"
+"      <menuitem action='poi_import'/>"
+"      <menuitem action='poi_export'/>"
+#endif
+"    </menu>"
+"    <menu action='view'>"
+"      <menuitem action='view_zoom_in'/>"
+"      <menuitem action='view_zoom_out'/>"
+"      <menuitem action='view_zoom_normal'/>"
+"      <menuitem action='view_zoom_auto'/>"
+"      <separator/>"
+"      <menuitem action='view_fullscreen'/>"
+"      <separator/>"
+"      <menuitem action='view_toolbar'/>"
+"      <separator/>"
+"      <menu action='view_items'>"
+"       <menuitem action='view_scale'/>"
+"       <menuitem action='view_route'/>"
+"       <menuitem action='view_track'/>"
+"       <menuitem action='view_vector'/>"
+"       <menuitem action='view_poi'/>"
+"      </menu>"
+"    </menu>"
+"    <menu action='goto'>"
+"      <menuitem action='goto_home'/>"
+"      <menuitem action='goto_destination'/>"
+"      <menuitem action='goto_gps'/>"
+"      <separator/>"
+"      <menuitem action='goto_latlon'/>"
+"      <menuitem action='goto_nearpoi'/>"
+"      <menuitem action='goto_nextway'/>"
+"      <separator/>"
+"    </menu>"
+"    <menu action='gps'>"
+"      <menuitem action='gps_enabled'/>"
+"      <menuitem action='gps_information'/>"
+"    </menu>"
+"    <menu action='help'>"
+#if defined (WITH_OSSO_HELP) || defined(WITH_HILDON_HELP)
+"      <menuitem action='help_help'/>"
+#endif
+"      <menuitem action='help_about'/>"
+"    </menu>"
+"  </menubar>"
+"  <toolbar name='ToolBar'>"
+"    <toolitem action='goto_home'/>"
+"    <toolitem action='goto_destination'/>"
+"    <toolitem action='goto_gps'/>"
+"    <separator/>"
+"    <toolitem action='poi_add'/>"
+"    <toolitem action='poi_quick_add'/>"
+"    <separator/>"
+"    <toolitem action='search_address'/>"
+"    <separator/>"
+"    <toolitem action='view_zoom_in'/>"
+"    <toolitem action='view_zoom_out'/>"
+#ifndef WITH_DEVICE_770
+"    <toolitem action='view_zoom_normal'/>"
+"    <toolitem action='view_zoom_auto'/>"
+#endif
+"    <separator/>"
+"  </toolbar>"
+"  <toolbar name='MappingToolBar'>"
+"    <toolitem action='goto_gps'/>"
+"    <separator/>"
+"    <toolitem action='poi_add'/>"
+"    <toolitem action='poi_quick_add'/>"
+"    <toolitem action='track_insert_break'/>"
+"    <toolitem action='track_insert_mark'/>"
+"    <separator/>"
+"    <toolitem action='search_address'/>"
+"  </toolbar>"
+"</ui>";
+
+static GtkActionEntry ui_entries[] = {
+       {"file", NULL, N_("_File"), NULL, NULL, NULL },
+       {"file_settings", GTK_STOCK_PREFERENCES, N_("_Settings..."), NULL, NULL, NULL },
+       {"file_settings_generic", NULL, N_("Generic..."), NULL, NULL, G_CALLBACK(menu_cb_settings) },
+       {"file_settings_colors", NULL, N_("_Colors..."), NULL, NULL, G_CALLBACK(menu_cb_settings_colors) },
+       {"file_settings_gps", NULL, N_("_Gps..."), NULL, NULL, G_CALLBACK(menu_cb_settings_gps) },
+       {"file_settings_osm", NULL, N_("_Map info..."), NULL, NULL, G_CALLBACK(menu_cb_settings_osm) },
+       {"file_settings_keys", NULL, N_("_Keys..."), NULL, NULL, G_CALLBACK(menu_cb_settings_keys) },
+       {"file_import_osm", NULL, N_("_Import OSM data..."), NULL, NULL, G_CALLBACK(menu_cb_import_osm) },
+       {"file_quit", GTK_STOCK_QUIT, N_("_Quit"), "<control>Q", NULL, G_CALLBACK(mapper_cb_quit) },
+
+       {"help", NULL, N_("_Help"), NULL, NULL, NULL },
+       {"help_help", GTK_STOCK_HELP, N_("_Help"), NULL, NULL, G_CALLBACK(menu_cb_help) },
+       {"help_about", GTK_STOCK_ABOUT, N_("_About"), "<control>A", NULL, G_CALLBACK(menu_cb_about) },
+
+       {"track", NULL, N_("_Track"), NULL, NULL, NULL },
+       {"track_open", GTK_STOCK_OPEN, N_("_Open..."), NULL, NULL, G_CALLBACK(menu_cb_track_open) },
+       {"track_save", GTK_STOCK_SAVE, N_("_Save..."), "<control>S", NULL, G_CALLBACK(menu_cb_track_save) },
+       {"track_clear", GTK_STOCK_CLEAR, N_("_Clear"), NULL, NULL, G_CALLBACK(menu_cb_track_clear) },
+       {"track_insert_break", NULL, N_("Insert _Break"), NULL, NULL, G_CALLBACK(menu_cb_track_insert_break) },
+       {"track_insert_mark", NULL, N_("Insert _Mark..."), NULL, NULL, G_CALLBACK(menu_cb_track_insert_mark) },
+       {"track_dist_last_mark", NULL, N_("Distance to _last mark"), NULL, NULL, G_CALLBACK(menu_cb_track_distlast) },
+       {"track_dist_first", NULL, N_("Distance from _first"), NULL, NULL, G_CALLBACK(menu_cb_track_distfirst) },
+       {"track_filter", NULL, N_("_Filter..."), NULL, NULL, G_CALLBACK(menu_cb_track_filter) },
+
+       {"route", NULL, N_("_Route"), NULL, NULL, NULL },
+       {"route_open", GTK_STOCK_OPEN, N_("_Open..."), NULL, NULL, G_CALLBACK(menu_cb_route_open) },
+       {"route_save", GTK_STOCK_SAVE, N_("_Save..."), NULL, NULL, G_CALLBACK(menu_cb_route_save) },
+       {"route_download", NULL, N_("Do_wnload..."), NULL, NULL, G_CALLBACK(menu_cb_route_download)},
+       {"route_reset", NULL, N_("Reset"), NULL, NULL, G_CALLBACK(menu_cb_route_reset) },
+       {"route_clear", GTK_STOCK_CLEAR, N_("_Clear"), NULL, NULL, G_CALLBACK(menu_cb_route_clear) },
+       {"route_dist_next", NULL, N_("Show Distance to _Next Waypoint"), NULL, NULL, G_CALLBACK(menu_cb_route_distnext) },
+       {"route_dist_last", NULL, N_("Show Distance to _End of Route"), NULL, NULL, G_CALLBACK(menu_cb_route_distlast) },
+
+       {"poi", NULL, N_("_Poi"), NULL, NULL, NULL },
+       {"poi_categories", GTK_STOCK_INDEX, N_("_Categories.."), NULL, NULL, G_CALLBACK(menu_cb_category) },
+       {"poi_settings", GTK_STOCK_PREFERENCES, N_("_Settings..."), NULL, NULL, NULL },
+       {"poi_add", GTK_STOCK_ADD, N_("_Add"), "<control>A", NULL, G_CALLBACK(cb_poi_add) },
+       {"poi_quick_add", GTK_STOCK_ABOUT, N_("_Quick Add"), "<control>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 },
+
+       {"search", NULL, N_("_Search"), NULL, NULL, NULL },
+       {"search_address", GTK_STOCK_FIND, N_("Address..."), "<control>F", NULL, G_CALLBACK(menu_cb_search_address) },
+
+       {"map", NULL, N_("_Map"), NULL, NULL, NULL },
+       {"map_maps", NULL, N_("_Maps"), NULL, NULL, NULL },
+       {"map_manager", NULL, N_("Manager..."), NULL, NULL, G_CALLBACK(menu_cb_mapman) },
+       {"map_repositories", NULL, N_("_Repositories..."), NULL, NULL, G_CALLBACK(menu_cb_maps_repoman) },
+       {"autocenter", NULL, N_("_Autocenter"), NULL, NULL, NULL },
+
+       {"view", NULL, N_("_View"), NULL, NULL, NULL },
+       {"view_zoom_in", GTK_STOCK_ZOOM_IN, N_("Zoom _in"), NULL, NULL, G_CALLBACK(cb_zoomin) },
+       {"view_zoom_out", GTK_STOCK_ZOOM_OUT, N_("Zoom _out"), NULL, NULL, G_CALLBACK(cb_zoomout) },
+       {"view_zoom_normal", GTK_STOCK_ZOOM_100, N_("Zoom _normal"), "<control>0", NULL, G_CALLBACK(cb_zoom_base) },
+
+       {"view_items", NULL, N_("_Features"), NULL, NULL, NULL },
+
+       {"goto", NULL, N_("_Go"), NULL, NULL, NULL },
+       {"goto_home", GTK_STOCK_HOME, N_("_Home"), "<control>H", NULL, G_CALLBACK(menu_cb_goto_home) },
+       {"goto_destination", GTK_STOCK_JUMP_TO, N_("_Destination"), "<control>J", NULL, G_CALLBACK(menu_cb_goto_destination) },
+       {"goto_gps", NULL, N_("_GPS"), "<control>G", NULL, G_CALLBACK(menu_cb_goto_gps) },
+       {"goto_latlon", NULL, N_("Lat/Lon"), NULL, NULL, G_CALLBACK(menu_cb_goto_latlon) },
+       {"goto_nextway", NULL, N_("Next Waypoint"), NULL, NULL, G_CALLBACK(menu_cb_goto_nextway) },
+       {"goto_nearpoi", NULL, N_("Near POI"), NULL, NULL, G_CALLBACK(menu_cb_goto_nearpoi) },
+
+       {"gps", NULL, N_("Gp_s"), NULL, NULL, NULL },
+       {"gps_settings", NULL, N_("_Settings..."), NULL, NULL, NULL },
+};
+static guint n_ui_entries = G_N_ELEMENTS (ui_entries);
+
+static GtkToggleActionEntry ui_toggle_entries[] = {
+       {"map_auto_download", NULL, N_("Auto download"), NULL, NULL, G_CALLBACK(menu_cb_auto_download), FALSE},
+       {"view_zoom_auto", GTK_STOCK_ZOOM_FIT, N_("AutoZoom"), NULL, NULL, G_CALLBACK(cb_zoom_auto), FALSE},
+       {"gps_enabled", GTK_STOCK_CONNECT, N_("Enabled"), NULL, NULL, G_CALLBACK(menu_cb_enable_gps), FALSE},
+       {"gps_information", GTK_STOCK_INFO, N_("Panel"), NULL, NULL, G_CALLBACK (menu_cb_gps_show_info), FALSE},
+#if 0
+       {"view_fullscreen", GTK_STOCK_FULLSCREEN, N_("Fullscreen"), NULL, NULL, G_CALLBACK(cb_fullscreen), FALSE},
+#else
+       {"view_fullscreen", NULL, N_("Fullscreen"), "F11", NULL, G_CALLBACK(cb_fullscreen), FALSE},
+#endif
+       {"view_toolbar", NULL, N_("Toolbar"), NULL, NULL, G_CALLBACK(menu_cb_view_toolbar), FALSE},
+       {"view_scale", NULL, N_("Scale"), NULL, NULL, G_CALLBACK(menu_cb_show_scale), TRUE},
+       {"view_route", NULL, N_("Route"), NULL, NULL, G_CALLBACK(menu_cb_show_routes), TRUE},
+       {"view_track", NULL, N_("Track"), NULL, NULL, G_CALLBACK(menu_cb_show_tracks), TRUE},
+       {"view_vector", NULL, N_("Vector"), NULL, NULL, G_CALLBACK(menu_cb_show_velvec), TRUE},
+       {"view_poi", NULL, N_("POIs"), NULL, NULL, G_CALLBACK(menu_cb_show_poi), TRUE},
+};
+static guint n_ui_toggle_entries = G_N_ELEMENTS (ui_toggle_entries);
+
+static GtkRadioActionEntry ui_autocenter_entries[] = {
+  { "autocenter_latlon", NULL, "Lat/Lon", "<control>L", NULL, CENTER_LATLON },
+  { "autocenter_lead", NULL, "Lead", "<control>E", NULL, CENTER_LEAD },
+  { "autocenter_none", NULL, "None", "<control>N", NULL, CENTER_MANUAL },
+};
+static guint n_ui_autocenter_entries = G_N_ELEMENTS (ui_autocenter_entries);
+
+/************************************************************************************/
+
+void
+set_action_sensitive(const char *name, gboolean sensitive)
 {
-       gint i;
-       printf("%s()\n", __PRETTY_FUNCTION__);
-
-       for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
-               gdk_color_alloc(gtk_widget_get_colormap(_map_widget),
-                               &_color[i]);
-               if (_gc[i])
-                       g_object_unref(_gc[i]);
-               _gc[i] = gdk_gc_new(_map_pixmap);
-               gdk_gc_set_foreground(_gc[i], &_color[i]);
-               gdk_gc_set_line_attributes(_gc[i],
-                                          _draw_width, GDK_LINE_SOLID,
-                                          GDK_CAP_ROUND, GDK_JOIN_ROUND);
-       }
+GtkAction *action = gtk_action_group_get_action(actions, name);
+g_assert(action);
+gtk_action_set_sensitive(action, sensitive);
+}
 
-       vprintf("%s(): return\n", __PRETTY_FUNCTION__);
+void
+set_action_activate(const char *name, gboolean active)
+{
+GtkAction *action = gtk_action_group_get_action(actions, name);
+g_assert(action);
+gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), active);
 }
 
+#if 0
+void
+set_radio_action_value(const char *name, gint value)
+{
+GtkAction *action = gtk_action_group_get_action(actions, name);
+gtk_radio_action_set_current_value(action, value);
+}
+#endif
+
+/************************************************************************************/
+
 #ifdef WITH_HILDON
 void force_min_visible_bars(HildonControlbar * control_bar, gint num_bars)
 {
-       GValue val;
-       printf("%s()\n", __PRETTY_FUNCTION__);
-       memset(&val, 0, sizeof(val));
-       g_value_init(&val, G_TYPE_INT);
-       g_value_set_int(&val, num_bars);
-       g_object_set_property(G_OBJECT(control_bar), "minimum-visible-bars",
-                             &val);
-       vprintf("%s(): return\n", __PRETTY_FUNCTION__);
+GValue val;
+memset(&val, 0, sizeof(val));
+g_value_init(&val, G_TYPE_INT);
+g_value_set_int(&val, num_bars);
+g_object_set_property(G_OBJECT(control_bar), "minimum-visible-bars", &val);
 }
 #else
 void force_min_visible_bars(void *a, gint b)
@@ -92,1100 +364,495 @@ void force_min_visible_bars(void *a, gint b)
 }
 #endif
 
-/**
- * Pop up a modal dialog box with simple error information in it.
- */
-void popup_error(GtkWidget * window, const gchar * error)
+static gboolean
+mapper_cb_quit(GtkWidget *widget, GdkEvent  *event, gpointer data)
 {
-       GtkWidget *dialog;
-       printf("%s(\"%s\")\n", __PRETTY_FUNCTION__, error);
-
-       dialog = hildon_note_new_information(GTK_WINDOW(window), error);
-
-       gtk_dialog_run(GTK_DIALOG(dialog));
-       gtk_widget_destroy(dialog);
-
-       vprintf("%s(): return\n", __PRETTY_FUNCTION__);
+if (dialog_confirm(_window, _("Are sure you'd like to quit ?"))==TRUE) {
+       gtk_main_quit();
+       return FALSE;
 }
-
-void menu_maps_remove_repos()
-{
-       GList *curr;
-       printf("%s()\n", __PRETTY_FUNCTION__);
-
-       /* Delete one menu item for each repo. */
-       for (curr = _repo_list; curr; curr = curr->next) {
-               gtk_widget_destroy(gtk_container_get_children
-                                  (GTK_CONTAINER(_menu_maps_submenu))->data);
-       }
-       vprintf("%s(): return\n", __PRETTY_FUNCTION__);
+return TRUE;
 }
 
-void menu_maps_add_repos()
+void 
+menu_maps_add_repos(void)
 {
-       GList *curr;
-       GtkWidget *last_repo = NULL;
-       printf("%s()\n", __PRETTY_FUNCTION__);
-
-       for (curr = g_list_last(_repo_list); curr; curr = curr->prev) {
-               RepoData *rd = (RepoData *) curr->data;
-               GtkWidget *menu_item;
-               if (last_repo)
-                       gtk_menu_prepend(_menu_maps_submenu, menu_item
-                                        =
-                                        gtk_radio_menu_item_new_with_label_from_widget
-                                        (GTK_RADIO_MENU_ITEM(last_repo),
-                                         rd->name));
-               else {
-                       gtk_menu_prepend(_menu_maps_submenu, menu_item
-                                        =
-                                        gtk_radio_menu_item_new_with_label
-                                        (NULL, rd->name));
-                       last_repo = menu_item;
-               }
-               gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item),
-                                              rd == _curr_repo);
-               rd->menu_item = menu_item;
-       }
-
-       /* Add signals (must be after entire menu is built). */
-       {
-               GList *currmi =
-                   gtk_container_get_children(GTK_CONTAINER
-                                              (_menu_maps_submenu));
-               for (curr = _repo_list; curr;
-                    curr = curr->next, currmi = currmi->next) {
-                       g_signal_connect(G_OBJECT(currmi->data), "activate",
-                                        G_CALLBACK(menu_cb_maps_select),
-                                        curr->data);
-               }
-       }
-
-       gtk_widget_show_all(_menu_maps_submenu);
-       vprintf("%s(): return\n", __PRETTY_FUNCTION__);
+GList *curr;
+static gint id=0;
+gint i=0;
+
+if (id>0) {
+       gtk_ui_manager_remove_ui(ui, id);
+} else {
+       id=gtk_ui_manager_new_merge_id(ui);
 }
 
-/**
- * Free a ProgressUpdateInfo data structure that was allocated during the
- * auto-map-download process.
- */
-void progress_update_info_free(ProgressUpdateInfo * pui)
-{
-       vprintf("%s()\n", __PRETTY_FUNCTION__);
-
-       g_free(pui->src_str);
-       g_free(pui->dest_str);
+if (map_repos_action_group) {
+       gtk_ui_manager_remove_action_group(ui, map_repos_action_group);
+       g_object_unref(map_repos_action_group);
+}
 
-       g_slice_free(ProgressUpdateInfo, pui);
+map_repos_action_group=gtk_action_group_new("map_repos_actions");
+g_assert(map_repos_action_group);
+gtk_ui_manager_insert_action_group(ui, map_repos_action_group, 0);
+gtk_ui_manager_ensure_update(ui);
+
+for (curr = g_list_last(_repo_list); curr; curr = curr->prev) {
+       RepoData *rd = (RepoData *) curr->data;
+       GtkAction *action;
+       gchar *action_name;
+
+       action_name = g_strdup_printf ("MapRepo%u", i++);
+       action=g_object_new(GTK_TYPE_ACTION, "name", action_name, "label", rd->name, NULL);
+       g_signal_connect(G_OBJECT(action), "activate", G_CALLBACK (menu_cb_maps_select), curr->data);
+       gtk_action_group_add_action(map_repos_action_group, action);
+       g_object_unref(action);
+       gtk_ui_manager_add_ui(ui, id, "/MenuBar/map/map_maps", rd->name, action_name, GTK_UI_MANAGER_MENUITEM, FALSE);
+}
 
-       vprintf("%s(): return\n", __PRETTY_FUNCTION__);
 }
 
 /**
- * Call gtk_window_present() on Mapper.  This also checks the
- * configuration and brings up the Settings dialog if the GPS Receiver is
- * not set up, the first time it is called.
+ * Call gtk_window_present() on Mapper.
  */
-gboolean window_present()
+gboolean 
+window_present()
 {
-       static gint been_here = 0;
-       static gint done_here = 0;
-       printf("%s()\n", __PRETTY_FUNCTION__);
-
-       if (!been_here++) {
-               /* Set connection state first, to avoid going into this if twice. */
-               if (!_rcvr_mac && _enable_gps) {
-                       GtkWidget *confirm;
-
-                       gtk_window_present(GTK_WINDOW(_window));
-
-                       popup_error(_window, _("It looks like this is your first time running "
-                                                         "Mapper. Press OK to continue."));
-
-                       if (settings_dialog()) {
-                               popup_error(_window,
-                                           _("OpenStreetMap.org provides public, free-to-use maps.  "
-                                            "You can also download a sample set of repositories from "
-                                            " the internet by using the \"Download...\" button."));
-                               repoman_dialog();
-                               if (_curr_repo->type != REPOTYPE_NONE) {
-                                       confirm = hildon_note_new_confirmation
-                                           (GTK_WINDOW(_window),
-                                            _("You will now see a blank screen.  You can download"
-                                             " maps using the \"Manage Maps\" menu item in the"
-                                             " \"Maps\" menu.  Or, press OK to enable"
-                                             " Auto-Download."));
-                                       if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) {
-                                               gtk_check_menu_item_set_active
-                                                   (GTK_CHECK_MENU_ITEM
-                                                    (_menu_auto_download_item),
-                                                    TRUE);
-                                       }
-                                       gtk_widget_destroy(confirm);
-                               }
-                       } else
-                               gtk_main_quit();
-               }
-               /* Connect to receiver. */
-               if (_enable_gps)
-                       rcvr_connect_now();
-
-               done_here++;    /* Don't ask... */
-       }
-       if (done_here) {
-               gtk_window_present(GTK_WINDOW(_window));
-
-               /* Re-enable any banners that might have been up. */
-               {
-                       ConnState old_state = _conn_state;
-                       set_conn_state(RCVR_OFF);
-                       set_conn_state(old_state);
-               }
-       }
-
-       vprintf("%s(): return\n", __PRETTY_FUNCTION__);
-       return FALSE;
+gtk_window_present(GTK_WINDOW(_window));
+return FALSE;
 }
 
-/**
- * Create the menu items needed for the drop down menu.
- */
-static void menu_init()
+static void 
+menu_init_cmenu()
 {
-       /* Create needed handles. */
-       GtkMenu *menu;
-       GtkWidget *submenu_routes;
-       GtkWidget *submenu_track;
-       GtkWidget *submenu;
-       GtkWidget *menu_item;
-       GtkWidget *file_item;
-       printf("%s()\n", __PRETTY_FUNCTION__);
-
-       /* Get the menu of our view. */
-       menu = GTK_MENU(gtk_menu_new());
+/* Create needed handles. */
+GtkMenu *menu;
+GtkWidget *submenu;
+GtkWidget *menu_item;
+
+/* Setup the context menu. */
+menu = GTK_MENU(gtk_menu_new());
+
+/* Setup the map context menu. */
+gtk_menu_append(menu, menu_item        = gtk_menu_item_new_with_label(_("Location")));
+gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
+
+/* Setup the map context menu. */
+gtk_menu_append(submenu, _cmenu_loc_show_latlon_item= gtk_menu_item_new_with_label(_("Show Lat/Lon")));
+gtk_menu_append(submenu, _cmenu_loc_clip_latlon_item = gtk_menu_item_new_with_label(_("Copy Lat/Lon")));
+gtk_menu_append(submenu, gtk_separator_menu_item_new());
+gtk_menu_append(submenu, _cmenu_loc_distance_to_item = gtk_menu_item_new_with_label(_("Show Distance to")));
+gtk_menu_append(submenu, _cmenu_loc_route_to_item= gtk_menu_item_new_with_label(_("Download Route to...")));
+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_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")));
+gtk_menu_append(submenu, _cmenu_loc_set_destination    = gtk_menu_item_new_with_label(_("Set as Destination")));
+
+/* Setup the waypoint context menu. */
+gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("Waypoint")));
+gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
+
+gtk_menu_append(submenu, _cmenu_way_show_latlon_item = gtk_menu_item_new_with_label(_("Show Lat/Lon")));
+gtk_menu_append(submenu, _cmenu_way_show_desc_item = gtk_menu_item_new_with_label(_("Show Description")));
+gtk_menu_append(submenu, _cmenu_way_clip_latlon_item = gtk_menu_item_new_with_label(_("Copy Lat/Lon")));
+gtk_menu_append(submenu, _cmenu_way_clip_desc_item = gtk_menu_item_new_with_label(_("Copy Description")));
+gtk_menu_append(submenu, gtk_separator_menu_item_new());
+gtk_menu_append(submenu, _cmenu_way_distance_to_item = gtk_menu_item_new_with_label(_("Show Distance to")));
+gtk_menu_append(submenu, _cmenu_way_route_to_item = gtk_menu_item_new_with_label(_("Download Route to...")));
+gtk_menu_append(submenu, _cmenu_way_delete_item = gtk_menu_item_new_with_label(_("Delete...")));
+gtk_menu_append(submenu, gtk_separator_menu_item_new());
+gtk_menu_append(submenu, _cmenu_way_add_poi = gtk_menu_item_new_with_label(_("Add POI...")));
+gtk_widget_set_sensitive(_cmenu_way_add_poi, _db != NULL);
+gtk_menu_append(submenu, gtk_separator_menu_item_new());
+gtk_menu_append(submenu, _cmenu_way_goto_nextway = gtk_menu_item_new_with_label(_("Go to Next")));
+
+/* Setup the POI context menu. */
+gtk_menu_append(menu, _cmenu_poi = gtk_menu_item_new_with_label(_("POI")));
+gtk_widget_set_sensitive(_cmenu_poi, _db != NULL);
+gtk_menu_item_set_submenu(GTK_MENU_ITEM(_cmenu_poi), submenu = gtk_menu_new());
+
+gtk_menu_append(submenu, _cmenu_loc_add_poi    = gtk_menu_item_new_with_label(_("Add POI...")));
+gtk_menu_append(submenu, _cmenu_poi_edit_poi = gtk_menu_item_new_with_label(_("View/Edit...")));
+gtk_menu_append(submenu, gtk_separator_menu_item_new());
+gtk_menu_append(submenu, _cmenu_poi_distance_to_item = gtk_menu_item_new_with_label(_("Show Distance to")));
+gtk_menu_append(submenu, _cmenu_poi_route_to_item = gtk_menu_item_new_with_label(_("Download Route to...")));
+gtk_menu_append(submenu, gtk_separator_menu_item_new());
+gtk_menu_append(submenu, _cmenu_poi_add_route = gtk_menu_item_new_with_label(_("Add Route Point")));
+gtk_menu_append(submenu, _cmenu_poi_add_way    = gtk_menu_item_new_with_label(_("Add Waypoint...")));
+gtk_menu_append(submenu, gtk_separator_menu_item_new());
+gtk_menu_append(submenu, _cmenu_poi_goto_nearpoi = gtk_menu_item_new_with_label(_("Go to Nearest")));
+
+/* Connect signals for context menu. */
+g_signal_connect(G_OBJECT(_cmenu_loc_show_latlon_item), "activate", G_CALLBACK(cmenu_cb_loc_show_latlon), NULL);
+g_signal_connect(G_OBJECT(_cmenu_loc_clip_latlon_item), "activate", G_CALLBACK(cmenu_cb_loc_clip_latlon), NULL);
+g_signal_connect(G_OBJECT(_cmenu_loc_route_to_item), "activate", G_CALLBACK(cmenu_cb_loc_route_to), NULL);
+g_signal_connect(G_OBJECT(_cmenu_loc_distance_to_item), "activate", G_CALLBACK(cmenu_cb_loc_distance_to), NULL);
+g_signal_connect(G_OBJECT(_cmenu_loc_add_route), "activate", G_CALLBACK(cmenu_cb_loc_add_route), NULL);
+g_signal_connect(G_OBJECT(_cmenu_loc_add_way), "activate", G_CALLBACK(cmenu_cb_loc_add_way), NULL);
+g_signal_connect(G_OBJECT(_cmenu_loc_add_poi), "activate", G_CALLBACK(cmenu_cb_loc_add_poi), NULL);
+g_signal_connect(G_OBJECT(_cmenu_loc_set_gps), "activate", G_CALLBACK(cmenu_cb_loc_set_gps), NULL);
+g_signal_connect(G_OBJECT(_cmenu_loc_set_home), "activate", G_CALLBACK(cmenu_cb_loc_set_home), NULL);
+g_signal_connect(G_OBJECT(_cmenu_loc_set_destination), "activate", G_CALLBACK(cmenu_cb_loc_set_destination), NULL);
+
+g_signal_connect(G_OBJECT(_cmenu_way_show_latlon_item), "activate", G_CALLBACK(cmenu_cb_way_show_latlon), NULL);
+g_signal_connect(G_OBJECT(_cmenu_way_show_desc_item), "activate", G_CALLBACK(cmenu_cb_way_show_desc), NULL);
+g_signal_connect(G_OBJECT(_cmenu_way_clip_latlon_item), "activate", G_CALLBACK(cmenu_cb_way_clip_latlon), NULL);
+g_signal_connect(G_OBJECT(_cmenu_way_clip_desc_item), "activate", G_CALLBACK(cmenu_cb_way_clip_desc), NULL);
+g_signal_connect(G_OBJECT(_cmenu_way_route_to_item), "activate", G_CALLBACK(cmenu_cb_way_route_to), NULL);
+g_signal_connect(G_OBJECT(_cmenu_way_distance_to_item), "activate", G_CALLBACK(cmenu_cb_way_distance_to), NULL);
+g_signal_connect(G_OBJECT(_cmenu_way_delete_item), "activate", G_CALLBACK(cmenu_cb_way_delete), NULL);
+g_signal_connect(G_OBJECT(_cmenu_way_add_poi), "activate", G_CALLBACK(cmenu_cb_way_add_poi), NULL);
+g_signal_connect(G_OBJECT(_cmenu_way_goto_nextway), "activate", G_CALLBACK(menu_cb_goto_nextway), NULL);
+
+g_signal_connect(G_OBJECT(_cmenu_poi_edit_poi), "activate", G_CALLBACK(cmenu_cb_poi_edit_poi), NULL);
+g_signal_connect(G_OBJECT(_cmenu_poi_route_to_item), "activate", G_CALLBACK(cmenu_cb_poi_route_to), NULL);
+g_signal_connect(G_OBJECT(_cmenu_poi_distance_to_item), "activate", G_CALLBACK(cmenu_cb_poi_distance_to), NULL);
+g_signal_connect(G_OBJECT(_cmenu_poi_add_route), "activate", G_CALLBACK(cmenu_cb_poi_add_route), NULL);
+g_signal_connect(G_OBJECT(_cmenu_poi_add_way), "activate", G_CALLBACK(cmenu_cb_poi_add_way), NULL);
+g_signal_connect(G_OBJECT(_cmenu_poi_goto_nearpoi), "activate", G_CALLBACK(menu_cb_goto_nearpoi), NULL);
+
+gtk_widget_show_all(GTK_WIDGET(menu));
 
-#ifdef WITH_HILDON
-       hildon_window_set_menu(HILDON_WINDOW(_window), menu);
+#ifdef WITH_DEVICE_770
+gtk_widget_tap_and_hold_setup(_map_widget, GTK_WIDGET(menu), NULL, 0);
 #else
-       file_item = gtk_menu_item_new_with_label("File");
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_item), GTK_WIDGET(menu));
-       gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(file_item));
+_menu_map = menu;
 #endif
+}
 
-       /* Create the menu items. */
+static GtkWidget *
+mapper_window_new(void) 
+{
+GtkWidget *window;
 
-       /* The "Routes" submenu. */
-       menu_item = gtk_menu_item_new_with_label(_("Route"));
-#ifdef WITH_HILDON
-       gtk_menu_append(menu, menu_item);
-#else
-       gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
-#endif
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),  submenu = gtk_menu_new());
-       gtk_menu_append(submenu, _menu_route_open_item = gtk_menu_item_new_with_label(_("Open...")));
-       gtk_menu_append(submenu, _menu_route_download_item = gtk_menu_item_new_with_label(_("Download...")));
-       gtk_menu_append(submenu, _menu_route_save_item = gtk_menu_item_new_with_label(_("Save...")));
-       gtk_menu_append(submenu, _menu_route_distnext_item = gtk_menu_item_new_with_label(_("Show Distance to Next Waypoint")));
-       gtk_menu_append(submenu, _menu_route_distlast_item = gtk_menu_item_new_with_label(_("Show Distance to End of Route")));
-       gtk_menu_append(submenu, _menu_route_reset_item = gtk_menu_item_new_with_label(_("Reset")));
-       gtk_menu_append(submenu, _menu_route_clear_item = gtk_menu_item_new_with_label(_("Clear")));
-
-       /* The "Track" submenu. */
-       menu_item = gtk_menu_item_new_with_label(_("Track"));
-#ifdef WITH_HILDON
-       gtk_menu_append(menu, menu_item);
-#else
-       gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
-#endif
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
-       gtk_menu_append(submenu, _menu_track_open_item = gtk_menu_item_new_with_label(_("Open...")));
-       gtk_menu_append(submenu, _menu_track_save_item = gtk_menu_item_new_with_label(_("Save...")));
-       gtk_menu_append(submenu, _menu_track_insert_break_item = gtk_menu_item_new_with_label(_("Insert Break")));
-       gtk_menu_append(submenu, _menu_track_insert_mark_item = gtk_menu_item_new_with_label(_("Insert Mark...")));
-       gtk_menu_append(submenu, _menu_track_distlast_item = gtk_menu_item_new_with_label(_("Show Distance from Last Mark")));
-       gtk_menu_append(submenu, _menu_track_distfirst_item = gtk_menu_item_new_with_label(_("Show Distance from Beginning")));
-       gtk_menu_append(submenu, _menu_track_clear_item = gtk_menu_item_new_with_label(_("Clear")));
-       gtk_menu_append(submenu, gtk_separator_menu_item_new());
-       gtk_menu_append(submenu, _menu_track_filter = gtk_menu_item_new_with_label(_("Filter...")));
-
-       /* The "Maps" submenu. */
-       menu_item = gtk_menu_item_new_with_label(_("Maps"));
-#ifdef WITH_HILDON
-       gtk_menu_append(menu, menu_item);
-#else
-       gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
-#endif
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), _menu_maps_submenu = gtk_menu_new());
-       gtk_menu_append(_menu_maps_submenu, gtk_separator_menu_item_new());
-       gtk_menu_append(_menu_maps_submenu, _menu_maps_mapman_item = gtk_menu_item_new_with_label(_("Manage Maps...")));
-       gtk_menu_append(_menu_maps_submenu, _menu_maps_repoman_item     = gtk_menu_item_new_with_label(_("Manage Repositories...")));
-       gtk_menu_append(_menu_maps_submenu, _menu_auto_download_item = gtk_check_menu_item_new_with_label(_("Auto-Download")));
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_auto_download_item), _auto_download);
-       menu_maps_add_repos(_curr_repo);
-
-       gtk_menu_append(menu, gtk_separator_menu_item_new());
-
-       /* The "View" submenu. */
-       menu_item = gtk_menu_item_new_with_label(_("View"));
-#ifdef WITH_HILDON
-       gtk_menu_append(menu, menu_item);
-#else
-       gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
-#endif
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
-       gtk_menu_append(submenu, _menu_zoomin_item = gtk_menu_item_new_with_label(_("Zoom In")));
-       gtk_menu_append(submenu, _menu_zoomout_item     = gtk_menu_item_new_with_label(_("Zoom Out")));
-       gtk_menu_append(submenu, _menu_fullscreen_item = gtk_check_menu_item_new_with_label(_("Full Screen")));
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_fullscreen_item), _fullscreen);
-       gtk_menu_append(submenu, gtk_separator_menu_item_new());
-       gtk_menu_append(submenu, _menu_show_scale_item = gtk_check_menu_item_new_with_label(_("Scale")));
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_show_scale_item), _show_scale);
-       gtk_menu_append(submenu, _menu_show_routes_item = gtk_check_menu_item_new_with_label(_("Route")));
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_show_routes_item), _show_tracks & ROUTES_MASK);
-       gtk_menu_append(submenu, _menu_show_tracks_item = gtk_check_menu_item_new_with_label(_("Track")));
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_show_tracks_item), _show_tracks & TRACKS_MASK);
-       gtk_menu_append(submenu, _menu_show_velvec_item = gtk_check_menu_item_new_with_label(_("Velocity Vector")));
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_show_velvec_item), _show_velvec);
-       gtk_menu_append(submenu, _menu_show_poi_item = gtk_check_menu_item_new_with_label(_("POIs")));
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_show_poi_item), _show_poi);
-       gtk_menu_append(submenu, _menu_poi_item = gtk_menu_item_new_with_label(_("POI Categories...")));
-       gtk_widget_set_sensitive(_menu_poi_item, _db != NULL);
-
-       /* The "Auto-Center" submenu. */
-       gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("Auto-Center")));
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
-       gtk_menu_append(submenu, _menu_ac_latlon_item = gtk_radio_menu_item_new_with_label(NULL, _("Lat/Lon")));
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_ac_latlon_item), _center_mode == CENTER_LATLON);
-       gtk_menu_append(submenu, _menu_ac_lead_item = gtk_radio_menu_item_new_with_label_from_widget
-                       (GTK_RADIO_MENU_ITEM(_menu_ac_latlon_item), _("Lead")));
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_ac_lead_item), _center_mode == CENTER_LEAD);
-       gtk_menu_append(submenu, _menu_ac_none_item = gtk_radio_menu_item_new_with_label_from_widget
-                       (GTK_RADIO_MENU_ITEM(_menu_ac_latlon_item), _("None")));
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_ac_none_item), _center_mode < 0);
-
-       /* The "Go to" submenu. */
-       menu_item = gtk_menu_item_new_with_label(_("Go to"));
-#ifdef WITH_HILDON
-       gtk_menu_append(menu, menu_item);
-#else
-       gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
-#endif
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
-       gtk_menu_append(submenu, _menu_goto_home = gtk_menu_item_new_with_label(_("Home")));
-       gtk_menu_append(submenu, _menu_goto_destination = gtk_menu_item_new_with_label(_("Destination")));
-       gtk_menu_append(submenu, _menu_goto_address = gtk_menu_item_new_with_label(_("Address...")));
-       gtk_menu_append(submenu, _menu_goto_latlon = gtk_menu_item_new_with_label(_("Lat/Lon...")));
-       gtk_menu_append(submenu, _menu_goto_gps = gtk_menu_item_new_with_label(_("GPS Location")));
-       gtk_menu_append(submenu, _menu_goto_nextway     = gtk_menu_item_new_with_label(_("Next Waypoint")));
-       gtk_menu_append(submenu, _menu_goto_nearpoi     = gtk_menu_item_new_with_label(_("Nearest POI")));
-
-       /* The "GPS" submenu. */
-       menu_item = gtk_menu_item_new_with_label(_("GPS"));
 #ifdef WITH_HILDON
-       gtk_menu_append(menu, menu_item);
+_program=HILDON_PROGRAM(hildon_program_get_instance());
+window=GTK_WIDGET(hildon_window_new());
+hildon_program_add_window(_program, HILDON_WINDOW(window));
 #else
-       gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
-#endif
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
-       gtk_menu_append(submenu, _menu_enable_gps_item = gtk_check_menu_item_new_with_label(_("Enable GPS")));
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_enable_gps_item), _enable_gps);
-       gtk_menu_append(submenu, _menu_gps_show_info_item =     gtk_check_menu_item_new_with_label(_("Show Information")));
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(_menu_gps_show_info_item), _gps_info);
-       gtk_menu_append(submenu, _menu_gps_details_item = gtk_menu_item_new_with_label(_("Details...")));
-       gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_details_item), _enable_gps);
-       gtk_menu_append(menu, gtk_separator_menu_item_new());
-
-       /* The other menu items. */
-       gtk_menu_append(menu, _menu_settings_item = gtk_menu_item_new_with_label(_("Settings...")));
-       gtk_menu_append(menu, gtk_separator_menu_item_new());
-       gtk_menu_append(menu, _menu_help_item = gtk_menu_item_new_with_label(_("Help...")));
-       gtk_menu_append(menu, _menu_about_item = gtk_menu_item_new_with_label(_("About...")));
-       gtk_menu_append(menu, _menu_close_item = gtk_menu_item_new_with_label(_("Quit")));
-
-       /* We need to show menu items. */
-
-       /* Connect the "Route" signals. */
-       g_signal_connect(G_OBJECT(_menu_route_open_item), "activate",
-                        G_CALLBACK(menu_cb_route_open), NULL);
-       g_signal_connect(G_OBJECT(_menu_route_download_item), "activate",
-                        G_CALLBACK(menu_cb_route_download), NULL);
-       g_signal_connect(G_OBJECT(_menu_route_save_item), "activate",
-                        G_CALLBACK(menu_cb_route_save), NULL);
-       g_signal_connect(G_OBJECT(_menu_route_distnext_item), "activate",
-                        G_CALLBACK(menu_cb_route_distnext), NULL);
-       g_signal_connect(G_OBJECT(_menu_route_distlast_item), "activate",
-                        G_CALLBACK(menu_cb_route_distlast), NULL);
-       g_signal_connect(G_OBJECT(_menu_route_reset_item), "activate",
-                        G_CALLBACK(menu_cb_route_reset), NULL);
-       g_signal_connect(G_OBJECT(_menu_route_clear_item), "activate",
-                        G_CALLBACK(menu_cb_route_clear), NULL);
-
-       /* Connect the "Track" signals. */
-       g_signal_connect(G_OBJECT(_menu_track_open_item), "activate",
-                        G_CALLBACK(menu_cb_track_open), NULL);
-       g_signal_connect(G_OBJECT(_menu_track_save_item), "activate",
-                        G_CALLBACK(menu_cb_track_save), NULL);
-       g_signal_connect(G_OBJECT(_menu_track_insert_break_item), "activate",
-                        G_CALLBACK(menu_cb_track_insert_break), NULL);
-       g_signal_connect(G_OBJECT(_menu_track_insert_mark_item), "activate",
-                        G_CALLBACK(menu_cb_track_insert_mark), NULL);
-       g_signal_connect(G_OBJECT(_menu_track_distlast_item), "activate",
-                        G_CALLBACK(menu_cb_track_distlast), NULL);
-       g_signal_connect(G_OBJECT(_menu_track_distfirst_item), "activate",
-                        G_CALLBACK(menu_cb_track_distfirst), NULL);
-       g_signal_connect(G_OBJECT(_menu_track_clear_item), "activate",
-                        G_CALLBACK(menu_cb_track_clear), NULL);
-       g_signal_connect(G_OBJECT(_menu_track_filter), "activate",
-                        G_CALLBACK(menu_cb_track_filter), NULL);
-
-       /* Connect the "Maps" signals. */
-       g_signal_connect(G_OBJECT(_menu_maps_repoman_item), "activate",
-                        G_CALLBACK(menu_cb_maps_repoman), NULL);
-       g_signal_connect(G_OBJECT(_menu_maps_mapman_item), "activate",
-                        G_CALLBACK(menu_cb_mapman), NULL);
-
-       /* Connect the "View" signals. */
-       g_signal_connect(G_OBJECT(_menu_zoomin_item), "activate",
-                        G_CALLBACK(cb_zoomin), NULL);
-       g_signal_connect(G_OBJECT(_menu_zoomout_item), "activate",
-                        G_CALLBACK(cb_zoomout), NULL);
-       g_signal_connect(G_OBJECT(_menu_fullscreen_item), "toggled",
-                        G_CALLBACK(cb_fullscreen), NULL);
-       g_signal_connect(G_OBJECT(_menu_show_tracks_item), "toggled",
-                        G_CALLBACK(menu_cb_show_tracks), NULL);
-       g_signal_connect(G_OBJECT(_menu_show_scale_item), "toggled",
-                        G_CALLBACK(menu_cb_show_scale), NULL);
-       g_signal_connect(G_OBJECT(_menu_show_routes_item), "toggled",
-                        G_CALLBACK(menu_cb_show_routes), NULL);
-       g_signal_connect(G_OBJECT(_menu_show_velvec_item), "toggled",
-                        G_CALLBACK(menu_cb_show_velvec), NULL);
-       g_signal_connect(G_OBJECT(_menu_show_poi_item), "toggled",
-                        G_CALLBACK(menu_cb_show_poi), NULL);
-       g_signal_connect(G_OBJECT(_menu_poi_item), "activate",
-                        G_CALLBACK(menu_cb_category), NULL);
-
-       /* Connect the "Auto-Center" signals. */
-       g_signal_connect(G_OBJECT(_menu_ac_latlon_item), "toggled",
-                        G_CALLBACK(menu_cb_ac_latlon), NULL);
-       g_signal_connect(G_OBJECT(_menu_ac_lead_item), "toggled",
-                        G_CALLBACK(menu_cb_ac_lead), NULL);
-       g_signal_connect(G_OBJECT(_menu_ac_none_item), "toggled",
-                        G_CALLBACK(menu_cb_ac_none), NULL);
-
-       /* Connect the "Go to" signals. */
-       g_signal_connect(G_OBJECT(_menu_goto_home), "activate",
-                        G_CALLBACK(menu_cb_goto_home), NULL);
-       g_signal_connect(G_OBJECT(_menu_goto_destination), "activate",
-                        G_CALLBACK(menu_cb_goto_destination), NULL);
-       g_signal_connect(G_OBJECT(_menu_goto_latlon), "activate",
-                        G_CALLBACK(menu_cb_goto_latlon), NULL);
-       g_signal_connect(G_OBJECT(_menu_goto_gps), "activate",
-                        G_CALLBACK(menu_cb_goto_gps), NULL);
-       g_signal_connect(G_OBJECT(_menu_goto_nextway), "activate",
-                        G_CALLBACK(menu_cb_goto_nextway), NULL);
-       g_signal_connect(G_OBJECT(_menu_goto_nearpoi), "activate",
-                        G_CALLBACK(menu_cb_goto_nearpoi), NULL);
-
-       /* Connect the "GPS" signals. */
-       g_signal_connect(G_OBJECT(_menu_enable_gps_item), "toggled",
-                        G_CALLBACK(menu_cb_enable_gps), NULL);
-       g_signal_connect(G_OBJECT(_menu_gps_show_info_item), "toggled",
-                        G_CALLBACK(menu_cb_gps_show_info), NULL);
-       g_signal_connect(G_OBJECT(_menu_gps_details_item), "activate",
-                        G_CALLBACK(menu_cb_gps_details), NULL);
-       g_signal_connect(G_OBJECT(_menu_auto_download_item), "toggled",
-                        G_CALLBACK(menu_cb_auto_download), NULL);
-
-       /* Connect the other menu item signals. */
-       g_signal_connect(G_OBJECT(_menu_settings_item), "activate",
-                        G_CALLBACK(menu_cb_settings), NULL);
-       g_signal_connect(G_OBJECT(_menu_help_item), "activate",
-                        G_CALLBACK(menu_cb_help), NULL);
-       g_signal_connect(G_OBJECT(_menu_about_item), "activate",
-                        G_CALLBACK(menu_cb_about), NULL);
-       g_signal_connect(G_OBJECT(_menu_close_item), "activate",
-                        G_CALLBACK(gtk_main_quit), NULL);
-
-       gtk_widget_show_all(GTK_WIDGET(menu));
-#ifndef WITH_HILDON
-       gtk_widget_show_all(GTK_WIDGET(_menu_bar));
+window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
+gtk_window_set_title(GTK_WINDOW(window), "Mapper");
+gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
+gtk_widget_set_size_request(GTK_WIDGET(window), WINDOW_SIZE_X, WINDOW_SIZE_Y);
+gtk_window_resize(GTK_WINDOW(window), WINDOW_SIZE_X, WINDOW_SIZE_Y);
 #endif
 
-       /* Setup the context menu. */
-       menu = GTK_MENU(gtk_menu_new());
-
-       /* Setup the map context menu. */
-       gtk_menu_append(menu, menu_item = gtk_menu_item_new_with_label(_("Location")));
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), submenu = gtk_menu_new());
-
-       /* Setup the map context menu. */
-       gtk_menu_append(submenu, _cmenu_loc_show_latlon_item
-                       = gtk_menu_item_new_with_label(_("Show Lat/Lon")));
-       gtk_menu_append(submenu, _cmenu_loc_clip_latlon_item
-                       = gtk_menu_item_new_with_label(_("Copy Lat/Lon")));
-       gtk_menu_append(submenu, gtk_separator_menu_item_new());
-       gtk_menu_append(submenu, _cmenu_loc_set_destination
-                       = gtk_menu_item_new_with_label(_("Set destination")));
-       gtk_menu_append(submenu, _cmenu_loc_distance_to_item
-                       = gtk_menu_item_new_with_label(_("Show Distance to")));
-       gtk_menu_append(submenu, _cmenu_loc_route_to_item
-                       = gtk_menu_item_new_with_label(_("Download Route to...")));
-       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_menu_append(submenu, _cmenu_loc_add_poi
-                       = gtk_menu_item_new_with_label(_("Add POI...")));
-       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")));
-
-       /* Setup the waypoint context menu. */
-       gtk_menu_append(menu, menu_item
-                       = gtk_menu_item_new_with_label(_("Waypoint")));
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
-                                 submenu = gtk_menu_new());
-
-       gtk_menu_append(submenu, _cmenu_way_show_latlon_item
-                       = gtk_menu_item_new_with_label(_("Show Lat/Lon")));
-       gtk_menu_append(submenu, _cmenu_way_show_desc_item
-                       = gtk_menu_item_new_with_label(_("Show Description")));
-       gtk_menu_append(submenu, _cmenu_way_clip_latlon_item
-                       = gtk_menu_item_new_with_label(_("Copy Lat/Lon")));
-       gtk_menu_append(submenu, _cmenu_way_clip_desc_item
-                       = gtk_menu_item_new_with_label(_("Copy Description")));
-       gtk_menu_append(submenu, gtk_separator_menu_item_new());
-       gtk_menu_append(submenu, _cmenu_way_distance_to_item
-                       = gtk_menu_item_new_with_label(_("Show Distance to")));
-       gtk_menu_append(submenu, _cmenu_way_route_to_item
-                       = gtk_menu_item_new_with_label(_("Download Route to...")));
-       gtk_menu_append(submenu, _cmenu_way_delete_item 
-                       = gtk_menu_item_new_with_label(_("Delete...")));
-       gtk_menu_append(submenu, gtk_separator_menu_item_new());
-       gtk_menu_append(submenu, _cmenu_way_add_poi = gtk_menu_item_new_with_label(_("Add POI...")));
-       gtk_widget_set_sensitive(_cmenu_way_add_poi, _db != NULL);
-       gtk_menu_append(submenu, gtk_separator_menu_item_new());
-       gtk_menu_append(submenu, _cmenu_way_goto_nextway = gtk_menu_item_new_with_label(_("Go to Next")));
-
-       /* Setup the POI context menu. */
-       gtk_menu_append(menu, _cmenu_poi = gtk_menu_item_new_with_label(_("POI")));
-       gtk_widget_set_sensitive(_cmenu_poi, _db != NULL);
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(_cmenu_poi), submenu = gtk_menu_new());
-
-       gtk_menu_append(submenu, _cmenu_poi_edit_poi
-                       = gtk_menu_item_new_with_label(_("View/Edit...")));
-       gtk_menu_append(submenu, gtk_separator_menu_item_new());
-       gtk_menu_append(submenu, _cmenu_poi_distance_to_item
-                       = gtk_menu_item_new_with_label(_("Show Distance to")));
-       gtk_menu_append(submenu, _cmenu_poi_route_to_item
-                       = gtk_menu_item_new_with_label(_("Download Route to...")));
-       gtk_menu_append(submenu, gtk_separator_menu_item_new());
-       gtk_menu_append(submenu, _cmenu_poi_add_route
-                       = gtk_menu_item_new_with_label(_("Add Route Point")));
-       gtk_menu_append(submenu, _cmenu_poi_add_way
-                       = gtk_menu_item_new_with_label(_("Add Waypoint...")));
-       gtk_menu_append(submenu, gtk_separator_menu_item_new());
-       gtk_menu_append(submenu, _cmenu_poi_goto_nearpoi
-                       = gtk_menu_item_new_with_label(_("Go to Nearest")));
-
-       /* Connect signals for context menu. */
-       g_signal_connect(G_OBJECT(_cmenu_loc_show_latlon_item), "activate",
-                        G_CALLBACK(cmenu_cb_loc_show_latlon), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_loc_clip_latlon_item), "activate",
-                        G_CALLBACK(cmenu_cb_loc_clip_latlon), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_loc_route_to_item), "activate",
-                        G_CALLBACK(cmenu_cb_loc_route_to), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_loc_distance_to_item), "activate",
-                        G_CALLBACK(cmenu_cb_loc_distance_to), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_loc_add_route), "activate",
-                        G_CALLBACK(cmenu_cb_loc_add_route), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_loc_add_way), "activate",
-                        G_CALLBACK(cmenu_cb_loc_add_way), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_loc_add_poi), "activate",
-                        G_CALLBACK(cmenu_cb_loc_add_poi), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_loc_set_gps), "activate",
-                        G_CALLBACK(cmenu_cb_loc_set_gps), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_loc_set_home), "activate",
-                        G_CALLBACK(cmenu_cb_loc_set_home), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_loc_set_destination), "activate",
-                        G_CALLBACK(cmenu_cb_loc_set_destination), NULL);
-
-       g_signal_connect(G_OBJECT(_cmenu_way_show_latlon_item), "activate",
-                        G_CALLBACK(cmenu_cb_way_show_latlon), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_way_show_desc_item), "activate",
-                        G_CALLBACK(cmenu_cb_way_show_desc), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_way_clip_latlon_item), "activate",
-                        G_CALLBACK(cmenu_cb_way_clip_latlon), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_way_clip_desc_item), "activate",
-                        G_CALLBACK(cmenu_cb_way_clip_desc), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_way_route_to_item), "activate",
-                        G_CALLBACK(cmenu_cb_way_route_to), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_way_distance_to_item), "activate",
-                        G_CALLBACK(cmenu_cb_way_distance_to), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_way_delete_item), "activate",
-                        G_CALLBACK(cmenu_cb_way_delete), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_way_add_poi), "activate",
-                        G_CALLBACK(cmenu_cb_way_add_poi), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_way_goto_nextway), "activate",
-                        G_CALLBACK(menu_cb_goto_nextway), NULL);
-
-       g_signal_connect(G_OBJECT(_cmenu_poi_edit_poi), "activate",
-                        G_CALLBACK(cmenu_cb_poi_edit_poi), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_poi_route_to_item), "activate",
-                        G_CALLBACK(cmenu_cb_poi_route_to), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_poi_distance_to_item), "activate",
-                        G_CALLBACK(cmenu_cb_poi_distance_to), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_poi_add_route), "activate",
-                        G_CALLBACK(cmenu_cb_poi_add_route), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_poi_add_way), "activate",
-                        G_CALLBACK(cmenu_cb_poi_add_way), NULL);
-       g_signal_connect(G_OBJECT(_cmenu_poi_goto_nearpoi), "activate",
-                        G_CALLBACK(menu_cb_goto_nearpoi), NULL);
-
-       gtk_widget_show_all(GTK_WIDGET(menu));
+return window;
+}
 
-#ifdef WITH_DEVICE_770
-       gtk_widget_tap_and_hold_setup(_map_widget, GTK_WIDGET(menu), NULL, 0);
-#else
-       _menu_map = menu;
-#endif
+/**
+ * Set sensitivity of route menu items
+ */
+void
+route_menu_set_sensitive(gboolean s)
+{
+set_action_sensitive("route_save", s);
+set_action_sensitive("route_dist_next", s);
+set_action_sensitive("route_dist_last", s);
+set_action_sensitive("route_reset", s);
+set_action_sensitive("route_clear", s);
+}
 
-       vprintf("%s(): return\n", __PRETTY_FUNCTION__);
+/**
+ * Create a tree view inside given container
+ */
+static GtkWidget *
+mapper_tree_view_new(GtkWidget *container) 
+{
+GtkWidget *tree_view, *sw;
+GtkTreeViewColumn *column;
+GtkCellRenderer *renderer;
+
+tree_view=gtk_tree_view_new();
+sw=gtk_scrolled_window_new(NULL, NULL);
+gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+gtk_container_add(GTK_CONTAINER(sw), tree_view);
+gtk_box_pack_start(container, sw, TRUE, TRUE, 0);
+gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)), GTK_SELECTION_SINGLE);
+gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), TRUE);
+
+renderer=gtk_cell_renderer_text_new();
+column=gtk_tree_view_column_new_with_attributes(_("Location"), renderer, "text", ROUTE_LATLON, NULL);
+gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
+
+renderer=gtk_cell_renderer_text_new();
+column=gtk_tree_view_column_new_with_attributes(_("Distance"), renderer, "text", ROUTE_DISTANCE, NULL);
+gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
+
+renderer=gtk_cell_renderer_text_new();
+column=gtk_tree_view_column_new_with_attributes(_("Waypoint"), renderer, "text", ROUTE_WAYPOINT, NULL);
+gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
+
+return tree_view;
 }
 
-static void toolbar_init(void)
+/**
+ * Initialize everything required in preparation for calling gtk_main().
+ */
+void 
+mapper_ui_init(void)
 {
+GError *error = NULL;
+GtkWidget *hbox, *mapvbox, *label, *vbox_main;
+GtkWidget *vbox;
+GtkNotebook *notebook;
 GtkToolItem *item;
+GtkTreeViewColumn *column;
+GtkCellRenderer *renderer;
 
-item = gtk_tool_button_new_from_stock (GTK_STOCK_HOME);
-g_signal_connect (item, "clicked", G_CALLBACK (menu_cb_goto_home), NULL);
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
-
-item = gtk_tool_button_new_from_stock (GTK_STOCK_JUMP_TO);
-g_signal_connect (item, "clicked", G_CALLBACK (menu_cb_goto_gps), NULL);
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
-
-item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD);
-g_signal_connect (item, "clicked", G_CALLBACK (menu_cb_goto_nextway), NULL);
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
-
-item = gtk_separator_tool_item_new();
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
-
-item = gtk_tool_button_new_from_stock (GTK_STOCK_ADD);
-g_signal_connect (item, "clicked", G_CALLBACK (cb_add_poi), NULL);
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
+_window=mapper_window_new();
+gtk_container_set_border_width (GTK_CONTAINER (_window), 0);
 
-#ifndef GTK_STOCK_INFO
-#define GTK_STOCK_INFO GTK_STOCK_PROPERTIES
-#endif
-
-item = gtk_tool_button_new_from_stock (GTK_STOCK_INFO);
-g_signal_connect (item, "clicked", G_CALLBACK (menu_cb_gps_details), NULL);
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
-
-item = gtk_separator_tool_item_new();
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
+actions = gtk_action_group_new ("Actions");
+g_assert(actions);
 
-item = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_IN);
-g_signal_connect (item, "clicked", G_CALLBACK (cb_zoomin), NULL);
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
+ui = gtk_ui_manager_new ();
+g_assert(ui);
 
-item = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_OUT);
-g_signal_connect (item, "clicked", G_CALLBACK (cb_zoomout), NULL);
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
+gtk_action_group_add_actions (actions, ui_entries, n_ui_entries, NULL);
+gtk_action_group_add_toggle_actions (actions, ui_toggle_entries, n_ui_toggle_entries, NULL);
+gtk_action_group_add_radio_actions (actions, ui_autocenter_entries, 
+       n_ui_autocenter_entries, _center_mode, G_CALLBACK(menu_cb_autocenter),  NULL);
 
-item = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_100);
-g_signal_connect (item, "clicked", G_CALLBACK (cb_zoom_base), NULL);
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
+gtk_ui_manager_insert_action_group (ui, actions, 0);
+g_object_unref (actions);
 
-item = gtk_tool_button_new_from_stock (GTK_STOCK_ZOOM_FIT);
-g_signal_connect (item, "clicked", G_CALLBACK (cb_zoom_autozoom), NULL);
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
+/* N810 has keyboard so set this up on hildon too */
+gtk_window_add_accel_group (GTK_WINDOW(_window), gtk_ui_manager_get_accel_group (ui));
 
-item = gtk_separator_tool_item_new();
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
+if (!gtk_ui_manager_add_ui_from_string (ui, mapper_ui, -1, &error)) {
+       g_message ("building menus failed: %s", error->message);
+       g_error_free(error);
+       g_assert(FALSE);
+}
 
-#ifndef WITH_HILDON
-_toolbar_fullscreen_item = gtk_toggle_tool_button_new_from_stock (GTK_STOCK_FULLSCREEN);
-g_signal_connect (_toolbar_fullscreen_item, "clicked", G_CALLBACK (cb_fullscreen_click), NULL);
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), _toolbar_fullscreen_item, -1);
-#endif
+/* Menu and Toolbar */
+menu_bar = gtk_ui_manager_get_widget (ui, "/MenuBar");
+g_assert(menu_bar);
 
-item=gtk_separator_tool_item_new();
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
+_toolbar = gtk_ui_manager_get_widget (ui, "/ToolBar");
+g_assert(_toolbar);
 
+/* Toolbar progress item */
 item=gtk_tool_item_new();
 _progress_item=gtk_progress_bar_new();
+gtk_tool_item_set_expand(item, TRUE);
+gtk_progress_bar_set_ellipsize(_progress_item, PANGO_ELLIPSIZE_END);
+gtk_progress_bar_set_pulse_step(_progress_item, 0.2);
 gtk_container_add(item, _progress_item);
-gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
-}
+gtk_toolbar_insert(GTK_TOOLBAR(_toolbar), item, -1);
 
-void mapper_init_variables(void)
-{
-       /* Set enum-based constants. */
-       UNITS_TEXT[UNITS_KM] = _("km");
-       UNITS_TEXT[UNITS_MI] = _("mi.");
-       UNITS_TEXT[UNITS_NM] = _("n.m.");
-
-       INFO_FONT_TEXT[INFO_FONT_XXSMALL] = "xx-small";
-       INFO_FONT_TEXT[INFO_FONT_XSMALL] = "x-small";
-       INFO_FONT_TEXT[INFO_FONT_SMALL] = "small";
-       INFO_FONT_TEXT[INFO_FONT_MEDIUM] = "medium";
-       INFO_FONT_TEXT[INFO_FONT_LARGE] = "large";
-       INFO_FONT_TEXT[INFO_FONT_XLARGE] = "x-large";
-       INFO_FONT_TEXT[INFO_FONT_XXLARGE] = "xx-large";
-
-       CUSTOM_KEY_GCONF[CUSTOM_KEY_UP] = GCONF_KEY_PREFIX "/key_up";
-       CUSTOM_KEY_GCONF[CUSTOM_KEY_DOWN] = GCONF_KEY_PREFIX "/key_down";
-       CUSTOM_KEY_GCONF[CUSTOM_KEY_LEFT] = GCONF_KEY_PREFIX "/key_left";
-       CUSTOM_KEY_GCONF[CUSTOM_KEY_RIGHT] = GCONF_KEY_PREFIX "/key_right";
-       CUSTOM_KEY_GCONF[CUSTOM_KEY_SELECT] = GCONF_KEY_PREFIX "/key_select";
-       CUSTOM_KEY_GCONF[CUSTOM_KEY_INCREASE] = GCONF_KEY_PREFIX "/key_increase";
-       CUSTOM_KEY_GCONF[CUSTOM_KEY_DECREASE] = GCONF_KEY_PREFIX "/key_decrease";
-       CUSTOM_KEY_GCONF[CUSTOM_KEY_FULLSCREEN] = GCONF_KEY_PREFIX "/key_fullscreen";
-       CUSTOM_KEY_GCONF[CUSTOM_KEY_ESC] = GCONF_KEY_PREFIX "/key_esc";
-
-       CUSTOM_KEY_ICON[CUSTOM_KEY_UP] = HWK_BUTTON_UP;
-       CUSTOM_KEY_ICON[CUSTOM_KEY_LEFT] = HWK_BUTTON_LEFT;
-       CUSTOM_KEY_ICON[CUSTOM_KEY_DOWN] = HWK_BUTTON_DOWN;
-       CUSTOM_KEY_ICON[CUSTOM_KEY_RIGHT] = HWK_BUTTON_RIGHT;
-       CUSTOM_KEY_ICON[CUSTOM_KEY_SELECT] = HWK_BUTTON_SELECT;
-       CUSTOM_KEY_ICON[CUSTOM_KEY_INCREASE] = HWK_BUTTON_INCREASE;
-       CUSTOM_KEY_ICON[CUSTOM_KEY_DECREASE] = HWK_BUTTON_DECREASE;
-       CUSTOM_KEY_ICON[CUSTOM_KEY_FULLSCREEN] = HWK_BUTTON_VIEW;
-       CUSTOM_KEY_ICON[CUSTOM_KEY_ESC] = HWK_BUTTON_CANCEL;
-
-       CUSTOM_KEY_DEFAULT[CUSTOM_KEY_UP] = CUSTOM_ACTION_PAN_NORTH;
-       CUSTOM_KEY_DEFAULT[CUSTOM_KEY_LEFT] = CUSTOM_ACTION_PAN_WEST;
-       CUSTOM_KEY_DEFAULT[CUSTOM_KEY_DOWN] = CUSTOM_ACTION_PAN_SOUTH;
-       CUSTOM_KEY_DEFAULT[CUSTOM_KEY_RIGHT] = CUSTOM_ACTION_PAN_EAST;
-       CUSTOM_KEY_DEFAULT[CUSTOM_KEY_SELECT] = CUSTOM_ACTION_TOGGLE_AUTOCENTER;
-       CUSTOM_KEY_DEFAULT[CUSTOM_KEY_INCREASE] = CUSTOM_ACTION_ZOOM_IN;
-       CUSTOM_KEY_DEFAULT[CUSTOM_KEY_DECREASE] = CUSTOM_ACTION_ZOOM_OUT;
-       CUSTOM_KEY_DEFAULT[CUSTOM_KEY_FULLSCREEN] = CUSTOM_ACTION_TOGGLE_FULLSCREEN;
-       CUSTOM_KEY_DEFAULT[CUSTOM_KEY_ESC] = CUSTOM_ACTION_TOGGLE_TRACKS;
-
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_NORTH] = _("Pan North");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_WEST] = _("Pan West");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_SOUTH] = _("Pan South");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_EAST] = _("Pan East");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_AUTOCENTER] = _("Toggle Auto-Center");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_FULLSCREEN] = _("Toggle Fullscreen");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ZOOM_IN] = _("Zoom In");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ZOOM_OUT] = _("Zoom Out");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_TRACKS] = _("Toggle Tracks");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_SCALE] = _("Toggle Scale");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_POI] = _("Toggle POIs");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_CHANGE_REPO] = _("Select Next Repository");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ROUTE_DISTNEXT] = _("Show Distance to Next Waypoint");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ROUTE_DISTLAST] = _("Show Distance to End of Route");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_BREAK] = _("Insert Track Break");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_DISTLAST] = _("Show Distance from Last Break");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_DISTFIRST] = _("Show Distance from Beginning");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_GPS] = _("Toggle GPS");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_GPSINFO] = _("Toggle GPS Info");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_SPEEDLIMIT] = _("Toggle Speed Limit");
-       CUSTOM_ACTION_TEXT[CUSTOM_ACTION_RESET_BLUETOOTH] = _("Reset Bluetooth");
-
-       COLORABLE_GCONF[COLORABLE_MARK] = GCONF_KEY_PREFIX "/color_mark";
-       COLORABLE_GCONF[COLORABLE_MARK_VELOCITY] = GCONF_KEY_PREFIX "/color_mark_velocity";
-       COLORABLE_GCONF[COLORABLE_MARK_OLD] = GCONF_KEY_PREFIX "/color_mark_old";
-       COLORABLE_GCONF[COLORABLE_TRACK] = GCONF_KEY_PREFIX "/color_track";
-       COLORABLE_GCONF[COLORABLE_TRACK_MARK] = GCONF_KEY_PREFIX "/color_track_mark";
-       COLORABLE_GCONF[COLORABLE_TRACK_BREAK] = GCONF_KEY_PREFIX "/color_track_break";
-       COLORABLE_GCONF[COLORABLE_ROUTE] = GCONF_KEY_PREFIX "/color_route";
-       COLORABLE_GCONF[COLORABLE_ROUTE_WAY] = GCONF_KEY_PREFIX "/color_route_way";
-       COLORABLE_GCONF[COLORABLE_ROUTE_BREAK] = GCONF_KEY_PREFIX "/color_route_break";
-       COLORABLE_GCONF[COLORABLE_POI] = GCONF_KEY_PREFIX "/color_poi";
-
-       DEG_FORMAT_TEXT[DDPDDDDD] = "-dd.ddddd°";
-       DEG_FORMAT_TEXT[DD_MMPMMM] = "-dd°mm.mmm'";
-       DEG_FORMAT_TEXT[DD_MM_SSPS] = "-dd°mm'ss.s\"";
-       DEG_FORMAT_TEXT[DDPDDDDD_NSEW] = "dd.ddddd° S";
-       DEG_FORMAT_TEXT[DD_MMPMMM_NSEW] = "dd°mm.mmm' S";
-       DEG_FORMAT_TEXT[DD_MM_SSPS_NSEW] = "dd°mm'ss.s\" S";
-
-       SPEED_LOCATION_TEXT[SPEED_LOCATION_TOP_LEFT] = _("Top-Left");
-       SPEED_LOCATION_TEXT[SPEED_LOCATION_TOP_RIGHT] = _("Top-Right");
-       SPEED_LOCATION_TEXT[SPEED_LOCATION_BOTTOM_RIGHT] = _("Bottom-Right");
-       SPEED_LOCATION_TEXT[SPEED_LOCATION_BOTTOM_LEFT] = _("Bottom-Left");
-}
+/* Notebook with different views */
+notebook = gtk_notebook_new();
+gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), TRUE);
 
-/**
- * Initialize everything required in preparation for calling gtk_main().
- */
-void mapper_init(gint argc, gchar ** argv)
-{
-       GtkWidget *hbox, *mapvbox, *label, *vbox, *vbox_main;
-       GtkWidget *notebook, *hbanner;
-       GdkColor color;
-       printf("%s()\n", __PRETTY_FUNCTION__);
-
-       mapper_init_variables();
+info_banner.container=gtk_hbox_new(FALSE, 0);
+info_banner.location=gtk_label_new("");
+info_banner.speed=gtk_label_new("");
+info_banner.distance=gtk_label_new("");
 
-       /* Set up track array (must be done before config). */
-       memset(&_track, 0, sizeof(_track));
-       memset(&_route, 0, sizeof(_route));
-       MACRO_PATH_INIT(_track);
-       MACRO_PATH_INIT(_route);
+gtk_misc_set_alignment(GTK_MISC(info_banner.location), 0.f, 0.5f);
+gtk_misc_set_alignment(GTK_MISC(info_banner.speed), 1.f, 0.5f);
+gtk_misc_set_alignment(GTK_MISC(info_banner.distance), 1.f, 0.5f);
 
-       config_init();
+gtk_box_pack_start(GTK_BOX(info_banner.container), info_banner.location, TRUE, TRUE, 0);
+gtk_box_pack_end(GTK_BOX(info_banner.container), info_banner.speed, FALSE, FALSE, 0);
+gtk_box_pack_end(GTK_BOX(info_banner.container), info_banner.distance, FALSE, FALSE, 0);
 
-       g_set_application_name("Mapper");
+vbox_main = gtk_vbox_new(FALSE, 0);
+gtk_container_add(GTK_CONTAINER(_window), vbox_main);
 
 #ifdef WITH_HILDON
-       /* Initialize _program. */
-       _program = HILDON_PROGRAM(hildon_program_get_instance());
+/* Create and add widgets and supporting data. */
+gtk_box_pack_start(GTK_BOX(vbox_main), GTK_WIDGET(notebook), TRUE, TRUE, 0);
+gtk_box_pack_start(GTK_BOX(vbox_main), GTK_WIDGET(info_banner.container), FALSE, FALSE, 0);
+{
+       GtkMenu *hmenu;
+       hmenu = GTK_MENU(gtk_menu_new());
 
-       /* Initialize _window. */
-       _window = GTK_WIDGET(hildon_window_new());
-       hildon_program_add_window(_program, HILDON_WINDOW(_window));
+       gtk_container_foreach(GTK_CONTAINER(menu_bar), (GtkCallback)gtk_widget_reparent, hmenu);
+       hildon_window_set_menu(HILDON_WINDOW(_window), hmenu);
+}
+hildon_window_add_toolbar(_window, GTK_TOOLBAR(_toolbar));
+gtk_widget_show_all(GTK_WIDGET(_toolbar));
 #else
-       _window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-       gtk_window_set_title(GTK_WINDOW(_window), "Mapper");
-       gtk_widget_set_size_request(GTK_WIDGET(_window), WINDOW_SIZE_X, WINDOW_SIZE_Y);
-       gtk_window_resize(GTK_WINDOW(_window), WINDOW_SIZE_X, WINDOW_SIZE_Y);
-       gtk_window_set_resizable(GTK_WINDOW(_window), TRUE);
+_status_bar = gtk_statusbar_new();
+gtk_box_pack_start(GTK_BOX(vbox_main), menu_bar, FALSE, FALSE, 0);
+gtk_box_pack_start(GTK_BOX(vbox_main), _toolbar, FALSE, FALSE, 0);
+gtk_box_pack_start(GTK_BOX(vbox_main), notebook, TRUE, TRUE, 0);
+gtk_box_pack_start(GTK_BOX(vbox_main), info_banner.container, FALSE, FALSE, 0);
+gtk_box_pack_start(GTK_BOX(vbox_main), _status_bar, FALSE, FALSE, 0);
 #endif
 
-       _toolbar = gtk_toolbar_new();
-       toolbar_init();
+label = gtk_label_new("Map");
+hbox = gtk_hpaned_new();
 
-       notebook = gtk_notebook_new();
-       gtk_notebook_set_show_tabs(notebook, TRUE);
-       label = gtk_label_new("Map");
+/* GPS 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);
 
-       hbox = gtk_hpaned_new();
+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);
 
-       info_banner.container=gtk_hbox_new(FALSE, 0);
-       info_banner.location=gtk_label_new("");
-       info_banner.speed=gtk_label_new("");
-       gtk_label_set_max_width_chars(info_banner.speed, 16);
-       gtk_label_set_width_chars(info_banner.speed, 14);
-       gtk_box_pack_start(GTK_BOX(info_banner.container), info_banner.speed, FALSE, FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(info_banner.container), info_banner.location, TRUE, TRUE, 0);
+/* Map widget */
+_map_widget = map_new();
+gtk_paned_add2(GTK_PANED(hbox), _map_widget);
 
-       mapvbox = gtk_vbox_new(FALSE, 0);
-
-#ifdef WITH_HILDON
-       /* Create and add widgets and supporting data. */
-       gtk_container_add(GTK_CONTAINER(_window), notebook);
-       hildon_program_set_common_toolbar(_program, _toolbar);
-
-       gtk_widget_show_all(notebook);
-       gtk_widget_show_all(_toolbar);
-#else
-       vbox_main = gtk_vbox_new(FALSE, 0);
-       gtk_container_add(GTK_CONTAINER(_window), vbox_main);
-
-       _menu_bar = gtk_menu_bar_new();
-       gtk_box_pack_start(GTK_BOX(vbox_main), _menu_bar, FALSE, FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(vbox_main), _toolbar, FALSE, FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(vbox_main), notebook, TRUE, TRUE, 0);
-
-       _status_bar = gtk_statusbar_new();
-       gtk_box_pack_start(GTK_BOX(vbox_main), _status_bar, FALSE, FALSE, 0);
-
-       gtk_widget_show_all(vbox_main);
+#ifndef WITH_DEVICE_770
+map_set_cache_size(256);
 #endif
 
-       /* gtk_widget_hide(_progress_item); */
-
-       gtk_box_pack_start(GTK_BOX(mapvbox), info_banner.container, FALSE, FALSE, 0);
-
-       gtk_box_pack_start(GTK_BOX(mapvbox), hbox, TRUE, TRUE, 0);
-       gtk_notebook_append_page(GTK_WIDGET(notebook), mapvbox, label);
-       gtk_widget_show_all(mapvbox);
-
-       vbox = gtk_vbox_new(FALSE, 0);
-       _gps_widget = gtk_frame_new("GPS Info");
-       gtk_container_add(GTK_CONTAINER(_gps_widget), vbox);
-       gtk_widget_set_size_request(GTK_WIDGET(_gps_widget), 180, 0);
-       gtk_paned_add1(hbox, _gps_widget);
-
-       label = gtk_label_new(" ");
-       gtk_widget_set_size_request(GTK_WIDGET(label), -1, 10);
-       gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 0);
-
-       _text_lat = gtk_label_new(" --- ");
-       gtk_widget_set_size_request(GTK_WIDGET(_text_lat), -1, 30);
-       gtk_box_pack_start(GTK_BOX(vbox), _text_lat, FALSE, TRUE, 0);
-
-       _text_lon = gtk_label_new(" --- ");
-       gtk_widget_set_size_request(GTK_WIDGET(_text_lon), -1, 30);
-       gtk_box_pack_start(GTK_BOX(vbox), _text_lon, FALSE, TRUE, 0);
-
-       _text_speed = gtk_label_new(" --- ");
-       gtk_widget_set_size_request(GTK_WIDGET(_text_speed), -1, 30);
-       gtk_box_pack_start(GTK_BOX(vbox), _text_speed, FALSE, TRUE, 0);
-
-       _text_alt = gtk_label_new(" --- ");
-       gtk_widget_set_size_request(GTK_WIDGET(_text_alt), -1, 30);
-       gtk_box_pack_start(GTK_BOX(vbox), _text_alt, FALSE, TRUE, 0);
-
-       _text_dop = gtk_label_new(" --- ");
-       gtk_widget_set_size_request(GTK_WIDGET(_text_dop), -1, 30);
-       gtk_box_pack_start(GTK_BOX(vbox), _text_dop, FALSE, TRUE, 0);
-
-       label = gtk_label_new(" ");
-       gtk_widget_set_size_request(GTK_WIDGET(label), -1, 10);
-       gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 0);
-
-       _sat_panel = gtk_drawing_area_new();
-       gtk_widget_set_size_request(_sat_panel, -1, 100);
-       gtk_box_pack_start(GTK_BOX(vbox), _sat_panel, TRUE, TRUE, 0);
+/* GPS Tab */
+vbox = gtk_vbox_new(FALSE, 0);
+label = gtk_label_new("Gps");
+_gps_sat_view = gtk_gps_new(GTK_GPS_MODE_SKY, &_gps->data);
+gtk_box_pack_start(GTK_BOX(vbox), _gps_sat_view, TRUE, TRUE, 0);
+_gps_sat_view = gtk_gps_new(GTK_GPS_MODE_SIGNAL, &_gps->data);
+gtk_box_pack_start(GTK_BOX(vbox), _gps_sat_view, TRUE, TRUE, 0);
+ui_notebook.gps=gtk_notebook_append_page(notebook, vbox, label);
+
+/* Heading Tab */
+vbox = gtk_vbox_new(FALSE, 0);
+label = gtk_label_new("Heading");
+_tab_compass = gtk_compass_new(&_gps->data);
+gtk_box_pack_start(GTK_BOX(vbox), _tab_compass, TRUE, TRUE, 0);
+ui_notebook.heading=gtk_notebook_append_page(notebook, vbox, label);
+
+/* Track Tab */
+vbox=gtk_vbox_new(FALSE, 0);
+label=gtk_label_new("Track");
+track_tree_view=mapper_tree_view_new(vbox);
+#if 0
+g_signal_connect(G_OBJECT(track_tree_view), "row-activated", G_CALLBACK(track_waypoint_activated_cb), NULL);
+#endif
+ui_notebook.track=gtk_notebook_append_page(notebook, vbox, label);
+
+/* Route Tab */
+vbox=gtk_vbox_new(FALSE, 0);
+label=gtk_label_new("Route");
+route_tree_view=mapper_tree_view_new(vbox);
+#if 0
+g_signal_connect(G_OBJECT(route_tree_view), "row-activated", G_CALLBACK(route_waypoint_activated_cb), NULL);
+#endif
+ui_notebook.route=gtk_notebook_append_page(notebook, vbox, label);
 
-       label = gtk_label_new(" ");
-       gtk_widget_set_size_request(GTK_WIDGET(label), -1, 10);
-       gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 0);
+/* Quick POI Tab */
+label=gtk_label_new("Quick POI");
+tqp.fixed=FALSE;
+tqp.close=FALSE;
+vbox=poi_quick_button_box(&tqp);
+ui_notebook.qpoi=gtk_notebook_append_page(notebook, vbox, label);
 
-       _text_time = gtk_label_new("--:--:--");
-       gtk_widget_set_size_request(GTK_WIDGET(_text_time), -1, 30);
-       gtk_box_pack_start(GTK_BOX(vbox), _text_time, FALSE, TRUE, 0);
+#ifdef WITH_GST
+{
+audio_note_ui *an_ui;
+label=gtk_label_new("Audio");
+an_ui=audio_note_new();
+ui_notebook.audio=gtk_notebook_append_page(notebook, an_ui->vbox, label);
+}
+#endif
 
-       _heading_panel = gtk_drawing_area_new();
-       gtk_widget_set_size_request(_heading_panel, -1, 100);
-       gtk_box_pack_start(GTK_BOX(vbox), _heading_panel, TRUE, TRUE, 0);
+menu_maps_add_repos();
+menu_init_cmenu();
 
-       _map_widget = gtk_drawing_area_new();
-       gtk_paned_add2(hbox, _map_widget);
+memset(&_autoroute_data, 0, sizeof(_autoroute_data));
 
-       gtk_widget_show_all(hbox);
-       gps_show_info();        /* hides info, if necessary. */
-       gtk_widget_realize(_map_widget);
-       map_poi_init(_map_widget);
+g_signal_connect(G_OBJECT(_window), "delete_event", G_CALLBACK(mapper_cb_quit), NULL);
+g_signal_connect(G_OBJECT(_window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
 
-       /* -1: use bit depth of widget->window. */
-       _map_pixmap = gdk_pixmap_new(_map_widget->window, BUF_WIDTH_PIXELS, BUF_HEIGHT_PIXELS, -1);     
+gtk_widget_show_all(GTK_WIDGET(vbox_main));
+gtk_widget_show_all(GTK_WIDGET(_window));
 
-       _curl_easy_queue = g_queue_new();
+/* Initialize our line styles. */
+update_gcs();
 
-       _pui_tree = g_tree_new_full((GCompareDataFunc) download_comparefunc,
-                                   NULL,
-                                   (GDestroyNotify) progress_update_info_free,
-                                   NULL);
-       _downloading_tree = g_tree_new_full((GCompareDataFunc) download_comparefunc, NULL,
-                           (GDestroyNotify) progress_update_info_free, NULL);
+/* Set defaults for items */
+set_action_activate("map_auto_download", _auto_download);
+set_action_activate("gps_enabled", _enable_gps);
+set_action_sensitive("goto_gps", _enable_gps);
 
-       _pui_by_easy = g_hash_table_new(g_direct_hash, g_direct_equal);
+set_action_sensitive("autocenter_latlon", _enable_gps);
+set_action_sensitive("autocenter_lead", _enable_gps);
 
-       /* Connect signals. */
-       g_signal_connect(G_OBJECT(_sat_panel), "expose_event",
-                        G_CALLBACK(sat_panel_expose), NULL);
-       g_signal_connect(G_OBJECT(_heading_panel), "expose_event",
-                        G_CALLBACK(heading_panel_expose), NULL);
-       g_signal_connect(G_OBJECT(_window), "destroy",
-                        G_CALLBACK(gtk_main_quit), NULL);
+set_action_activate("gps_information", _gps_info);
 
-       g_signal_connect(G_OBJECT(_window), "key_press_event",
-                        G_CALLBACK(window_cb_key_press), NULL);
+set_action_activate("view_toolbar", TRUE);
 
-       g_signal_connect(G_OBJECT(_window), "key_release_event",
-                        G_CALLBACK(window_cb_key_release), NULL);
+set_action_activate("view_scale", _show_scale);
+set_action_activate("view_vector", _show_velvec);
+set_action_activate("view_poi", _show_poi);
 
-       g_signal_connect(G_OBJECT(_map_widget), "configure_event",
-                        G_CALLBACK(map_cb_configure), NULL);
+set_action_activate("view_track", _show_tracks & TRACKS_MASK);
+set_action_activate("view_route", _show_tracks & ROUTES_MASK);
 
-       g_signal_connect(G_OBJECT(_map_widget), "expose_event",
-                        G_CALLBACK(map_cb_expose), NULL);
+route_menu_set_sensitive(FALSE);
 
-       g_signal_connect(G_OBJECT(_map_widget), "button_press_event",
-                        G_CALLBACK(map_cb_button_press), NULL);
+gps_show_info(&_gps->data);
 
-       g_signal_connect(G_OBJECT(_map_widget), "button_release_event",
-                        G_CALLBACK(map_cb_button_release), NULL);
+/* Connect signals. */
+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), "scroll_event",
-                        G_CALLBACK(map_cb_scroll_event), NULL);
+gtk_idle_add((GSourceFunc)window_present, 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);
+/******* XXX: Move these !! *******/
 
-#ifdef WITH_OSSO
-       osso_hw_set_event_cb(_osso, NULL, osso_cb_hw_state, NULL);
-#endif
+gboolean
+gps_info_update(Gps *gps)
+{
+g_assert(gps);
+if (_gps_info)
+    gps_display_data(&gps->data);
 
-       /* Initialize data. */
-
-       /* Cache some pango and GCs for drawing. */
-       _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);
-
-       /* draw_sat_info() */
-       _sat_info_gc1 = gdk_gc_new(_map_widget->window);
-       color.red = 0;
-       color.green = 0;
-       color.blue = 0;
-       gdk_gc_set_rgb_fg_color(_sat_info_gc1, &color);
-       color.red = 0;
-       color.green = 0;
-       color.blue = 0xffff;
-       _sat_info_gc2 = gdk_gc_new(_map_widget->window);
-       gdk_gc_set_rgb_fg_color(_sat_info_gc2, &color);
-       _sat_info_context = gtk_widget_get_pango_context(_map_widget);
-       _sat_info_layout = pango_layout_new(_sat_info_context);
-       _sat_info_fontdesc = pango_font_description_new();
-       pango_font_description_set_family(_sat_info_fontdesc, "Sans Serif");
-       pango_font_description_set_size(_sat_info_fontdesc, 8 * PANGO_SCALE);
-       pango_layout_set_font_description(_sat_info_layout, _sat_info_fontdesc);
-       pango_layout_set_alignment(_sat_info_layout, PANGO_ALIGN_CENTER);
-
-       /* sat_panel_expose() */
-       _sat_panel_context = gtk_widget_get_pango_context(_map_widget);
-       _sat_panel_layout = pango_layout_new(_sat_panel_context);
-       _sat_panel_fontdesc = pango_font_description_new();
-       pango_font_description_set_family(_sat_panel_fontdesc, "Sans Serif");
-       pango_font_description_set_size(_sat_panel_fontdesc, 14 * PANGO_SCALE);
-       pango_layout_set_font_description(_sat_panel_layout, _sat_panel_fontdesc);
-
-       /* heading_panel_expose() */
-       _heading_panel_context = gtk_widget_get_pango_context(_map_widget);
-       _heading_panel_layout = pango_layout_new(_heading_panel_context);
-       _heading_panel_fontdesc = pango_font_description_new();
-       pango_font_description_set_family(_heading_panel_fontdesc, "Sans Serif");
-
-       /* draw_sat_details() */
-       _sat_details_context = gtk_widget_get_pango_context(_map_widget);
-       _sat_details_layout = pango_layout_new(_sat_details_context);
-       _sat_details_fontdesc = pango_font_description_new();
-
-       pango_font_description_set_family(_sat_details_fontdesc, "Sans Serif");
-       pango_font_description_set_size(_sat_details_fontdesc, 10 * PANGO_SCALE);
-       pango_layout_set_font_description(_sat_details_layout, _sat_details_fontdesc);
-       pango_layout_set_alignment(_sat_details_layout, PANGO_ALIGN_CENTER);
-
-       /* sat_details_panel_expose() */
-       _sat_details_expose_context = gtk_widget_get_pango_context(_map_widget);
-       _sat_details_expose_layout = pango_layout_new(_sat_details_expose_context);
-       _sat_details_expose_fontdesc = pango_font_description_new();
-       pango_font_description_set_family(_sat_details_expose_fontdesc, "Sans Serif");
-       pango_layout_set_alignment(_sat_details_expose_layout, PANGO_ALIGN_CENTER);
-       pango_font_description_set_size(_sat_details_expose_fontdesc,14 * PANGO_SCALE);
-       pango_layout_set_font_description(_sat_details_expose_layout, _sat_details_expose_fontdesc);
-
-       _last_spoken_phrase = g_strdup("");
-
-       memset(&_autoroute_data, 0, sizeof(_autoroute_data));
-
-       _gps.lat = 0;
-       _gps.lon = 0;
-       _pos.unitx = 0;
-       _pos.unity = 0;
-
-       _gps.heading = 0;
-       _gps.lheading = 0;
-
-       integerize_data(_vel_offsetx, _vel_offsety, _pos, _gps);
-
-       /* Initialize our line styles. */
-       update_gcs();
-
-       menu_init();
-
-       osm_init();
-
-       /* If present, attempt to load the file specified on the command line. */
-       if (argc > 1) {
-               GnomeVFSResult vfs_result;
-               gint size;
-               gchar *buffer;
-               gchar *file_uri;
-
-               /* Get the selected filename. */
-               file_uri = gnome_vfs_make_uri_from_shell_arg(argv[1]);
-
-               if (GNOME_VFS_OK !=
-                   (vfs_result =
-                    gnome_vfs_read_entire_file(file_uri, &size, &buffer))) {
-                       gchar buffer[BUFFER_SIZE];
-                       snprintf(buffer, sizeof(buffer),
-                                "%s:\n%s",
-                                _("Failed to open file for reading"),
-                                gnome_vfs_result_to_string(vfs_result));
-                       popup_error(_window, buffer);
-               } else {
-                       if (parse_gpx(&_route, buffer, size, 0)) {
-                               MACRO_BANNER_SHOW_INFO(_window, _("Route Opened"));
-                       } else
-                               popup_error(_window, _("Error parsing GPX file."));
-                       g_free(buffer);
-               }
-               g_free(file_uri);
-       }
+gps_display_data_speed(info_banner.speed, gps->data.speed);
 
-       /* If we have a route, calculate the next point. */
-       route_find_nearest_point();
+return FALSE;
+}
 
-#ifdef WITH_OSSO
-       /* Add D-BUS signal handler for 'status_changed' */
-       {
-               DBusConnection *dbus_conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
-               gchar *filter_string = g_strdup_printf("interface=%s", ICD_DBUS_INTERFACE);
-               /* add match */
-               dbus_bus_add_match(dbus_conn, filter_string, NULL);
+gboolean
+gps_satellite_update(Gps *gps)
+{
+g_assert(gps);
+if (_satdetails_on)
+    gps_display_details(&gps->data);
 
-               g_free(filter_string);
+return FALSE;
+}
 
-               /* add the callback */
-               dbus_connection_add_filter(dbus_conn,
-                                          get_connection_status_signal_cb,
-                                          NULL, NULL);
-       }
-       osso_iap_cb(iap_callback);
-
-       {
-               DBusGConnection *dbus_conn;
-               GError *error = NULL;
-
-               /* Initialize D-Bus. */
-               if (NULL == (dbus_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error))) {
-                       g_printerr("Failed to open connection to D-Bus: %s.\n",
-                                  error->message);
-                       error = NULL;
-               }
-
-               if (NULL == (_rfcomm_req_proxy =
-                    dbus_g_proxy_new_for_name(dbus_conn, BTCOND_SERVICE,
-                                              BTCOND_REQ_PATH,
-                                              BTCOND_REQ_INTERFACE))) {
-                       g_printerr("Failed to open connection to %s.\n",
-                                  BTCOND_REQ_INTERFACE);
-               }
+gboolean
+gps_location_update(Gps *gps)
+{
+g_assert(gps);
+if (filter_check(&filter, &gps->data, &map_loc)==TRUE) {
+       if (track_add(_track, &_gps->data)) {
+               KEEP_DISPLAY_ON();
+               route_check_waypoint_announce(_route, &_gps->data);
+               route_autoroute_check(_route);
        }
+       map_refresh_mark();
+}
+return FALSE;
+}
 
-#endif
-       gtk_idle_add((GSourceFunc) window_present, NULL);
-
-       vprintf("%s(): return\n", __PRETTY_FUNCTION__);
+/**
+ * Simple dialog to ask if we should try to reconnect to GPS
+ * returns TRUE or FALSE
+ */
+gboolean
+gps_retry_connection(Gps *gps, const gchar *error)
+{
+GtkWidget *confirm;
+gboolean r;
+
+g_assert(gps);
+confirm=hildon_note_new_confirmation(GTK_WINDOW(_window), _("Failed to connect to GPS receiver. Retry?"));
+r=(GTK_RESPONSE_OK==gtk_dialog_run(GTK_DIALOG(confirm))) ? TRUE : FALSE;
+gtk_widget_destroy(confirm);
+return r;
 }