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