]> err.no Git - mapper/blob - src/ui-common.c
2e8afaa219086ad48950ac26c870e28b6806aec3
[mapper] / src / ui-common.c
1 #include <config.h>
2
3 #define _GNU_SOURCE
4
5 #include <unistd.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <strings.h>
9 #include <stddef.h>
10 #include <locale.h>
11 #include <math.h>
12 #include <errno.h>
13 #include <sys/wait.h>
14 #include <glib/gstdio.h>
15 #include <gtk/gtk.h>
16 #include <fcntl.h>
17 #include <libgnomevfs/gnome-vfs.h>
18 #include <curl/multi.h>
19 #include <gconf/gconf-client.h>
20 #include <libxml/parser.h>
21 #include <libintl.h>
22 #include <locale.h>
23 #include <sqlite3.h>
24
25 #include "hildon-mapper.h"
26
27 #include "utils.h"
28 #include "poi.h"
29 #include "route.h"
30 #include "settings.h"
31 #include "gps.h"
32 #include "map.h"
33 #include "mapper-types.h"
34 #include "bt.h"
35 #include "ui-common.h"
36 #include "db.h"
37
38 #include "settings-gui.h"
39
40 /* Callbacks */
41 #include "cb.h"
42
43 /* Default size */
44 #define WINDOW_SIZE_X 800
45 #define WINDOW_SIZE_Y 600
46
47 GtkWidget *_menu_bar;
48 GtkWidget *_toolbar;
49 GtkWidget *_fix_banner=NULL;
50
51 /**
52  * Update all GdkGC objects to reflect the current _draw_width.
53  */
54 #define UPDATE_GC(gc) \
55     gdk_gc_set_line_attributes(gc, \
56             _draw_width, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND);
57 void update_gcs()
58 {
59         gint i;
60         printf("%s()\n", __PRETTY_FUNCTION__);
61
62         for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
63                 gdk_color_alloc(gtk_widget_get_colormap(_map_widget),
64                                 &_color[i]);
65                 if (_gc[i])
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);
72         }
73
74         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
75 }
76
77 #ifdef WITH_HILDON
78 void force_min_visible_bars(HildonControlbar * control_bar, gint num_bars)
79 {
80         GValue val;
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",
86                               &val);
87         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
88 }
89 #else
90 void force_min_visible_bars(void *a, gint b)
91 {
92 }
93 #endif
94
95 /**
96  * Pop up a modal dialog box with simple error information in it.
97  */
98 void popup_error(GtkWidget * window, const gchar * error)
99 {
100         GtkWidget *dialog;
101         printf("%s(\"%s\")\n", __PRETTY_FUNCTION__, error);
102
103         dialog = hildon_note_new_information(GTK_WINDOW(window), error);
104
105         gtk_dialog_run(GTK_DIALOG(dialog));
106         gtk_widget_destroy(dialog);
107
108         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
109 }
110
111 void menu_maps_remove_repos()
112 {
113         GList *curr;
114         printf("%s()\n", __PRETTY_FUNCTION__);
115
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);
120         }
121         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
122 }
123
124 void menu_maps_add_repos()
125 {
126         GList *curr;
127         GtkWidget *last_repo = NULL;
128         printf("%s()\n", __PRETTY_FUNCTION__);
129
130         for (curr = g_list_last(_repo_list); curr; curr = curr->prev) {
131                 RepoData *rd = (RepoData *) curr->data;
132                 GtkWidget *menu_item;
133                 if (last_repo)
134                         gtk_menu_prepend(_menu_maps_submenu, menu_item
135                                          =
136                                          gtk_radio_menu_item_new_with_label_from_widget
137                                          (GTK_RADIO_MENU_ITEM(last_repo),
138                                           rd->name));
139                 else {
140                         gtk_menu_prepend(_menu_maps_submenu, menu_item
141                                          =
142                                          gtk_radio_menu_item_new_with_label
143                                          (NULL, rd->name));
144                         last_repo = menu_item;
145                 }
146                 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item),
147                                                rd == _curr_repo);
148                 rd->menu_item = menu_item;
149         }
150
151         /* Add signals (must be after entire menu is built). */
152         {
153                 GList *currmi =
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),
160                                          curr->data);
161                 }
162         }
163
164         gtk_widget_show_all(_menu_maps_submenu);
165         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
166 }
167
168 /**
169  * Free a ProgressUpdateInfo data structure that was allocated during the
170  * auto-map-download process.
171  */
172 void progress_update_info_free(ProgressUpdateInfo * pui)
173 {
174         vprintf("%s()\n", __PRETTY_FUNCTION__);
175
176         g_free(pui->src_str);
177         g_free(pui->dest_str);
178
179         g_slice_free(ProgressUpdateInfo, pui);
180
181         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
182 }
183
184 /**
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.
188  */
189 gboolean window_present()
190 {
191         static gint been_here = 0;
192         static gint done_here = 0;
193         printf("%s()\n", __PRETTY_FUNCTION__);
194
195         if (!been_here++) {
196                 /* Set connection state first, to avoid going into this if twice. */
197                 if (!_rcvr_mac && _enable_gps) {
198                         GtkWidget *confirm;
199
200                         gtk_window_present(GTK_WINDOW(_window));
201
202                         popup_error(_window, _("It looks like this is your first time running "
203                                                           "Mapper. Press OK to continue."));
204
205                         if (settings_dialog()) {
206                                 popup_error(_window,
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."));
210                                 repoman_dialog();
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"
217                                               " Auto-Download."));
218                                         if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) {
219                                                 gtk_check_menu_item_set_active
220                                                     (GTK_CHECK_MENU_ITEM
221                                                      (_menu_auto_download_item),
222                                                      TRUE);
223                                         }
224                                         gtk_widget_destroy(confirm);
225                                 }
226                         } else
227                                 gtk_main_quit();
228                 }
229                 /* Connect to receiver. */
230                 if (_enable_gps)
231                         rcvr_connect_now();
232
233                 done_here++;    /* Don't ask... */
234         }
235         if (done_here) {
236                 gtk_window_present(GTK_WINDOW(_window));
237
238                 /* Re-enable any banners that might have been up. */
239                 {
240                         ConnState old_state = _conn_state;
241                         set_conn_state(RCVR_OFF);
242                         set_conn_state(old_state);
243                 }
244         }
245
246         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
247         return FALSE;
248 }
249
250 /**
251  * Create the menu items needed for the drop down menu.
252  */
253 static void menu_init()
254 {
255         /* Create needed handles. */
256         GtkMenu *menu;
257         GtkWidget *submenu_routes;
258         GtkWidget *submenu_track;
259         GtkWidget *submenu;
260         GtkWidget *menu_item;
261         GtkWidget *file_item;
262         printf("%s()\n", __PRETTY_FUNCTION__);
263
264         /* Get the menu of our view. */
265         menu = GTK_MENU(gtk_menu_new());
266
267 #ifdef WITH_HILDON
268         hildon_window_set_menu(HILDON_WINDOW(_window), menu);
269 #else
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));
273 #endif
274
275         /* Create the menu items. */
276
277         /* The "Routes" submenu. */
278         menu_item = gtk_menu_item_new_with_label(_("Route"));
279 #ifdef WITH_HILDON
280         gtk_menu_append(menu, menu_item);
281 #else
282         gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
283 #endif
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")));
292
293         /* The "Track" submenu. */
294         menu_item = gtk_menu_item_new_with_label(_("Track"));
295 #ifdef WITH_HILDON
296         gtk_menu_append(menu, menu_item);
297 #else
298         gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
299 #endif
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...")));
310
311         /* The "Maps" submenu. */
312         menu_item = gtk_menu_item_new_with_label(_("Maps"));
313 #ifdef WITH_HILDON
314         gtk_menu_append(menu, menu_item);
315 #else
316         gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
317 #endif
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);
325
326         gtk_menu_append(menu, gtk_separator_menu_item_new());
327
328         /* The "View" submenu. */
329         menu_item = gtk_menu_item_new_with_label(_("View"));
330 #ifdef WITH_HILDON
331         gtk_menu_append(menu, menu_item);
332 #else
333         gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
334 #endif
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);
353
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);
365
366         /* The "Go to" submenu. */
367         menu_item = gtk_menu_item_new_with_label(_("Go to"));
368 #ifdef WITH_HILDON
369         gtk_menu_append(menu, menu_item);
370 #else
371         gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
372 #endif
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")));
379
380         /* The "GPS" submenu. */
381         menu_item = gtk_menu_item_new_with_label(_("GPS"));
382 #ifdef WITH_HILDON
383         gtk_menu_append(menu, menu_item);
384 #else
385         gtk_menu_bar_append(GTK_MENU_BAR(_menu_bar), GTK_WIDGET(menu_item));
386 #endif
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());
395
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")));
402
403         /* We need to show menu items. */
404
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);
420
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);
438
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);
444
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);
464
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);
472
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);
484
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);
494
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);
504
505         gtk_widget_show_all(GTK_WIDGET(menu));
506 #ifndef WITH_HILDON
507         gtk_widget_show_all(GTK_WIDGET(_menu_bar));
508 #endif
509
510         /* Setup the context menu. */
511         menu = GTK_MENU(gtk_menu_new());
512
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());
516
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")));
540
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());
546
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")));
567
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());
572
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")));
588
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);
608
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);
627
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);
640
641         gtk_widget_show_all(GTK_WIDGET(menu));
642
643 #ifdef WITH_DEVICE_770
644         gtk_widget_tap_and_hold_setup(_map_widget, GTK_WIDGET(menu), NULL, 0);
645 #else
646         _menu_map = menu;
647 #endif
648
649         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
650 }
651
652 static void toolbar_init(void)
653 {
654 GtkToolItem *item;
655
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);
659
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);
663
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);
667
668 item = gtk_separator_tool_item_new();
669 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
670
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);
674
675 #ifndef GTK_STOCK_INFO
676 #define GTK_STOCK_INFO GTK_STOCK_PROPERTIES
677 #endif
678
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);
682
683 item = gtk_separator_tool_item_new();
684 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
685
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);
689
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);
693
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);
697
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);
701
702 item = gtk_separator_tool_item_new();
703 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
704
705 #ifndef WITH_HILDON
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);
709 #endif
710
711 item=gtk_separator_tool_item_new();
712 gtk_toolbar_insert (GTK_TOOLBAR (_toolbar), item, -1);
713
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);
718 }
719
720 void mapper_init_variables(void)
721 {
722         /* Set enum-based constants. */
723         UNITS_TEXT[UNITS_KM] = _("km");
724         UNITS_TEXT[UNITS_MI] = _("mi.");
725         UNITS_TEXT[UNITS_NM] = _("n.m.");
726
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";
734
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";
747
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;
757
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;
768
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");
799
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";
816
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";
823
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");
828 }
829
830 /**
831  * Initialize everything required in preparation for calling gtk_main().
832  */
833 void mapper_init(gint argc, gchar ** argv)
834 {
835         GtkWidget *hbox, *mapvbox, *label, *vbox, *vbox_main;
836         GtkWidget *notebook, *hbanner;
837         GdkColor color;
838         printf("%s()\n", __PRETTY_FUNCTION__);
839
840         mapper_init_variables();
841
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);
847
848         config_init();
849
850         g_set_application_name("Mapper");
851
852 #ifdef WITH_HILDON
853         /* Initialize _program. */
854         _program = HILDON_PROGRAM(hildon_program_get_instance());
855
856         /* Initialize _window. */
857         _window = GTK_WIDGET(hildon_window_new());
858         hildon_program_add_window(_program, HILDON_WINDOW(_window));
859 #else
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);
865 #endif
866
867         _toolbar = gtk_toolbar_new();
868         toolbar_init();
869
870         notebook = gtk_notebook_new();
871         gtk_notebook_set_show_tabs(notebook, TRUE);
872         label = gtk_label_new("Map");
873
874         hbox = gtk_hpaned_new();
875
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);
883
884         mapvbox = gtk_vbox_new(FALSE, 0);
885
886 #ifdef WITH_HILDON
887         /* Create and add widgets and supporting data. */
888         gtk_container_add(GTK_CONTAINER(_window), notebook);
889         hildon_program_set_common_toolbar(_program, _toolbar);
890
891         gtk_widget_show_all(notebook);
892         gtk_widget_show_all(_toolbar);
893 #else
894         vbox_main = gtk_vbox_new(FALSE, 0);
895         gtk_container_add(GTK_CONTAINER(_window), vbox_main);
896
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);
901
902         _status_bar = gtk_statusbar_new();
903         gtk_box_pack_start(GTK_BOX(vbox_main), _status_bar, FALSE, FALSE, 0);
904
905         gtk_widget_show_all(vbox_main);
906 #endif
907
908         /* gtk_widget_hide(_progress_item); */
909
910         gtk_box_pack_start(GTK_BOX(mapvbox), info_banner.container, FALSE, FALSE, 0);
911
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);
915
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);
921
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);
925
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);
929
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);
933
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);
937
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);
941
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);
945
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);
949
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);
953
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);
957
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);
961
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);
965
966         _map_widget = gtk_drawing_area_new();
967         gtk_paned_add2(hbox, _map_widget);
968
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);
973
974         /* -1: use bit depth of widget->window. */
975         _map_pixmap = gdk_pixmap_new(_map_widget->window, BUF_WIDTH_PIXELS, BUF_HEIGHT_PIXELS, -1);     
976
977         _curl_easy_queue = g_queue_new();
978
979         _pui_tree = g_tree_new_full((GCompareDataFunc) download_comparefunc,
980                                     NULL,
981                                     (GDestroyNotify) progress_update_info_free,
982                                     NULL);
983         _downloading_tree = g_tree_new_full((GCompareDataFunc) download_comparefunc, NULL,
984                             (GDestroyNotify) progress_update_info_free, NULL);
985
986         _pui_by_easy = g_hash_table_new(g_direct_hash, g_direct_equal);
987
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);
995
996         g_signal_connect(G_OBJECT(_window), "key_press_event",
997                          G_CALLBACK(window_cb_key_press), NULL);
998
999         g_signal_connect(G_OBJECT(_window), "key_release_event",
1000                          G_CALLBACK(window_cb_key_release), NULL);
1001
1002         g_signal_connect(G_OBJECT(_map_widget), "configure_event",
1003                          G_CALLBACK(map_cb_configure), NULL);
1004
1005         g_signal_connect(G_OBJECT(_map_widget), "expose_event",
1006                          G_CALLBACK(map_cb_expose), NULL);
1007
1008         g_signal_connect(G_OBJECT(_map_widget), "button_press_event",
1009                          G_CALLBACK(map_cb_button_press), NULL);
1010
1011         g_signal_connect(G_OBJECT(_map_widget), "button_release_event",
1012                          G_CALLBACK(map_cb_button_release), NULL);
1013
1014         g_signal_connect(G_OBJECT(_map_widget), "scroll_event",
1015                          G_CALLBACK(map_cb_scroll_event), NULL);
1016
1017         gtk_widget_add_events(_map_widget,
1018                               GDK_EXPOSURE_MASK
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);
1024
1025 #ifdef WITH_OSSO
1026         osso_hw_set_event_cb(_osso, NULL, osso_cb_hw_state, NULL);
1027 #endif
1028
1029         /* Initialize data. */
1030
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);
1037
1038         /* speed limit */
1039         _speed_limit_gc1 = gdk_gc_new(_map_widget->window);
1040         color.red = 0xffff;
1041         color.green = 0;
1042         color.blue = 0;
1043         gdk_gc_set_rgb_fg_color(_speed_limit_gc1, &color);
1044         color.red = 0;
1045         color.green = 0;
1046         color.blue = 0;
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);
1055
1056         /* draw_sat_info() */
1057         _sat_info_gc1 = gdk_gc_new(_map_widget->window);
1058         color.red = 0;
1059         color.green = 0;
1060         color.blue = 0;
1061         gdk_gc_set_rgb_fg_color(_sat_info_gc1, &color);
1062         color.red = 0;
1063         color.green = 0;
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);
1074
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);
1082
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");
1088
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();
1093
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);
1098
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);
1107
1108         _last_spoken_phrase = g_strdup("");
1109
1110         memset(&_autoroute_data, 0, sizeof(_autoroute_data));
1111
1112         _gps.lat = 0;
1113         _gps.lon = 0;
1114         _pos.unitx = 0;
1115         _pos.unity = 0;
1116
1117         _gps.heading = 0;
1118         _gps.lheading = 0;
1119
1120         integerize_data(_vel_offsetx, _vel_offsety, _pos, _gps);
1121
1122         /* Initialize our line styles. */
1123         update_gcs();
1124
1125         menu_init();
1126
1127         osm_init();
1128
1129         /* If present, attempt to load the file specified on the command line. */
1130         if (argc > 1) {
1131                 GnomeVFSResult vfs_result;
1132                 gint size;
1133                 gchar *buffer;
1134                 gchar *file_uri;
1135
1136                 /* Get the selected filename. */
1137                 file_uri = gnome_vfs_make_uri_from_shell_arg(argv[1]);
1138
1139                 if (GNOME_VFS_OK !=
1140                     (vfs_result =
1141                      gnome_vfs_read_entire_file(file_uri, &size, &buffer))) {
1142                         gchar buffer[BUFFER_SIZE];
1143                         snprintf(buffer, sizeof(buffer),
1144                                  "%s:\n%s",
1145                                  _("Failed to open file for reading"),
1146                                  gnome_vfs_result_to_string(vfs_result));
1147                         popup_error(_window, buffer);
1148                 } else {
1149                         if (parse_gpx(&_route, buffer, size, 0)) {
1150                                 MACRO_BANNER_SHOW_INFO(_window, _("Route Opened"));
1151                         } else
1152                                 popup_error(_window, _("Error parsing GPX file."));
1153                         g_free(buffer);
1154                 }
1155                 g_free(file_uri);
1156         }
1157
1158         /* If we have a route, calculate the next point. */
1159         route_find_nearest_point();
1160
1161 #ifdef WITH_OSSO
1162         /* Add D-BUS signal handler for 'status_changed' */
1163         {
1164                 DBusConnection *dbus_conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
1165                 gchar *filter_string = g_strdup_printf("interface=%s", ICD_DBUS_INTERFACE);
1166                 /* add match */
1167                 dbus_bus_add_match(dbus_conn, filter_string, NULL);
1168
1169                 g_free(filter_string);
1170
1171                 /* add the callback */
1172                 dbus_connection_add_filter(dbus_conn,
1173                                            get_connection_status_signal_cb,
1174                                            NULL, NULL);
1175         }
1176         osso_iap_cb(iap_callback);
1177
1178         {
1179                 DBusGConnection *dbus_conn;
1180                 GError *error = NULL;
1181
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",
1185                                    error->message);
1186                         error = NULL;
1187                 }
1188
1189                 if (NULL == (_rfcomm_req_proxy =
1190                      dbus_g_proxy_new_for_name(dbus_conn, BTCOND_SERVICE,
1191                                                BTCOND_REQ_PATH,
1192                                                BTCOND_REQ_INTERFACE))) {
1193                         g_printerr("Failed to open connection to %s.\n",
1194                                    BTCOND_REQ_INTERFACE);
1195                 }
1196         }
1197
1198 #endif
1199         gtk_idle_add((GSourceFunc) window_present, NULL);
1200
1201         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1202 }