]> git.itanic.dy.fi Git - maemo-mapper/blob - src/menu.c
Added ability to disable the recording of your track (closes #2311).
[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(GtkMenuItem *item)
426 {
427     printf("%s()\n", __PRETTY_FUNCTION__);
428
429     if(!(_enable_track = gtk_check_menu_item_get_active(
430                 GTK_CHECK_MENU_ITEM(_menu_track_enable_item))))
431     {
432         track_insert_break(FALSE); /* FALSE = not temporary */
433     }
434
435     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
436     return TRUE;
437 }
438
439 /****************************************************************************
440  * ABOVE: TRACK MENU ********************************************************
441  ****************************************************************************/
442
443 /****************************************************************************
444  * BELOW: POI MENU **********************************************************
445  ****************************************************************************/
446
447 static gboolean
448 menu_cb_poi_import(GtkMenuItem *item)
449 {
450     printf("%s()\n", __PRETTY_FUNCTION__);
451
452     if(poi_import_dialog(_center.unitx, _center.unity))
453         map_force_redraw();
454
455     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
456     return TRUE;
457 }
458
459 static gboolean
460 menu_cb_poi_download(GtkMenuItem *item)
461 {
462     printf("%s()\n", __PRETTY_FUNCTION__);
463
464     if(poi_download_dialog(0, 0)) /* 0, 0 means no default origin */
465         map_force_redraw();
466
467     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
468     return TRUE;
469 }
470
471 static gboolean
472 menu_cb_poi_browse(GtkMenuItem *item)
473 {
474     printf("%s()\n", __PRETTY_FUNCTION__);
475
476     if(poi_browse_dialog(0, 0)) /* 0, 0 means no default origin */
477         map_force_redraw();
478
479     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
480     return TRUE;
481 }
482
483 static gboolean
484 menu_cb_poi_categories(GtkMenuItem *item)
485 {
486     printf("%s()\n", __PRETTY_FUNCTION__);
487
488     if(category_list_dialog(_window))
489         map_force_redraw();
490
491     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
492     return TRUE;
493 }
494
495 /****************************************************************************
496  * ABOVE: POI MENU **********************************************************
497  ****************************************************************************/
498
499 /****************************************************************************
500  * BELOW: MAPS MENU *********************************************************
501  ****************************************************************************/
502
503 static gboolean
504 menu_cb_maps_repoman(GtkMenuItem *item)
505 {
506     printf("%s()\n", __PRETTY_FUNCTION__);
507     repoman_dialog();
508     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
509     return TRUE;
510 }
511
512 static gboolean
513 menu_cb_maps_select(GtkMenuItem *item, gpointer new_repo)
514 {
515     printf("%s()\n", __PRETTY_FUNCTION__);
516
517     if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item)))
518     {
519         repo_set_curr(new_repo);
520         map_refresh_mark(TRUE);
521     }
522     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
523     return TRUE;
524 }
525
526 static gboolean
527 menu_cb_maps_mapman(GtkMenuItem *item)
528 {
529     printf("%s()\n", __PRETTY_FUNCTION__);
530
531     mapman_dialog();
532
533     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
534     return TRUE;
535 }
536
537 static gboolean
538 menu_cb_maps_auto_download(GtkMenuItem *item)
539 {
540     printf("%s()\n", __PRETTY_FUNCTION__);
541
542     if((_auto_download = gtk_check_menu_item_get_active(
543             GTK_CHECK_MENU_ITEM(_menu_maps_auto_download_item))))
544     {
545         if(_curr_repo->url == REPOTYPE_NONE)
546             popup_error(_window,
547                 _("NOTE: You must set a Map URI in the current repository in "
548                     "order to download maps."));
549         map_refresh_mark(TRUE);
550     }
551
552     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
553     return TRUE;
554 }
555
556 /****************************************************************************
557  * ABOVE: MAPS MENU *********************************************************
558  ****************************************************************************/
559
560 /****************************************************************************
561  * BELOW: VIEW/ZOOM MENU ****************************************************
562  ****************************************************************************/
563
564 static gboolean
565 menu_cb_view_zoom_in(GtkMenuItem *item)
566 {
567     printf("%s()\n", __PRETTY_FUNCTION__);
568
569     if(_zoom > MIN_ZOOM)
570     {
571         gchar buffer[80];
572         snprintf(buffer, sizeof(buffer),"%s %d",
573                 _("Zoom to Level"), _next_zoom - 1);
574         MACRO_BANNER_SHOW_INFO(_window, buffer);
575         map_set_zoom(_next_zoom - 1);
576     }
577
578     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
579     return TRUE;
580 }
581
582 static gboolean
583 menu_cb_view_zoom_out(GtkMenuItem *item)
584 {
585     printf("%s()\n", __PRETTY_FUNCTION__);
586
587     if(_zoom < MAX_ZOOM)
588     {
589         gchar buffer[80];
590         snprintf(buffer, sizeof(buffer),"%s %d",
591                 _("Zoom to Level"), _next_zoom + 1);
592         MACRO_BANNER_SHOW_INFO(_window, buffer);
593         map_set_zoom(_next_zoom + 1);
594     }
595
596     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
597     return TRUE;
598 }
599
600 /****************************************************************************
601  * ABOVE: VIEW/ZOOM MENU ****************************************************
602  ****************************************************************************/
603
604 /****************************************************************************
605  * BELOW: VIEW/ROTATE MENU **************************************************
606  ****************************************************************************/
607
608 static gboolean
609 menu_cb_view_rotate_clock(GtkMenuItem *item)
610 {
611     printf("%s()\n", __PRETTY_FUNCTION__);
612
613     map_rotate(-ROTATE_DEGREES);
614
615     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
616     return TRUE;
617 }
618
619 static gboolean
620 menu_cb_view_rotate_counter(GtkMenuItem *item)
621 {
622     printf("%s()\n", __PRETTY_FUNCTION__);
623
624     map_rotate(ROTATE_DEGREES);
625
626     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
627     return TRUE;
628 }
629
630 static gboolean
631 menu_cb_view_rotate_reset(GtkMenuItem *item)
632 {
633     printf("%s()\n", __PRETTY_FUNCTION__);
634
635     map_rotate(-_next_map_rotate_angle);
636
637     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
638     return TRUE;
639 }
640
641 static gboolean
642 menu_cb_view_rotate_auto(GtkMenuItem *item)
643 {
644     printf("%s()\n", __PRETTY_FUNCTION__);
645
646     if(gtk_check_menu_item_get_active(
647                 GTK_CHECK_MENU_ITEM(_menu_view_rotate_auto_item)))
648     {
649         _center_rotate = TRUE;
650         if(_center_mode > 0)
651             map_refresh_mark(TRUE);
652         MACRO_BANNER_SHOW_INFO(_window, _("Auto-Rotate Enabled"));
653     }
654     else
655     {
656         _center_rotate = FALSE;
657         MACRO_BANNER_SHOW_INFO(_window, _("Auto-Rotate Disabled"));
658     }
659
660     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
661     return TRUE;
662 }
663
664 /****************************************************************************
665  * ABOVE: VIEW/ROTATE MENU **************************************************
666  ****************************************************************************/
667
668 /****************************************************************************
669  * BELOW: VIEW/PAN MENU *****************************************************
670  ****************************************************************************/
671
672 static gboolean
673 menu_cb_view_pan_up(GtkMenuItem *item)
674 {
675     gfloat panx_adj, pany_adj;
676     printf("%s()\n", __PRETTY_FUNCTION__);
677
678     /* Adjust for rotate angle. */
679     gdk_pixbuf_rotate_vector(&panx_adj, &pany_adj, _map_reverse_matrix,
680             0, -PAN_PIXELS);
681
682     map_pan(pixel2unit((gint)(panx_adj + 0.5f)),
683                 pixel2unit((gint)(pany_adj + 0.5f)));
684
685     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
686     return TRUE;
687 }
688
689 static gboolean
690 menu_cb_view_pan_down(GtkMenuItem *item)
691 {
692     gfloat panx_adj, pany_adj;
693     printf("%s()\n", __PRETTY_FUNCTION__);
694
695     /* Adjust for rotate angle. */
696     gdk_pixbuf_rotate_vector(&panx_adj, &pany_adj, _map_reverse_matrix,
697             0, PAN_PIXELS);
698
699     map_pan(pixel2unit((gint)(panx_adj + 0.5f)),
700                 pixel2unit((gint)(pany_adj + 0.5f)));
701
702     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
703     return TRUE;
704 }
705
706 static gboolean
707 menu_cb_view_pan_left(GtkMenuItem *item)
708 {
709     gfloat panx_adj, pany_adj;
710     printf("%s()\n", __PRETTY_FUNCTION__);
711
712     /* Adjust for rotate angle. */
713     gdk_pixbuf_rotate_vector(&panx_adj, &pany_adj, _map_reverse_matrix,
714             -PAN_PIXELS, 0);
715
716     map_pan(pixel2unit((gint)(panx_adj + 0.5f)),
717                 pixel2unit((gint)(pany_adj + 0.5f)));
718
719     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
720     return TRUE;
721 }
722
723 static gboolean
724 menu_cb_view_pan_right(GtkMenuItem *item)
725 {
726     gfloat panx_adj, pany_adj;
727     printf("%s()\n", __PRETTY_FUNCTION__);
728
729     /* Adjust for rotate angle. */
730     gdk_pixbuf_rotate_vector(&panx_adj, &pany_adj, _map_reverse_matrix,
731             PAN_PIXELS, 0);
732
733     map_pan(pixel2unit((gint)(panx_adj + 0.5f)),
734                 pixel2unit((gint)(pany_adj + 0.5f)));
735
736     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
737     return TRUE;
738 }
739
740 static gboolean
741 menu_cb_view_pan_north(GtkMenuItem *item)
742 {
743     printf("%s()\n", __PRETTY_FUNCTION__);
744
745     map_pan(0, -pixel2unit(PAN_PIXELS));
746
747     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
748     return TRUE;
749 }
750
751 static gboolean
752 menu_cb_view_pan_south(GtkMenuItem *item)
753 {
754     printf("%s()\n", __PRETTY_FUNCTION__);
755
756     map_pan(0, pixel2unit(PAN_PIXELS));
757
758     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
759     return TRUE;
760 }
761
762 static gboolean
763 menu_cb_view_pan_west(GtkMenuItem *item)
764 {
765     printf("%s()\n", __PRETTY_FUNCTION__);
766
767     map_pan(-pixel2unit(PAN_PIXELS), 0);
768
769     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
770     return TRUE;
771 }
772
773 static gboolean
774 menu_cb_view_pan_east(GtkMenuItem *item)
775 {
776     printf("%s()\n", __PRETTY_FUNCTION__);
777
778     map_pan(pixel2unit(PAN_PIXELS), 0);
779
780     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
781     return TRUE;
782 }
783
784 /****************************************************************************
785  * ABOVE: VIEW/PAN MENU *****************************************************
786  ****************************************************************************/
787
788 /****************************************************************************
789  * BELOW: VIEW/GOTO MENU ****************************************************
790  ****************************************************************************/
791
792 static gboolean
793 menu_cb_view_goto_latlon(GtkMenuItem *item)
794 {
795     static GtkWidget *dialog = NULL;
796     static GtkWidget *table = NULL;
797     static GtkWidget *label = NULL;
798     static GtkWidget *txt_lat = NULL;
799     static GtkWidget *txt_lon = NULL;
800     printf("%s()\n", __PRETTY_FUNCTION__);
801
802     if(dialog == NULL)
803     {
804         dialog = gtk_dialog_new_with_buttons(_("Go to Lat/Lon"),
805                 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
806                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
807                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
808                 NULL);
809
810         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
811                 table = gtk_table_new(2, 3, FALSE), TRUE, TRUE, 0);
812
813         gtk_table_attach(GTK_TABLE(table),
814                 label = gtk_label_new(_("Latitude")),
815                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
816         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
817
818         gtk_table_attach(GTK_TABLE(table),
819                 txt_lat = gtk_entry_new(),
820                 1, 2, 0, 1, GTK_FILL, 0, 2, 4);
821         gtk_entry_set_width_chars(GTK_ENTRY(txt_lat), 16);
822         gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
823 #ifndef LEGACY
824         g_object_set(G_OBJECT(txt_lat), "hildon-input-mode",
825                 HILDON_GTK_INPUT_MODE_FULL, NULL);
826 #else
827         g_object_set(G_OBJECT(txt_lat), HILDON_AUTOCAP, FALSE, NULL);
828         g_object_set(G_OBJECT(txt_lat), HILDON_INPUT_MODE_HINT,
829                 HILDON_INPUT_MODE_HINT_ALPHANUMERICSPECIAL, NULL);
830 #endif
831
832         gtk_table_attach(GTK_TABLE(table),
833                 label = gtk_label_new(_("Longitude")),
834                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
835         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
836
837         gtk_table_attach(GTK_TABLE(table),
838                 txt_lon = gtk_entry_new(),
839                 1, 2, 1, 2, GTK_FILL, 0, 2, 4);
840         gtk_entry_set_width_chars(GTK_ENTRY(txt_lon), 16);
841         gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
842 #ifndef LEGACY
843         g_object_set(G_OBJECT(txt_lon), "hildon-input-mode",
844                 HILDON_GTK_INPUT_MODE_FULL, NULL);
845 #else
846         g_object_set(G_OBJECT(txt_lon), HILDON_AUTOCAP, FALSE, NULL);
847         g_object_set(G_OBJECT(txt_lon), HILDON_INPUT_MODE_HINT,
848                 HILDON_INPUT_MODE_HINT_ALPHANUMERICSPECIAL, NULL);
849 #endif
850     }
851
852     /* Initialize with the current center position. */
853     {
854         gchar buffer[32];
855         gdouble lat, lon;
856         unit2latlon(_center.unitx, _center.unity, lat, lon);
857         lat_format(lat, buffer);
858         gtk_entry_set_text(GTK_ENTRY(txt_lat), buffer);
859         lon_format(lon, buffer);
860         gtk_entry_set_text(GTK_ENTRY(txt_lon), buffer);
861     }
862
863     gtk_widget_show_all(dialog);
864
865     while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
866     {
867         const gchar *text;
868         gchar *error_check;
869         gdouble lat, lon;
870         Point sel_unit;
871
872         text = gtk_entry_get_text(GTK_ENTRY(txt_lat));
873         lat = strdmstod(text, &error_check);
874         if(text == error_check || lat < -90. || lat > 90.) {
875             popup_error(dialog, _("Invalid Latitude"));
876             continue;
877         }
878
879         text = gtk_entry_get_text(GTK_ENTRY(txt_lon));
880         lon = strdmstod(text, &error_check);
881         if(text == error_check || lon < -180. || lon > 180.) {
882             popup_error(dialog, _("Invalid Longitude"));
883             continue;
884         }
885
886         latlon2unit(lat, lon, sel_unit.unitx, sel_unit.unity);
887         if(_center_mode > 0)
888             gtk_check_menu_item_set_active(
889                     GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE);
890         map_center_unit(sel_unit);
891         break;
892     }
893     gtk_widget_hide(dialog);
894     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
895     return TRUE;
896 }
897
898 static gboolean
899 menu_cb_view_goto_address(GtkMenuItem *item)
900 {
901     static GtkWidget *dialog = NULL;
902     static GtkWidget *table = NULL;
903     static GtkWidget *label = NULL;
904     static GtkWidget *txt_addr = NULL;
905     printf("%s()\n", __PRETTY_FUNCTION__);
906
907     if(dialog == NULL)
908     {
909         GtkEntryCompletion *comp;
910         dialog = gtk_dialog_new_with_buttons(_("Go to Address"),
911                 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
912                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
913                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
914                 NULL);
915
916         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
917                 table = gtk_table_new(2, 3, FALSE), TRUE, TRUE, 0);
918
919         gtk_table_attach(GTK_TABLE(table),
920                 label = gtk_label_new(_("Address")),
921                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
922         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
923
924         gtk_table_attach(GTK_TABLE(table),
925                 txt_addr = gtk_entry_new(),
926                 1, 2, 0, 1, GTK_FILL, 0, 2, 4);
927         gtk_entry_set_width_chars(GTK_ENTRY(txt_addr), 25);
928         gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
929
930         /* Set up auto-completion. */
931         comp = gtk_entry_completion_new();
932         gtk_entry_completion_set_model(comp, GTK_TREE_MODEL(_loc_model));
933         gtk_entry_completion_set_text_column(comp, 0);
934         gtk_entry_set_completion(GTK_ENTRY(txt_addr), comp);
935     }
936
937     gtk_widget_show_all(dialog);
938
939     while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
940     {
941         Point origin = locate_address(dialog,
942                 gtk_entry_get_text(GTK_ENTRY(txt_addr)));
943         if(origin.unity)
944         {
945             MACRO_BANNER_SHOW_INFO(_window, _("Address Located"));
946
947             if(_center_mode > 0)
948                 gtk_check_menu_item_set_active(
949                         GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE);
950
951             map_center_unit(origin);
952
953             /* Success! Get out of the while loop. */
954             break;
955         }
956     }
957     gtk_widget_hide(dialog);
958     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
959     return TRUE;
960 }
961
962 static gboolean
963 menu_cb_view_goto_gps(GtkMenuItem *item)
964 {
965     printf("%s()\n", __PRETTY_FUNCTION__);
966
967     if(_center_mode > 0)
968         gtk_check_menu_item_set_active(
969                 GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE);
970
971     map_center_unit(_pos);
972
973     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
974     return TRUE;
975 }
976
977 gboolean
978 menu_cb_view_goto_nextway(GtkMenuItem *item)
979 {
980     WayPoint *next_way;
981     printf("%s()\n", __PRETTY_FUNCTION__);
982
983     next_way = path_get_next_way();
984
985     if(next_way && next_way->point->unity)
986     {
987         if(_center_mode > 0)
988             gtk_check_menu_item_set_active(
989                     GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE);
990
991         map_center_unit(*next_way->point);
992     }
993     else
994     {
995         MACRO_BANNER_SHOW_INFO(_window, _("There is no next waypoint."));
996     }
997
998     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
999     return TRUE;
1000 }
1001
1002 gboolean
1003 menu_cb_view_goto_nearpoi(GtkMenuItem *item)
1004 {
1005     printf("%s()\n", __PRETTY_FUNCTION__);
1006
1007     if(_poi_enabled)
1008     {
1009         PoiInfo poi;
1010         gchar *banner;
1011
1012         if((_center_mode > 0 ? get_nearest_poi(_pos.unitx, _pos.unity, &poi)
1013                     : get_nearest_poi(_center.unitx, _center.unity, &poi) ))
1014         {
1015             /* Auto-Center is enabled - use the GPS position. */
1016             Point unit;
1017             latlon2unit(poi.lat, poi.lon, unit.unitx, unit.unity);
1018             banner = g_strdup_printf("%s (%s)", poi.label, poi.clabel);
1019             MACRO_BANNER_SHOW_INFO(_window, banner);
1020             g_free(banner);
1021             g_free(poi.label);
1022             g_free(poi.desc);
1023             g_free(poi.clabel);
1024
1025             if(_center_mode > 0)
1026                 gtk_check_menu_item_set_active(
1027                         GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE);
1028
1029             map_center_unit(unit);
1030         }
1031         else
1032         {
1033             MACRO_BANNER_SHOW_INFO(_window, _("No POIs found."));
1034             /* Auto-Center is disabled - use the view center. */
1035         }
1036     }
1037
1038     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1039     return TRUE;
1040 }
1041
1042 /****************************************************************************
1043  * ABOVE: VIEW/GOTO MENU ****************************************************
1044  ****************************************************************************/
1045
1046 /****************************************************************************
1047  * BELOW: VIEW/SHOW MENU ****************************************************
1048  ****************************************************************************/
1049
1050 static gboolean
1051 menu_cb_view_show_tracks(GtkMenuItem *item)
1052 {
1053     printf("%s()\n", __PRETTY_FUNCTION__);
1054
1055     _show_paths ^= TRACKS_MASK;
1056     if(gtk_check_menu_item_get_active(
1057                 GTK_CHECK_MENU_ITEM(_menu_view_show_tracks_item)))
1058     {
1059         _show_paths |= TRACKS_MASK;
1060         map_render_paths();
1061         MACRO_QUEUE_DRAW_AREA();
1062         MACRO_BANNER_SHOW_INFO(_window, _("Tracks are now shown"));
1063     }
1064     else
1065     {
1066         _show_paths &= ~TRACKS_MASK;
1067         map_force_redraw();
1068         MACRO_BANNER_SHOW_INFO(_window, _("Tracks are now hidden"));
1069     }
1070
1071     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1072     return TRUE;
1073 }
1074
1075 static gboolean
1076 menu_cb_view_show_zoomlevel(GtkMenuItem *item)
1077 {
1078     printf("%s()\n", __PRETTY_FUNCTION__);
1079
1080     _show_zoomlevel = gtk_check_menu_item_get_active(
1081                 GTK_CHECK_MENU_ITEM(_menu_view_show_zoomlevel_item));
1082     map_force_redraw();
1083
1084     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1085     return TRUE;
1086 }
1087
1088 static gboolean
1089 menu_cb_view_show_scale(GtkMenuItem *item)
1090 {
1091     printf("%s()\n", __PRETTY_FUNCTION__);
1092
1093     _show_scale = gtk_check_menu_item_get_active(
1094                 GTK_CHECK_MENU_ITEM(_menu_view_show_scale_item));
1095     map_force_redraw();
1096
1097     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1098     return TRUE;
1099 }
1100
1101 static gboolean
1102 menu_cb_view_show_comprose(GtkMenuItem *item)
1103 {
1104     printf("%s()\n", __PRETTY_FUNCTION__);
1105
1106     _show_comprose = gtk_check_menu_item_get_active(
1107                 GTK_CHECK_MENU_ITEM(_menu_view_show_comprose_item));
1108     map_force_redraw();
1109
1110     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1111     return TRUE;
1112 }
1113
1114 static gboolean
1115 menu_cb_view_show_routes(GtkMenuItem *item)
1116 {
1117     printf("%s()\n", __PRETTY_FUNCTION__);
1118
1119     if(gtk_check_menu_item_get_active(
1120                 GTK_CHECK_MENU_ITEM(_menu_view_show_routes_item)))
1121     {
1122         _show_paths |= ROUTES_MASK;
1123         map_render_paths();
1124         MACRO_QUEUE_DRAW_AREA();
1125         MACRO_BANNER_SHOW_INFO(_window, _("Routes are now shown"));
1126     }
1127     else
1128     {
1129         _show_paths &= ~ROUTES_MASK;
1130         map_force_redraw();
1131         MACRO_BANNER_SHOW_INFO(_window, _("Routes are now hidden"));
1132     }
1133
1134     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1135     return TRUE;
1136 }
1137
1138 static gboolean
1139 menu_cb_view_show_velvec(GtkMenuItem *item)
1140 {
1141     printf("%s()\n", __PRETTY_FUNCTION__);
1142
1143     _show_velvec = gtk_check_menu_item_get_active(
1144             GTK_CHECK_MENU_ITEM(_menu_view_show_velvec_item));
1145     map_move_mark();
1146
1147     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1148     return TRUE;
1149 }
1150
1151 static gboolean
1152 menu_cb_view_show_poi(GtkMenuItem *item)
1153 {
1154     printf("%s()\n", __PRETTY_FUNCTION__);
1155
1156     _show_poi = gtk_check_menu_item_get_active(
1157             GTK_CHECK_MENU_ITEM(_menu_view_show_poi_item));
1158     map_force_redraw();
1159
1160     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1161     return TRUE;
1162 }
1163
1164 /****************************************************************************
1165  * ABOVE: VIEW/SHOW MENU ****************************************************
1166  ****************************************************************************/
1167
1168 /****************************************************************************
1169  * BELOW: VIEW/AUTO-CENTER MENU *********************************************
1170  ****************************************************************************/
1171
1172 static gboolean
1173 menu_cb_view_ac_lead(GtkMenuItem *item)
1174 {
1175     printf("%s()\n", __PRETTY_FUNCTION__);
1176
1177     if(gtk_check_menu_item_get_active(
1178                 GTK_CHECK_MENU_ITEM(_menu_view_ac_lead_item)))
1179     {
1180         _center_mode = CENTER_LEAD;
1181         MACRO_BANNER_SHOW_INFO(_window, _("Auto-Center Mode: Lead"));
1182         map_refresh_mark(TRUE);
1183     }
1184
1185     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1186     return TRUE;
1187 }
1188
1189 static gboolean
1190 menu_cb_view_ac_latlon(GtkMenuItem *item)
1191 {
1192     printf("%s()\n", __PRETTY_FUNCTION__);
1193
1194     if(gtk_check_menu_item_get_active(
1195                 GTK_CHECK_MENU_ITEM(_menu_view_ac_latlon_item)))
1196     {
1197         _center_mode = CENTER_LATLON;
1198         MACRO_BANNER_SHOW_INFO(_window, _("Auto-Center Mode: Lat/Lon"));
1199         map_refresh_mark(TRUE);
1200     }
1201
1202     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1203     return TRUE;
1204 }
1205
1206 static gboolean
1207 menu_cb_view_ac_none(GtkMenuItem *item)
1208 {
1209     printf("%s()\n", __PRETTY_FUNCTION__);
1210
1211     if(gtk_check_menu_item_get_active(
1212                 GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item)))
1213     {
1214         _center_mode = -_center_mode;
1215         MACRO_BANNER_SHOW_INFO(_window, _("Auto-Center Off"));
1216     }
1217
1218     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1219     return TRUE;
1220 }
1221
1222 /****************************************************************************
1223  * ABOVE: VIEW/AUTO-CENTER MENU *********************************************
1224  ****************************************************************************/
1225
1226 static gboolean
1227 menu_cb_view_fullscreen(GtkMenuItem *item)
1228 {
1229     printf("%s()\n", __PRETTY_FUNCTION__);
1230
1231     if((_fullscreen = gtk_check_menu_item_get_active(
1232                 GTK_CHECK_MENU_ITEM(_menu_view_fullscreen_item))))
1233         gtk_window_fullscreen(GTK_WINDOW(_window));
1234     else
1235         gtk_window_unfullscreen(GTK_WINDOW(_window));
1236
1237     g_idle_add((GSourceFunc)window_present, NULL);
1238
1239     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1240     return TRUE;
1241 }
1242
1243 /****************************************************************************
1244  * BELOW: GPS MENU **********************************************************
1245  ****************************************************************************/
1246
1247 static gboolean
1248 menu_cb_gps_enable(GtkMenuItem *item)
1249 {
1250     printf("%s()\n", __PRETTY_FUNCTION__);
1251
1252     if((_enable_gps = gtk_check_menu_item_get_active(
1253                 GTK_CHECK_MENU_ITEM(_menu_gps_enable_item))))
1254         rcvr_connect();
1255     else
1256         rcvr_disconnect();
1257
1258     map_move_mark();
1259     gps_show_info();
1260     gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_details_item), _enable_gps);
1261     gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_reset_item), _enable_gps);
1262
1263     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1264     return TRUE;
1265 }
1266
1267 static gboolean
1268 menu_cb_gps_show_info(GtkMenuItem *item)
1269 {
1270     printf("%s()\n", __PRETTY_FUNCTION__);
1271
1272     _gps_info = gtk_check_menu_item_get_active(
1273                 GTK_CHECK_MENU_ITEM(_menu_gps_show_info_item));
1274
1275     gps_show_info();
1276
1277     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1278     return TRUE;
1279 }
1280
1281 static gboolean
1282 menu_cb_gps_details(GtkMenuItem *item)
1283 {
1284     printf("%s()\n", __PRETTY_FUNCTION__);
1285
1286     gps_details();
1287
1288     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1289     return TRUE;
1290 }
1291
1292 static gboolean
1293 menu_cb_gps_reset(GtkMenuItem *item)
1294 {
1295     printf("%s()\n", __PRETTY_FUNCTION__);
1296
1297     reset_bluetooth();
1298
1299     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1300     return TRUE;
1301 }
1302
1303 /****************************************************************************
1304  * ABOVE: GPS MENU **********************************************************
1305  ****************************************************************************/
1306
1307 static gboolean
1308 menu_cb_settings(GtkMenuItem *item)
1309 {
1310     printf("%s()\n", __PRETTY_FUNCTION__);
1311
1312     if(settings_dialog())
1313     {
1314         /* Settings have changed - reconnect to receiver. */
1315         if(_enable_gps)
1316         {
1317             rcvr_disconnect();
1318             rcvr_connect();
1319         }
1320     }
1321
1322     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1323     return TRUE;
1324 }
1325
1326 static gboolean
1327 menu_cb_help(GtkMenuItem *item)
1328 {
1329     printf("%s()\n", __PRETTY_FUNCTION__);
1330
1331 #ifndef LEGACY
1332     hildon_help_show(_osso, HELP_ID_INTRO, 0);
1333 #else
1334     ossohelp_show(_osso, HELP_ID_INTRO, 0);
1335 #endif
1336
1337     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1338     return TRUE;
1339 }
1340
1341 static gboolean
1342 menu_cb_about(GtkMenuItem *item)
1343 {
1344     printf("%s()\n", __PRETTY_FUNCTION__);
1345
1346 #ifndef LEGACY
1347     hildon_help_show(_osso, HELP_ID_ABOUT, HILDON_HELP_SHOW_DIALOG);
1348 #else
1349     ossohelp_show(_osso, HELP_ID_ABOUT, OSSO_HELP_SHOW_DIALOG);
1350 #endif
1351
1352     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1353     return TRUE;
1354 }
1355
1356
1357
1358 void
1359 menu_maps_remove_repos()
1360 {
1361     GList *curr;
1362     printf("%s()\n", __PRETTY_FUNCTION__);
1363
1364     /* Delete one menu item for each repo. */
1365     for(curr = _repo_list; curr; curr = curr->next)
1366     {
1367         gtk_widget_destroy(gtk_container_get_children(
1368                     GTK_CONTAINER(_menu_maps_submenu))->data);
1369     }
1370     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1371 }
1372
1373 void
1374 menu_maps_add_repos()
1375 {
1376     GList *curr;
1377     GtkWidget *last_repo = NULL;
1378     printf("%s()\n", __PRETTY_FUNCTION__);
1379
1380     for(curr = g_list_last(_repo_list); curr; curr = curr->prev)
1381     {
1382         RepoData *rd = (RepoData*)curr->data;
1383         GtkWidget *menu_item;
1384         if(last_repo)
1385             gtk_menu_prepend(_menu_maps_submenu, menu_item
1386                     = gtk_radio_menu_item_new_with_label_from_widget(
1387                         GTK_RADIO_MENU_ITEM(last_repo), rd->name));
1388         else
1389         {
1390             gtk_menu_prepend(_menu_maps_submenu, menu_item
1391                     = gtk_radio_menu_item_new_with_label(NULL, rd->name));
1392             last_repo = menu_item;
1393         }
1394         gtk_check_menu_item_set_active(
1395                 GTK_CHECK_MENU_ITEM(menu_item), rd == _curr_repo);
1396         rd->menu_item = menu_item;
1397     }
1398
1399     /* Add signals (must be after entire menu is built). */
1400     {
1401         GList *currmi = gtk_container_get_children(
1402                 GTK_CONTAINER(_menu_maps_submenu));
1403         for(curr = _repo_list; curr; curr = curr->next, currmi = currmi->next)
1404         {
1405             g_signal_connect(G_OBJECT(currmi->data), "activate",
1406                              G_CALLBACK(menu_cb_maps_select), curr->data);
1407         }
1408     }
1409
1410     gtk_widget_show_all(_menu_maps_submenu);
1411     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1412 }
1413
1414 /**
1415  * Create the menu items needed for the drop down menu.
1416  */
1417 void
1418 menu_init()
1419 {
1420     /* Create needed handles. */
1421     GtkMenu *menu;
1422     GtkWidget *submenu;
1423     GtkWidget *submenu2;
1424     GtkWidget *menu_item;
1425     printf("%s()\n", __PRETTY_FUNCTION__);
1426
1427     /* Get the menu of our view. */
1428     menu = GTK_MENU(gtk_menu_new());
1429
1430     /* Create the menu items. */
1431
1432     /* The "Routes" submenu. */
1433     gtk_menu_append(menu, menu_item
1434             = gtk_menu_item_new_with_label(_("Route")));
1435     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1436             submenu = gtk_menu_new());
1437     gtk_menu_append(submenu, _menu_route_open_item
1438             = gtk_menu_item_new_with_label(_("Open...")));
1439     gtk_menu_append(submenu, _menu_route_download_item
1440             = gtk_menu_item_new_with_label(_("Download...")));
1441     gtk_menu_append(submenu, _menu_route_save_item
1442             = gtk_menu_item_new_with_label(_("Save...")));
1443     gtk_menu_append(submenu, _menu_route_distnext_item
1444         = gtk_menu_item_new_with_label(_("Show Distance to Next Waypoint")));
1445     gtk_menu_append(submenu, _menu_route_distlast_item
1446         = gtk_menu_item_new_with_label(_("Show Distance to End of Route")));
1447     gtk_menu_append(submenu, _menu_route_reset_item
1448             = gtk_menu_item_new_with_label(_("Reset")));
1449     gtk_menu_append(submenu, _menu_route_clear_item
1450             = gtk_menu_item_new_with_label(_("Clear")));
1451
1452     /* The "Track" submenu. */
1453     gtk_menu_append(menu, menu_item
1454             = gtk_menu_item_new_with_label(_("Track")));
1455     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1456             submenu = gtk_menu_new());
1457     gtk_menu_append(submenu, _menu_track_open_item
1458             = gtk_menu_item_new_with_label(_("Open...")));
1459     gtk_menu_append(submenu, _menu_track_save_item
1460             = gtk_menu_item_new_with_label(_("Save...")));
1461     gtk_menu_append(submenu, _menu_track_insert_break_item
1462             = gtk_menu_item_new_with_label(_("Insert Break")));
1463     gtk_menu_append(submenu, _menu_track_insert_mark_item
1464             = gtk_menu_item_new_with_label(_("Insert Mark...")));
1465     gtk_menu_append(submenu, _menu_track_distlast_item
1466             = gtk_menu_item_new_with_label(_("Show Distance from Last Mark")));
1467     gtk_menu_append(submenu, _menu_track_distfirst_item
1468             = gtk_menu_item_new_with_label(_("Show Distance from Beginning")));
1469     gtk_menu_append(submenu, _menu_track_clear_item
1470             = gtk_menu_item_new_with_label(_("Clear")));
1471     gtk_menu_append(submenu, _menu_track_enable_item
1472             = gtk_check_menu_item_new_with_label(_("Enable Track")));
1473     gtk_check_menu_item_set_active(
1474             GTK_CHECK_MENU_ITEM(_menu_track_enable_item), _enable_track);
1475
1476     /* The "POI" submenu. */
1477     gtk_menu_append(menu, menu_item = _menu_poi_item
1478             = gtk_menu_item_new_with_label(_("POI")));
1479     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1480             submenu = gtk_menu_new());
1481     gtk_menu_append(submenu, _menu_poi_import_item
1482             = gtk_menu_item_new_with_label(_("Import...")));
1483     gtk_menu_append(submenu, _menu_poi_download_item
1484             = gtk_menu_item_new_with_label(_("Download...")));
1485     gtk_menu_append(submenu, _menu_poi_browse_item
1486             = gtk_menu_item_new_with_label(_("Browse...")));
1487     gtk_menu_append(submenu, _menu_poi_categories_item
1488             = gtk_menu_item_new_with_label(_("Categories...")));
1489
1490     /* The "Maps" submenu. */
1491     gtk_menu_append(menu, menu_item
1492             = gtk_menu_item_new_with_label(_("Maps")));
1493     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1494             _menu_maps_submenu = gtk_menu_new());
1495     gtk_menu_append(_menu_maps_submenu, gtk_separator_menu_item_new());
1496     gtk_menu_append(_menu_maps_submenu, _menu_maps_mapman_item
1497             = gtk_menu_item_new_with_label(_("Manage Maps...")));
1498     gtk_menu_append(_menu_maps_submenu, _menu_maps_repoman_item
1499             = gtk_menu_item_new_with_label(_("Manage Repositories...")));
1500     gtk_menu_append(_menu_maps_submenu, _menu_maps_auto_download_item
1501             = gtk_check_menu_item_new_with_label(_("Auto-Download")));
1502     gtk_check_menu_item_set_active(
1503             GTK_CHECK_MENU_ITEM(_menu_maps_auto_download_item),_auto_download);
1504     menu_maps_add_repos();
1505
1506     gtk_menu_append(menu, gtk_separator_menu_item_new());
1507
1508     /* The "View" submenu. */
1509     gtk_menu_append(menu, menu_item
1510             = gtk_menu_item_new_with_label(_("View")));
1511     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1512             submenu = gtk_menu_new());
1513
1514     /* The "View"/"Zoom" submenu. */
1515     gtk_menu_append(submenu, menu_item
1516             = gtk_menu_item_new_with_label(_("Zoom")));
1517     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1518             submenu2 = gtk_menu_new());
1519     gtk_menu_append(submenu2, _menu_view_zoom_in_item
1520             = gtk_menu_item_new_with_label(_("Zoom In")));
1521     gtk_menu_append(submenu2, _menu_view_zoom_out_item
1522             = gtk_menu_item_new_with_label(_("Zoom Out")));
1523
1524     /* The "View"/"Rotate" submenu. */
1525     gtk_menu_append(submenu, menu_item
1526             = gtk_menu_item_new_with_label(_("Rotate")));
1527     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1528             submenu2 = gtk_menu_new());
1529     gtk_menu_append(submenu2, _menu_view_rotate_clock_item
1530             = gtk_menu_item_new_with_label(_("Clockwise")));
1531     gtk_menu_append(submenu2, _menu_view_rotate_counter_item
1532             = gtk_menu_item_new_with_label(_("Counter")));
1533     gtk_menu_append(submenu2, gtk_separator_menu_item_new());
1534     gtk_menu_append(submenu2, _menu_view_rotate_reset_item
1535             = gtk_menu_item_new_with_label(_("Reset")));
1536     gtk_menu_append(submenu2, _menu_view_rotate_auto_item
1537             = gtk_check_menu_item_new_with_label(_("Auto-Rotate")));
1538     gtk_check_menu_item_set_active(
1539             GTK_CHECK_MENU_ITEM(_menu_view_rotate_auto_item), _center_rotate);
1540
1541     /* The "View"/"Pan" submenu. */
1542     gtk_menu_append(submenu, menu_item
1543             = gtk_menu_item_new_with_label(_("Pan")));
1544     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1545             submenu2 = gtk_menu_new());
1546     gtk_menu_append(submenu2, _menu_view_pan_up_item
1547             = gtk_menu_item_new_with_label(_("Up")));
1548     gtk_menu_append(submenu2, _menu_view_pan_down_item
1549             = gtk_menu_item_new_with_label(_("Down")));
1550     gtk_menu_append(submenu2, _menu_view_pan_left_item
1551             = gtk_menu_item_new_with_label(_("Left")));
1552     gtk_menu_append(submenu2, _menu_view_pan_right_item
1553             = gtk_menu_item_new_with_label(_("Right")));
1554     gtk_menu_append(submenu2, gtk_separator_menu_item_new());
1555     gtk_menu_append(submenu2, _menu_view_pan_north_item
1556             = gtk_menu_item_new_with_label(_("North")));
1557     gtk_menu_append(submenu2, _menu_view_pan_south_item
1558             = gtk_menu_item_new_with_label(_("South")));
1559     gtk_menu_append(submenu2, _menu_view_pan_west_item
1560             = gtk_menu_item_new_with_label(_("West")));
1561     gtk_menu_append(submenu2, _menu_view_pan_east_item
1562             = gtk_menu_item_new_with_label(_("East")));
1563
1564     /* The "Go to" submenu. */
1565     gtk_menu_append(submenu, menu_item
1566             = gtk_menu_item_new_with_label(_("Go to")));
1567     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1568             submenu2 = gtk_menu_new());
1569     gtk_menu_append(submenu2, _menu_view_goto_latlon_item
1570             = gtk_menu_item_new_with_label(_("Lat/Lon...")));
1571     gtk_menu_append(submenu2, _menu_view_goto_address_item
1572             = gtk_menu_item_new_with_label(_("Address...")));
1573     gtk_menu_append(submenu2, _menu_view_goto_gps_item
1574             = gtk_menu_item_new_with_label(_("GPS Location")));
1575     gtk_menu_append(submenu2, _menu_view_goto_nextway_item
1576             = gtk_menu_item_new_with_label(_("Next Waypoint")));
1577     gtk_menu_append(submenu2, _menu_view_goto_nearpoi_item
1578             = gtk_menu_item_new_with_label(_("Nearest POI")));
1579
1580     gtk_menu_append(submenu, gtk_separator_menu_item_new());
1581
1582     /* The "View"/"Show" submenu. */
1583     gtk_menu_append(submenu, menu_item
1584             = gtk_menu_item_new_with_label(_("Show")));
1585     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1586             submenu2 = gtk_menu_new());
1587     gtk_menu_append(submenu2, _menu_view_show_zoomlevel_item
1588             = gtk_check_menu_item_new_with_label(_("Zoom Level")));
1589     gtk_check_menu_item_set_active(
1590             GTK_CHECK_MENU_ITEM(_menu_view_show_zoomlevel_item),
1591             _show_zoomlevel);
1592     gtk_menu_append(submenu2, _menu_view_show_scale_item
1593             = gtk_check_menu_item_new_with_label(_("Scale")));
1594     gtk_check_menu_item_set_active(
1595             GTK_CHECK_MENU_ITEM(_menu_view_show_scale_item),
1596             _show_scale);
1597     gtk_menu_append(submenu2, _menu_view_show_comprose_item
1598             = gtk_check_menu_item_new_with_label(_("Compass Rose")));
1599     gtk_check_menu_item_set_active(
1600             GTK_CHECK_MENU_ITEM(_menu_view_show_comprose_item),
1601             _show_comprose);
1602     gtk_menu_append(submenu2, _menu_view_show_routes_item
1603             = gtk_check_menu_item_new_with_label(_("Route")));
1604     gtk_check_menu_item_set_active(
1605             GTK_CHECK_MENU_ITEM(_menu_view_show_routes_item),
1606             _show_paths & ROUTES_MASK);
1607     gtk_menu_append(submenu2, _menu_view_show_tracks_item
1608             = gtk_check_menu_item_new_with_label(_("Track")));
1609     gtk_check_menu_item_set_active(
1610             GTK_CHECK_MENU_ITEM(_menu_view_show_tracks_item),
1611             _show_paths & TRACKS_MASK);
1612     gtk_menu_append(submenu2, _menu_view_show_velvec_item
1613             = gtk_check_menu_item_new_with_label(_("Velocity Vector")));
1614     gtk_check_menu_item_set_active(
1615             GTK_CHECK_MENU_ITEM(_menu_view_show_velvec_item), _show_velvec);
1616     gtk_menu_append(submenu2, _menu_view_show_poi_item
1617             = gtk_check_menu_item_new_with_label(_("POI")));
1618     gtk_check_menu_item_set_active(
1619             GTK_CHECK_MENU_ITEM(_menu_view_show_poi_item), _show_poi);
1620
1621     /* The "View"/"Auto-Center" submenu. */
1622     gtk_menu_append(submenu, menu_item
1623             = gtk_menu_item_new_with_label(_("Auto-Center")));
1624     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1625             submenu2 = gtk_menu_new());
1626     gtk_menu_append(submenu2, _menu_view_ac_latlon_item
1627             = gtk_radio_menu_item_new_with_label(NULL, _("Lat/Lon")));
1628     gtk_check_menu_item_set_active(
1629             GTK_CHECK_MENU_ITEM(_menu_view_ac_latlon_item),
1630             _center_mode == CENTER_LATLON);
1631     gtk_menu_append(submenu2, _menu_view_ac_lead_item
1632             = gtk_radio_menu_item_new_with_label_from_widget(
1633                 GTK_RADIO_MENU_ITEM(_menu_view_ac_latlon_item), _("Lead")));
1634     gtk_check_menu_item_set_active(
1635             GTK_CHECK_MENU_ITEM(_menu_view_ac_lead_item),
1636             _center_mode == CENTER_LEAD);
1637     gtk_menu_append(submenu2, _menu_view_ac_none_item
1638             = gtk_radio_menu_item_new_with_label_from_widget(
1639                 GTK_RADIO_MENU_ITEM(_menu_view_ac_latlon_item), _("None")));
1640     gtk_check_menu_item_set_active(
1641             GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item),
1642             _center_mode < 0);
1643
1644     gtk_menu_append(submenu, gtk_separator_menu_item_new());
1645
1646     gtk_menu_append(submenu, _menu_view_fullscreen_item
1647             = gtk_check_menu_item_new_with_label(_("Full Screen")));
1648     gtk_check_menu_item_set_active(
1649             GTK_CHECK_MENU_ITEM(_menu_view_fullscreen_item), _fullscreen);
1650
1651     /* The "GPS" submenu. */
1652     gtk_menu_append(menu, menu_item
1653             = gtk_menu_item_new_with_label(_("GPS")));
1654     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),
1655             submenu = gtk_menu_new());
1656     gtk_menu_append(submenu, _menu_gps_enable_item
1657             = gtk_check_menu_item_new_with_label(_("Enable GPS")));
1658     gtk_check_menu_item_set_active(
1659             GTK_CHECK_MENU_ITEM(_menu_gps_enable_item), _enable_gps);
1660     gtk_menu_append(submenu, _menu_gps_show_info_item
1661             = gtk_check_menu_item_new_with_label(_("Show Information")));
1662     gtk_check_menu_item_set_active(
1663             GTK_CHECK_MENU_ITEM(_menu_gps_show_info_item), _gps_info);
1664     gtk_menu_append(submenu, _menu_gps_details_item
1665             = gtk_menu_item_new_with_label(_("Details...")));
1666     gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_details_item), _enable_gps);
1667     gtk_menu_append(submenu, _menu_gps_reset_item
1668         = gtk_menu_item_new_with_label(_("Reset Bluetooth")));
1669     gtk_widget_set_sensitive(GTK_WIDGET(_menu_gps_reset_item), _enable_gps);
1670
1671     gtk_menu_append(menu, gtk_separator_menu_item_new());
1672
1673     /* The other menu items. */
1674     gtk_menu_append(menu, _menu_settings_item
1675         = gtk_menu_item_new_with_label(_("Settings...")));
1676     gtk_menu_append(menu, gtk_separator_menu_item_new());
1677     gtk_menu_append(menu, _menu_help_item
1678         = gtk_menu_item_new_with_label(_("Help...")));
1679     gtk_menu_append(menu, _menu_about_item
1680         = gtk_menu_item_new_with_label(_("About...")));
1681     gtk_menu_append(menu, _menu_close_item
1682         = gtk_menu_item_new_with_label(_("Close")));
1683
1684     /* We need to show menu items. */
1685     gtk_widget_show_all(GTK_WIDGET(menu));
1686
1687     hildon_window_set_menu(HILDON_WINDOW(_window), menu);
1688
1689     /* Connect the "Route" signals. */
1690     g_signal_connect(G_OBJECT(_menu_route_open_item), "activate",
1691                       G_CALLBACK(menu_cb_route_open), NULL);
1692     g_signal_connect(G_OBJECT(_menu_route_download_item), "activate",
1693                       G_CALLBACK(menu_cb_route_download), NULL);
1694     g_signal_connect(G_OBJECT(_menu_route_save_item), "activate",
1695                       G_CALLBACK(menu_cb_route_save), NULL);
1696     g_signal_connect(G_OBJECT(_menu_route_distnext_item), "activate",
1697                       G_CALLBACK(menu_cb_route_distnext), NULL);
1698     g_signal_connect(G_OBJECT(_menu_route_distlast_item), "activate",
1699                       G_CALLBACK(menu_cb_route_distlast), NULL);
1700     g_signal_connect(G_OBJECT(_menu_route_reset_item), "activate",
1701                       G_CALLBACK(menu_cb_route_reset), NULL);
1702     g_signal_connect(G_OBJECT(_menu_route_clear_item), "activate",
1703                       G_CALLBACK(menu_cb_route_clear), NULL);
1704
1705     /* Connect the "Track" signals. */
1706     g_signal_connect(G_OBJECT(_menu_track_open_item), "activate",
1707                       G_CALLBACK(menu_cb_track_open), NULL);
1708     g_signal_connect(G_OBJECT(_menu_track_save_item), "activate",
1709                       G_CALLBACK(menu_cb_track_save), NULL);
1710     g_signal_connect(G_OBJECT(_menu_track_insert_break_item), "activate",
1711                       G_CALLBACK(menu_cb_track_insert_break), NULL);
1712     g_signal_connect(G_OBJECT(_menu_track_insert_mark_item), "activate",
1713                       G_CALLBACK(menu_cb_track_insert_mark), NULL);
1714     g_signal_connect(G_OBJECT(_menu_track_distlast_item), "activate",
1715                       G_CALLBACK(menu_cb_track_distlast), NULL);
1716     g_signal_connect(G_OBJECT(_menu_track_distfirst_item), "activate",
1717                       G_CALLBACK(menu_cb_track_distfirst), NULL);
1718     g_signal_connect(G_OBJECT(_menu_track_clear_item), "activate",
1719                       G_CALLBACK(menu_cb_track_clear), NULL);
1720     g_signal_connect(G_OBJECT(_menu_track_enable_item), "toggled",
1721                       G_CALLBACK(menu_cb_track_enable), NULL);
1722
1723     /* Connect the "POI" signals. */
1724     g_signal_connect(G_OBJECT(_menu_poi_import_item), "activate",
1725                       G_CALLBACK(menu_cb_poi_import), NULL);
1726     g_signal_connect(G_OBJECT(_menu_poi_download_item), "activate",
1727                       G_CALLBACK(menu_cb_poi_download), NULL);
1728     g_signal_connect(G_OBJECT(_menu_poi_browse_item), "activate",
1729                       G_CALLBACK(menu_cb_poi_browse), NULL);
1730     g_signal_connect(G_OBJECT(_menu_poi_categories_item), "activate",
1731                       G_CALLBACK(menu_cb_poi_categories), NULL);
1732
1733     /* Connect the "Maps" signals. */
1734     g_signal_connect(G_OBJECT(_menu_maps_repoman_item), "activate",
1735                       G_CALLBACK(menu_cb_maps_repoman), NULL);
1736     g_signal_connect(G_OBJECT(_menu_maps_mapman_item), "activate",
1737                       G_CALLBACK(menu_cb_maps_mapman), NULL);
1738     g_signal_connect(G_OBJECT(_menu_maps_auto_download_item), "toggled",
1739                       G_CALLBACK(menu_cb_maps_auto_download), NULL);
1740
1741     /* Connect the "View" signals. */
1742     g_signal_connect(G_OBJECT(_menu_view_zoom_in_item), "activate",
1743                       G_CALLBACK(menu_cb_view_zoom_in), NULL);
1744     g_signal_connect(G_OBJECT(_menu_view_zoom_out_item), "activate",
1745                       G_CALLBACK(menu_cb_view_zoom_out), NULL);
1746
1747     g_signal_connect(G_OBJECT(_menu_view_rotate_clock_item), "activate",
1748                       G_CALLBACK(menu_cb_view_rotate_clock), NULL);
1749     g_signal_connect(G_OBJECT(_menu_view_rotate_counter_item), "activate",
1750                       G_CALLBACK(menu_cb_view_rotate_counter), NULL);
1751     g_signal_connect(G_OBJECT(_menu_view_rotate_reset_item), "activate",
1752                       G_CALLBACK(menu_cb_view_rotate_reset), NULL);
1753     g_signal_connect(G_OBJECT(_menu_view_rotate_auto_item), "toggled",
1754                       G_CALLBACK(menu_cb_view_rotate_auto), NULL);
1755
1756     g_signal_connect(G_OBJECT(_menu_view_pan_up_item), "activate",
1757                       G_CALLBACK(menu_cb_view_pan_up), NULL);
1758     g_signal_connect(G_OBJECT(_menu_view_pan_down_item), "activate",
1759                       G_CALLBACK(menu_cb_view_pan_down), NULL);
1760     g_signal_connect(G_OBJECT(_menu_view_pan_left_item), "activate",
1761                       G_CALLBACK(menu_cb_view_pan_left), NULL);
1762     g_signal_connect(G_OBJECT(_menu_view_pan_right_item), "activate",
1763                       G_CALLBACK(menu_cb_view_pan_right), NULL);
1764     g_signal_connect(G_OBJECT(_menu_view_pan_north_item), "activate",
1765                       G_CALLBACK(menu_cb_view_pan_north), NULL);
1766     g_signal_connect(G_OBJECT(_menu_view_pan_south_item), "activate",
1767                       G_CALLBACK(menu_cb_view_pan_south), NULL);
1768     g_signal_connect(G_OBJECT(_menu_view_pan_west_item), "activate",
1769                       G_CALLBACK(menu_cb_view_pan_west), NULL);
1770     g_signal_connect(G_OBJECT(_menu_view_pan_east_item), "activate",
1771                       G_CALLBACK(menu_cb_view_pan_east), NULL);
1772
1773     g_signal_connect(G_OBJECT(_menu_view_goto_latlon_item), "activate",
1774                       G_CALLBACK(menu_cb_view_goto_latlon), NULL);
1775     g_signal_connect(G_OBJECT(_menu_view_goto_address_item), "activate",
1776                       G_CALLBACK(menu_cb_view_goto_address), NULL);
1777     g_signal_connect(G_OBJECT(_menu_view_goto_gps_item), "activate",
1778                       G_CALLBACK(menu_cb_view_goto_gps), NULL);
1779     g_signal_connect(G_OBJECT(_menu_view_goto_nextway_item), "activate",
1780                       G_CALLBACK(menu_cb_view_goto_nextway), NULL);
1781     g_signal_connect(G_OBJECT(_menu_view_goto_nearpoi_item), "activate",
1782                       G_CALLBACK(menu_cb_view_goto_nearpoi), NULL);
1783
1784     g_signal_connect(G_OBJECT(_menu_view_show_tracks_item), "toggled",
1785                       G_CALLBACK(menu_cb_view_show_tracks), NULL);
1786     g_signal_connect(G_OBJECT(_menu_view_show_zoomlevel_item), "toggled",
1787                       G_CALLBACK(menu_cb_view_show_zoomlevel), NULL);
1788     g_signal_connect(G_OBJECT(_menu_view_show_scale_item), "toggled",
1789                       G_CALLBACK(menu_cb_view_show_scale), NULL);
1790     g_signal_connect(G_OBJECT(_menu_view_show_comprose_item), "toggled",
1791                       G_CALLBACK(menu_cb_view_show_comprose), NULL);
1792     g_signal_connect(G_OBJECT(_menu_view_show_routes_item), "toggled",
1793                       G_CALLBACK(menu_cb_view_show_routes), NULL);
1794     g_signal_connect(G_OBJECT(_menu_view_show_velvec_item), "toggled",
1795                       G_CALLBACK(menu_cb_view_show_velvec), NULL);
1796     g_signal_connect(G_OBJECT(_menu_view_show_poi_item), "toggled",
1797                       G_CALLBACK(menu_cb_view_show_poi), NULL);
1798
1799     g_signal_connect(G_OBJECT(_menu_view_ac_latlon_item), "toggled",
1800                       G_CALLBACK(menu_cb_view_ac_latlon), NULL);
1801     g_signal_connect(G_OBJECT(_menu_view_ac_lead_item), "toggled",
1802                       G_CALLBACK(menu_cb_view_ac_lead), NULL);
1803     g_signal_connect(G_OBJECT(_menu_view_ac_none_item), "toggled",
1804                       G_CALLBACK(menu_cb_view_ac_none), NULL);
1805
1806     g_signal_connect(G_OBJECT(_menu_view_fullscreen_item), "toggled",
1807                       G_CALLBACK(menu_cb_view_fullscreen), NULL);
1808
1809     /* Connect the "GPS" signals. */
1810     g_signal_connect(G_OBJECT(_menu_gps_enable_item), "toggled",
1811                       G_CALLBACK(menu_cb_gps_enable), NULL);
1812     g_signal_connect(G_OBJECT(_menu_gps_show_info_item), "toggled",
1813                       G_CALLBACK(menu_cb_gps_show_info), NULL);
1814     g_signal_connect(G_OBJECT(_menu_gps_details_item), "activate",
1815                       G_CALLBACK(menu_cb_gps_details), NULL);
1816     g_signal_connect(G_OBJECT(_menu_gps_reset_item), "activate",
1817                       G_CALLBACK(menu_cb_gps_reset), NULL);
1818
1819     /* Connect the other menu item signals. */
1820     g_signal_connect(G_OBJECT(_menu_settings_item), "activate",
1821                       G_CALLBACK(menu_cb_settings), NULL);
1822     g_signal_connect(G_OBJECT(_menu_help_item), "activate",
1823                       G_CALLBACK(menu_cb_help), NULL);
1824     g_signal_connect(G_OBJECT(_menu_about_item), "activate",
1825                       G_CALLBACK(menu_cb_about), NULL);
1826     g_signal_connect(G_OBJECT(_menu_close_item), "activate",
1827                       G_CALLBACK(gtk_main_quit), NULL);
1828
1829     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1830 }
1831