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