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