]> git.itanic.dy.fi Git - maemo-mapper/blob - src/settings.c
5bac7204b9401c0976902a6a1b646307eac02e88
[maemo-mapper] / src / settings.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 <stdlib.h>
31 #include <string.h>
32 #include <math.h>
33 #include <dbus/dbus-glib.h>
34 #include <bt-dbus.h>
35 #include <gconf/gconf-client.h>
36
37 #ifndef LEGACY
38 #    include <hildon/hildon-help.h>
39 #    include <hildon/hildon-note.h>
40 #    include <hildon/hildon-color-button.h>
41 #    include <hildon/hildon-file-chooser-dialog.h>
42 #    include <hildon/hildon-number-editor.h>
43 #    include <hildon/hildon-banner.h>
44 #else
45 #    include <osso-helplib.h>
46 #    include <hildon-widgets/hildon-note.h>
47 #    include <hildon-widgets/hildon-color-button.h>
48 #    include <hildon-widgets/hildon-file-chooser-dialog.h>
49 #    include <hildon-widgets/hildon-number-editor.h>
50 #    include <hildon-widgets/hildon-banner.h>
51 #    include <hildon-widgets/hildon-input-mode-hint.h>
52 #endif
53
54 #include "types.h"
55 #include "data.h"
56 #include "defines.h"
57
58 #include "gps.h"
59 #include "display.h"
60 #include "gdk-pixbuf-rotate.h"
61 #include "maps.h"
62 #include "marshal.h"
63 #include "poi.h"
64 #include "settings.h"
65 #include "util.h"
66
67 typedef struct _ScanInfo ScanInfo;
68 struct _ScanInfo {
69     GtkWidget *settings_dialog;
70     GtkWidget *txt_gps_bt_mac;
71     GtkWidget *scan_dialog;
72     GtkWidget *banner;
73     GtkListStore *store;
74     gint sid;
75     DBusGConnection *bus;
76     DBusGProxy *req_proxy;
77     DBusGProxy *sig_proxy;
78 };
79
80 typedef struct _KeysDialogInfo KeysDialogInfo;
81 struct _KeysDialogInfo {
82     GtkWidget *cmb[CUSTOM_KEY_ENUM_COUNT];
83 };
84
85 typedef struct _ColorsDialogInfo ColorsDialogInfo;
86 struct _ColorsDialogInfo {
87     GtkWidget *col[COLORABLE_ENUM_COUNT];
88 };
89
90
91 /**
92  * Save all configuration data to GCONF.
93  */
94 void
95 settings_save()
96 {
97     gchar *settings_dir;
98     GConfClient *gconf_client;
99     gchar buffer[16];
100     printf("%s()\n", __PRETTY_FUNCTION__);
101
102     /* Initialize settings_dir. */
103     settings_dir = gnome_vfs_expand_initial_tilde(CONFIG_DIR_NAME);
104     g_mkdir_with_parents(settings_dir, 0700);
105
106     /* SAVE ALL GCONF SETTINGS. */
107
108     gconf_client = gconf_client_get_default();
109     if(!gconf_client)
110     {
111         popup_error(_window,
112                 _("Failed to initialize GConf.  Settings were not saved."));
113         return;
114     }
115
116     /* Save GPS Receiver Type. */
117     gconf_client_set_string(gconf_client,
118             GCONF_KEY_GPS_RCVR_TYPE,
119             GPS_RCVR_ENUM_TEXT[_gri.type], NULL);
120
121     /* Save Bluetooth Receiver MAC. */
122     if(_gri.bt_mac)
123         gconf_client_set_string(gconf_client,
124                 GCONF_KEY_GPS_BT_MAC, _gri.bt_mac, NULL);
125     else
126         gconf_client_unset(gconf_client,
127                 GCONF_KEY_GPS_BT_MAC, NULL);
128
129     /* Save GPSD Host. */
130     if(_gri.gpsd_host)
131         gconf_client_set_string(gconf_client,
132                 GCONF_KEY_GPS_GPSD_HOST, _gri.gpsd_host, NULL);
133     else
134         gconf_client_unset(gconf_client,
135                 GCONF_KEY_GPS_GPSD_HOST, NULL);
136
137     /* Save GPSD Port. */
138     gconf_client_set_int(gconf_client,
139             GCONF_KEY_GPS_GPSD_PORT, _gri.gpsd_port, NULL);
140
141     /* Save File Path. */
142     if(_gri.file_path)
143         gconf_client_set_string(gconf_client,
144                 GCONF_KEY_GPS_FILE_PATH, _gri.file_path, NULL);
145     else
146         gconf_client_unset(gconf_client,
147                 GCONF_KEY_GPS_FILE_PATH, NULL);
148
149     /* Save Auto-Download. */
150     gconf_client_set_bool(gconf_client,
151             GCONF_KEY_AUTO_DOWNLOAD, _auto_download, NULL);
152
153     /* Save Auto-Download Pre-cache. */
154     gconf_client_set_int(gconf_client,
155             GCONF_KEY_AUTO_DOWNLOAD_PRECACHE, _auto_download_precache, NULL);
156
157     /* Save Auto-Center Sensitivity. */
158     gconf_client_set_int(gconf_client,
159             GCONF_KEY_CENTER_SENSITIVITY, _center_ratio, NULL);
160
161     /* Save Auto-Center Lead Amount. */
162     gconf_client_set_int(gconf_client,
163             GCONF_KEY_LEAD_AMOUNT, _lead_ratio, NULL);
164
165     /* Save Auto-Center Lead Fixed flag. */
166     gconf_client_set_bool(gconf_client,
167             GCONF_KEY_LEAD_IS_FIXED, _lead_is_fixed, NULL);
168
169     /* Save Auto-Rotate Sensitivity. */
170     gconf_client_set_int(gconf_client,
171             GCONF_KEY_ROTATE_SENSITIVITY, _rotate_sens, NULL);
172
173     /* Save Auto-Center/Rotate Minimum Speed. */
174     gconf_client_set_int(gconf_client,
175             GCONF_KEY_AC_MIN_SPEED, _ac_min_speed, NULL);
176
177     /* Save Auto-Rotate Sensitivity. */
178     gconf_client_set_string(gconf_client,
179             GCONF_KEY_ROTATE_DIR, ROTATE_DIR_ENUM_TEXT[_rotate_dir], NULL);
180
181     /* Save Draw Line Width. */
182     gconf_client_set_int(gconf_client,
183             GCONF_KEY_DRAW_WIDTH, _draw_width, NULL);
184
185     /* Save Announce Advance Notice Ratio. */
186     gconf_client_set_int(gconf_client,
187             GCONF_KEY_ANNOUNCE_NOTICE, _announce_notice_ratio, NULL);
188
189     /* Save Enable Voice flag. */
190     gconf_client_set_bool(gconf_client,
191             GCONF_KEY_ENABLE_VOICE, _enable_voice, NULL);
192
193     /* Save fullscreen flag. */
194     gconf_client_set_bool(gconf_client,
195             GCONF_KEY_FULLSCREEN, _fullscreen, NULL);
196
197     /* Save Units. */
198     gconf_client_set_string(gconf_client,
199             GCONF_KEY_UNITS, UNITS_ENUM_TEXT[_units], NULL);
200
201     /* Save Custom Key Actions. */
202     {
203         gint i;
204         for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
205             gconf_client_set_string(gconf_client,
206                     CUSTOM_KEY_GCONF[i],
207                     CUSTOM_ACTION_ENUM_TEXT[_action[i]], NULL);
208     }
209
210     /* Save Deg Format. */
211     gconf_client_set_string(gconf_client,
212             GCONF_KEY_DEG_FORMAT, DEG_FORMAT_ENUM_TEXT[_degformat], NULL);
213
214     /* Save Speed Limit On flag. */
215     gconf_client_set_bool(gconf_client,
216             GCONF_KEY_SPEED_LIMIT_ON, _speed_limit_on, NULL);
217
218     /* Save Speed Limit. */
219     gconf_client_set_int(gconf_client,
220             GCONF_KEY_SPEED_LIMIT, _speed_limit, NULL);
221
222     /* Save Speed Location. */
223     gconf_client_set_string(gconf_client,
224             GCONF_KEY_SPEED_LOCATION,
225             SPEED_LOCATION_ENUM_TEXT[_speed_location], NULL);
226
227     /* Save Info Font Size. */
228     gconf_client_set_string(gconf_client,
229             GCONF_KEY_INFO_FONT_SIZE,
230             INFO_FONT_ENUM_TEXT[_info_font_size], NULL);
231
232     /* Save Unblank Option. */
233     gconf_client_set_string(gconf_client,
234             GCONF_KEY_UNBLANK_SIZE,
235             UNBLANK_ENUM_TEXT[_unblank_option], NULL);
236
237     /* Save last saved latitude. */
238     gconf_client_set_float(gconf_client,
239             GCONF_KEY_LAST_LAT, _gps.lat, NULL);
240
241     /* Save last saved longitude. */
242     gconf_client_set_float(gconf_client,
243             GCONF_KEY_LAST_LON, _gps.lon, NULL);
244
245     /* Save last saved altitude. */
246     gconf_client_set_int(gconf_client,
247             GCONF_KEY_LAST_ALT, _pos.altitude, NULL);
248
249     /* Save last saved speed. */
250     gconf_client_set_float(gconf_client,
251             GCONF_KEY_LAST_SPEED, _gps.speed, NULL);
252
253     /* Save last saved heading. */
254     gconf_client_set_float(gconf_client,
255             GCONF_KEY_LAST_HEADING, _gps.heading, NULL);
256
257     /* Save last saved timestamp. */
258     gconf_client_set_float(gconf_client,
259             GCONF_KEY_LAST_TIME, _pos.time, NULL);
260
261     /* Save last center point. */
262     {
263         gdouble center_lat, center_lon;
264         unit2latlon(_center.unitx, _center.unity, center_lat, center_lon);
265
266         /* Save last center latitude. */
267         gconf_client_set_float(gconf_client,
268                 GCONF_KEY_CENTER_LAT, center_lat, NULL);
269
270         /* Save last center longitude. */
271         gconf_client_set_float(gconf_client,
272                 GCONF_KEY_CENTER_LON, center_lon, NULL);
273
274         /* Save last view angle. */
275         gconf_client_set_int(gconf_client,
276                 GCONF_KEY_CENTER_ANGLE, _map_rotate_angle, NULL);
277     }
278
279     /* Save last Zoom Level. */
280     gconf_client_set_int(gconf_client,
281             GCONF_KEY_ZOOM, _zoom, NULL);
282
283     /* Save Route Directory. */
284     if(_route_dir_uri)
285         gconf_client_set_string(gconf_client,
286                 GCONF_KEY_ROUTEDIR, _route_dir_uri, NULL);
287
288     /* Save the repositories. */
289     {
290         GList *curr = _repo_list;
291         GSList *temp_list = NULL;
292         gint curr_repo_index = 0;
293
294         for(curr = _repo_list; curr != NULL; curr = curr->next)
295         {
296             /* Build from each part of a repo, delimited by newline characters:
297              * 1. url
298              * 2. db_filename
299              * 3. dl_zoom_steps
300              * 4. view_zoom_steps
301              */
302             RepoData *rd = curr->data;
303             gchar buffer[BUFFER_SIZE];
304             snprintf(buffer, sizeof(buffer),
305                     "%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d",
306                     rd->name,
307                     rd->url,
308                     rd->db_filename,
309                     rd->dl_zoom_steps,
310                     rd->view_zoom_steps,
311                     rd->double_size,
312                     rd->nextable,
313                     rd->min_zoom,
314                     rd->max_zoom);
315             temp_list = g_slist_append(temp_list, g_strdup(buffer));
316             if(rd == _curr_repo)
317                 gconf_client_set_int(gconf_client,
318                         GCONF_KEY_CURRREPO, curr_repo_index, NULL);
319             curr_repo_index++;
320         }
321         gconf_client_set_list(gconf_client,
322                 GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, temp_list, NULL);
323     }
324
325     /* Save Last Track File. */
326     if(_track_file_uri)
327         gconf_client_set_string(gconf_client,
328                 GCONF_KEY_TRACKFILE, _track_file_uri, NULL);
329
330     /* Save Auto-Center Mode. */
331     gconf_client_set_int(gconf_client,
332             GCONF_KEY_AUTOCENTER_MODE, _center_mode, NULL);
333
334     /* Save Auto-Center Rotate Flag. */
335     gconf_client_set_bool(gconf_client,
336             GCONF_KEY_AUTOCENTER_ROTATE, _center_rotate, NULL);
337
338     /* Save Show Zoom Level flag. */
339     gconf_client_set_bool(gconf_client,
340             GCONF_KEY_SHOWZOOMLEVEL, _show_zoomlevel, NULL);
341
342     /* Save Show Scale flag. */
343     gconf_client_set_bool(gconf_client,
344             GCONF_KEY_SHOWSCALE, _show_scale, NULL);
345
346     /* Save Show Compass Rose flag. */
347     gconf_client_set_bool(gconf_client,
348             GCONF_KEY_SHOWCOMPROSE, _show_comprose, NULL);
349
350     /* Save Show Tracks flag. */
351     gconf_client_set_bool(gconf_client,
352             GCONF_KEY_SHOWTRACKS, _show_paths & TRACKS_MASK, NULL);
353
354     /* Save Show Routes flag. */
355     gconf_client_set_bool(gconf_client,
356             GCONF_KEY_SHOWROUTES, _show_paths & ROUTES_MASK, NULL);
357
358     /* Save Show Velocity Vector flag. */
359     gconf_client_set_bool(gconf_client,
360             GCONF_KEY_SHOWVELVEC, _show_velvec, NULL);
361
362     /* Save Show POIs flag. */
363     gconf_client_set_bool(gconf_client,
364             GCONF_KEY_SHOWPOIS, _show_poi, NULL);
365
366     /* Save Enable GPS flag. */
367     gconf_client_set_bool(gconf_client,
368             GCONF_KEY_ENABLE_GPS, _enable_gps, NULL);
369
370     /* Save Route Locations. */
371     gconf_client_set_list(gconf_client,
372             GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, _loc_list, NULL);
373
374     /* Save GPS Info flag. */
375     gconf_client_set_bool(gconf_client,
376             GCONF_KEY_GPS_INFO, _gps_info, NULL);
377
378     /* Save Route Download URL Format. */
379     gconf_client_set_string(gconf_client,
380             GCONF_KEY_ROUTE_DL_URL, _route_dl_url, NULL);
381
382     /* Save Route Download Radius. */
383     gconf_client_set_int(gconf_client,
384             GCONF_KEY_ROUTE_DL_RADIUS, _route_dl_radius, NULL);
385
386     /* Save POI Download URL Format. */
387     gconf_client_set_string(gconf_client,
388             GCONF_KEY_POI_DL_URL, _poi_dl_url, NULL);
389
390     /* Save Colors. */
391     {
392         gint i;
393         for(i = 0; i < COLORABLE_ENUM_COUNT; i++)
394         {
395             snprintf(buffer, sizeof(buffer), "#%02x%02x%02x",
396                     _color[i].red >> 8,
397                     _color[i].green >> 8,
398                     _color[i].blue >> 8);
399             gconf_client_set_string(gconf_client,
400                     COLORABLE_GCONF[i], buffer, NULL);
401         }
402     }
403
404     /* Save POI database. */
405     if(_poi_db_filename)
406         gconf_client_set_string(gconf_client,
407                 GCONF_KEY_POI_DB, _poi_db_filename, NULL);
408     else
409         gconf_client_unset(gconf_client, GCONF_KEY_POI_DB, NULL);
410
411     /* Save Show POI below zoom. */
412     gconf_client_set_int(gconf_client,
413             GCONF_KEY_POI_ZOOM, _poi_zoom, NULL);
414
415     gconf_client_clear_cache(gconf_client);
416     g_object_unref(gconf_client);
417     g_free(settings_dir);
418
419     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
420 }
421
422 static void
423 scan_cb_dev_found(DBusGProxy *sig_proxy, const gchar *bda,
424         const gchar *name, gpointer *class, guchar rssi, gint coff,
425         ScanInfo *scan_info)
426 {
427     GtkTreeIter iter;
428     printf("%s()\n", __PRETTY_FUNCTION__);
429     gtk_list_store_append(scan_info->store, &iter);
430     gtk_list_store_set(scan_info->store, &iter,
431             0, g_strdup(bda),
432             1, g_strdup(name),
433             -1);
434     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
435 }
436
437 static void
438 scan_cb_search_complete(DBusGProxy *sig_proxy, ScanInfo *scan_info)
439 {
440     printf("%s()\n", __PRETTY_FUNCTION__);
441     gtk_widget_destroy(scan_info->banner);
442     dbus_g_proxy_disconnect_signal(sig_proxy, BTSEARCH_DEV_FOUND_SIG,
443             G_CALLBACK(scan_cb_dev_found), scan_info);
444     dbus_g_proxy_disconnect_signal(sig_proxy, BTSEARCH_SEARCH_COMPLETE_SIG,
445             G_CALLBACK(scan_cb_search_complete), scan_info);
446     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
447 }
448
449 static gint
450 scan_start_search(ScanInfo *scan_info)
451 {
452     GError *error = NULL;
453     printf("%s()\n", __PRETTY_FUNCTION__);
454
455     /* Initialize D-Bus. */
456     if(NULL == (scan_info->bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error)))
457     {
458         g_printerr("Failed to open connection to D-Bus: %s.\n",
459                 error->message);
460         return 1;
461     }
462
463     if(NULL == (scan_info->req_proxy =dbus_g_proxy_new_for_name(scan_info->bus,
464             BTSEARCH_SERVICE,
465             BTSEARCH_REQ_PATH,
466             BTSEARCH_REQ_INTERFACE)))
467     {
468         g_printerr("Failed to create D-Bus request proxy for btsearch.");
469         return 2;
470     }
471
472     if(NULL == (scan_info->sig_proxy =dbus_g_proxy_new_for_name(scan_info->bus,
473             BTSEARCH_SERVICE,
474             BTSEARCH_SIG_PATH,
475             BTSEARCH_SIG_INTERFACE)))
476     {
477         g_printerr("Failed to create D-Bus signal proxy for btsearch.");
478         return 2;
479     }
480
481     dbus_g_object_register_marshaller(
482             g_cclosure_user_marshal_VOID__STRING_STRING_POINTER_UCHAR_UINT,
483             G_TYPE_NONE,
484             G_TYPE_STRING,
485             G_TYPE_STRING,
486             DBUS_TYPE_G_UCHAR_ARRAY,
487             G_TYPE_UCHAR,
488             G_TYPE_UINT,
489             G_TYPE_INVALID);
490
491     dbus_g_proxy_add_signal(scan_info->sig_proxy,
492             BTSEARCH_DEV_FOUND_SIG,
493             G_TYPE_STRING,
494             G_TYPE_STRING,
495             DBUS_TYPE_G_UCHAR_ARRAY,
496             G_TYPE_UCHAR,
497             G_TYPE_UINT,
498             G_TYPE_INVALID);
499     dbus_g_proxy_connect_signal(scan_info->sig_proxy, BTSEARCH_DEV_FOUND_SIG,
500             G_CALLBACK(scan_cb_dev_found), scan_info, NULL);
501
502     dbus_g_proxy_add_signal(scan_info->sig_proxy,
503             BTSEARCH_SEARCH_COMPLETE_SIG,
504             G_TYPE_INVALID);
505     dbus_g_proxy_connect_signal(scan_info->sig_proxy,
506             BTSEARCH_SEARCH_COMPLETE_SIG,
507             G_CALLBACK(scan_cb_search_complete), scan_info, NULL);
508
509     error = NULL;
510     if(!dbus_g_proxy_call(scan_info->req_proxy, BTSEARCH_START_SEARCH_REQ,
511                 &error, G_TYPE_INVALID, G_TYPE_INVALID))
512     {
513         if(error->domain == DBUS_GERROR
514                 && error->code == DBUS_GERROR_REMOTE_EXCEPTION)
515         {
516             g_printerr("Caught remote method exception %s: %s",
517                     dbus_g_error_get_name(error),
518                     error->message);
519         }
520         else
521             g_printerr("Error: %s\n", error->message);
522         return 3;
523     }
524
525     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
526     return 0;
527 }
528
529 /**
530  * Scan for all bluetooth devices.  This method can take a few seconds,
531  * during which the UI will freeze.
532  */
533 static gboolean
534 scan_bluetooth(GtkWidget *widget, ScanInfo *scan_info)
535 {
536     GError *error = NULL;
537     GtkWidget *dialog = NULL;
538     GtkWidget *lst_devices = NULL;
539     GtkTreeViewColumn *column = NULL;
540     GtkCellRenderer *renderer = NULL;
541     printf("%s()\n", __PRETTY_FUNCTION__);
542
543     dialog = gtk_dialog_new_with_buttons(_("Select Bluetooth Device"),
544             GTK_WINDOW(scan_info->settings_dialog), GTK_DIALOG_MODAL,
545             GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
546             GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
547             NULL);
548
549     scan_info->scan_dialog = dialog;
550
551     scan_info->store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
552
553     gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 300);
554
555     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
556             lst_devices = gtk_tree_view_new_with_model(
557                 GTK_TREE_MODEL(scan_info->store)), TRUE, TRUE, 0);
558
559     g_object_unref(G_OBJECT(scan_info->store));
560
561     gtk_tree_selection_set_mode(
562             gtk_tree_view_get_selection(GTK_TREE_VIEW(lst_devices)),
563             GTK_SELECTION_SINGLE);
564     gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(lst_devices), TRUE);
565
566     renderer = gtk_cell_renderer_text_new();
567     column = gtk_tree_view_column_new_with_attributes(
568             _("MAC"), renderer, "text", 0, NULL);
569     gtk_tree_view_append_column(GTK_TREE_VIEW(lst_devices), column);
570
571     renderer = gtk_cell_renderer_text_new();
572     column = gtk_tree_view_column_new_with_attributes(
573             _("Description"), renderer, "text", 1, NULL);
574     gtk_tree_view_append_column(GTK_TREE_VIEW(lst_devices), column);
575
576     gtk_widget_show_all(dialog);
577
578     scan_info->banner = hildon_banner_show_animation(dialog, NULL,
579             _("Scanning for Bluetooth Devices"));
580
581     if(scan_start_search(scan_info))
582     {
583         gtk_widget_destroy(scan_info->banner);
584         popup_error(scan_info->settings_dialog,
585                 _("An error occurred while attempting to scan for "
586                 "bluetooth devices."));
587     }
588     else while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
589     {
590         GtkTreeIter iter;
591         if(gtk_tree_selection_get_selected(
592                     gtk_tree_view_get_selection(GTK_TREE_VIEW(lst_devices)),
593                     NULL, &iter))
594         {
595             gchar *mac;
596             gtk_tree_model_get(GTK_TREE_MODEL(scan_info->store),
597                     &iter, 0, &mac, -1);
598             gtk_entry_set_text(GTK_ENTRY(scan_info->txt_gps_bt_mac), mac);
599             break;
600         }
601         else
602             popup_error(dialog,
603                     _("Please select a bluetooth device from the list."));
604     }
605
606     gtk_widget_destroy(dialog);
607
608     /* Clean up D-Bus. */
609     if(scan_info->req_proxy)
610     {
611         dbus_g_proxy_call(scan_info->req_proxy, BTSEARCH_STOP_SEARCH_REQ,
612                     &error, G_TYPE_INVALID, G_TYPE_INVALID);
613         g_object_unref(scan_info->req_proxy);
614         scan_info->req_proxy = NULL;
615     }
616     if(scan_info->sig_proxy)
617     {
618         g_object_unref(scan_info->sig_proxy);
619         scan_info->sig_proxy = NULL;
620     }
621     if(scan_info->bus)
622     {
623         dbus_g_connection_unref(scan_info->bus);
624         scan_info->bus = NULL;
625     }
626
627     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
628     return TRUE;
629 }
630
631 static gboolean
632 settings_dialog_browse_forfile(GtkWidget *widget, BrowseInfo *browse_info)
633 {
634     GtkWidget *dialog;
635     printf("%s()\n", __PRETTY_FUNCTION__);
636
637     dialog = GTK_WIDGET(
638             hildon_file_chooser_dialog_new(GTK_WINDOW(browse_info->dialog),
639             GTK_FILE_CHOOSER_ACTION_OPEN));
640
641     gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialog), TRUE);
642     gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
643             gtk_entry_get_text(GTK_ENTRY(browse_info->txt)));
644
645     if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(dialog)))
646     {
647         gchar *filename = gtk_file_chooser_get_filename(
648                 GTK_FILE_CHOOSER(dialog));
649         gtk_entry_set_text(GTK_ENTRY(browse_info->txt), filename);
650         g_free(filename);
651     }
652
653     gtk_widget_destroy(dialog);
654
655     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
656     return TRUE;
657 }
658
659 static gboolean
660 settings_dialog_hardkeys_reset(GtkWidget *widget, KeysDialogInfo *cdi)
661 {
662     GtkWidget *confirm;
663     printf("%s()\n", __PRETTY_FUNCTION__);
664
665     confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
666             _("Reset all hardware keys to their original defaults?"));
667
668     if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm)))
669     {
670         gint i;
671         for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
672             gtk_combo_box_set_active(GTK_COMBO_BOX(cdi->cmb[i]),
673                     CUSTOM_KEY_DEFAULT[i]);
674     }
675     gtk_widget_destroy(confirm);
676
677     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
678     return TRUE;
679 }
680
681 static gboolean
682 settings_dialog_hardkeys(GtkWidget *widget, GtkWidget *parent)
683 {
684     gint i;
685     static GtkWidget *dialog = NULL;
686     static GtkWidget *table = NULL;
687     static GtkWidget *label = NULL;
688     static KeysDialogInfo bdi;
689     static GtkWidget *btn_defaults = NULL;
690     printf("%s()\n", __PRETTY_FUNCTION__);
691
692     if(dialog == NULL)
693     {
694         dialog = gtk_dialog_new_with_buttons(_("Hardware Keys"),
695                 GTK_WINDOW(parent), GTK_DIALOG_MODAL,
696                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
697                 NULL);
698
699         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
700                 btn_defaults = gtk_button_new_with_label(_("Reset...")));
701         g_signal_connect(G_OBJECT(btn_defaults), "clicked",
702                           G_CALLBACK(settings_dialog_hardkeys_reset), &bdi);
703
704         gtk_dialog_add_button(GTK_DIALOG(dialog),
705                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
706
707         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
708                 table = gtk_table_new(2, 9, FALSE), TRUE, TRUE, 0);
709         for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
710         {
711             gint j;
712             gtk_table_attach(GTK_TABLE(table),
713                     label = gtk_label_new(""),
714                     0, 1, i, i + 1, GTK_FILL, 0, 2, 1);
715             gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
716             gtk_label_set_markup(GTK_LABEL(label), CUSTOM_KEY_ICON[i]);
717             gtk_table_attach(GTK_TABLE(table),
718                     bdi.cmb[i] = gtk_combo_box_new_text(),
719                     1, 2, i, i + 1, GTK_FILL, 0, 2, 1);
720             for(j = 0; j < CUSTOM_ACTION_ENUM_COUNT; j++)
721                 gtk_combo_box_append_text(GTK_COMBO_BOX(bdi.cmb[i]),
722                         CUSTOM_ACTION_ENUM_TEXT[j]);
723         }
724     }
725
726     /* Initialize contents of the combo boxes. */
727     for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
728         gtk_combo_box_set_active(GTK_COMBO_BOX(bdi.cmb[i]), _action[i]);
729
730     gtk_widget_show_all(dialog);
731
732 OUTER_WHILE:
733     while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
734     {
735         /* Check for duplicates. */
736         for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
737         {
738             gint j;
739             for(j = i + 1; j < CUSTOM_KEY_ENUM_COUNT; j++)
740             {
741                 if(gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i]))
742                         == gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[j])))
743                 {
744                     GtkWidget *confirm;
745                     gchar *buffer = g_strdup_printf("%s:\n    %s\n%s",
746                         _("The following action is mapped to multiple keys"),
747                         CUSTOM_ACTION_ENUM_TEXT[gtk_combo_box_get_active(
748                             GTK_COMBO_BOX(bdi.cmb[i]))],
749                         _("Continue?"));
750                     confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
751                             buffer);
752
753                     if(GTK_RESPONSE_OK != gtk_dialog_run(GTK_DIALOG(confirm)))
754                     {
755                         gtk_widget_destroy(confirm);
756                         goto OUTER_WHILE;
757                     }
758                     gtk_widget_destroy(confirm);
759                 }
760             }
761         }
762         for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
763             _action[i] = gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i]));
764         break;
765     }
766
767     gtk_widget_hide(dialog);
768
769     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
770     return TRUE;
771 }
772
773 static gboolean
774 settings_dialog_colors_reset(GtkWidget *widget, ColorsDialogInfo *cdi)
775 {
776     GtkWidget *confirm;
777     printf("%s()\n", __PRETTY_FUNCTION__);
778
779     confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
780             _("Reset all colors to their original defaults?"));
781
782     if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm)))
783     {
784         gint i;
785         for(i = 0; i < COLORABLE_ENUM_COUNT; i++)
786         {
787             hildon_color_button_set_color(
788                     HILDON_COLOR_BUTTON(cdi->col[i]),
789                     &COLORABLE_DEFAULT[i]);
790         }
791     }
792     gtk_widget_destroy(confirm);
793
794     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
795     return TRUE;
796 }
797
798 static gboolean
799 settings_dialog_colors(GtkWidget *widget, GtkWidget *parent)
800 {
801     static GtkWidget *dialog = NULL;
802     static GtkWidget *table = NULL;
803     static GtkWidget *label = NULL;
804     static GtkWidget *btn_defaults = NULL;
805     static ColorsDialogInfo cdi;
806     printf("%s()\n", __PRETTY_FUNCTION__);
807
808     if(dialog == NULL)
809     {
810         dialog = gtk_dialog_new_with_buttons(_("Colors"),
811                 GTK_WINDOW(parent), GTK_DIALOG_MODAL,
812                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
813                 NULL);
814
815         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
816                 btn_defaults = gtk_button_new_with_label(_("Reset...")));
817         g_signal_connect(G_OBJECT(btn_defaults), "clicked",
818                           G_CALLBACK(settings_dialog_colors_reset), &cdi);
819
820         gtk_dialog_add_button(GTK_DIALOG(dialog),
821                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
822
823         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
824                 table = gtk_table_new(4, 3, FALSE), TRUE, TRUE, 0);
825
826         /* GPS. */
827         gtk_table_attach(GTK_TABLE(table),
828                 label = gtk_label_new(_("GPS")),
829                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
830         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
831         gtk_table_attach(GTK_TABLE(table),
832                 cdi.col[COLORABLE_MARK] = hildon_color_button_new(),
833                 1, 2, 0, 1, 0, 0, 2, 4);
834         gtk_table_attach(GTK_TABLE(table),
835                 cdi.col[COLORABLE_MARK_VELOCITY] = hildon_color_button_new(),
836                 2, 3, 0, 1, 0, 0, 2, 4);
837         gtk_table_attach(GTK_TABLE(table),
838                 cdi.col[COLORABLE_MARK_OLD] = hildon_color_button_new(),
839                 3, 4, 0, 1, 0, 0, 2, 4);
840
841         /* Track. */
842         gtk_table_attach(GTK_TABLE(table),
843                 label = gtk_label_new(_("Track")),
844                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
845         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
846         gtk_table_attach(GTK_TABLE(table),
847                 cdi.col[COLORABLE_TRACK] = hildon_color_button_new(),
848                 1, 2, 1, 2, 0, 0, 2, 4);
849         gtk_table_attach(GTK_TABLE(table),
850                 cdi.col[COLORABLE_TRACK_MARK] = hildon_color_button_new(),
851                 2, 3, 1, 2, 0, 0, 2, 4);
852         gtk_table_attach(GTK_TABLE(table),
853                 cdi.col[COLORABLE_TRACK_BREAK] = hildon_color_button_new(),
854                 3, 4, 1, 2, 0, 0, 2, 4);
855
856         /* Route. */
857         gtk_table_attach(GTK_TABLE(table),
858                 label = gtk_label_new(_("Route")),
859                 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
860         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
861         gtk_table_attach(GTK_TABLE(table),
862                 cdi.col[COLORABLE_ROUTE] = hildon_color_button_new(),
863                 1, 2, 2, 3, 0, 0, 2, 4);
864         gtk_table_attach(GTK_TABLE(table),
865                 cdi.col[COLORABLE_ROUTE_WAY] = hildon_color_button_new(),
866                 2, 3, 2, 3, 0, 0, 2, 4);
867         gtk_table_attach(GTK_TABLE(table),
868                 cdi.col[COLORABLE_ROUTE_BREAK] = hildon_color_button_new(),
869                 3, 4, 2, 3, 0, 0, 2, 4);
870
871         /* POI. */
872         gtk_table_attach(GTK_TABLE(table),
873                 label = gtk_label_new(_("POI")),
874                 0, 1, 3, 4, GTK_FILL, 0, 2, 4);
875         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
876         gtk_table_attach(GTK_TABLE(table),
877                 cdi.col[COLORABLE_POI] = hildon_color_button_new(),
878                 1, 2, 3, 4, 0, 0, 2, 4);
879     }
880
881     /* Initialize GPS. */
882     hildon_color_button_set_color(
883             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK]),
884             &_color[COLORABLE_MARK]);
885     hildon_color_button_set_color(
886             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]),
887             &_color[COLORABLE_MARK_VELOCITY]);
888     hildon_color_button_set_color(
889             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]),
890             &_color[COLORABLE_MARK_OLD]);
891
892     /* Initialize Track. */
893     hildon_color_button_set_color(
894             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]),
895             &_color[COLORABLE_TRACK]);
896     hildon_color_button_set_color(
897             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]),
898             &_color[COLORABLE_TRACK_MARK]);
899     hildon_color_button_set_color(
900             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]),
901             &_color[COLORABLE_TRACK_BREAK]);
902
903     /* Initialize Route. */
904     hildon_color_button_set_color(
905             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]),
906             &_color[COLORABLE_ROUTE]);
907     hildon_color_button_set_color(
908             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]),
909             &_color[COLORABLE_ROUTE_WAY]);
910     hildon_color_button_set_color(
911             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]),
912             &_color[COLORABLE_ROUTE_BREAK]);
913
914     /* Initialize POI. */
915     hildon_color_button_set_color(
916             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_POI]),
917             &_color[COLORABLE_POI]);
918
919     gtk_widget_show_all(dialog);
920
921     while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
922     {
923 #ifndef LEGACY
924         hildon_color_button_get_color(
925                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK]), 
926                 &_color[COLORABLE_MARK]);
927
928         hildon_color_button_get_color(
929                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]), 
930                 &_color[COLORABLE_MARK_VELOCITY]);
931
932         hildon_color_button_get_color(
933                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]),
934                 &_color[COLORABLE_MARK_OLD]);
935
936         hildon_color_button_get_color(
937                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]),
938                 &_color[COLORABLE_TRACK]);
939
940         hildon_color_button_get_color(
941                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]),
942                 &_color[COLORABLE_TRACK_MARK]);
943
944         hildon_color_button_get_color(
945                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]),
946                 &_color[COLORABLE_TRACK_BREAK]);
947
948         hildon_color_button_get_color(
949                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]),
950                 &_color[COLORABLE_ROUTE]);
951
952         hildon_color_button_get_color(
953                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]),
954                 &_color[COLORABLE_ROUTE_WAY]);
955
956         hildon_color_button_get_color(
957                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]),
958                 &_color[COLORABLE_ROUTE_BREAK]);
959
960         hildon_color_button_get_color(
961                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_POI]),
962                 &_color[COLORABLE_POI]);
963 #else
964         GdkColor *color;
965
966         color = hildon_color_button_get_color(
967                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK]));
968         _color[COLORABLE_MARK] = *color;
969
970         color = hildon_color_button_get_color(
971                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]));
972         _color[COLORABLE_MARK_VELOCITY] = *color;
973
974         color = hildon_color_button_get_color(
975                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]));
976         _color[COLORABLE_MARK_OLD] = *color;
977
978         color = hildon_color_button_get_color(
979                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]));
980         _color[COLORABLE_TRACK] = *color;
981
982         color = hildon_color_button_get_color(
983                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]));
984         _color[COLORABLE_TRACK_MARK] = *color;
985
986         color = hildon_color_button_get_color(
987                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]));
988         _color[COLORABLE_TRACK_BREAK] = *color;
989
990         color = hildon_color_button_get_color(
991                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]));
992         _color[COLORABLE_ROUTE] = *color;
993
994         color = hildon_color_button_get_color(
995                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]));
996         _color[COLORABLE_ROUTE_WAY] = *color;
997
998         color = hildon_color_button_get_color(
999                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]));
1000         _color[COLORABLE_ROUTE_BREAK] = *color;
1001
1002         color = hildon_color_button_get_color(
1003                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_POI]));
1004         _color[COLORABLE_POI] = *color;
1005
1006 #endif
1007         
1008         update_gcs();
1009         break;
1010     }
1011
1012     map_force_redraw();
1013
1014     gtk_widget_hide(dialog);
1015
1016     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1017     return TRUE;
1018 }
1019
1020 /**
1021  * Bring up the Settings dialog.  Return TRUE if and only if the recever
1022  * information has changed (MAC or channel).
1023  */
1024 gboolean
1025 settings_dialog()
1026 {
1027     static GtkWidget *dialog = NULL;
1028     static GtkWidget *notebook = NULL;
1029     static GtkWidget *table = NULL;
1030     static GtkWidget *hbox = NULL;
1031     static GtkWidget *label = NULL;
1032     static GtkWidget *rad_gps_bt = NULL;
1033     static GtkWidget *rad_gps_gpsd = NULL;
1034     static GtkWidget *rad_gps_file = NULL;
1035     static GtkWidget *txt_gps_bt_mac = NULL;
1036     static GtkWidget *txt_gps_gpsd_host = NULL;
1037     static GtkWidget *num_gps_gpsd_port = NULL;
1038     static GtkWidget *txt_gps_file_path = NULL;
1039     static GtkWidget *num_center_ratio = NULL;
1040     static GtkWidget *num_lead_ratio = NULL;
1041     static GtkWidget *chk_lead_is_fixed = NULL;
1042     static GtkWidget *num_rotate_sens = NULL;
1043     static GtkWidget *cmb_rotate_dir = NULL;
1044     static GtkWidget *num_ac_min_speed = NULL;
1045     static GtkWidget *num_announce_notice = NULL;
1046     static GtkWidget *chk_enable_voice = NULL;
1047     static GtkWidget *num_draw_width = NULL;
1048     static GtkWidget *cmb_units = NULL;
1049     static GtkWidget *cmb_degformat = NULL;
1050     static GtkWidget *btn_scan = NULL;
1051     static GtkWidget *btn_browse_gps = NULL;
1052     static GtkWidget *btn_buttons = NULL;
1053     static GtkWidget *btn_colors = NULL;
1054
1055     static GtkWidget *txt_poi_db = NULL;
1056     static GtkWidget *btn_browse_poi = NULL;
1057     static GtkWidget *num_poi_zoom = NULL;
1058     static GtkWidget *num_auto_download_precache = NULL;
1059     static GtkWidget *chk_speed_limit_on = NULL;
1060     static GtkWidget *num_speed = NULL;
1061     static GtkWidget *cmb_speed_location = NULL;
1062     static GtkWidget *cmb_unblank_option = NULL;
1063     static GtkWidget *cmb_info_font_size = NULL;
1064
1065     static BrowseInfo poi_browse_info = {0, 0};
1066     static BrowseInfo gps_file_browse_info = {0, 0};
1067     static ScanInfo scan_info = {0};
1068     gboolean rcvr_changed = FALSE;
1069     gint i;
1070     printf("%s()\n", __PRETTY_FUNCTION__);
1071
1072     if(dialog == NULL)
1073     {
1074         dialog = gtk_dialog_new_with_buttons(_("Settings"),
1075                 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
1076                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1077                 NULL);
1078
1079         /* Enable the help button. */
1080 #ifndef LEGACY
1081         hildon_help_dialog_help_enable(
1082 #else
1083         ossohelp_dialog_help_enable(
1084 #endif 
1085                 GTK_DIALOG(dialog), HELP_ID_SETTINGS, _osso);
1086
1087         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
1088                btn_buttons = gtk_button_new_with_label(_("Hardware Keys...")));
1089
1090         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
1091                 btn_colors = gtk_button_new_with_label(_("Colors...")));
1092
1093         gtk_dialog_add_button(GTK_DIALOG(dialog),
1094                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
1095
1096         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
1097                 notebook = gtk_notebook_new(), TRUE, TRUE, 0);
1098
1099         /* Receiver page. */
1100         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1101                 table = gtk_table_new(3, 4, FALSE),
1102                 label = gtk_label_new(_("GPS")));
1103
1104         /* Receiver MAC Address. */
1105         gtk_table_attach(GTK_TABLE(table),
1106                 rad_gps_bt = gtk_radio_button_new_with_label(
1107                     NULL, _("Bluetooth")),
1108                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1109         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1110         gtk_table_attach(GTK_TABLE(table),
1111                 hbox = gtk_hbox_new(FALSE, 4),
1112                 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1113         gtk_box_pack_start(GTK_BOX(hbox),
1114                 txt_gps_bt_mac = gtk_entry_new(),
1115                 TRUE, TRUE, 0);
1116 #ifndef LEGACY
1117         g_object_set(G_OBJECT(txt_gps_bt_mac), "hildon-input-mode",
1118                 HILDON_GTK_INPUT_MODE_FULL, NULL);
1119 #else
1120         g_object_set(G_OBJECT(txt_gps_bt_mac), HILDON_AUTOCAP, FALSE, NULL);
1121 #endif
1122         gtk_box_pack_start(GTK_BOX(hbox),
1123                 btn_scan = gtk_button_new_with_label(_("Scan...")),
1124                 FALSE, FALSE, 0);
1125
1126         /* File Path (RFComm). */
1127         gtk_table_attach(GTK_TABLE(table),
1128                 rad_gps_file = gtk_radio_button_new_with_label_from_widget(
1129                     GTK_RADIO_BUTTON(rad_gps_bt), _("File Path")),
1130                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1131         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1132         gtk_table_attach(GTK_TABLE(table),
1133                 hbox = gtk_hbox_new(FALSE, 4),
1134                 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1135         gtk_box_pack_start(GTK_BOX(hbox),
1136                 txt_gps_file_path = gtk_entry_new(),
1137                 TRUE, TRUE, 0);
1138 #ifndef LEGACY
1139         g_object_set(G_OBJECT(txt_gps_file_path), "hildon-input-mode",
1140                 HILDON_GTK_INPUT_MODE_FULL, NULL);
1141 #else
1142         g_object_set(G_OBJECT(txt_gps_file_path), HILDON_AUTOCAP, FALSE, NULL);
1143 #endif
1144         gtk_box_pack_start(GTK_BOX(hbox),
1145                 btn_browse_gps = gtk_button_new_with_label(_("Browse...")),
1146                 FALSE, FALSE, 0);
1147
1148         /* GPSD Hostname and Port. */
1149         gtk_table_attach(GTK_TABLE(table),
1150                 rad_gps_gpsd = gtk_radio_button_new_with_label_from_widget(
1151                     GTK_RADIO_BUTTON(rad_gps_bt), _("GPSD Host")),
1152                 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1153         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1154         gtk_table_attach(GTK_TABLE(table),
1155                 hbox = gtk_hbox_new(FALSE, 4),
1156                 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1157         gtk_box_pack_start(GTK_BOX(hbox),
1158                 txt_gps_gpsd_host = gtk_entry_new(),
1159                 TRUE, TRUE, 0);
1160 #ifndef LEGACY
1161         g_object_set(G_OBJECT(txt_gps_gpsd_host), "hildon-input-mode",
1162                 HILDON_GTK_INPUT_MODE_FULL, NULL);
1163 #else
1164         g_object_set(G_OBJECT(txt_gps_gpsd_host), HILDON_AUTOCAP, FALSE, NULL);
1165 #endif
1166         gtk_box_pack_start(GTK_BOX(hbox),
1167                 label = gtk_label_new(_("Port")),
1168                 FALSE, FALSE, 0);
1169         gtk_box_pack_start(GTK_BOX(hbox),
1170                 num_gps_gpsd_port = hildon_number_editor_new(1, 65535),
1171                 FALSE, FALSE, 0);
1172
1173
1174         /* Auto-Center page. */
1175         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1176                 table = gtk_table_new(3, 3, FALSE),
1177                 label = gtk_label_new(_("Auto-Center")));
1178
1179         /* Lead Amount. */
1180         gtk_table_attach(GTK_TABLE(table),
1181                 label = gtk_label_new(_("Lead Amount")),
1182                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1183         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1184         gtk_table_attach(GTK_TABLE(table),
1185                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1186                 1, 2, 0, 1, GTK_FILL, 0, 2, 4);
1187         gtk_container_add(GTK_CONTAINER(label),
1188                 num_lead_ratio = hildon_controlbar_new());
1189         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_lead_ratio), 1, 10);
1190         force_min_visible_bars(HILDON_CONTROLBAR(num_lead_ratio), 1);
1191
1192         gtk_table_attach(GTK_TABLE(table),
1193                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1194                 2, 3, 0, 1, GTK_FILL, 0, 2, 4);
1195         gtk_container_add(GTK_CONTAINER(label),
1196             chk_lead_is_fixed = gtk_check_button_new_with_label(_("Fixed")));
1197
1198         /* Auto-Center Pan Sensitivity. */
1199         gtk_table_attach(GTK_TABLE(table),
1200                 label = gtk_label_new(_("Pan Sensitivity")),
1201                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1202         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1203         gtk_table_attach(GTK_TABLE(table),
1204                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1205                 1, 2, 1, 2, GTK_FILL, 0, 2, 4);
1206         gtk_container_add(GTK_CONTAINER(label),
1207                 num_center_ratio = hildon_controlbar_new());
1208         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_center_ratio), 1,10);
1209         force_min_visible_bars(HILDON_CONTROLBAR(num_center_ratio), 1);
1210
1211         gtk_table_attach(GTK_TABLE(table),
1212                 hbox = gtk_hbox_new(FALSE, 4),
1213                 2, 3, 1, 2, GTK_FILL, 0, 2, 4);
1214         gtk_box_pack_start(GTK_BOX(hbox),
1215                 label = gtk_label_new(_("Min. Speed")),
1216                 TRUE, TRUE, 4);
1217         gtk_box_pack_start(GTK_BOX(hbox),
1218                 num_ac_min_speed = hildon_number_editor_new(0, 99),
1219                 TRUE, TRUE, 4);
1220
1221         /* Auto-Center Rotate Sensitivity. */
1222         gtk_table_attach(GTK_TABLE(table),
1223                 label = gtk_label_new(_("Rotate Sensit.")),
1224                 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1225         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1226         gtk_table_attach(GTK_TABLE(table),
1227                 num_rotate_sens = hildon_controlbar_new(),
1228                 1, 2, 2, 3, GTK_FILL, 0, 2, 4);
1229         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_rotate_sens), 1,10);
1230         force_min_visible_bars(HILDON_CONTROLBAR(num_rotate_sens), 1);
1231
1232         gtk_table_attach(GTK_TABLE(table),
1233                 hbox = gtk_hbox_new(FALSE, 4),
1234                 2, 3, 2, 3, GTK_FILL, 0, 2, 4);
1235         gtk_box_pack_start(GTK_BOX(hbox),
1236                 label = gtk_label_new(_("Points")),
1237                 TRUE, TRUE, 4);
1238         gtk_box_pack_start(GTK_BOX(hbox),
1239                 cmb_rotate_dir = gtk_combo_box_new_text(),
1240                 TRUE, TRUE, 4);
1241         for(i = 0; i < ROTATE_DIR_ENUM_COUNT; i++)
1242             gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_rotate_dir),
1243                     ROTATE_DIR_ENUM_TEXT[i]);
1244
1245         /* Announcement. */
1246         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1247                 table = gtk_table_new(2, 3, FALSE),
1248                 label = gtk_label_new(_("Announce")));
1249
1250         /* Announcement Advance Notice. */
1251         gtk_table_attach(GTK_TABLE(table),
1252                 label = gtk_label_new(_("Advance Notice")),
1253                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1254         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1255         gtk_table_attach(GTK_TABLE(table),
1256                 num_announce_notice = hildon_controlbar_new(),
1257                 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1258         hildon_controlbar_set_range(
1259                 HILDON_CONTROLBAR(num_announce_notice), 1, 20);
1260         force_min_visible_bars(HILDON_CONTROLBAR(num_announce_notice), 1);
1261
1262         /* Enable Voice. */
1263         gtk_table_attach(GTK_TABLE(table),
1264                 chk_enable_voice = gtk_check_button_new_with_label(
1265                     _("Enable Voice Synthesis (requires flite)")),
1266                 0, 2, 1, 2, GTK_FILL, 0, 2, 4);
1267         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_enable_voice),
1268                 _enable_voice);
1269
1270         /* Misc. page. */
1271         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1272                 table = gtk_table_new(3, 5, FALSE),
1273                 label = gtk_label_new(_("Misc.")));
1274
1275         /* Line Width. */
1276         gtk_table_attach(GTK_TABLE(table),
1277                 label = gtk_label_new(_("Line Width")),
1278                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1279         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1280         gtk_table_attach(GTK_TABLE(table),
1281                 num_draw_width = hildon_controlbar_new(),
1282                 1, 5, 0, 1, GTK_FILL, 0, 2, 4);
1283         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_draw_width), 1, 20);
1284         force_min_visible_bars(HILDON_CONTROLBAR(num_draw_width), 1);
1285
1286         /* Unblank Screen */
1287         gtk_table_attach(GTK_TABLE(table),
1288                 label = gtk_label_new(_("Unblank Screen")),
1289                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1290         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1291         gtk_table_attach(GTK_TABLE(table),
1292                 cmb_unblank_option = gtk_combo_box_new_text(),
1293                 1, 5, 1, 2, GTK_FILL, 0, 2, 4);
1294         for(i = 0; i < UNBLANK_ENUM_COUNT; i++)
1295             gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_unblank_option),
1296                     UNBLANK_ENUM_TEXT[i]);
1297
1298         /* Information Font Size. */
1299         gtk_table_attach(GTK_TABLE(table),
1300                 label = gtk_label_new(_("Info Font Size")),
1301                 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1302         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1303         gtk_table_attach(GTK_TABLE(table),
1304                 cmb_info_font_size = gtk_combo_box_new_text(),
1305                 1, 2, 2, 3, GTK_FILL, 0, 2, 4);
1306         for(i = 0; i < INFO_FONT_ENUM_COUNT; i++)
1307             gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_info_font_size),
1308                     INFO_FONT_ENUM_TEXT[i]);
1309
1310         gtk_table_attach(GTK_TABLE(table),
1311                 gtk_vseparator_new(),
1312                 2, 3, 2, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 2,4);
1313
1314
1315         /* Units. */
1316         gtk_table_attach(GTK_TABLE(table),
1317                 label = gtk_label_new(_("Units")),
1318                 3, 4, 2, 3, GTK_FILL, 0, 2, 4);
1319         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1320         gtk_table_attach(GTK_TABLE(table),
1321                 cmb_units = gtk_combo_box_new_text(),
1322                 4, 5, 2, 3, GTK_FILL, 0, 2, 4);
1323         for(i = 0; i < UNITS_ENUM_COUNT; i++)
1324             gtk_combo_box_append_text(
1325                     GTK_COMBO_BOX(cmb_units), UNITS_ENUM_TEXT[i]);
1326
1327         /* Misc. 2 page. */
1328         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1329                 table = gtk_table_new(3, 4, FALSE),
1330                 label = gtk_label_new(_("Misc. 2")));
1331
1332         /* Degrees format */
1333         gtk_table_attach(GTK_TABLE(table),
1334                 label = gtk_label_new(_("Degrees Format")),
1335                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1336         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1337         gtk_table_attach(GTK_TABLE(table),
1338                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1339                 1, 2, 0, 1, GTK_FILL, 0, 2, 4);
1340         gtk_container_add(GTK_CONTAINER(label),
1341                 cmb_degformat = gtk_combo_box_new_text());
1342         for(i = 0; i < DEG_FORMAT_ENUM_COUNT; i++)
1343             gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_degformat),
1344                 DEG_FORMAT_ENUM_TEXT[i]);
1345
1346         gtk_table_attach(GTK_TABLE(table),
1347                 label = gtk_label_new(_("Auto-Download Pre-cache")),
1348                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1349         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1350         gtk_table_attach(GTK_TABLE(table),
1351                 num_auto_download_precache = hildon_controlbar_new(),
1352                 1, 2, 1, 2, GTK_FILL, 0, 2, 4);
1353         hildon_controlbar_set_range(
1354                 HILDON_CONTROLBAR(num_auto_download_precache), 1, 5);
1355         force_min_visible_bars(
1356                 HILDON_CONTROLBAR(num_auto_download_precache), 1);
1357
1358         /* Speed warner. */
1359         gtk_table_attach(GTK_TABLE(table),
1360                 hbox = gtk_hbox_new(FALSE, 4),
1361                 0, 4, 2, 3, GTK_FILL, 0, 2, 4);
1362
1363         gtk_box_pack_start(GTK_BOX(hbox),
1364                 chk_speed_limit_on = gtk_check_button_new_with_label(
1365                     _("Speed Limit")),
1366                 FALSE, FALSE, 0);
1367
1368         gtk_box_pack_start(GTK_BOX(hbox),
1369                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1370                 FALSE, FALSE, 0);
1371         gtk_container_add(GTK_CONTAINER(label),
1372                 num_speed = hildon_number_editor_new(0, 999));
1373
1374         gtk_box_pack_start(GTK_BOX(hbox),
1375                 label = gtk_label_new(_("Location")),
1376                 FALSE, FALSE, 0);
1377         gtk_box_pack_start(GTK_BOX(hbox),
1378                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1379                 FALSE, FALSE, 0);
1380         gtk_container_add(GTK_CONTAINER(label),
1381                 cmb_speed_location = gtk_combo_box_new_text());
1382         for(i = 0; i < SPEED_LOCATION_ENUM_COUNT; i++)
1383             gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_speed_location),
1384                     SPEED_LOCATION_ENUM_TEXT[i]);
1385
1386
1387         /* POI page */
1388         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1389                 table = gtk_table_new(2, 3, FALSE),
1390                 label = gtk_label_new(_("POI")));
1391
1392         /* POI database. */
1393         gtk_table_attach(GTK_TABLE(table),
1394                 label = gtk_label_new(_("POI database")),
1395                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1396         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1397         gtk_table_attach(GTK_TABLE(table),
1398                 hbox = gtk_hbox_new(FALSE, 4),
1399                 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1400         gtk_box_pack_start(GTK_BOX(hbox),
1401                 txt_poi_db = gtk_entry_new(),
1402                 TRUE, TRUE, 0);
1403 #ifndef LEGACY
1404         g_object_set(G_OBJECT(txt_poi_db), "hildon-input-mode",
1405                 HILDON_GTK_INPUT_MODE_FULL, NULL);
1406 #else
1407         g_object_set(G_OBJECT(txt_poi_db), HILDON_AUTOCAP, FALSE, NULL);
1408 #endif
1409         gtk_box_pack_start(GTK_BOX(hbox),
1410                 btn_browse_poi = gtk_button_new_with_label(_("Browse...")),
1411                 FALSE, FALSE, 0);
1412
1413         /* Show POI below zoom. */
1414         gtk_table_attach(GTK_TABLE(table),
1415                 label = gtk_label_new(_("Show POI below zoom")),
1416                 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1417         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1418         gtk_table_attach(GTK_TABLE(table),
1419                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1420                 1, 2, 2, 3, GTK_FILL, 0, 2, 4);
1421         gtk_container_add(GTK_CONTAINER(label),
1422                 num_poi_zoom = hildon_number_editor_new(0, MAX_ZOOM));
1423
1424         /* Connect signals. */
1425         memset(&scan_info, 0, sizeof(scan_info));
1426         scan_info.settings_dialog = dialog;
1427         scan_info.txt_gps_bt_mac = txt_gps_bt_mac;
1428         g_signal_connect(G_OBJECT(btn_scan), "clicked",
1429                          G_CALLBACK(scan_bluetooth), &scan_info);
1430         g_signal_connect(G_OBJECT(btn_buttons), "clicked",
1431                          G_CALLBACK(settings_dialog_hardkeys), dialog);
1432         g_signal_connect(G_OBJECT(btn_colors), "clicked",
1433                          G_CALLBACK(settings_dialog_colors), dialog);
1434
1435         poi_browse_info.dialog = dialog;
1436         poi_browse_info.txt = txt_poi_db;
1437         g_signal_connect(G_OBJECT(btn_browse_poi), "clicked",
1438                 G_CALLBACK(settings_dialog_browse_forfile), &poi_browse_info);
1439
1440         gps_file_browse_info.dialog = dialog;
1441         gps_file_browse_info.txt = txt_gps_file_path;
1442         g_signal_connect(G_OBJECT(btn_browse_gps), "clicked",
1443                 G_CALLBACK(settings_dialog_browse_forfile),
1444                 &gps_file_browse_info);
1445     }
1446
1447
1448     /* Initialize fields. */
1449     if(_gri.bt_mac)
1450         gtk_entry_set_text(GTK_ENTRY(txt_gps_bt_mac), _gri.bt_mac);
1451     if(_gri.gpsd_host)
1452         gtk_entry_set_text(GTK_ENTRY(txt_gps_gpsd_host), _gri.gpsd_host);
1453     hildon_number_editor_set_value(
1454             HILDON_NUMBER_EDITOR(num_gps_gpsd_port), _gri.gpsd_port);
1455     if(_gri.file_path)
1456         gtk_entry_set_text(GTK_ENTRY(txt_gps_file_path), _gri.file_path);
1457     switch(_gri.type)
1458     {
1459         case GPS_RCVR_GPSD:
1460             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad_gps_gpsd),TRUE);
1461             break;
1462         case GPS_RCVR_FILE:
1463             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad_gps_file),TRUE);
1464             break;
1465         default: /* Including GPS_RCVR_BT */
1466             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad_gps_bt), TRUE);
1467             break;
1468     }
1469
1470     if(_poi_db_filename)
1471         gtk_entry_set_text(GTK_ENTRY(txt_poi_db), _poi_db_filename);
1472     hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_poi_zoom),
1473             _poi_zoom);
1474     hildon_controlbar_set_value(HILDON_CONTROLBAR(num_center_ratio),
1475             _center_ratio);
1476     hildon_controlbar_set_value(HILDON_CONTROLBAR(num_lead_ratio),
1477             _lead_ratio);
1478     gtk_toggle_button_set_active(
1479             GTK_TOGGLE_BUTTON(chk_lead_is_fixed), _lead_is_fixed);
1480     hildon_controlbar_set_value(HILDON_CONTROLBAR(num_rotate_sens),
1481             _rotate_sens);
1482     gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_rotate_dir), _rotate_dir);
1483     hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_ac_min_speed),
1484             _ac_min_speed);
1485     hildon_controlbar_set_value(HILDON_CONTROLBAR(num_announce_notice),
1486             _announce_notice_ratio);
1487     hildon_controlbar_set_value(HILDON_CONTROLBAR(num_draw_width),
1488             _draw_width);
1489     gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_units), _units);
1490     gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_degformat), _degformat);
1491     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_speed_limit_on),
1492             _speed_limit_on);
1493     hildon_controlbar_set_value(HILDON_CONTROLBAR(num_auto_download_precache),
1494             _auto_download_precache);
1495     hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_speed),
1496             _speed_limit);
1497     gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_speed_location),
1498             _speed_location);
1499     gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_unblank_option),
1500             _unblank_option);
1501     gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_info_font_size),
1502             _info_font_size);
1503
1504     gtk_widget_show_all(dialog);
1505
1506     while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
1507     {
1508         GpsRcvrType new_grtype;
1509
1510         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_gpsd))
1511                 && !*gtk_entry_get_text(GTK_ENTRY(txt_gps_gpsd_host)))
1512         {
1513             popup_error(dialog, _("Please specify a GPSD hostname."));
1514             continue;
1515         }
1516
1517         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_file))
1518                 && !*gtk_entry_get_text(GTK_ENTRY(txt_gps_file_path)))
1519         {
1520             popup_error(dialog, _("Please specify a GPS file pathname."));
1521             continue;
1522         }
1523
1524         /* Set _gri.bt_mac if necessary. */
1525         if(!*gtk_entry_get_text(GTK_ENTRY(txt_gps_bt_mac)))
1526         {
1527             /* User specified no rcvr mac - set _gri.bt_mac to NULL. */
1528             if(_gri.bt_mac)
1529             {
1530                 g_free(_gri.bt_mac);
1531                 _gri.bt_mac = NULL;
1532                 rcvr_changed = (_gri.type == GPS_RCVR_BT);
1533             }
1534         }
1535         else if(!_gri.bt_mac || strcmp(_gri.bt_mac,
1536                       gtk_entry_get_text(GTK_ENTRY(txt_gps_bt_mac))))
1537         {
1538             /* User specified a new rcvr mac. */
1539             g_free(_gri.bt_mac);
1540             _gri.bt_mac = g_strdup(gtk_entry_get_text(
1541                         GTK_ENTRY(txt_gps_bt_mac)));
1542             rcvr_changed = (_gri.type == GPS_RCVR_BT);
1543         }
1544
1545         /* Set _gri.gpsd_host if necessary. */
1546         if(!*gtk_entry_get_text(GTK_ENTRY(txt_gps_gpsd_host)))
1547         {
1548             /* User specified no rcvr mac - set _gri.gpsd_host to NULL. */
1549             if(_gri.gpsd_host)
1550             {
1551                 g_free(_gri.gpsd_host);
1552                 _gri.gpsd_host = NULL;
1553                 rcvr_changed = (_gri.type == GPS_RCVR_GPSD);
1554             }
1555         }
1556         else if(!_gri.gpsd_host || strcmp(_gri.gpsd_host,
1557                       gtk_entry_get_text(GTK_ENTRY(txt_gps_gpsd_host))))
1558         {
1559             /* User specified a new rcvr mac. */
1560             g_free(_gri.gpsd_host);
1561             _gri.gpsd_host = g_strdup(gtk_entry_get_text(
1562                         GTK_ENTRY(txt_gps_gpsd_host)));
1563             rcvr_changed = (_gri.type == GPS_RCVR_GPSD);
1564         }
1565
1566         if(_gri.gpsd_port != hildon_number_editor_get_value(
1567                     HILDON_NUMBER_EDITOR(num_gps_gpsd_port)))
1568         {
1569             _gri.gpsd_port = hildon_number_editor_get_value(
1570                     HILDON_NUMBER_EDITOR(num_gps_gpsd_port));
1571             rcvr_changed = (_gri.type == GPS_RCVR_GPSD);
1572         }
1573
1574         /* Set _gri.file_path if necessary. */
1575         if(!*gtk_entry_get_text(GTK_ENTRY(txt_gps_file_path)))
1576         {
1577             /* User specified no rcvr mac - set _gri.file_path to NULL. */
1578             if(_gri.file_path)
1579             {
1580                 g_free(_gri.file_path);
1581                 _gri.file_path = NULL;
1582                 rcvr_changed = (_gri.type == GPS_RCVR_FILE);
1583             }
1584         }
1585         else if(!_gri.file_path || strcmp(_gri.file_path,
1586                       gtk_entry_get_text(GTK_ENTRY(txt_gps_file_path))))
1587         {
1588             /* User specified a new rcvr mac. */
1589             g_free(_gri.file_path);
1590             _gri.file_path = g_strdup(gtk_entry_get_text(
1591                         GTK_ENTRY(txt_gps_file_path)));
1592             rcvr_changed = (_gri.type == GPS_RCVR_FILE);
1593         }
1594
1595         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_bt)))
1596             new_grtype = GPS_RCVR_BT;
1597         else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_gpsd)))
1598             new_grtype = GPS_RCVR_GPSD;
1599         else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_file)))
1600             new_grtype = GPS_RCVR_FILE;
1601         else
1602             new_grtype = GPS_RCVR_BT;
1603
1604         if(new_grtype != _gri.type)
1605         {
1606             _gri.type = new_grtype;
1607             rcvr_changed = TRUE;
1608         }
1609
1610         _center_ratio = hildon_controlbar_get_value(
1611                 HILDON_CONTROLBAR(num_center_ratio));
1612
1613         _lead_ratio = hildon_controlbar_get_value(
1614                 HILDON_CONTROLBAR(num_lead_ratio));
1615
1616         _lead_is_fixed = gtk_toggle_button_get_active(
1617                 GTK_TOGGLE_BUTTON(chk_lead_is_fixed));
1618
1619         _rotate_sens = hildon_controlbar_get_value(
1620                 HILDON_CONTROLBAR(num_rotate_sens));
1621
1622         _ac_min_speed = hildon_number_editor_get_value(
1623                 HILDON_NUMBER_EDITOR(num_ac_min_speed));
1624
1625         _rotate_dir = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_rotate_dir));
1626
1627         _auto_download_precache = hildon_controlbar_get_value(
1628                 HILDON_CONTROLBAR(num_auto_download_precache));
1629
1630         _draw_width = hildon_controlbar_get_value(
1631                 HILDON_CONTROLBAR(num_draw_width));
1632
1633         _units = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_units));
1634         _degformat = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_degformat));
1635
1636         _speed_limit_on = gtk_toggle_button_get_active(
1637                 GTK_TOGGLE_BUTTON(chk_speed_limit_on));
1638         _speed_limit = hildon_number_editor_get_value(
1639                 HILDON_NUMBER_EDITOR(num_speed));
1640         _speed_location = gtk_combo_box_get_active(
1641                 GTK_COMBO_BOX(cmb_speed_location));
1642
1643         _unblank_option = gtk_combo_box_get_active(
1644                 GTK_COMBO_BOX(cmb_unblank_option));
1645
1646         _info_font_size = gtk_combo_box_get_active(
1647                 GTK_COMBO_BOX(cmb_info_font_size));
1648
1649         _announce_notice_ratio = hildon_controlbar_get_value(
1650                 HILDON_CONTROLBAR(num_announce_notice));
1651
1652         _enable_voice = gtk_toggle_button_get_active(
1653                 GTK_TOGGLE_BUTTON(chk_enable_voice));
1654
1655         /* Check if user specified a different POI database from before. */
1656         if((!_poi_db_filename && *gtk_entry_get_text(GTK_ENTRY(txt_poi_db)))
1657                 || strcmp(_poi_db_filename,
1658                     gtk_entry_get_text(GTK_ENTRY(txt_poi_db))))
1659         {
1660             /* Clear old filename/dirname, if necessary. */
1661             if(_poi_db_filename)
1662             {
1663                 g_free(_poi_db_filename);
1664                 _poi_db_filename = NULL;
1665                 g_free(_poi_db_dirname);
1666                 _poi_db_dirname = NULL;
1667             }
1668
1669             if(*gtk_entry_get_text(GTK_ENTRY(txt_poi_db)))
1670             {
1671                 _poi_db_filename = g_strdup(gtk_entry_get_text(
1672                             GTK_ENTRY(txt_poi_db)));
1673                 _poi_db_dirname = g_path_get_dirname(_poi_db_filename);
1674             }
1675
1676             poi_db_connect();
1677         }
1678
1679         _poi_zoom = hildon_number_editor_get_value(
1680                 HILDON_NUMBER_EDITOR(num_poi_zoom));
1681
1682         update_gcs();
1683
1684         settings_save();
1685
1686         map_force_redraw();
1687         map_refresh_mark(TRUE);
1688
1689         break;
1690     }
1691
1692     gtk_widget_hide(dialog);
1693
1694     vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, rcvr_changed);
1695     return rcvr_changed;
1696 }
1697
1698 RepoData*
1699 settings_parse_repo(gchar *str)
1700 {
1701     /* Parse each part of a repo, delimited by newline characters:
1702      * 1. name
1703      * 2. url
1704      * 3. db_filename
1705      * 4. dl_zoom_steps
1706      * 5. view_zoom_steps
1707      */
1708     gchar *token, *error_check;
1709     printf("%s(%s)\n", __PRETTY_FUNCTION__, str);
1710
1711     RepoData *rd = g_new0(RepoData, 1);
1712
1713     /* Parse name. */
1714     token = strsep(&str, "\n\t");
1715     if(token)
1716         rd->name = g_strdup(token);
1717
1718     /* Parse URL format. */
1719     token = strsep(&str, "\n\t");
1720     if(token)
1721         rd->url = g_strdup(token);
1722
1723     /* Parse cache dir. */
1724     token = strsep(&str, "\n\t");
1725     if(token)
1726         rd->db_filename = gnome_vfs_expand_initial_tilde(token);
1727
1728     /* Parse download zoom steps. */
1729     token = strsep(&str, "\n\t");
1730     if(!token || !*token || !(rd->dl_zoom_steps = atoi(token)))
1731         rd->dl_zoom_steps = 2;
1732
1733     /* Parse view zoom steps. */
1734     token = strsep(&str, "\n\t");
1735     if(!token || !*token || !(rd->view_zoom_steps = atoi(token)))
1736         rd->view_zoom_steps = 1;
1737
1738     /* Parse double-size. */
1739     token = strsep(&str, "\n\t");
1740     if(token)
1741         rd->double_size = atoi(token); /* Default is zero (FALSE) */
1742
1743     /* Parse next-able. */
1744     token = strsep(&str, "\n\t");
1745     if(!token || !*token
1746             || (rd->nextable = strtol(token, &error_check, 10), token == str))
1747         rd->nextable = TRUE;
1748
1749     /* Parse min zoom. */
1750     token = strsep(&str, "\n\t");
1751     if(!token || !*token
1752             || (rd->min_zoom = strtol(token, &error_check, 10), token == str))
1753         rd->min_zoom = 4;
1754
1755     /* Parse max zoom. */
1756     token = strsep(&str, "\n\t");
1757     if(!token || !*token
1758             || (rd->max_zoom = strtol(token, &error_check, 10), token == str))
1759         rd->max_zoom = 20;
1760
1761     set_repo_type(rd);
1762
1763     vprintf("%s(): return %p\n", __PRETTY_FUNCTION__, rd);
1764     return rd;
1765 }
1766
1767 /**
1768  * Initialize all configuration from GCONF.  This should not be called more
1769  * than once during execution.
1770  */
1771 void
1772 settings_init()
1773 {
1774     GConfValue *value;
1775     GConfClient *gconf_client = gconf_client_get_default();
1776     gchar *str;
1777     printf("%s()\n", __PRETTY_FUNCTION__);
1778
1779     if(!gconf_client)
1780     {
1781         popup_error(_window, _("Failed to initialize GConf.  Quitting."));
1782         exit(1);
1783     }
1784
1785     /* Get GPS Receiver Type.  Default is Bluetooth Receiver. */
1786     {
1787         gchar *gri_type_str = gconf_client_get_string(gconf_client,
1788                 GCONF_KEY_GPS_RCVR_TYPE, NULL);
1789         gint i = 0;
1790         if(gri_type_str)
1791             for(i = GPS_RCVR_ENUM_COUNT - 1; i > 0; i--)
1792                 if(!strcmp(gri_type_str, GPS_RCVR_ENUM_TEXT[i]))
1793                     break;
1794         _gri.type = i;
1795     }
1796
1797     /* Get Bluetooth Receiver MAC.  Default is NULL. */
1798     _gri.bt_mac = gconf_client_get_string(
1799             gconf_client, GCONF_KEY_GPS_BT_MAC, NULL);
1800
1801     /* Get GPSD Host.  Default is localhost. */
1802     _gri.gpsd_host = gconf_client_get_string(
1803             gconf_client, GCONF_KEY_GPS_GPSD_HOST, NULL);
1804     if(!_gri.gpsd_host)
1805         _gri.gpsd_host = g_strdup("127.0.0.1");
1806
1807     /* Get GPSD Port.  Default is GPSD_PORT_DEFAULT (2947). */
1808     if(!(_gri.gpsd_port = gconf_client_get_int(
1809             gconf_client, GCONF_KEY_GPS_GPSD_PORT, NULL)))
1810         _gri.gpsd_port = GPSD_PORT_DEFAULT;
1811
1812     /* Get File Path.  Default is /dev/pgps. */
1813     _gri.file_path = gconf_client_get_string(
1814             gconf_client, GCONF_KEY_GPS_FILE_PATH, NULL);
1815     if(!_gri.file_path)
1816         _gri.file_path = g_strdup("/dev/pgps");
1817
1818     /* Get Auto-Download.  Default is FALSE. */
1819     _auto_download = gconf_client_get_bool(gconf_client,
1820             GCONF_KEY_AUTO_DOWNLOAD, NULL);
1821
1822     /* Get Auto-Download Pre-cache - Default is 2. */
1823     _auto_download_precache = gconf_client_get_int(gconf_client,
1824             GCONF_KEY_AUTO_DOWNLOAD_PRECACHE, NULL);
1825     if(!_auto_download_precache)
1826         _auto_download_precache = 2;
1827
1828     /* Get Center Ratio - Default is 5. */
1829     _center_ratio = gconf_client_get_int(gconf_client,
1830             GCONF_KEY_CENTER_SENSITIVITY, NULL);
1831     if(!_center_ratio)
1832         _center_ratio = 5;
1833
1834     /* Get Lead Ratio - Default is 5. */
1835     _lead_ratio = gconf_client_get_int(gconf_client,
1836             GCONF_KEY_LEAD_AMOUNT, NULL);
1837     if(!_lead_ratio)
1838         _lead_ratio = 5;
1839
1840     /* Get Lead Is Fixed flag - Default is FALSE. */
1841     _lead_is_fixed = gconf_client_get_bool(gconf_client,
1842             GCONF_KEY_LEAD_IS_FIXED, NULL);
1843
1844     /* Get Rotate Sensitivity - Default is 5. */
1845     _rotate_sens = gconf_client_get_int(gconf_client,
1846             GCONF_KEY_ROTATE_SENSITIVITY, NULL);
1847     if(!_rotate_sens)
1848         _rotate_sens = 5;
1849
1850     /* Get Auto-Center/Rotate Minimum Speed - Default is 2. */
1851     value = gconf_client_get(gconf_client, GCONF_KEY_AC_MIN_SPEED, NULL);
1852     if(value)
1853     {
1854         _ac_min_speed = gconf_value_get_int(value);
1855         gconf_value_free(value);
1856     }
1857     else
1858         _ac_min_speed = 2;
1859
1860     /* Get Rotate Dir - Default is ROTATE_DIR_UP. */
1861     {
1862         gchar *rotate_dir_str = gconf_client_get_string(gconf_client,
1863                 GCONF_KEY_ROTATE_DIR, NULL);
1864         gint i = -1;
1865         if(rotate_dir_str)
1866             for(i = ROTATE_DIR_ENUM_COUNT - 1; i >= 0; i--)
1867                 if(!strcmp(rotate_dir_str, ROTATE_DIR_ENUM_TEXT[i]))
1868                     break;
1869         if(i == -1)
1870             i = ROTATE_DIR_UP;
1871         _rotate_dir = i;
1872     }
1873
1874     /* Get Draw Line Width- Default is 5. */
1875     _draw_width = gconf_client_get_int(gconf_client,
1876             GCONF_KEY_DRAW_WIDTH, NULL);
1877     if(!_draw_width)
1878         _draw_width = 5;
1879
1880     /* Get Announce Advance Notice - Default is 30. */
1881     value = gconf_client_get(gconf_client, GCONF_KEY_ANNOUNCE_NOTICE, NULL);
1882     if(value)
1883     {
1884         _announce_notice_ratio = gconf_value_get_int(value);
1885         gconf_value_free(value);
1886     }
1887     else
1888         _announce_notice_ratio = 8;
1889
1890     /* Get Enable Voice flag.  Default is TRUE. */
1891     value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_VOICE, NULL);
1892     if(value)
1893     {
1894         _enable_voice = gconf_value_get_bool(value);
1895         gconf_value_free(value);
1896     }
1897     else
1898         _enable_voice = TRUE;
1899
1900     /* Get Fullscreen flag. Default is FALSE. */
1901     _fullscreen = gconf_client_get_bool(gconf_client,
1902             GCONF_KEY_FULLSCREEN, NULL);
1903
1904     /* Get Units.  Default is UNITS_KM. */
1905     {
1906         gchar *units_str = gconf_client_get_string(gconf_client,
1907                 GCONF_KEY_UNITS, NULL);
1908         gint i = 0;
1909         if(units_str)
1910             for(i = UNITS_ENUM_COUNT - 1; i > 0; i--)
1911                 if(!strcmp(units_str, UNITS_ENUM_TEXT[i]))
1912                     break;
1913         _units = i;
1914     }
1915
1916     /* Get Custom Key Actions. */
1917     {
1918         gint i;
1919         for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
1920         {
1921             gint j = CUSTOM_KEY_DEFAULT[i];
1922             gchar *str = gconf_client_get_string(gconf_client,
1923                     CUSTOM_KEY_GCONF[i], NULL);
1924             if(str)
1925                 for(j = CUSTOM_ACTION_ENUM_COUNT - 1; j > 0; j--)
1926                     if(!strcmp(str, CUSTOM_ACTION_ENUM_TEXT[j]))
1927                         break;
1928             _action[i] = j;
1929         }
1930     }
1931
1932     /* Get Deg format.  Default is DDPDDDDD. */
1933     {
1934         gchar *degformat_key_str = gconf_client_get_string(gconf_client,
1935                 GCONF_KEY_DEG_FORMAT, NULL);
1936         gint i = 0;
1937         if(degformat_key_str)
1938             for(i = DEG_FORMAT_ENUM_COUNT - 1; i > 0; i--)
1939                 if(!strcmp(degformat_key_str, DEG_FORMAT_ENUM_TEXT[i]))
1940                     break;
1941         _degformat = i;
1942     }
1943
1944     /* Get Speed Limit On flag.  Default is FALSE. */
1945     _speed_limit_on = gconf_client_get_bool(gconf_client,
1946             GCONF_KEY_SPEED_LIMIT_ON, NULL);
1947
1948     /* Get Speed Limit */
1949     _speed_limit = gconf_client_get_int(gconf_client,
1950             GCONF_KEY_SPEED_LIMIT, NULL);
1951     if(_speed_limit <= 0)
1952         _speed_limit = 100;
1953
1954     /* Get Speed Location.  Default is SPEED_LOCATION_TOP_LEFT. */
1955     {
1956         gchar *speed_location_str = gconf_client_get_string(gconf_client,
1957                 GCONF_KEY_SPEED_LOCATION, NULL);
1958         gint i = 0;
1959         if(speed_location_str)
1960             for(i = SPEED_LOCATION_ENUM_COUNT - 1; i > 0; i--)
1961                 if(!strcmp(speed_location_str, SPEED_LOCATION_ENUM_TEXT[i]))
1962                     break;
1963         _speed_location = i;
1964     }
1965
1966     /* Get Unblank Option.  Default is UNBLANK_FULLSCREEN. */
1967     {
1968         gchar *unblank_option_str = gconf_client_get_string(gconf_client,
1969                 GCONF_KEY_UNBLANK_SIZE, NULL);
1970         gint i = -1;
1971         if(unblank_option_str)
1972             for(i = UNBLANK_ENUM_COUNT - 1; i >= 0; i--)
1973                 if(!strcmp(unblank_option_str, UNBLANK_ENUM_TEXT[i]))
1974                     break;
1975         if(i == -1)
1976             i = UNBLANK_FULLSCREEN;
1977         _unblank_option = i;
1978     }
1979
1980     /* Get Info Font Size.  Default is INFO_FONT_MEDIUM. */
1981     {
1982         gchar *info_font_size_str = gconf_client_get_string(gconf_client,
1983                 GCONF_KEY_INFO_FONT_SIZE, NULL);
1984         gint i = -1;
1985         if(info_font_size_str)
1986             for(i = INFO_FONT_ENUM_COUNT - 1; i >= 0; i--)
1987                 if(!strcmp(info_font_size_str, INFO_FONT_ENUM_TEXT[i]))
1988                     break;
1989         if(i == -1)
1990             i = INFO_FONT_MEDIUM;
1991         _info_font_size = i;
1992     }
1993
1994     /* Get last saved latitude.  Default is 50.f. */
1995     value = gconf_client_get(gconf_client, GCONF_KEY_LAST_LAT, NULL);
1996     if(value)
1997     {
1998         _gps.lat = gconf_value_get_float(value);
1999         gconf_value_free(value);
2000     }
2001     else
2002         _gps.lat = 50.f;
2003
2004     /* Get last saved longitude.  Default is 0. */
2005     _gps.lon = gconf_client_get_float(gconf_client, GCONF_KEY_LAST_LON, NULL);
2006
2007     /* Get last saved altitude.  Default is 0. */
2008     _pos.altitude = gconf_client_get_int(
2009             gconf_client, GCONF_KEY_LAST_ALT, NULL);
2010
2011     /* Get last saved speed.  Default is 0. */
2012     _gps.speed = gconf_client_get_float(
2013             gconf_client, GCONF_KEY_LAST_SPEED, NULL);
2014
2015     /* Get last saved speed.  Default is 0. */
2016     _gps.heading = gconf_client_get_float(
2017             gconf_client, GCONF_KEY_LAST_HEADING, NULL);
2018
2019     /* Get last saved timestamp.  Default is 0. */
2020     _pos.time= gconf_client_get_float(gconf_client, GCONF_KEY_LAST_TIME, NULL);
2021
2022     /* Get last center point. */
2023     {
2024         gdouble center_lat, center_lon;
2025
2026         /* Get last saved latitude.  Default is last saved latitude. */
2027         value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LAT, NULL);
2028         if(value)
2029         {
2030             center_lat = gconf_value_get_float(value);
2031             gconf_value_free(value);
2032         }
2033         else
2034         {
2035             _is_first_time = TRUE;
2036             center_lat = _gps.lat;
2037         }
2038
2039         /* Get last saved longitude.  Default is last saved longitude. */
2040         value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LON, NULL);
2041         if(value)
2042         {
2043             center_lon = gconf_value_get_float(value);
2044             gconf_value_free(value);
2045         }
2046         else
2047             center_lon = _gps.lon;
2048
2049         latlon2unit(center_lat, center_lon, _center.unitx, _center.unity);
2050         _next_center = _center;
2051     }
2052
2053     /* Get last viewing angle.  Default is 0. */
2054     _map_rotate_angle = _next_map_rotate_angle = gconf_client_get_int(
2055             gconf_client, GCONF_KEY_CENTER_ANGLE, NULL);
2056     gdk_pixbuf_rotate_matrix_fill_for_rotation(
2057             _map_rotate_matrix,
2058             deg2rad(ROTATE_DIR_ENUM_DEGREES[_rotate_dir] - _map_rotate_angle));
2059     gdk_pixbuf_rotate_matrix_fill_for_rotation(
2060             _map_reverse_matrix,
2061             deg2rad(_map_rotate_angle - ROTATE_DIR_ENUM_DEGREES[_rotate_dir]));
2062
2063
2064     /* Load the repositories. */
2065     {
2066         GSList *list, *curr;
2067         gint curr_repo_index = gconf_client_get_int(gconf_client,
2068             GCONF_KEY_CURRREPO, NULL);
2069         list = gconf_client_get_list(gconf_client,
2070             GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, NULL);
2071
2072         for(curr = list; curr != NULL; curr = curr->next)
2073         {
2074             RepoData *rd = settings_parse_repo(curr->data);
2075             _repo_list = g_list_append(_repo_list, rd);
2076             if(!curr_repo_index--)
2077                 repo_set_curr(rd);
2078             g_free(curr->data);
2079         }
2080         g_slist_free(list);
2081     }
2082
2083
2084     if(_repo_list == NULL)
2085     {
2086         /* We have no repositories - create a default one. */
2087         RepoData *repo = g_new(RepoData, 1);
2088
2089         repo->db_filename = gnome_vfs_expand_initial_tilde(
2090                 REPO_DEFAULT_CACHE_DIR);
2091         repo->url=g_strdup(REPO_DEFAULT_MAP_URI);
2092         repo->dl_zoom_steps = REPO_DEFAULT_DL_ZOOM_STEPS;
2093         repo->name = g_strdup(REPO_DEFAULT_NAME);
2094         repo->view_zoom_steps = REPO_DEFAULT_VIEW_ZOOM_STEPS;
2095         repo->double_size = FALSE;
2096         repo->nextable = TRUE;
2097         repo->min_zoom = REPO_DEFAULT_MIN_ZOOM;
2098         repo->max_zoom = REPO_DEFAULT_MAX_ZOOM;
2099         set_repo_type(repo);
2100
2101         _repo_list = g_list_append(_repo_list, repo);
2102         repo_set_curr(repo);
2103     }
2104
2105     /* Get last Zoom Level.  Default is 16. */
2106     value = gconf_client_get(gconf_client, GCONF_KEY_ZOOM, NULL);
2107     if(value)
2108     {
2109         _zoom = gconf_value_get_int(value) / _curr_repo->view_zoom_steps
2110             * _curr_repo->view_zoom_steps;
2111         gconf_value_free(value);
2112     }
2113     else
2114         _zoom = 16 / _curr_repo->view_zoom_steps
2115             * _curr_repo->view_zoom_steps;
2116     BOUND(_zoom, 0, MAX_ZOOM);
2117     _next_zoom = _zoom;
2118
2119     /* Get Route Directory.  Default is NULL. */
2120     _route_dir_uri = gconf_client_get_string(gconf_client,
2121             GCONF_KEY_ROUTEDIR, NULL);
2122
2123     /* Get Last Track File.  Default is NULL. */
2124     _track_file_uri = gconf_client_get_string(gconf_client,
2125             GCONF_KEY_TRACKFILE, NULL);
2126
2127     /* Get Auto-Center Mode.  Default is CENTER_LEAD. */
2128     value = gconf_client_get(gconf_client, GCONF_KEY_AUTOCENTER_MODE, NULL);
2129     if(value)
2130     {
2131         _center_mode = gconf_value_get_int(value);
2132         gconf_value_free(value);
2133     }
2134     else
2135         _center_mode = CENTER_LEAD;
2136
2137     /* Get Auto-Center Rotate Flag.  Default is TRUE. */
2138     value = gconf_client_get(gconf_client, GCONF_KEY_AUTOCENTER_ROTATE, NULL);
2139     if(value)
2140     {
2141         _center_rotate = gconf_value_get_bool(value);
2142         gconf_value_free(value);
2143     }
2144     else
2145         _center_rotate = TRUE;
2146
2147     /* Get Show Zoom Level flag.  Default is FALSE. */
2148     _show_zoomlevel = gconf_client_get_bool(gconf_client,
2149             GCONF_KEY_SHOWZOOMLEVEL, NULL);
2150
2151     /* Get Show Scale flag.  Default is TRUE. */
2152     value = gconf_client_get(gconf_client, GCONF_KEY_SHOWSCALE, NULL);
2153     if(value)
2154     {
2155         _show_scale = gconf_value_get_bool(value);
2156         gconf_value_free(value);
2157     }
2158     else
2159         _show_scale = TRUE;
2160
2161     /* Get Show Compass Rose flag.  Default is TRUE. */
2162     value = gconf_client_get(gconf_client, GCONF_KEY_SHOWCOMPROSE, NULL);
2163     if(value)
2164     {
2165         _show_comprose = gconf_value_get_bool(value);
2166         gconf_value_free(value);
2167     }
2168     else
2169         _show_comprose = TRUE;
2170
2171     /* Get Show Tracks flag.  Default is TRUE. */
2172     value = gconf_client_get(gconf_client, GCONF_KEY_SHOWTRACKS, NULL);
2173     if(value)
2174     {
2175         _show_paths |= (gconf_value_get_bool(value) ? TRACKS_MASK : 0);
2176         gconf_value_free(value);
2177     }
2178     else
2179         _show_paths |= TRACKS_MASK;
2180
2181     /* Get Show Routes flag.  Default is TRUE. */
2182     value = gconf_client_get(gconf_client, GCONF_KEY_SHOWROUTES, NULL);
2183     if(value)
2184     {
2185         _show_paths |= (gconf_value_get_bool(value) ? ROUTES_MASK : 0);
2186         gconf_value_free(value);
2187     }
2188     else
2189         _show_paths |= ROUTES_MASK;
2190
2191     /* Get Show Velocity Vector flag.  Default is TRUE. */
2192     value = gconf_client_get(gconf_client, GCONF_KEY_SHOWVELVEC, NULL);
2193     if(value)
2194     {
2195         _show_velvec = gconf_value_get_bool(value);
2196         gconf_value_free(value);
2197     }
2198     else
2199         _show_velvec = TRUE;
2200
2201     /* Get Show Velocity Vector flag.  Default is TRUE. */
2202     value = gconf_client_get(gconf_client, GCONF_KEY_SHOWPOIS, NULL);
2203     if(value)
2204     {
2205         _show_poi = gconf_value_get_bool(value);
2206         gconf_value_free(value);
2207     }
2208     else
2209         _show_poi = TRUE;
2210
2211     /* Get Enable GPS flag.  Default is TRUE. */
2212     value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_GPS, NULL);
2213     if(value)
2214     {
2215         _enable_gps = gconf_value_get_bool(value);
2216         gconf_value_free(value);
2217     }
2218     else
2219         _enable_gps = TRUE;
2220
2221     /* Initialize _gps_state based on _enable_gps. */
2222     _gps_state = RCVR_OFF;
2223
2224     /* Load the route locations. */
2225     {
2226         GSList *curr;
2227         _loc_list = gconf_client_get_list(gconf_client,
2228             GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, NULL);
2229         _loc_model = gtk_list_store_new(1, G_TYPE_STRING);
2230         for(curr = _loc_list; curr != NULL; curr = curr->next)
2231         {
2232             GtkTreeIter iter;
2233             gtk_list_store_insert_with_values(_loc_model, &iter, INT_MAX,
2234                     0, curr->data, -1);
2235         }
2236     }
2237
2238     /* Get POI Database.  Default is in REPO_DEFAULT_CACHE_BASE */
2239     _poi_db_filename = gconf_client_get_string(gconf_client,
2240             GCONF_KEY_POI_DB, NULL);
2241     if(_poi_db_filename == NULL)
2242     {
2243         gchar *poi_base = gnome_vfs_expand_initial_tilde(
2244                 REPO_DEFAULT_CACHE_BASE);
2245         _poi_db_filename = gnome_vfs_uri_make_full_from_relative(
2246                 poi_base, "poi.db");
2247         g_free(poi_base);
2248     }
2249
2250     _poi_db_dirname = g_path_get_dirname(_poi_db_filename);
2251
2252     _poi_zoom = gconf_client_get_int(gconf_client,
2253             GCONF_KEY_POI_ZOOM, NULL);
2254     if(!_poi_zoom)
2255         _poi_zoom = MAX_ZOOM - 10;
2256
2257
2258     /* Get GPS Info flag.  Default is FALSE. */
2259     _gps_info = gconf_client_get_bool(gconf_client, GCONF_KEY_GPS_INFO, NULL);
2260
2261     /* Get Route Download URL.  Default is:
2262      * "http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s" */
2263     _route_dl_url = gconf_client_get_string(gconf_client,
2264             GCONF_KEY_ROUTE_DL_URL, NULL);
2265     if(_route_dl_url == NULL)
2266         _route_dl_url = g_strdup(
2267                 "http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s");
2268
2269     /* Get Route Download Radius.  Default is 4. */
2270     value = gconf_client_get(gconf_client, GCONF_KEY_ROUTE_DL_RADIUS, NULL);
2271     if(value)
2272     {
2273         _route_dl_radius = gconf_value_get_int(value);
2274         gconf_value_free(value);
2275     }
2276     else
2277         _route_dl_radius = 8;
2278
2279     /* Get POI Download URL.  Default is:
2280      * "http://www.gnuite.com/cgi-bin/poi.cgi?saddr=%s&query=%s&page=%d" */
2281     _poi_dl_url = gconf_client_get_string(gconf_client,
2282             GCONF_KEY_POI_DL_URL, NULL);
2283     if(_poi_dl_url == NULL)
2284         _poi_dl_url = g_strdup(
2285             "http://www.gnuite.com/cgi-bin/poi.cgi?saddr=%s&query=%s&page=%d");
2286
2287     /* Get Colors. */
2288     {
2289         gint i;
2290         for(i = 0; i < COLORABLE_ENUM_COUNT; i++)
2291         {
2292             str = gconf_client_get_string(gconf_client,
2293                     COLORABLE_GCONF[i], NULL);
2294             if(!str || !gdk_color_parse(str, &_color[i]))
2295                 _color[i] = COLORABLE_DEFAULT[i];
2296         }
2297     }
2298
2299     gconf_client_clear_cache(gconf_client);
2300     g_object_unref(gconf_client);
2301
2302     /* GPS data init */
2303     _gps.fix = 1;
2304     _gps.satinuse = 0;
2305     _gps.satinview = 0;
2306
2307     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
2308 }
2309