]> git.itanic.dy.fi Git - maemo-mapper/blob - src/menu.c
Added ability to set "Toggle Tracking" as a hardware key.
[maemo-mapper] / src / menu.c
1 /*
2  * Copyright (C) 2006, 2007 John Costigan.
3  *
4  * POI and GPS-Info code originally written by Cezary Jackiewicz.
5  *
6  * Default map data provided by http://www.openstreetmap.org/
7  *
8  * This file is part of Maemo Mapper.
9  *
10  * Maemo Mapper is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * Maemo Mapper is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with Maemo Mapper.  If not, see <http://www.gnu.org/licenses/>.
22  */
23
24 #ifdef HAVE_CONFIG_H
25 #    include "config.h"
26 #endif
27
28 #define _GNU_SOURCE
29
30 #include <math.h>
31
32 #ifndef LEGACY
33 #    include <hildon/hildon-help.h>
34 #    include <hildon/hildon-program.h>
35 #    include <hildon/hildon-banner.h>
36 #else
37 #    include <osso-helplib.h>
38 #    include <hildon-widgets/hildon-program.h>
39 #    include <hildon-widgets/hildon-banner.h>
40 #    include <hildon-widgets/hildon-input-mode-hint.h>
41 #endif
42
43 #include "types.h"
44 #include "data.h"
45 #include "defines.h"
46
47 #include "display.h"
48 #include "gps.h"
49 #include "gdk-pixbuf-rotate.h"
50 #include "gpx.h"
51 #include "maps.h"
52 #include "menu.h"
53 #include "path.h"
54 #include "poi.h"
55 #include "settings.h"
56 #include "util.h"
57
58 static GtkWidget *_menu_route_open_item = NULL;
59 static GtkWidget *_menu_route_download_item = NULL;
60 static GtkWidget *_menu_route_save_item = NULL;
61 static GtkWidget *_menu_route_distnext_item = NULL;
62 static GtkWidget *_menu_route_distlast_item = NULL;
63 static GtkWidget *_menu_route_reset_item = NULL;
64 static GtkWidget *_menu_route_clear_item = NULL;
65 static GtkWidget *_menu_track_open_item = NULL;
66 static GtkWidget *_menu_track_save_item = NULL;
67 static GtkWidget *_menu_track_insert_break_item = NULL;
68 static GtkWidget *_menu_track_insert_mark_item = NULL;
69 static GtkWidget *_menu_track_distlast_item = NULL;
70 static GtkWidget *_menu_track_distfirst_item = NULL;
71 static GtkWidget *_menu_track_clear_item = NULL;
72 static GtkWidget *_menu_poi_import_item = NULL;
73 static GtkWidget *_menu_poi_download_item = NULL;
74 static GtkWidget *_menu_poi_browse_item = NULL;
75 static GtkWidget *_menu_poi_categories_item = NULL;
76 static GtkWidget *_menu_maps_submenu = NULL;
77 static GtkWidget *_menu_maps_mapman_item = NULL;
78 static GtkWidget *_menu_maps_repoman_item = NULL;
79 static GtkWidget *_menu_view_zoom_in_item = NULL;
80 static GtkWidget *_menu_view_zoom_out_item = NULL;
81 static GtkWidget *_menu_view_rotate_clock_item = NULL;
82 static GtkWidget *_menu_view_rotate_counter_item = NULL;
83 static GtkWidget *_menu_view_rotate_reset_item = NULL;
84 static GtkWidget *_menu_view_pan_up_item = NULL;
85 static GtkWidget *_menu_view_pan_down_item = NULL;
86 static GtkWidget *_menu_view_pan_left_item = NULL;
87 static GtkWidget *_menu_view_pan_right_item = NULL;
88 static GtkWidget *_menu_view_pan_north_item = NULL;
89 static GtkWidget *_menu_view_pan_south_item = NULL;
90 static GtkWidget *_menu_view_pan_west_item = NULL;
91 static GtkWidget *_menu_view_pan_east_item = NULL;
92 static GtkWidget *_menu_view_show_zoomlevel_item = NULL;
93 static GtkWidget *_menu_view_show_comprose_item = NULL;
94 static GtkWidget *_menu_view_show_velvec_item = NULL;
95 static GtkWidget *_menu_view_goto_latlon_item = NULL;
96 static GtkWidget *_menu_view_goto_address_item = NULL;
97 static GtkWidget *_menu_view_goto_gps_item = NULL;
98 static GtkWidget *_menu_view_goto_nextway_item = NULL;
99 static GtkWidget *_menu_view_goto_nearpoi_item = NULL;
100 static GtkWidget *_menu_settings_item = NULL;
101 static GtkWidget *_menu_help_item = NULL;
102 static GtkWidget *_menu_about_item = NULL;
103 static GtkWidget *_menu_close_item = NULL;
104
105 /****************************************************************************
106  * BELOW: ROUTE MENU ********************************************************
107  ****************************************************************************/
108
109 static gboolean
110 menu_cb_route_open(GtkMenuItem *item)
111 {
112     gchar *buffer;
113     gint size;
114     printf("%s()\n", __PRETTY_FUNCTION__);
115
116     if(display_open_file(GTK_WINDOW(_window), &buffer, NULL, &size,
117                 &_route_dir_uri, NULL, GTK_FILE_CHOOSER_ACTION_OPEN))
118     {
119         /* If auto is enabled, append the route, otherwise replace it. */
120         if(gpx_path_parse(&_route, buffer, size,
121                     _autoroute_data.enabled ? 0 : 1))
122         {
123             path_save_route_to_db();
124
125             cancel_autoroute();
126
127             /* Find the nearest route point, if we're connected. */
128             route_find_nearest_point();
129
130             map_force_redraw();
131             MACRO_BANNER_SHOW_INFO(_window, _("Route Opened"));
132         }
133         else
134             popup_error(_window, _("Error parsing GPX file."));
135         g_free(buffer);
136     }
137
138     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
139     return TRUE;
140 }
141
142 static gboolean
143 menu_cb_route_download(GtkMenuItem *item)
144 {
145     printf("%s()\n", __PRETTY_FUNCTION__);
146     route_download(NULL);
147     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
148     return TRUE;
149 }
150
151 static gboolean
152 menu_cb_route_save(GtkMenuItem *item)
153 {
154     GnomeVFSHandle *handle;
155     printf("%s()\n", __PRETTY_FUNCTION__);
156
157     if(display_open_file(GTK_WINDOW(_window), NULL, &handle, NULL,
158                 &_route_dir_uri, NULL, GTK_FILE_CHOOSER_ACTION_SAVE))
159     {
160         if(gpx_path_write(&_route, handle))
161         {
162             MACRO_BANNER_SHOW_INFO(_window, _("Route Saved"));
163         }
164         else
165             popup_error(_window, _("Error writing GPX file."));
166         gnome_vfs_close(handle);
167     }
168
169     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
170     return TRUE;
171 }
172
173 static gboolean
174 menu_cb_route_distnext(GtkMenuItem *item)
175 {
176     printf("%s()\n", __PRETTY_FUNCTION__);
177
178     route_show_distance_to_next();
179
180     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
181     return TRUE;
182 }
183
184 static gboolean
185 menu_cb_route_distlast(GtkMenuItem *item)
186 {
187     printf("%s()\n", __PRETTY_FUNCTION__);
188
189     route_show_distance_to_last();
190
191     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
192     return TRUE;
193 }
194
195 gboolean
196 menu_cb_route_reset(GtkMenuItem *item)
197 {
198     printf("%s()\n", __PRETTY_FUNCTION__);
199
200     path_reset_route();
201
202     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
203     return TRUE;
204 }
205
206 static gboolean
207 menu_cb_route_clear(GtkMenuItem *item)
208 {
209     printf("%s()\n", __PRETTY_FUNCTION__);
210
211     cancel_autoroute();
212     MACRO_PATH_FREE(_route);
213     MACRO_PATH_INIT(_route);
214     path_save_route_to_db();
215     route_find_nearest_point();
216     map_force_redraw();
217
218     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
219     return TRUE;
220 }
221
222 /****************************************************************************
223  * ABOVE: ROUTE MENU ********************************************************
224  ****************************************************************************/
225
226 /****************************************************************************
227  * BELOW: TRACK MENU ********************************************************
228  ****************************************************************************/
229
230 static gboolean
231 menu_cb_track_open(GtkMenuItem *item)
232 {
233     gchar *buffer;
234     gint size;
235     printf("%s()\n", __PRETTY_FUNCTION__);
236
237     if(display_open_file(GTK_WINDOW(_window), &buffer, NULL, &size,
238                 NULL, &_track_file_uri, GTK_FILE_CHOOSER_ACTION_OPEN))
239     {
240         if(gpx_path_parse(&_track, buffer, size, -1))
241         {
242             map_force_redraw();
243             MACRO_BANNER_SHOW_INFO(_window, _("Track Opened"));
244         }
245         else
246             popup_error(_window, _("Error parsing GPX file."));
247         g_free(buffer);
248     }
249
250     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
251     return TRUE;
252 }
253
254 static gboolean
255 menu_cb_track_save(GtkMenuItem *item)
256 {
257     GnomeVFSHandle *handle;
258     printf("%s()\n", __PRETTY_FUNCTION__);
259
260     if(display_open_file(GTK_WINDOW(_window), NULL, &handle, NULL,
261                 NULL, &_track_file_uri, GTK_FILE_CHOOSER_ACTION_SAVE))
262     {
263         if(gpx_path_write(&_track, handle))
264         {
265             MACRO_BANNER_SHOW_INFO(_window, _("Track Saved"));
266         }
267         else
268             popup_error(_window, _("Error writing GPX file."));
269         gnome_vfs_close(handle);
270     }
271
272     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
273     return TRUE;
274 }
275
276 static gboolean
277 menu_cb_track_insert_break(GtkMenuItem *item)
278 {
279     printf("%s()\n", __PRETTY_FUNCTION__);
280
281     track_insert_break(TRUE);
282
283     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
284     return TRUE;
285 }
286
287 static gboolean
288 menu_cb_track_insert_mark(GtkMenuItem *item)
289 {
290     gdouble lat, lon;
291     gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN], *p_latlon;
292     static GtkWidget *dialog = NULL;
293     static GtkWidget *table = NULL;
294     static GtkWidget *label = NULL;
295     static GtkWidget *lbl_latlon = NULL;
296     static GtkWidget *txt_scroll = NULL;
297     static GtkWidget *txt_desc = NULL;
298     printf("%s()\n", __PRETTY_FUNCTION__);
299
300     if(dialog == NULL)
301     {
302         dialog = gtk_dialog_new_with_buttons(_("Insert Mark"),
303                 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
304                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
305                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
306                 NULL);
307
308         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
309                 table = gtk_table_new(2, 2, FALSE), TRUE, TRUE, 0);
310
311         gtk_table_attach(GTK_TABLE(table),
312                 label = gtk_label_new(_("Lat, Lon:")),
313                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
314         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
315
316         gtk_table_attach(GTK_TABLE(table),
317                 lbl_latlon = gtk_label_new(""),
318                 1, 2, 0, 1, GTK_FILL, 0, 2, 4);
319         gtk_misc_set_alignment(GTK_MISC(lbl_latlon), 0.0f, 0.5f);
320
321         gtk_table_attach(GTK_TABLE(table),
322                 label = gtk_label_new(_("Description")),
323                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
324         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
325
326         txt_scroll = gtk_scrolled_window_new(NULL, NULL);
327         gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll),
328                                        GTK_SHADOW_IN);
329         gtk_table_attach(GTK_TABLE(table),
330                 txt_scroll,
331                 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
332
333         gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll),
334                 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
335
336         txt_desc = gtk_text_view_new ();
337         gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), GTK_WRAP_WORD);
338
339         gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc);
340         gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 400, 60);
341     }
342
343     unit2latlon(_pos.unitx, _pos.unity, lat, lon);
344     lat_format(lat, tmp1);
345     lon_format(lon, tmp2);
346     p_latlon = g_strdup_printf("%s, %s", tmp1, tmp2);
347     gtk_label_set_text(GTK_LABEL(lbl_latlon), p_latlon);
348     g_free(p_latlon);
349
350     gtk_text_buffer_set_text(
351             gtk_text_view_get_buffer(GTK_TEXT_VIEW(txt_desc)), "", 0);
352
353     gtk_widget_show_all(dialog);
354
355     while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
356     {
357         GtkTextBuffer *tbuf;
358         GtkTextIter ti1, ti2;
359         gchar *desc;
360
361         tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txt_desc));
362         gtk_text_buffer_get_iter_at_offset(tbuf, &ti1, 0);
363         gtk_text_buffer_get_end_iter(tbuf, &ti2);
364         desc = gtk_text_buffer_get_text(tbuf, &ti1, &ti2, TRUE);
365
366         if(*desc)
367         {
368             MACRO_PATH_INCREMENT_WTAIL(_track);
369             _track.wtail->point = _track.tail;
370             _track.wtail->desc
371                 = gtk_text_buffer_get_text(tbuf, &ti1, &ti2, TRUE);
372         }
373         else
374         {
375             popup_error(dialog,
376                     _("Please provide a description for the mark."));
377             g_free(desc);
378             continue;
379         }
380
381         map_render_paths();
382         MACRO_QUEUE_DRAW_AREA();
383         break;
384     }
385     gtk_widget_hide(dialog);
386
387     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
388     return TRUE;
389 }
390
391 static gboolean
392 menu_cb_track_distlast(GtkMenuItem *item)
393 {
394     printf("%s()\n", __PRETTY_FUNCTION__);
395
396     track_show_distance_from_last();
397
398     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
399     return TRUE;
400 }
401
402 static gboolean
403 menu_cb_track_distfirst(GtkMenuItem *item)
404 {
405     printf("%s()\n", __PRETTY_FUNCTION__);
406
407     track_show_distance_from_first();
408
409     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
410     return TRUE;
411 }
412
413 static gboolean
414 menu_cb_track_clear(GtkMenuItem *item)
415 {
416     printf("%s()\n", __PRETTY_FUNCTION__);
417
418     track_clear();
419
420     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
421     return TRUE;
422 }
423
424 static gboolean
425 menu_cb_track_enable_tracking(GtkMenuItem *item)
426 {
427     printf("%s()\n", __PRETTY_FUNCTION__);
428
429     if(!(_enable_tracking = gtk_check_menu_item_get_active(
430                 GTK_CHECK_MENU_ITEM(_menu_track_enable_tracking_item))))
431     {
432         track_insert_break(FALSE); /* FALSE = not temporary */
433         MACRO_BANNER_SHOW_INFO(_window, _("Tracking Disabled"));
434     }
435     else
436     {
437         MACRO_BANNER_SHOW_INFO(_window, _("Tracking Enabled"));
438     }
439
440
441     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
442     return TRUE;
443 }
444
445 /****************************************************************************
446  * ABOVE: TRACK MENU ********************************************************
447  ****************************************************************************/
448
449 /****************************************************************************
450  * BELOW: POI MENU **********************************************************
451  ****************************************************************************/
452
453 static gboolean
454 menu_cb_poi_import(GtkMenuItem *item)
455 {
456     printf("%s()\n", __PRETTY_FUNCTION__);
457
458     if(poi_import_dialog(_center.unitx, _center.unity))
459         map_force_redraw();
460
461     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
462     return TRUE;
463 }
464
465 static gboolean
466 menu_cb_poi_download(GtkMenuItem *item)
467 {
468     printf("%s()\n", __PRETTY_FUNCTION__);
469
470     if(poi_download_dialog(0, 0)) /* 0, 0 means no default origin */
471         map_force_redraw();
472
473     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
474     return TRUE;
475 }
476
477 static gboolean
478 menu_cb_poi_browse(GtkMenuItem *item)
479 {
480     printf("%s()\n", __PRETTY_FUNCTION__);
481
482     if(poi_browse_dialog(0, 0)) /* 0, 0 means no default origin */
483         map_force_redraw();
484
485     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
486     return TRUE;
487 }
488
489 static gboolean
490 menu_cb_poi_categories(GtkMenuItem *item)
491 {
492     printf("%s()\n", __PRETTY_FUNCTION__);
493
494     if(category_list_dialog(_window))
495         map_force_redraw();
496
497     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
498     return TRUE;
499 }
500
501 /****************************************************************************
502  * ABOVE: POI MENU **********************************************************
503  ****************************************************************************/
504
505 /****************************************************************************
506  * BELOW: MAPS MENU *********************************************************
507  ****************************************************************************/
508
509 static gboolean
510 menu_cb_maps_repoman(GtkMenuItem *item)
511 {
512     printf("%s()\n", __PRETTY_FUNCTION__);
513     repoman_dialog();
514     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
515     return TRUE;
516 }
517
518 static gboolean
519 menu_cb_maps_select(GtkMenuItem *item, gpointer new_repo)
520 {
521     printf("%s()\n", __PRETTY_FUNCTION__);
522
523     if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item)))
524     {
525         repo_set_curr(new_repo);
526         map_refresh_mark(TRUE);
527     }
528     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
529     return TRUE;
530 }
531
532 static gboolean
533 menu_cb_maps_mapman(GtkMenuItem *item)
534 {
535     printf("%s()\n", __PRETTY_FUNCTION__);
536
537     mapman_dialog();
538
539     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
540     return TRUE;
541 }
542
543 static gboolean
544 menu_cb_maps_auto_download(GtkMenuItem *item)
545 {
546     printf("%s()\n", __PRETTY_FUNCTION__);
547
548     if((_auto_download = gtk_check_menu_item_get_active(
549             GTK_CHECK_MENU_ITEM(_menu_maps_auto_download_item))))
550     {
551         if(_curr_repo->url == REPOTYPE_NONE)
552             popup_error(_window,
553                 _("NOTE: You must set a Map URI in the current repository in "
554                     "order to download maps."));
555         map_refresh_mark(TRUE);
556     }
557
558     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
559     return TRUE;
560 }
561
562 /****************************************************************************
563  * ABOVE: MAPS MENU *********************************************************
564  ****************************************************************************/
565
566 /****************************************************************************
567  * BELOW: VIEW/ZOOM MENU ****************************************************
568  ****************************************************************************/
569
570 static gboolean
571 menu_cb_view_zoom_in(GtkMenuItem *item)
572 {
573     printf("%s()\n", __PRETTY_FUNCTION__);
574
575     if(_zoom > MIN_ZOOM)
576     {
577         gchar buffer[80];
578         snprintf(buffer, sizeof(buffer),"%s %d",
579                 _("Zoom to Level"), _next_zoom - 1);
580         MACRO_BANNER_SHOW_INFO(_window, buffer);
581         map_set_zoom(_next_zoom - 1);
582     }
583
584     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
585     return TRUE;
586 }
587
588 static gboolean
589 menu_cb_view_zoom_out(GtkMenuItem *item)
590 {
591     printf("%s()\n", __PRETTY_FUNCTION__);
592
593     if(_zoom < MAX_ZOOM)
594     {
595         gchar buffer[80];
596         snprintf(buffer, sizeof(buffer),"%s %d",
597                 _("Zoom to Level"), _next_zoom + 1);
598         MACRO_BANNER_SHOW_INFO(_window, buffer);
599         map_set_zoom(_next_zoom + 1);
600     }
601
602     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
603     return TRUE;
604 }
605
606 /****************************************************************************
607  * ABOVE: VIEW/ZOOM MENU ****************************************************
608  ****************************************************************************/
609
610 /****************************************************************************
611  * BELOW: VIEW/ROTATE MENU **************************************************
612  ****************************************************************************/
613
614 static gboolean
615 menu_cb_view_rotate_clock(GtkMenuItem *item)
616 {
617     printf("%s()\n", __PRETTY_FUNCTION__);
618
619     map_rotate(-ROTATE_DEGREES);
620
621     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
622     return TRUE;
623 }
624
625 static gboolean
626 menu_cb_view_rotate_counter(GtkMenuItem *item)
627 {
628     printf("%s()\n", __PRETTY_FUNCTION__);
629
630     map_rotate(ROTATE_DEGREES);
631
632     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
633     return TRUE;
634 }
635
636 static gboolean
637 menu_cb_view_rotate_reset(GtkMenuItem *item)
638 {
639     printf("%s()\n", __PRETTY_FUNCTION__);
640
641     map_rotate(-_next_map_rotate_angle);
642
643     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
644     return TRUE;
645 }
646
647 static gboolean
648 menu_cb_view_rotate_auto(GtkMenuItem *item)
649 {
650     printf("%s()\n", __PRETTY_FUNCTION__);
651
652     if(gtk_check_menu_item_get_active(
653                 GTK_CHECK_MENU_ITEM(_menu_view_rotate_auto_item)))
654     {
655         _center_rotate = TRUE;
656         if(_center_mode > 0)
657             map_refresh_mark(TRUE);
658         MACRO_BANNER_SHOW_INFO(_window, _("Auto-Rotate Enabled"));
659     }
660     else
661     {
662         _center_rotate = FALSE;
663         MACRO_BANNER_SHOW_INFO(_window, _("Auto-Rotate Disabled"));
664     }
665
666     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
667     return TRUE;
668 }
669
670 /****************************************************************************
671  * ABOVE: VIEW/ROTATE MENU **************************************************
672  ****************************************************************************/
673
674 /****************************************************************************
675  * BELOW: VIEW/PAN MENU *****************************************************
676  ****************************************************************************/
677
678 static gboolean
679 menu_cb_view_pan_up(GtkMenuItem *item)
680 {
681     gfloat panx_adj, pany_adj;
682     printf("%s()\n", __PRETTY_FUNCTION__);
683
684     /* Adjust for rotate angle. */
685     gdk_pixbuf_rotate_vector(&panx_adj, &pany_adj, _map_reverse_matrix,
686             0, -PAN_PIXELS);
687
688     map_pan(pixel2unit((gint)(panx_adj + 0.5f)),
689                 pixel2unit((gint)(pany_adj + 0.5f)));
690
691     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
692     return TRUE;
693 }
694
695 static gboolean
696 menu_cb_view_pan_down(GtkMenuItem *item)
697 {
698     gfloat panx_adj, pany_adj;
699     printf("%s()\n", __PRETTY_FUNCTION__);
700
701     /* Adjust for rotate angle. */
702     gdk_pixbuf_rotate_vector(&panx_adj, &pany_adj, _map_reverse_matrix,
703             0, PAN_PIXELS);
704
705     map_pan(pixel2unit((gint)(panx_adj + 0.5f)),
706                 pixel2unit((gint)(pany_adj + 0.5f)));
707
708     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
709     return TRUE;
710 }
711
712 static gboolean
713 menu_cb_view_pan_left(GtkMenuItem *item)
714 {
715     gfloat panx_adj, pany_adj;
716     printf("%s()\n", __PRETTY_FUNCTION__);
717
718     /* Adjust for rotate angle. */
719     gdk_pixbuf_rotate_vector(&panx_adj, &pany_adj, _map_reverse_matrix,
720             -PAN_PIXELS, 0);
721
722     map_pan(pixel2unit((gint)(panx_adj + 0.5f)),
723                 pixel2unit((gint)(pany_adj + 0.5f)));
724
725     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
726     return TRUE;
727 }
728
729 static gboolean
730 menu_cb_view_pan_right(GtkMenuItem *item)
731 {
732     gfloat panx_adj, pany_adj;
733     printf("%s()\n", __PRETTY_FUNCTION__);
734
735     /* Adjust for rotate angle. */
736     gdk_pixbuf_rotate_vector(&panx_adj, &pany_adj, _map_reverse_matrix,
737             PAN_PIXELS, 0);
738
739     map_pan(pixel2unit((gint)(panx_adj + 0.5f)),
740                 pixel2unit((gint)(pany_adj + 0.5f)));
741
742     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
743     return TRUE;
744 }
745
746 static gboolean
747 menu_cb_view_pan_north(GtkMenuItem *item)
748 {
749     printf("%s()\n", __PRETTY_FUNCTION__);
750
751     map_pan(0, -pixel2unit(PAN_PIXELS));
752
753     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
754     return TRUE;
755 }
756
757 static gboolean
758 menu_cb_view_pan_south(GtkMenuItem *item)
759 {
760     printf("%s()\n", __PRETTY_FUNCTION__);
761
762     map_pan(0, pixel2unit(PAN_PIXELS));
763
764     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
765     return TRUE;
766 }
767
768 static gboolean
769 menu_cb_view_pan_west(GtkMenuItem *item)
770 {
771     printf("%s()\n", __PRETTY_FUNCTION__);
772
773     map_pan(-pixel2unit(PAN_PIXELS), 0);
774
775     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
776     return TRUE;
777 }
778
779 static gboolean
780 menu_cb_view_pan_east(GtkMenuItem *item)
781 {
782     printf("%s()\n", __PRETTY_FUNCTION__);
783
784     map_pan(pixel2unit(PAN_PIXELS), 0);
785
786     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
787     return TRUE;
788 }
789
790 /****************************************************************************
791  * ABOVE: VIEW/PAN MENU *****************************************************
792  ****************************************************************************/
793
794 /****************************************************************************
795  * BELOW: VIEW/GOTO MENU ****************************************************
796  ****************************************************************************/
797
798 static gboolean
799 menu_cb_view_goto_latlon(GtkMenuItem *item)
800 {
801     static GtkWidget *dialog = NULL;
802     static GtkWidget *table = NULL;
803     static GtkWidget *label = NULL;
804     static GtkWidget *txt_lat = NULL;
805     static GtkWidget *txt_lon = NULL;
806     printf("%s()\n", __PRETTY_FUNCTION__);
807
808     if(dialog == NULL)
809     {
810         dialog = gtk_dialog_new_with_buttons(_("Go to Lat/Lon"),
811                 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
812                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
813                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
814                 NULL);
815
816         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
817                 table = gtk_table_new(2, 3, FALSE), TRUE, TRUE, 0);
818
819         gtk_table_attach(GTK_TABLE(table),
820                 label = gtk_label_new(_("Latitude")),
821                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
822         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
823
824         gtk_table_attach(GTK_TABLE(table),
825                 txt_lat = gtk_entry_new(),
826                 1, 2, 0, 1, GTK_FILL, 0, 2, 4);
827         gtk_entry_set_width_chars(GTK_ENTRY(txt_lat), 16);
828         gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
829 #ifndef LEGACY
830         g_object_set(G_OBJECT(txt_lat), "hildon-input-mode",
831                 HILDON_GTK_INPUT_MODE_FULL, NULL);
832 #else
833         g_object_set(G_OBJECT(txt_lat), HILDON_AUTOCAP, FALSE, NULL);
834         g_object_set(G_OBJECT(txt_lat), HILDON_INPUT_MODE_HINT,
835                 HILDON_INPUT_MODE_HINT_ALPHANUMERICSPECIAL, NULL);
836 #endif
837
838         gtk_table_attach(GTK_TABLE(table),
839                 label = gtk_label_new(_("Longitude")),
840                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
841         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
842
843         gtk_table_attach(GTK_TABLE(table),
844                 txt_lon = gtk_entry_new(),
845                 1, 2, 1, 2, GTK_FILL, 0, 2, 4);
846         gtk_entry_set_width_chars(GTK_ENTRY(txt_lon), 16);
847         gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
848 #ifndef LEGACY
849         g_object_set(G_OBJECT(txt_lon), "hildon-input-mode",
850                 HILDON_GTK_INPUT_MODE_FULL, NULL);
851 #else
852         g_object_set(G_OBJECT(txt_lon), HILDON_AUTOCAP, FALSE, NULL);
853         g_object_set(G_OBJECT(txt_lon), HILDON_INPUT_MODE_HINT,
854                 HILDON_INPUT_MODE_HINT_ALPHANUMERICSPECIAL, NULL);
855 #endif
856     }
857
858     /* Initialize with the current center position. */
859     {
860         gchar buffer[32];
861         gdouble lat, lon;
862         unit2latlon(_center.unitx, _center.unity, lat, lon);
863         lat_format(lat, buffer);
864         gtk_entry_set_text(GTK_ENTRY(txt_lat), buffer);
865         lon_format(lon, buffer);
866         gtk_entry_set_text(GTK_ENTRY(txt_lon), buffer);
867     }
868
869     gtk_widget_show_all(dialog);
870
871     while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
872     {
873         const gchar *text;
874         gchar *error_check;
875         gdouble lat, lon;
876         Point sel_unit;
877
878         text = gtk_entry_get_text(GTK_ENTRY(txt_lat));
879         lat = strdmstod(text, &error_check);
880         if(text == error_check || lat < -90. || lat > 90.) {
881             popup_error(dialog, _("Invalid Latitude"));
882             continue;
883         }
884
885         text = gtk_entry_get_text(GTK_ENTRY(txt_lon));
886         lon = strdmstod(text, &error_check);
887         if(text == error_check || lon < -180. || lon > 180.) {
888             popup_error(dialog, _("Invalid Longitude"));
889             continue;
890         }
891
892         latlon2unit(lat, lon, sel_unit.unitx, sel_unit.unity);
893         if(_center_mode > 0)
894             gtk_check_menu_item_set_active(
895                     GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE);
896         map_center_unit(sel_unit);
897         break;
898     }
899     gtk_widget_hide(dialog);
900     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
901     return TRUE;
902 }
903
904 static gboolean
905 menu_cb_view_goto_address(GtkMenuItem *item)
906 {
907     static GtkWidget *dialog = NULL;
908     static GtkWidget *table = NULL;
909     static GtkWidget *label = NULL;
910     static GtkWidget *txt_addr = NULL;
911     printf("%s()\n", __PRETTY_FUNCTION__);
912
913     if(dialog == NULL)
914     {
915         GtkEntryCompletion *comp;
916         dialog = gtk_dialog_new_with_buttons(_("Go to Address"),
917                 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
918                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
919                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
920                 NULL);
921
922         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
923                 table = gtk_table_new(2, 3, FALSE), TRUE, TRUE, 0);
924
925         gtk_table_attach(GTK_TABLE(table),
926                 label = gtk_label_new(_("Address")),
927                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
928         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
929
930         gtk_table_attach(GTK_TABLE(table),
931                 txt_addr = gtk_entry_new(),
932                 1, 2, 0, 1, GTK_FILL, 0, 2, 4);
933         gtk_entry_set_width_chars(GTK_ENTRY(txt_addr), 25);
934         gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
935
936         /* Set up auto-completion. */
937         comp = gtk_entry_completion_new();
938         gtk_entry_completion_set_model(comp, GTK_TREE_MODEL(_loc_model));
939         gtk_entry_completion_set_text_column(comp, 0);
940         gtk_entry_set_completion(GTK_ENTRY(txt_addr), comp);
941     }
942
943     gtk_widget_show_all(dialog);
944
945     while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
946     {
947         Point origin = locate_address(dialog,
948                 gtk_entry_get_text(GTK_ENTRY(txt_addr)));
949         if(origin.unity)
950         {
951             MACRO_BANNER_SHOW_INFO(_window, _("Address Located"));
952
953             if(_center_mode > 0)
954                 gtk_check_menu_item_set_active(
955                         GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE);
956
957             map_center_unit(origin);
958
959             /* Success! Get out of the while loop. */
960             break;
961         }
962     }
963     gtk_widget_hide(dialog);
964     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
965     return TRUE;
966 }
967
968 static gboolean
969 menu_cb_view_goto_gps(GtkMenuItem *item)
970 {
971     printf("%s()\n", __PRETTY_FUNCTION__);
972
973     if(_center_mode > 0)
974         gtk_check_menu_item_set_active(
975                 GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE);
976
977     map_center_unit(_pos);
978
979     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
980     return TRUE;
981 }
982
983 gboolean
984 menu_cb_view_goto_nextway(GtkMenuItem *item)
985 {
986     WayPoint *next_way;
987     printf("%s()\n", __PRETTY_FUNCTION__);
988
989     next_way = path_get_next_way();
990
991     if(next_way && next_way->point->unity)
992     {
993         if(_center_mode > 0)
994             gtk_check_menu_item_set_active(
995                     GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE);
996
997         map_center_unit(*next_way->point);
998     }
999     else
1000     {
1001         MACRO_BANNER_SHOW_INFO(_window, _("There is no next waypoint."));
1002     }
1003
1004     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1005     return TRUE;
1006 }
1007
1008 gboolean
1009 menu_cb_view_goto_nearpoi(GtkMenuItem *item)
1010 {
1011     printf("%s()\n", __PRETTY_FUNCTION__);
1012
1013     if(_poi_enabled)
1014     {
1015         PoiInfo poi;
1016         gchar *banner;
1017
1018         if((_center_mode > 0 ? get_nearest_poi(_pos.unitx, _pos.unity, &poi)
1019                     : get_nearest_poi(_center.unitx, _center.unity, &poi) ))
1020         {
1021             /* Auto-Center is enabled - use the GPS position. */
1022             Point unit;
1023             latlon2unit(poi.lat, poi.lon, unit.unitx, unit.unity);
1024             banner = g_strdup_printf("%s (%s)", poi.label, poi.clabel);
1025             MACRO_BANNER_SHOW_INFO(_window, banner);
1026             g_free(banner);
1027             g_free(poi.label);
1028             g_free(poi.desc);
1029             g_free(poi.clabel);
1030
1031             if(_center_mode > 0)
1032                 gtk_check_menu_item_set_active(
1033                         GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE);
1034
1035             map_center_unit(unit);
1036         }
1037         else
1038         {
1039             MACRO_BANNER_SHOW_INFO(_window, _("No POIs found."));
1040             /* Auto-Center is disabled - use the view center. */
1041         }
1042     }
1043
1044     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1045     return TRUE;
1046 }
1047
1048 /****************************************************************************
1049  * ABOVE: VIEW/GOTO MENU ****************************************************
1050  ****************************************************************************/
1051
1052 /****************************************************************************
1053  * BELOW: VIEW/SHOW MENU ****************************************************
1054  ****************************************************************************/
1055
1056 static gboolean
1057 menu_cb_view_show_tracks(GtkMenuItem *item)
1058 {
1059     printf("%s()\n", __PRETTY_FUNCTION__);
1060
1061     _show_paths ^= TRACKS_MASK;
1062     if(gtk_check_menu_item_get_active(
1063                 GTK_CHECK_MENU_ITEM(_menu_view_show_tracks_item)))
1064     {
1065         _show_paths |= TRACKS_MASK;
1066         map_render_paths();
1067         MACRO_QUEUE_DRAW_AREA();
1068         MACRO_BANNER_SHOW_INFO(_window, _("Tracks are now shown"));
1069     }
1070     else
1071     {
1072         _show_paths &= ~TRACKS_MASK;
1073         map_force_redraw();
1074         MACRO_BANNER_SHOW_INFO(_window, _("Tracks are now hidden"));
1075     }
1076
1077     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1078     return TRUE;
1079 }
1080
1081 static gboolean
1082 menu_cb_view_show_zoomlevel(GtkMenuItem *item)
1083 {
1084     printf("%s()\n", __PRETTY_FUNCTION__);
1085
1086     _show_zoomlevel = gtk_check_menu_item_get_active(
1087                 GTK_CHECK_MENU_ITEM(_menu_view_show_zoomlevel_item));
1088     map_force_redraw();
1089
1090     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1091     return TRUE;
1092 }
1093
1094 static gboolean
1095 menu_cb_view_show_scale(GtkMenuItem *item)
1096 {
1097     printf("%s()\n", __PRETTY_FUNCTION__);
1098
1099     _show_scale = gtk_check_menu_item_get_active(
1100                 GTK_CHECK_MENU_ITEM(_menu_view_show_scale_item));
1101     map_force_redraw();
1102
1103     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1104     return TRUE;
1105 }
1106
1107 static gboolean
1108 menu_cb_view_show_comprose(GtkMenuItem *item)
1109 {
1110     printf("%s()\n", __PRETTY_FUNCTION__);
1111
1112     _show_comprose = gtk_check_menu_item_get_active(
1113                 GTK_CHECK_MENU_ITEM(_menu_view_show_comprose_item));
1114     map_force_redraw();
1115
1116     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1117     return TRUE;
1118 }
1119
1120 static gboolean
1121 menu_cb_view_show_routes(GtkMenuItem *item)
1122 {
1123     printf("%s()\n", __PRETTY_FUNCTION__);
1124
1125     if(gtk_check_menu_item_get_active(
1126                 GTK_CHECK_MENU_ITEM(_menu_view_show_routes_item)))
1127     {
1128         _show_paths |= ROUTES_MASK;
1129         map_render_paths();
1130         MACRO_QUEUE_DRAW_AREA();
1131         MACRO_BANNER_SHOW_INFO(_window, _("Routes are now shown"));
1132     }
1133     else
1134     {
1135         _show_paths &= ~ROUTES_MASK;
1136         map_force_redraw();
1137         MACRO_BANNER_SHOW_INFO(_window, _("Routes are now hidden"));
1138     }
1139
1140     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1141     return TRUE;
1142 }
1143
1144 static gboolean
1145 menu_cb_view_show_velvec(GtkMenuItem *item)
1146 {
1147     printf("%s()\n", __PRETTY_FUNCTION__);
1148
1149     _show_velvec = gtk_check_menu_item_get_active(
1150             GTK_CHECK_MENU_ITEM(_menu_view_show_velvec_item));
1151     map_move_mark();
1152
1153     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1154     return TRUE;
1155 }
1156
1157 static gboolean
1158 menu_cb_view_show_poi(GtkMenuItem *item)
1159 {
1160     printf("%s()\n", __PRETTY_FUNCTION__);
1161
1162     _show_poi = gtk_check_menu_item_get_active(
1163             GTK_CHECK_MENU_ITEM(_menu_view_show_poi_item));
1164     map_force_redraw();
1165
1166     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1167     return TRUE;
1168 }
1169
1170 /****************************************************************************
1171  * ABOVE: VIEW/SHOW MENU ****************************************************
1172  ****************************************************************************/
1173
1174 /****************************************************************************
1175  * BELOW: VIEW/AUTO-CENTER MENU *********************************************
1176  ****************************************************************************/
1177
1178 static gboolean
1179 menu_cb_view_ac_lead(GtkMenuItem *item)
1180 {
1181     printf("%s()\n", __PRETTY_FUNCTION__);
1182
1183     if(gtk_check_menu_item_get_active(
1184                 GTK_CHECK_MENU_ITEM(_menu_view_ac_lead_item)))
1185     {
1186         _center_mode = CENTER_LEAD;
1187         MACRO_BANNER_SHOW_INFO(_window, _("Auto-Center Mode: Lead"));
1188         map_refresh_mark(TRUE);
1189     }
1190
1191     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1192     return TRUE;
1193 }
1194
1195 static gboolean
1196 menu_cb_view_ac_latlon(GtkMenuItem *item)
1197 {
1198     printf("%s()\n", __PRETTY_FUNCTION__);
1199
1200     if(gtk_check_menu_item_get_active(
1201                 GTK_CHECK_MENU_ITEM(_menu_view_ac_latlon_item)))
1202     {
1203         _center_mode = CENTER_LATLON;
1204         MACRO_BANNER_SHOW_INFO(_window, _("Auto-Center Mode: Lat/Lon"));
1205         map_refresh_mark(TRUE);
1206     }
1207
1208     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1209     return TRUE;
1210 }
1211
1212 static gboolean
1213 menu_cb_view_ac_none(GtkMenuItem *item)
1214 {
1215     printf("%s()\n", __PRETTY_FUNCTION__);
1216
1217     if(gtk_check_menu_item_get_active(
1218                 GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item)))
1219     {
1220         _center_mode = -_center_mode;
1221         MACRO_BANNER_SHOW_INFO(_window, _("Auto-Center Off"));
1222     }
1223
1224     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1225     return TRUE;
1226 }
1227
1228 /****************************************************************************
1229  * ABOVE: VIEW/AUTO-CENTER MENU *********************************************
1230  ****************************************************************************/
1231
1232 static gboolean
1233 menu_cb_view_fullscreen(GtkMenuItem *item)
1234 {
1235     printf("%s()\n", __PRETTY_FUNCTION__);
1236
1237     if((_fullscreen = gtk_check_menu_item_get_active(
1238                 GTK_CHECK_MENU_ITEM(_menu_view_fullscreen_item))))
1239         gtk_window_fullscreen(GTK_WINDOW(_window));
1240     else
1241         gtk_window_unfullscreen(GTK_WINDOW(_window));
1242
1243     g_idle_add((GSourceFunc)window_present, NULL);
1244
1245     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1246     return TRUE;
1247 }
1248
1249 /****************************************************************************
1250  * BELOW: GPS MENU **********************************************************
1251  ****************************************************************************/
1252
1253 static gboolean
1254 menu_cb_gps_enable(GtkMenuItem *item)
1255 {
1256     printf("%s()\n", __PRETTY_FUNCTION__);
1257
1258     if((_enable_gps = gtk_check_menu_item_get_active(
1259                 GTK_CHECK_MENU_ITEM(_menu_gps_enable_item))))
1260         rcvr_connect();
1261     else
1262         rcvr_disconnect();
1263
1264     map_move_mark();
1265     gps_show_info();
1266     gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_details_item), _enable_gps);
1267     gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_reset_item), _enable_gps);
1268
1269     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1270     return TRUE;
1271 }
1272
1273 static gboolean
1274 menu_cb_gps_show_info(GtkMenuItem *item)
1275 {
1276     printf("%s()\n", __PRETTY_FUNCTION__);
1277
1278     _gps_info = gtk_check_menu_item_get_active(
1279                 GTK_CHECK_MENU_ITEM(_menu_gps_show_info_item));
1280
1281     gps_show_info();
1282
1283     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1284     return TRUE;
1285 }
1286
1287 static gboolean
1288 menu_cb_gps_details(GtkMenuItem *item)
1289 {
1290     printf("%s()\n", __PRETTY_FUNCTION__);
1291
1292     gps_details();
1293
1294     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1295     return TRUE;
1296 }
1297
1298 static gboolean
1299 menu_cb_gps_reset(GtkMenuItem *item)
1300 {
1301     printf("%s()\n", __PRETTY_FUNCTION__);
1302
1303     reset_bluetooth();
1304
1305     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1306     return TRUE;
1307 }
1308
1309 /****************************************************************************
1310  * ABOVE: GPS MENU **********************************************************
1311  ****************************************************************************/
1312
1313 static gboolean
1314 menu_cb_settings(GtkMenuItem *item)
1315 {
1316     printf("%s()\n", __PRETTY_FUNCTION__);
1317
1318     if(settings_dialog())
1319     {
1320         /* Settings have changed - reconnect to receiver. */
1321         if(_enable_gps)
1322         {
1323             rcvr_disconnect();
1324             rcvr_connect();
1325         }
1326     }
1327
1328     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1329     return TRUE;
1330 }
1331
1332 static gboolean
1333 menu_cb_help(GtkMenuItem *item)
1334 {
1335     printf("%s()\n", __PRETTY_FUNCTION__);
1336
1337 #ifndef LEGACY
1338     hildon_help_show(_osso, HELP_ID_INTRO, 0);
1339 #else
1340     ossohelp_show(_osso, HELP_ID_INTRO, 0);
1341 #endif
1342
1343     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1344     return TRUE;
1345 }
1346
1347 static gboolean
1348 menu_cb_about(GtkMenuItem *item)
1349 {
1350     printf("%s()\n", __PRETTY_FUNCTION__);
1351
1352 #ifndef LEGACY
1353     hildon_help_show(_osso, HELP_ID_ABOUT, HILDON_HELP_SHOW_DIALOG);
1354 #else
1355     ossohelp_show(_osso, HELP_ID_ABOUT, OSSO_HELP_SHOW_DIALOG);
1356 #endif
1357
1358     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1359     return TRUE;
1360 }
1361
1362
1363
1364 void
1365 menu_maps_remove_repos()
1366 {
1367     GList *curr;
1368     printf("%s()\n", __PRETTY_FUNCTION__);
1369
1370     /* Delete one menu item for each repo. */
1371     for(curr = _repo_list; curr; curr = curr->next)
1372     {
1373         gtk_widget_destroy(gtk_container_get_children(
1374                     GTK_CONTAINER(_menu_maps_submenu))->data);
1375     }
1376     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1377 }
1378
1379 void
1380 menu_maps_add_repos()
1381 {
1382     GList *curr;
1383     GtkWidget *last_repo = NULL;
1384     printf("%s()\n", __PRETTY_FUNCTION__);
1385
1386     for(curr = g_list_last(_repo_list); curr; curr = curr->prev)
1387     {
1388         RepoData *rd = (RepoData*)curr->data;
1389         GtkWidget *menu_item;
1390         if(last_repo)
1391             gtk_menu_prepend(_menu_maps_submenu, menu_item
1392                     = gtk_radio_menu_item_new_with_label_from_widget(
1393                         GTK_RADIO_MENU_ITEM(last_repo), rd->name));
1394         else
1395         {
1396             gtk_menu_prepend(_menu_maps_submenu, menu_item
1397                     = gtk_radio_menu_item_new_with_label(NULL, rd->name));
1398             last_repo = menu_item;
1399         }
1400         gtk_check_menu_item_set_active(
1401                 GTK_CHECK_MENU_ITEM(menu_item), rd == _curr_repo);
1402         rd->menu_item = menu_item;
1403     }
1404
1405     /* Add signals (must be after entire menu is built). */
1406     {
1407         GList *currmi = gtk_container_get_children(
1408                 GTK_CONTAINER(_menu_maps_submenu));
1409         for(curr = _repo_list; curr; curr = curr->next, currmi = currmi->next)
1410         {
1411             g_signal_connect(G_OBJECT(currmi->data), "activate",
1412                              G_CALLBACK(menu_cb_maps_select), curr->data);
1413         }
1414     }
1415
1416     gtk_widget_show_all(_menu_maps_submenu);
1417     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1418 }
1419
1420 /**
1421  * Create the menu items needed for the drop down menu.
1422  */
1423 void
1424 menu_init()
1425 {
1426     /* Create needed handles. */
1427     GtkMenu *menu;
1428     GtkWidget *submenu;
1429     GtkWidget *submenu2;
1430     GtkWidget *menu_item;
1431     printf("%s()\n", __PRETTY_FUNCTION__);
1432
1433     /* Get the menu of our view. */
1434     menu = GTK_MENU(gtk_menu_new());
1435
1436     /* Create the menu items. */
1437
1438     /* The "Routes" submenu. */
1439     gtk_menu_append(menu, menu_item
1440             = gtk_menu_item_new_with_label(_("Route")));
1441     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1442             submenu = gtk_menu_new());
1443     gtk_menu_append(submenu, _menu_route_open_item
1444             = gtk_menu_item_new_with_label(_("Open...")));
1445     gtk_menu_append(submenu, _menu_route_download_item
1446             = gtk_menu_item_new_with_label(_("Download...")));
1447     gtk_menu_append(submenu, _menu_route_save_item
1448             = gtk_menu_item_new_with_label(_("Save...")));
1449     gtk_menu_append(submenu, _menu_route_distnext_item
1450         = gtk_menu_item_new_with_label(_("Show Distance to Next Waypoint")));
1451     gtk_menu_append(submenu, _menu_route_distlast_item
1452         = gtk_menu_item_new_with_label(_("Show Distance to End of Route")));
1453     gtk_menu_append(submenu, _menu_route_reset_item
1454             = gtk_menu_item_new_with_label(_("Reset")));
1455     gtk_menu_append(submenu, _menu_route_clear_item
1456             = gtk_menu_item_new_with_label(_("Clear")));
1457
1458     /* The "Track" submenu. */
1459     gtk_menu_append(menu, menu_item
1460             = gtk_menu_item_new_with_label(_("Track")));
1461     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1462             submenu = gtk_menu_new());
1463     gtk_menu_append(submenu, _menu_track_open_item
1464             = gtk_menu_item_new_with_label(_("Open...")));
1465     gtk_menu_append(submenu, _menu_track_save_item
1466             = gtk_menu_item_new_with_label(_("Save...")));
1467     gtk_menu_append(submenu, _menu_track_insert_break_item
1468             = gtk_menu_item_new_with_label(_("Insert Break")));
1469     gtk_menu_append(submenu, _menu_track_insert_mark_item
1470             = gtk_menu_item_new_with_label(_("Insert Mark...")));
1471     gtk_menu_append(submenu, _menu_track_distlast_item
1472             = gtk_menu_item_new_with_label(_("Show Distance from Last Mark")));
1473     gtk_menu_append(submenu, _menu_track_distfirst_item
1474             = gtk_menu_item_new_with_label(_("Show Distance from Beginning")));
1475     gtk_menu_append(submenu, _menu_track_clear_item
1476             = gtk_menu_item_new_with_label(_("Clear")));
1477     gtk_menu_append(submenu, _menu_track_enable_tracking_item
1478             = gtk_check_menu_item_new_with_label(_("Enable Tracking")));
1479     gtk_check_menu_item_set_active(
1480             GTK_CHECK_MENU_ITEM(_menu_track_enable_tracking_item), _enable_tracking);
1481
1482     /* The "POI" submenu. */
1483     gtk_menu_append(menu, menu_item = _menu_poi_item
1484             = gtk_menu_item_new_with_label(_("POI")));
1485     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1486             submenu = gtk_menu_new());
1487     gtk_menu_append(submenu, _menu_poi_import_item
1488             = gtk_menu_item_new_with_label(_("Import...")));
1489     gtk_menu_append(submenu, _menu_poi_download_item
1490             = gtk_menu_item_new_with_label(_("Download...")));
1491     gtk_menu_append(submenu, _menu_poi_browse_item
1492             = gtk_menu_item_new_with_label(_("Browse...")));
1493     gtk_menu_append(submenu, _menu_poi_categories_item
1494             = gtk_menu_item_new_with_label(_("Categories...")));
1495
1496     /* The "Maps" submenu. */
1497     gtk_menu_append(menu, menu_item
1498             = gtk_menu_item_new_with_label(_("Maps")));
1499     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1500             _menu_maps_submenu = gtk_menu_new());
1501     gtk_menu_append(_menu_maps_submenu, gtk_separator_menu_item_new());
1502     gtk_menu_append(_menu_maps_submenu, _menu_maps_mapman_item
1503             = gtk_menu_item_new_with_label(_("Manage Maps...")));
1504     gtk_menu_append(_menu_maps_submenu, _menu_maps_repoman_item
1505             = gtk_menu_item_new_with_label(_("Manage Repositories...")));
1506     gtk_menu_append(_menu_maps_submenu, _menu_maps_auto_download_item
1507             = gtk_check_menu_item_new_with_label(_("Auto-Download")));
1508     gtk_check_menu_item_set_active(
1509             GTK_CHECK_MENU_ITEM(_menu_maps_auto_download_item),_auto_download);
1510     menu_maps_add_repos();
1511
1512     gtk_menu_append(menu, gtk_separator_menu_item_new());
1513
1514     /* The "View" submenu. */
1515     gtk_menu_append(menu, menu_item
1516             = gtk_menu_item_new_with_label(_("View")));
1517     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1518             submenu = gtk_menu_new());
1519
1520     /* The "View"/"Zoom" submenu. */
1521     gtk_menu_append(submenu, menu_item
1522             = gtk_menu_item_new_with_label(_("Zoom")));
1523     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1524             submenu2 = gtk_menu_new());
1525     gtk_menu_append(submenu2, _menu_view_zoom_in_item
1526             = gtk_menu_item_new_with_label(_("Zoom In")));
1527     gtk_menu_append(submenu2, _menu_view_zoom_out_item
1528             = gtk_menu_item_new_with_label(_("Zoom Out")));
1529
1530     /* The "View"/"Rotate" submenu. */
1531     gtk_menu_append(submenu, menu_item
1532             = gtk_menu_item_new_with_label(_("Rotate")));
1533     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1534             submenu2 = gtk_menu_new());
1535     gtk_menu_append(submenu2, _menu_view_rotate_clock_item
1536             = gtk_menu_item_new_with_label(_("Clockwise")));
1537     gtk_menu_append(submenu2, _menu_view_rotate_counter_item
1538             = gtk_menu_item_new_with_label(_("Counter")));
1539     gtk_menu_append(submenu2, gtk_separator_menu_item_new());
1540     gtk_menu_append(submenu2, _menu_view_rotate_reset_item
1541             = gtk_menu_item_new_with_label(_("Reset")));
1542     gtk_menu_append(submenu2, _menu_view_rotate_auto_item
1543             = gtk_check_menu_item_new_with_label(_("Auto-Rotate")));
1544     gtk_check_menu_item_set_active(
1545             GTK_CHECK_MENU_ITEM(_menu_view_rotate_auto_item), _center_rotate);
1546
1547     /* The "View"/"Pan" submenu. */
1548     gtk_menu_append(submenu, menu_item
1549             = gtk_menu_item_new_with_label(_("Pan")));
1550     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1551             submenu2 = gtk_menu_new());
1552     gtk_menu_append(submenu2, _menu_view_pan_up_item
1553             = gtk_menu_item_new_with_label(_("Up")));
1554     gtk_menu_append(submenu2, _menu_view_pan_down_item
1555             = gtk_menu_item_new_with_label(_("Down")));
1556     gtk_menu_append(submenu2, _menu_view_pan_left_item
1557             = gtk_menu_item_new_with_label(_("Left")));
1558     gtk_menu_append(submenu2, _menu_view_pan_right_item
1559             = gtk_menu_item_new_with_label(_("Right")));
1560     gtk_menu_append(submenu2, gtk_separator_menu_item_new());
1561     gtk_menu_append(submenu2, _menu_view_pan_north_item
1562             = gtk_menu_item_new_with_label(_("North")));
1563     gtk_menu_append(submenu2, _menu_view_pan_south_item
1564             = gtk_menu_item_new_with_label(_("South")));
1565     gtk_menu_append(submenu2, _menu_view_pan_west_item
1566             = gtk_menu_item_new_with_label(_("West")));
1567     gtk_menu_append(submenu2, _menu_view_pan_east_item
1568             = gtk_menu_item_new_with_label(_("East")));
1569
1570     /* The "Go to" submenu. */
1571     gtk_menu_append(submenu, menu_item
1572             = gtk_menu_item_new_with_label(_("Go to")));
1573     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1574             submenu2 = gtk_menu_new());
1575     gtk_menu_append(submenu2, _menu_view_goto_latlon_item
1576             = gtk_menu_item_new_with_label(_("Lat/Lon...")));
1577     gtk_menu_append(submenu2, _menu_view_goto_address_item
1578             = gtk_menu_item_new_with_label(_("Address...")));
1579     gtk_menu_append(submenu2, _menu_view_goto_gps_item
1580             = gtk_menu_item_new_with_label(_("GPS Location")));
1581     gtk_menu_append(submenu2, _menu_view_goto_nextway_item
1582             = gtk_menu_item_new_with_label(_("Next Waypoint")));
1583     gtk_menu_append(submenu2, _menu_view_goto_nearpoi_item
1584             = gtk_menu_item_new_with_label(_("Nearest POI")));
1585
1586     gtk_menu_append(submenu, gtk_separator_menu_item_new());
1587
1588     /* The "View"/"Show" submenu. */
1589     gtk_menu_append(submenu, menu_item
1590             = gtk_menu_item_new_with_label(_("Show")));
1591     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1592             submenu2 = gtk_menu_new());
1593     gtk_menu_append(submenu2, _menu_view_show_zoomlevel_item
1594             = gtk_check_menu_item_new_with_label(_("Zoom Level")));
1595     gtk_check_menu_item_set_active(
1596             GTK_CHECK_MENU_ITEM(_menu_view_show_zoomlevel_item),
1597             _show_zoomlevel);
1598     gtk_menu_append(submenu2, _menu_view_show_scale_item
1599             = gtk_check_menu_item_new_with_label(_("Scale")));
1600     gtk_check_menu_item_set_active(
1601             GTK_CHECK_MENU_ITEM(_menu_view_show_scale_item),
1602             _show_scale);
1603     gtk_menu_append(submenu2, _menu_view_show_comprose_item
1604             = gtk_check_menu_item_new_with_label(_("Compass Rose")));
1605     gtk_check_menu_item_set_active(
1606             GTK_CHECK_MENU_ITEM(_menu_view_show_comprose_item),
1607             _show_comprose);
1608     gtk_menu_append(submenu2, _menu_view_show_routes_item
1609             = gtk_check_menu_item_new_with_label(_("Route")));
1610     gtk_check_menu_item_set_active(
1611             GTK_CHECK_MENU_ITEM(_menu_view_show_routes_item),
1612             _show_paths & ROUTES_MASK);
1613     gtk_menu_append(submenu2, _menu_view_show_tracks_item
1614             = gtk_check_menu_item_new_with_label(_("Track")));
1615     gtk_check_menu_item_set_active(
1616             GTK_CHECK_MENU_ITEM(_menu_view_show_tracks_item),
1617             _show_paths & TRACKS_MASK);
1618     gtk_menu_append(submenu2, _menu_view_show_velvec_item
1619             = gtk_check_menu_item_new_with_label(_("Velocity Vector")));
1620     gtk_check_menu_item_set_active(
1621             GTK_CHECK_MENU_ITEM(_menu_view_show_velvec_item), _show_velvec);
1622     gtk_menu_append(submenu2, _menu_view_show_poi_item
1623             = gtk_check_menu_item_new_with_label(_("POI")));
1624     gtk_check_menu_item_set_active(
1625             GTK_CHECK_MENU_ITEM(_menu_view_show_poi_item), _show_poi);
1626
1627     /* The "View"/"Auto-Center" submenu. */
1628     gtk_menu_append(submenu, menu_item
1629             = gtk_menu_item_new_with_label(_("Auto-Center")));
1630     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1631             submenu2 = gtk_menu_new());
1632     gtk_menu_append(submenu2, _menu_view_ac_latlon_item
1633             = gtk_radio_menu_item_new_with_label(NULL, _("Lat/Lon")));
1634     gtk_check_menu_item_set_active(
1635             GTK_CHECK_MENU_ITEM(_menu_view_ac_latlon_item),
1636             _center_mode == CENTER_LATLON);
1637     gtk_menu_append(submenu2, _menu_view_ac_lead_item
1638             = gtk_radio_menu_item_new_with_label_from_widget(
1639                 GTK_RADIO_MENU_ITEM(_menu_view_ac_latlon_item), _("Lead")));
1640     gtk_check_menu_item_set_active(
1641             GTK_CHECK_MENU_ITEM(_menu_view_ac_lead_item),
1642             _center_mode == CENTER_LEAD);
1643     gtk_menu_append(submenu2, _menu_view_ac_none_item
1644             = gtk_radio_menu_item_new_with_label_from_widget(
1645                 GTK_RADIO_MENU_ITEM(_menu_view_ac_latlon_item), _("None")));
1646     gtk_check_menu_item_set_active(
1647             GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item),
1648             _center_mode < 0);
1649
1650     gtk_menu_append(submenu, gtk_separator_menu_item_new());
1651
1652     gtk_menu_append(submenu, _menu_view_fullscreen_item
1653             = gtk_check_menu_item_new_with_label(_("Full Screen")));
1654     gtk_check_menu_item_set_active(
1655             GTK_CHECK_MENU_ITEM(_menu_view_fullscreen_item), _fullscreen);
1656
1657     /* The "GPS" submenu. */
1658     gtk_menu_append(menu, menu_item
1659             = gtk_menu_item_new_with_label(_("GPS")));
1660     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1661             submenu = gtk_menu_new());
1662     gtk_menu_append(submenu, _menu_gps_enable_item
1663             = gtk_check_menu_item_new_with_label(_("Enable GPS")));
1664     gtk_check_menu_item_set_active(
1665             GTK_CHECK_MENU_ITEM(_menu_gps_enable_item), _enable_gps);
1666     gtk_menu_append(submenu, _menu_gps_show_info_item
1667             = gtk_check_menu_item_new_with_label(_("Show Information")));
1668     gtk_check_menu_item_set_active(
1669             GTK_CHECK_MENU_ITEM(_menu_gps_show_info_item), _gps_info);
1670     gtk_menu_append(submenu, _menu_gps_details_item
1671             = gtk_menu_item_new_with_label(_("Details...")));
1672     gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_details_item), _enable_gps);
1673     gtk_menu_append(submenu, _menu_gps_reset_item
1674         = gtk_menu_item_new_with_label(_("Reset Bluetooth")));
1675     gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_reset_item), _enable_gps);
1676
1677     gtk_menu_append(menu, gtk_separator_menu_item_new());
1678
1679     /* The other menu items. */
1680     gtk_menu_append(menu, _menu_settings_item
1681         = gtk_menu_item_new_with_label(_("Settings...")));
1682     gtk_menu_append(menu, gtk_separator_menu_item_new());
1683     gtk_menu_append(menu, _menu_help_item
1684         = gtk_menu_item_new_with_label(_("Help...")));
1685     gtk_menu_append(menu, _menu_about_item
1686         = gtk_menu_item_new_with_label(_("About...")));
1687     gtk_menu_append(menu, _menu_close_item
1688         = gtk_menu_item_new_with_label(_("Close")));
1689
1690     /* We need to show menu items. */
1691     gtk_widget_show_all(GTK_WIDGET(menu));
1692
1693     hildon_window_set_menu(HILDON_WINDOW(_window), menu);
1694
1695     /* Connect the "Route" signals. */
1696     g_signal_connect(G_OBJECT(_menu_route_open_item), "activate",
1697                       G_CALLBACK(menu_cb_route_open), NULL);
1698     g_signal_connect(G_OBJECT(_menu_route_download_item), "activate",
1699                       G_CALLBACK(menu_cb_route_download), NULL);
1700     g_signal_connect(G_OBJECT(_menu_route_save_item), "activate",
1701                       G_CALLBACK(menu_cb_route_save), NULL);
1702     g_signal_connect(G_OBJECT(_menu_route_distnext_item), "activate",
1703                       G_CALLBACK(menu_cb_route_distnext), NULL);
1704     g_signal_connect(G_OBJECT(_menu_route_distlast_item), "activate",
1705                       G_CALLBACK(menu_cb_route_distlast), NULL);
1706     g_signal_connect(G_OBJECT(_menu_route_reset_item), "activate",
1707                       G_CALLBACK(menu_cb_route_reset), NULL);
1708     g_signal_connect(G_OBJECT(_menu_route_clear_item), "activate",
1709                       G_CALLBACK(menu_cb_route_clear), NULL);
1710
1711     /* Connect the "Track" signals. */
1712     g_signal_connect(G_OBJECT(_menu_track_open_item), "activate",
1713                       G_CALLBACK(menu_cb_track_open), NULL);
1714     g_signal_connect(G_OBJECT(_menu_track_save_item), "activate",
1715                       G_CALLBACK(menu_cb_track_save), NULL);
1716     g_signal_connect(G_OBJECT(_menu_track_insert_break_item), "activate",
1717                       G_CALLBACK(menu_cb_track_insert_break), NULL);
1718     g_signal_connect(G_OBJECT(_menu_track_insert_mark_item), "activate",
1719                       G_CALLBACK(menu_cb_track_insert_mark), NULL);
1720     g_signal_connect(G_OBJECT(_menu_track_distlast_item), "activate",
1721                       G_CALLBACK(menu_cb_track_distlast), NULL);
1722     g_signal_connect(G_OBJECT(_menu_track_distfirst_item), "activate",
1723                       G_CALLBACK(menu_cb_track_distfirst), NULL);
1724     g_signal_connect(G_OBJECT(_menu_track_clear_item), "activate",
1725                       G_CALLBACK(menu_cb_track_clear), NULL);
1726     g_signal_connect(G_OBJECT(_menu_track_enable_tracking_item), "toggled",
1727                       G_CALLBACK(menu_cb_track_enable_tracking), NULL);
1728
1729     /* Connect the "POI" signals. */
1730     g_signal_connect(G_OBJECT(_menu_poi_import_item), "activate",
1731                       G_CALLBACK(menu_cb_poi_import), NULL);
1732     g_signal_connect(G_OBJECT(_menu_poi_download_item), "activate",
1733                       G_CALLBACK(menu_cb_poi_download), NULL);
1734     g_signal_connect(G_OBJECT(_menu_poi_browse_item), "activate",
1735                       G_CALLBACK(menu_cb_poi_browse), NULL);
1736     g_signal_connect(G_OBJECT(_menu_poi_categories_item), "activate",
1737                       G_CALLBACK(menu_cb_poi_categories), NULL);
1738
1739     /* Connect the "Maps" signals. */
1740     g_signal_connect(G_OBJECT(_menu_maps_repoman_item), "activate",
1741                       G_CALLBACK(menu_cb_maps_repoman), NULL);
1742     g_signal_connect(G_OBJECT(_menu_maps_mapman_item), "activate",
1743                       G_CALLBACK(menu_cb_maps_mapman), NULL);
1744     g_signal_connect(G_OBJECT(_menu_maps_auto_download_item), "toggled",
1745                       G_CALLBACK(menu_cb_maps_auto_download), NULL);
1746
1747     /* Connect the "View" signals. */
1748     g_signal_connect(G_OBJECT(_menu_view_zoom_in_item), "activate",
1749                       G_CALLBACK(menu_cb_view_zoom_in), NULL);
1750     g_signal_connect(G_OBJECT(_menu_view_zoom_out_item), "activate",
1751                       G_CALLBACK(menu_cb_view_zoom_out), NULL);
1752
1753     g_signal_connect(G_OBJECT(_menu_view_rotate_clock_item), "activate",
1754                       G_CALLBACK(menu_cb_view_rotate_clock), NULL);
1755     g_signal_connect(G_OBJECT(_menu_view_rotate_counter_item), "activate",
1756                       G_CALLBACK(menu_cb_view_rotate_counter), NULL);
1757     g_signal_connect(G_OBJECT(_menu_view_rotate_reset_item), "activate",
1758                       G_CALLBACK(menu_cb_view_rotate_reset), NULL);
1759     g_signal_connect(G_OBJECT(_menu_view_rotate_auto_item), "toggled",
1760                       G_CALLBACK(menu_cb_view_rotate_auto), NULL);
1761
1762     g_signal_connect(G_OBJECT(_menu_view_pan_up_item), "activate",
1763                       G_CALLBACK(menu_cb_view_pan_up), NULL);
1764     g_signal_connect(G_OBJECT(_menu_view_pan_down_item), "activate",
1765                       G_CALLBACK(menu_cb_view_pan_down), NULL);
1766     g_signal_connect(G_OBJECT(_menu_view_pan_left_item), "activate",
1767                       G_CALLBACK(menu_cb_view_pan_left), NULL);
1768     g_signal_connect(G_OBJECT(_menu_view_pan_right_item), "activate",
1769                       G_CALLBACK(menu_cb_view_pan_right), NULL);
1770     g_signal_connect(G_OBJECT(_menu_view_pan_north_item), "activate",
1771                       G_CALLBACK(menu_cb_view_pan_north), NULL);
1772     g_signal_connect(G_OBJECT(_menu_view_pan_south_item), "activate",
1773                       G_CALLBACK(menu_cb_view_pan_south), NULL);
1774     g_signal_connect(G_OBJECT(_menu_view_pan_west_item), "activate",
1775                       G_CALLBACK(menu_cb_view_pan_west), NULL);
1776     g_signal_connect(G_OBJECT(_menu_view_pan_east_item), "activate",
1777                       G_CALLBACK(menu_cb_view_pan_east), NULL);
1778
1779     g_signal_connect(G_OBJECT(_menu_view_goto_latlon_item), "activate",
1780                       G_CALLBACK(menu_cb_view_goto_latlon), NULL);
1781     g_signal_connect(G_OBJECT(_menu_view_goto_address_item), "activate",
1782                       G_CALLBACK(menu_cb_view_goto_address), NULL);
1783     g_signal_connect(G_OBJECT(_menu_view_goto_gps_item), "activate",
1784                       G_CALLBACK(menu_cb_view_goto_gps), NULL);
1785     g_signal_connect(G_OBJECT(_menu_view_goto_nextway_item), "activate",
1786                       G_CALLBACK(menu_cb_view_goto_nextway), NULL);
1787     g_signal_connect(G_OBJECT(_menu_view_goto_nearpoi_item), "activate",
1788                       G_CALLBACK(menu_cb_view_goto_nearpoi), NULL);
1789
1790     g_signal_connect(G_OBJECT(_menu_view_show_tracks_item), "toggled",
1791                       G_CALLBACK(menu_cb_view_show_tracks), NULL);
1792     g_signal_connect(G_OBJECT(_menu_view_show_zoomlevel_item), "toggled",
1793                       G_CALLBACK(menu_cb_view_show_zoomlevel), NULL);
1794     g_signal_connect(G_OBJECT(_menu_view_show_scale_item), "toggled",
1795                       G_CALLBACK(menu_cb_view_show_scale), NULL);
1796     g_signal_connect(G_OBJECT(_menu_view_show_comprose_item), "toggled",
1797                       G_CALLBACK(menu_cb_view_show_comprose), NULL);
1798     g_signal_connect(G_OBJECT(_menu_view_show_routes_item), "toggled",
1799                       G_CALLBACK(menu_cb_view_show_routes), NULL);
1800     g_signal_connect(G_OBJECT(_menu_view_show_velvec_item), "toggled",
1801                       G_CALLBACK(menu_cb_view_show_velvec), NULL);
1802     g_signal_connect(G_OBJECT(_menu_view_show_poi_item), "toggled",
1803                       G_CALLBACK(menu_cb_view_show_poi), NULL);
1804
1805     g_signal_connect(G_OBJECT(_menu_view_ac_latlon_item), "toggled",
1806                       G_CALLBACK(menu_cb_view_ac_latlon), NULL);
1807     g_signal_connect(G_OBJECT(_menu_view_ac_lead_item), "toggled",
1808                       G_CALLBACK(menu_cb_view_ac_lead), NULL);
1809     g_signal_connect(G_OBJECT(_menu_view_ac_none_item), "toggled",
1810                       G_CALLBACK(menu_cb_view_ac_none), NULL);
1811
1812     g_signal_connect(G_OBJECT(_menu_view_fullscreen_item), "toggled",
1813                       G_CALLBACK(menu_cb_view_fullscreen), NULL);
1814
1815     /* Connect the "GPS" signals. */
1816     g_signal_connect(G_OBJECT(_menu_gps_enable_item), "toggled",
1817                       G_CALLBACK(menu_cb_gps_enable), NULL);
1818     g_signal_connect(G_OBJECT(_menu_gps_show_info_item), "toggled",
1819                       G_CALLBACK(menu_cb_gps_show_info), NULL);
1820     g_signal_connect(G_OBJECT(_menu_gps_details_item), "activate",
1821                       G_CALLBACK(menu_cb_gps_details), NULL);
1822     g_signal_connect(G_OBJECT(_menu_gps_reset_item), "activate",
1823                       G_CALLBACK(menu_cb_gps_reset), NULL);
1824
1825     /* Connect the other menu item signals. */
1826     g_signal_connect(G_OBJECT(_menu_settings_item), "activate",
1827                       G_CALLBACK(menu_cb_settings), NULL);
1828     g_signal_connect(G_OBJECT(_menu_help_item), "activate",
1829                       G_CALLBACK(menu_cb_help), NULL);
1830     g_signal_connect(G_OBJECT(_menu_about_item), "activate",
1831                       G_CALLBACK(menu_cb_about), NULL);
1832     g_signal_connect(G_OBJECT(_menu_close_item), "activate",
1833                       G_CALLBACK(gtk_main_quit), NULL);
1834
1835     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1836 }
1837