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