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