]> git.itanic.dy.fi Git - maemo-mapper/blob - src/settings.c
Conditional compilation for Maemo-only features
[maemo-mapper] / src / settings.c
1 /*
2  * Copyright (C) 2006, 2007 John Costigan.
3  *
4  * POI and GPS-Info code originally written by Cezary Jackiewicz.
5  *
6  * Default map data provided by http://www.openstreetmap.org/
7  *
8  * This file is part of Maemo Mapper.
9  *
10  * Maemo Mapper is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * Maemo Mapper is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with Maemo Mapper.  If not, see <http://www.gnu.org/licenses/>.
22  */
23
24 #ifdef HAVE_CONFIG_H
25 #    include "config.h"
26 #endif
27
28 #define _GNU_SOURCE
29
30 #include <stdlib.h>
31 #include <string.h>
32 #include <math.h>
33 #include <dbus/dbus-glib.h>
34 #include <bt-dbus.h>
35 #include <gconf/gconf-client.h>
36 #include <glib.h>
37
38 #ifndef LEGACY
39 #    include <hildon/hildon-help.h>
40 #    include <hildon/hildon-note.h>
41 #    include <hildon/hildon-color-button.h>
42 #    include <hildon/hildon-file-chooser-dialog.h>
43 #    include <hildon/hildon-number-editor.h>
44 #    include <hildon/hildon-banner.h>
45 #else
46 #    include <osso-helplib.h>
47 #    include <hildon-widgets/hildon-note.h>
48 #    include <hildon-widgets/hildon-color-button.h>
49 #    include <hildon-widgets/hildon-file-chooser-dialog.h>
50 #    include <hildon-widgets/hildon-number-editor.h>
51 #    include <hildon-widgets/hildon-banner.h>
52 #    include <hildon-widgets/hildon-input-mode-hint.h>
53 #endif
54
55 #include "types.h"
56 #include "data.h"
57 #include "defines.h"
58
59 #include "gps.h"
60 #include "display.h"
61 #include "gdk-pixbuf-rotate.h"
62 #include "maps.h"
63 #include "marshal.h"
64 #include "poi.h"
65 #include "settings.h"
66 #include "util.h"
67
68 #define GCONF_KEY_PREFIX "/apps/maemo/maemo-mapper"
69 #define GCONF_KEY_GPS_RCVR_TYPE GCONF_KEY_PREFIX"/gps_rcvr_type"
70 #define GCONF_KEY_GPS_BT_MAC GCONF_KEY_PREFIX"/receiver_mac"
71 #define GCONF_KEY_GPS_GPSD_HOST GCONF_KEY_PREFIX"/gps_gpsd_host"
72 #define GCONF_KEY_GPS_GPSD_PORT GCONF_KEY_PREFIX"/gps_gpsd_port"
73 #define GCONF_KEY_GPS_FILE_PATH GCONF_KEY_PREFIX"/gps_file_path"
74 #define GCONF_KEY_AUTO_DOWNLOAD GCONF_KEY_PREFIX"/auto_download"
75 #define GCONF_KEY_AUTO_DOWNLOAD_PRECACHE \
76                                       GCONF_KEY_PREFIX"/auto_download_precache"
77 #define GCONF_KEY_CENTER_SENSITIVITY GCONF_KEY_PREFIX"/center_sensitivity"
78 #define GCONF_KEY_ENABLE_ANNOUNCE GCONF_KEY_PREFIX"/enable_announce"
79 #define GCONF_KEY_ANNOUNCE_NOTICE GCONF_KEY_PREFIX"/announce_notice"
80 #define GCONF_KEY_ROTATE_SENSITIVITY GCONF_KEY_PREFIX"/rotate_sensitivity"
81 #define GCONF_KEY_AC_MIN_SPEED GCONF_KEY_PREFIX"/autocenter_min_speed"
82 #define GCONF_KEY_ROTATE_DIR GCONF_KEY_PREFIX"/rotate_direction"
83 #define GCONF_KEY_DRAW_WIDTH GCONF_KEY_PREFIX"/draw_width"
84 #define GCONF_KEY_ENABLE_VOICE GCONF_KEY_PREFIX"/enable_voice"
85 #define GCONF_KEY_VOICE_SPEED GCONF_KEY_PREFIX"/voice_speed"
86 #define GCONF_KEY_VOICE_PITCH GCONF_KEY_PREFIX"/voice_pitch"
87 #define GCONF_KEY_FULLSCREEN GCONF_KEY_PREFIX"/fullscreen"
88 #define GCONF_KEY_UNITS GCONF_KEY_PREFIX"/units"
89 #define GCONF_KEY_SPEED_LIMIT_ON GCONF_KEY_PREFIX"/speed_limit_on"
90 #define GCONF_KEY_SPEED_LIMIT GCONF_KEY_PREFIX"/speed_limit"
91 #define GCONF_KEY_SPEED_LOCATION GCONF_KEY_PREFIX"/speed_location"
92 #define GCONF_KEY_UNBLANK_SIZE GCONF_KEY_PREFIX"/unblank_option"
93 #define GCONF_KEY_INFO_FONT_SIZE GCONF_KEY_PREFIX"/info_font_size"
94
95 #define GCONF_KEY_POI_DB GCONF_KEY_PREFIX"/poi_db"
96 #define GCONF_KEY_POI_ZOOM GCONF_KEY_PREFIX"/poi_zoom"
97
98 #define GCONF_KEY_AUTOCENTER_MODE GCONF_KEY_PREFIX"/autocenter_mode"
99 #define GCONF_KEY_AUTOCENTER_ROTATE GCONF_KEY_PREFIX"/autocenter_rotate"
100 #define GCONF_KEY_LEAD_AMOUNT GCONF_KEY_PREFIX"/lead_amount"
101 #define GCONF_KEY_LEAD_IS_FIXED GCONF_KEY_PREFIX"/lead_is_fixed"
102 #define GCONF_KEY_LAST_LAT GCONF_KEY_PREFIX"/last_latitude"
103 #define GCONF_KEY_LAST_LON GCONF_KEY_PREFIX"/last_longitude"
104 #define GCONF_KEY_LAST_ALT GCONF_KEY_PREFIX"/last_altitude"
105 #define GCONF_KEY_LAST_SPEED GCONF_KEY_PREFIX"/last_speed"
106 #define GCONF_KEY_LAST_HEADING GCONF_KEY_PREFIX"/last_heading"
107 #define GCONF_KEY_LAST_TIME GCONF_KEY_PREFIX"/last_timestamp"
108 #define GCONF_KEY_CENTER_LAT GCONF_KEY_PREFIX"/center_latitude"
109 #define GCONF_KEY_CENTER_LON GCONF_KEY_PREFIX"/center_longitude"
110 #define GCONF_KEY_CENTER_ANGLE GCONF_KEY_PREFIX"/center_angle"
111 #define GCONF_KEY_MAP_CORRECTION_UNITX GCONF_KEY_PREFIX"/map_correction_unitx"
112 #define GCONF_KEY_MAP_CORRECTION_UNITY GCONF_KEY_PREFIX"/map_correction_unity"
113 #define GCONF_KEY_ZOOM GCONF_KEY_PREFIX"/zoom"
114 #define GCONF_KEY_ROUTEDIR GCONF_KEY_PREFIX"/route_directory"
115 #define GCONF_KEY_TRACKFILE GCONF_KEY_PREFIX"/track_file"
116 #define GCONF_KEY_SHOWZOOMLEVEL GCONF_KEY_PREFIX"/show_zoomlevel"
117 #define GCONF_KEY_SHOWSCALE GCONF_KEY_PREFIX"/show_scale"
118 #define GCONF_KEY_SHOWCOMPROSE GCONF_KEY_PREFIX"/show_comprose"
119 #define GCONF_KEY_SHOWTRACKS GCONF_KEY_PREFIX"/show_tracks"
120 #define GCONF_KEY_SHOWROUTES GCONF_KEY_PREFIX"/show_routes"
121 #define GCONF_KEY_SHOWVELVEC GCONF_KEY_PREFIX"/show_velocity_vector" 
122 #define GCONF_KEY_SHOWPOIS GCONF_KEY_PREFIX"/show_poi" 
123 #define GCONF_KEY_ENABLE_GPS GCONF_KEY_PREFIX"/enable_gps" 
124 #define GCONF_KEY_ENABLE_TRACKING GCONF_KEY_PREFIX"/enable_tracking"
125 #define GCONF_KEY_ROUTE_LOCATIONS GCONF_KEY_PREFIX"/route_locations" 
126 #define GCONF_KEY_REPOSITORIES GCONF_KEY_PREFIX"/repositories" 
127 #define GCONF_KEY_CURRREPO GCONF_KEY_PREFIX"/curr_repo" 
128 #define GCONF_KEY_GPS_INFO GCONF_KEY_PREFIX"/gps_info" 
129 #define GCONF_KEY_ROUTE_DL_URL GCONF_KEY_PREFIX"/route_dl_url" 
130 #define GCONF_KEY_ROUTE_DL_RADIUS GCONF_KEY_PREFIX"/route_dl_radius" 
131 #define GCONF_KEY_POI_DL_URL GCONF_KEY_PREFIX"/poi_dl_url" 
132 #define GCONF_KEY_DEG_FORMAT GCONF_KEY_PREFIX"/deg_format" 
133
134 // APRS
135 #ifdef INCLUDE_APRS
136 #define GCONF_KEY_APRS_SERVER      GCONF_KEY_PREFIX"/aprs_server" 
137 #define GCONF_KEY_APRS_SERVER_PORT GCONF_KEY_PREFIX"/aprs_server_port" 
138 #define GCONF_KEY_APRS_SERVER_VAL  GCONF_KEY_PREFIX"/aprs_mycall_val" 
139 #define GCONF_KEY_APRS_MYCALL      GCONF_KEY_PREFIX"/aprs_mycall"
140 #define GCONF_KEY_APRS_INET_BEACON      GCONF_KEY_PREFIX"/aprs_inet_beacon"
141 #define GCONF_KEY_APRS_INET_BEACON_INTERVAL      GCONF_KEY_PREFIX"/aprs_inet_beacon_interval"
142 #define GCONF_KEY_APRS_ENABLE                                   GCONF_KEY_PREFIX"/aprs_enable"
143 #define GCONF_KEY_APRS_ENABLE_INET_TX                   GCONF_KEY_PREFIX"/aprs_enable_inet_tx"
144 #define GCONF_KEY_APRS_ENABLE_TTY_TX                    GCONF_KEY_PREFIX"/aprs_enable_tty_tx"
145
146 #define GCONF_KEY_APRS_MAX_TRACK_PTS                    GCONF_KEY_PREFIX"/aprs_max_track_points"
147 #define GCONF_KEY_APRS_MAX_STATIONS                     GCONF_KEY_PREFIX"/aprs_max_stations"
148 #define GCONF_KEY_APRS_TTY_PORT                                 GCONF_KEY_PREFIX"/aprs_tty_port"
149 #define GCONF_KEY_APRS_TNC_CONN_METHOD                  GCONF_KEY_PREFIX"/aprs_tnc_conn_method"
150 #define GCONF_KEY_APRS_TNC_BT_MAC                       GCONF_KEY_PREFIX"/aprs_tnc_bt_mac"
151 #define GCONF_KEY_APRS_INET_AUTO_FILTER                 GCONF_KEY_PREFIX"/aprs_inet_auto_filter"
152 #define GCONF_KEY_APRS_INET_AUTO_FILTER_RANGE   GCONF_KEY_PREFIX"/aprs_inet_auto_filter_range"
153 #define GCONF_KEY_APRS_SHOW_NEW_STATION_ALERT   GCONF_KEY_PREFIX"/aprs_show_new_station_alert"
154 #define GCONF_KEY_APRS_BEACON_COMMENT                   GCONF_KEY_PREFIX"/aprs_beacon_comment"
155 #define GCONF_KEY_APRS_TTY_BEACON_INTERVAL              GCONF_KEY_PREFIX"/aprs_tty_beacon_interval"
156
157 #define GCONF_KEY_APRS_BEACON_PATH                              GCONF_KEY_PREFIX"/aprs_beacon_path"
158 #define GCONF_KEY_APRS_BEACON_SYM_GROUP                 GCONF_KEY_PREFIX"/aprs_beacon_symbol_group"
159 #define GCONF_KEY_APRS_BEACON_SYMBOL                    GCONF_KEY_PREFIX"/aprs_beacon_symbol"
160 #define GCONF_KEY_APRS_BEACON_COMPRESSED                GCONF_KEY_PREFIX"/aprs_beacon_compressed"
161
162 //////////
163 #endif // INCLUDE_APRS
164
165
166 typedef struct _ScanInfo ScanInfo;
167 struct _ScanInfo {
168     GtkWidget *settings_dialog;
169     GtkWidget *txt_gps_bt_mac;
170     GtkWidget *scan_dialog;
171     GtkWidget *banner;
172     GtkListStore *store;
173     gint sid;
174     DBusGConnection *bus;
175     DBusGProxy *req_proxy;
176     DBusGProxy *sig_proxy;
177 };
178
179 #ifdef INCLUDE_APRS
180
181 typedef struct
182 {
183     GtkWidget *txt_aprs_mycall;
184     GtkWidget *txt_aprs_inet_server_validation;
185     GtkWidget *txt_aprs_server;
186     GtkWidget *txt_aprs_inet_beacon_interval;
187     GtkWidget *txt_aprs_inet_beacon_comment;
188     GtkWidget *txt_aprs_max_stations;
189     GtkWidget *txt_aprs_tty_port;
190     GtkWidget *txt_tnc_bt_mac;    
191     GtkWidget *txt_auto_filter_range;
192     GtkWidget *txt_beacon_comment;
193     GtkWidget *num_aprs_server_port;
194     GtkWidget *txt_tty_beacon_interval;
195     
196     GtkWidget *rad_aprs_file;
197     GtkWidget *rad_tnc_bt;
198     GtkWidget *rad_tnc_file;
199     
200     GtkWidget *chk_enable_inet_auto_filter;
201     GtkWidget *chk_enable_inet_tx;
202     GtkWidget *chk_enable_tty_tx;
203     GtkWidget *chk_aprs_show_new_station_alert;
204     GtkWidget *chk_aprs_enabled;
205     
206     GtkWidget *btn_scan_bt_tnc;
207     
208     GtkWidget *txt_unproto_path;
209     GtkWidget *chk_compressed_beacon;
210     GtkWidget *txt_beacon_group;
211     GtkWidget *txt_beacon_symbol;
212     
213 } TAprsSettings;
214 #endif // INCLUDE_APRS
215
216
217 typedef struct _KeysDialogInfo KeysDialogInfo;
218 struct _KeysDialogInfo {
219     GtkWidget *cmb[CUSTOM_KEY_ENUM_COUNT];
220 };
221
222 typedef struct _ColorsDialogInfo ColorsDialogInfo;
223 struct _ColorsDialogInfo {
224     GtkWidget *col[COLORABLE_ENUM_COUNT];
225 };
226
227 #ifdef INCLUDE_APRS
228 typedef enum
229 {
230         ALIGN_TOP_LEFT,
231         ALIGN_TOP_CENTER,
232         ALIGN_TOP_RIGHT,
233         ALIGN_CENTER_LEFT,
234         ALIGN_CENTER_CENTER,
235         ALIGN_CENTER_RIGHT,
236         ALIGN_BOTTOM_LEFT,
237         ALIGN_BOTTOM_CENTER,
238         ALIGN_BOTTOM_RIGHT
239 } TCellAlignment;
240
241 void set_ctrl_alignment(GtkWidget *ctrl, TCellAlignment alignment)
242 {
243         gfloat align_hor = 0.0f, align_vert = 0.0f;
244
245         switch(alignment)
246     {
247     case ALIGN_CENTER_LEFT:
248     case ALIGN_CENTER_CENTER:
249     case ALIGN_CENTER_RIGHT:
250         align_vert = 0.5f;
251         break;
252     case ALIGN_BOTTOM_LEFT:
253     case ALIGN_BOTTOM_CENTER:
254     case ALIGN_BOTTOM_RIGHT:
255         align_vert = 1.0f;
256         break;
257     case ALIGN_TOP_LEFT:
258     case ALIGN_TOP_CENTER:
259     case ALIGN_TOP_RIGHT:
260     default:
261         align_vert = 0.0f;
262         break;
263     }
264     
265
266     switch(alignment)
267     {
268     case ALIGN_CENTER_CENTER:
269     case ALIGN_BOTTOM_CENTER:
270     case ALIGN_TOP_CENTER:
271         align_hor = 0.5f;
272         break;
273     case ALIGN_CENTER_RIGHT:
274     case ALIGN_BOTTOM_RIGHT:
275     case ALIGN_TOP_RIGHT:
276         align_hor = 1.0f;
277         break;
278     case ALIGN_CENTER_LEFT:
279     case ALIGN_BOTTOM_LEFT:
280     case ALIGN_TOP_LEFT:
281     default:
282         align_hor = 0.0f;
283         break;
284     }
285     
286     gtk_misc_set_alignment(GTK_MISC(ctrl), align_hor, align_vert);
287 }
288
289 void set_ctrl_width(GtkWidget *ctrl, gint width)
290 {
291         gtk_widget_set_size_request(ctrl, width, -1);
292 }
293
294
295 void add_edit_box(GtkWidget *table, gint xmin, gint xmax, gint ymin, gint ymax, gint width, 
296                 GtkWidget **ctrl, TCellAlignment alignment, gchar * initial_value)
297 {
298         GtkWidget * hbox;
299         
300     gtk_table_attach(GTK_TABLE(table),
301         hbox = gtk_hbox_new(FALSE, 4),
302             xmin, xmax, ymin, ymax, GTK_EXPAND | GTK_FILL, 0, 2, 4);
303     gtk_box_pack_start(GTK_BOX(hbox),
304                 *ctrl = gtk_entry_new(),
305         TRUE, TRUE, 0);
306
307 #ifdef MAEMO_CHANGES
308 #ifndef LEGACY
309     g_object_set(G_OBJECT(*ctrl), "hildon-input-mode",
310         HILDON_GTK_INPUT_MODE_FULL, NULL);
311 #else
312     g_object_set(G_OBJECT(*ctrl), HILDON_AUTOCAP, FALSE, NULL);
313 #endif
314 #endif
315
316     //set_ctrl_alignment(*ctrl, alignment);
317     //set_ctrl_width(*ctrl, width);    
318     
319     // Set the initial value
320     if(initial_value)
321     {
322         gtk_entry_set_text(GTK_ENTRY(*ctrl), initial_value);
323     }
324 }
325
326 void add_check_box(GtkWidget *table, gint xmin, gint xmax, gint ymin, gint ymax, gint width, 
327                 GtkWidget **ctrl, TCellAlignment alignment, gchar * caption, gboolean initial_value)
328 {
329         gtk_table_attach(GTK_TABLE(table),
330                         *ctrl = gtk_check_button_new_with_label(caption),
331         xmin, xmax, ymin, ymax, GTK_FILL, 0, 2, 4);
332         
333     //set_ctrl_alignment(*ctrl, alignment);
334     //set_ctrl_width(*ctrl, width);
335     
336     gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(*ctrl), initial_value);
337 }
338
339 void add_label_box(GtkWidget *table, gint xmin, gint xmax, gint ymin, gint ymax, gint width,  
340                 GtkWidget **ctrl, TCellAlignment alignment, gchar * initial_value)
341 {
342         
343     gtk_table_attach(GTK_TABLE(table),
344             *ctrl = gtk_label_new(initial_value),
345             xmin, xmax, ymin, ymax, GTK_FILL, 0, 2, 4);
346     
347     gtk_misc_set_alignment(GTK_MISC(*ctrl), 1.f, 0.5f);
348     
349
350     set_ctrl_alignment(*ctrl, alignment);
351     set_ctrl_width(*ctrl, width);
352 }
353
354 #endif // INCLUDE_APRS
355
356
357 /**
358  * Save all configuration data to GCONF.
359  */
360 void
361 settings_save()
362 {
363     gchar *settings_dir;
364     GConfClient *gconf_client;
365     gchar buffer[16];
366     printf("%s()\n", __PRETTY_FUNCTION__);
367
368     /* Initialize settings_dir. */
369     settings_dir = gnome_vfs_expand_initial_tilde(CONFIG_DIR_NAME);
370     g_mkdir_with_parents(settings_dir, 0700);
371
372     /* SAVE ALL GCONF SETTINGS. */
373
374     gconf_client = gconf_client_get_default();
375     if(!gconf_client)
376     {
377         popup_error(_window,
378                 _("Failed to initialize GConf.  Settings were not saved."));
379         return;
380     }
381
382     /* Save GPS Receiver Type. */
383     gconf_client_set_string(gconf_client,
384             GCONF_KEY_GPS_RCVR_TYPE,
385             GPS_RCVR_ENUM_TEXT[_gri.type], NULL);
386
387     /* Save Bluetooth Receiver MAC. */
388     if(_gri.bt_mac)
389         gconf_client_set_string(gconf_client,
390                 GCONF_KEY_GPS_BT_MAC, _gri.bt_mac, NULL);
391     else
392         gconf_client_unset(gconf_client,
393                 GCONF_KEY_GPS_BT_MAC, NULL);
394
395     /* Save GPSD Host. */
396     if(_gri.gpsd_host)
397         gconf_client_set_string(gconf_client,
398                 GCONF_KEY_GPS_GPSD_HOST, _gri.gpsd_host, NULL);
399     else
400         gconf_client_unset(gconf_client,
401                 GCONF_KEY_GPS_GPSD_HOST, NULL);
402
403     /* Save GPSD Port. */
404     gconf_client_set_int(gconf_client,
405             GCONF_KEY_GPS_GPSD_PORT, _gri.gpsd_port, NULL);
406
407     /* Save File Path. */
408     if(_gri.file_path)
409         gconf_client_set_string(gconf_client,
410                 GCONF_KEY_GPS_FILE_PATH, _gri.file_path, NULL);
411     else
412         gconf_client_unset(gconf_client,
413                 GCONF_KEY_GPS_FILE_PATH, NULL);
414
415     /* Save Auto-Download. */
416     gconf_client_set_bool(gconf_client,
417             GCONF_KEY_AUTO_DOWNLOAD, _auto_download, NULL);
418
419     /* Save Auto-Download Pre-cache. */
420     gconf_client_set_int(gconf_client,
421             GCONF_KEY_AUTO_DOWNLOAD_PRECACHE, _auto_download_precache, NULL);
422
423     /* Save Auto-Center Sensitivity. */
424     gconf_client_set_int(gconf_client,
425             GCONF_KEY_CENTER_SENSITIVITY, _center_ratio, NULL);
426
427     /* Save Auto-Center Lead Amount. */
428     gconf_client_set_int(gconf_client,
429             GCONF_KEY_LEAD_AMOUNT, _lead_ratio, NULL);
430
431     /* Save Auto-Center Lead Fixed flag. */
432     gconf_client_set_bool(gconf_client,
433             GCONF_KEY_LEAD_IS_FIXED, _lead_is_fixed, NULL);
434
435     /* Save Auto-Rotate Sensitivity. */
436     gconf_client_set_int(gconf_client,
437             GCONF_KEY_ROTATE_SENSITIVITY, _rotate_sens, NULL);
438
439     /* Save Auto-Center/Rotate Minimum Speed. */
440     gconf_client_set_int(gconf_client,
441             GCONF_KEY_AC_MIN_SPEED, _ac_min_speed, NULL);
442
443     /* Save Auto-Rotate Sensitivity. */
444     gconf_client_set_string(gconf_client,
445             GCONF_KEY_ROTATE_DIR, ROTATE_DIR_ENUM_TEXT[_rotate_dir], NULL);
446
447     /* Save Draw Line Width. */
448     gconf_client_set_int(gconf_client,
449             GCONF_KEY_DRAW_WIDTH, _draw_width, NULL);
450
451     /* Save Announce Flag. */
452     gconf_client_set_bool(gconf_client,
453             GCONF_KEY_ENABLE_ANNOUNCE, _enable_announce, NULL);
454
455     /* Save Announce Advance Notice Ratio. */
456     gconf_client_set_int(gconf_client,
457             GCONF_KEY_ANNOUNCE_NOTICE, _announce_notice_ratio, NULL);
458
459     /* Save Enable Voice flag. */
460     gconf_client_set_bool(gconf_client,
461             GCONF_KEY_ENABLE_VOICE, _enable_voice, NULL);
462
463     /* Save fullscreen flag. */
464     gconf_client_set_bool(gconf_client,
465             GCONF_KEY_FULLSCREEN, _fullscreen, NULL);
466
467     /* Save Units. */
468     gconf_client_set_string(gconf_client,
469             GCONF_KEY_UNITS, UNITS_ENUM_TEXT[_units], NULL);
470
471     /* Save Custom Key Actions. */
472     {
473         gint i;
474         for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
475             gconf_client_set_string(gconf_client,
476                     CUSTOM_KEY_GCONF[i],
477                     CUSTOM_ACTION_ENUM_TEXT[_action[i]], NULL);
478     }
479
480     /* Save Deg Format. */
481     gconf_client_set_string(gconf_client,
482             GCONF_KEY_DEG_FORMAT, DEG_FORMAT_ENUM_TEXT[_degformat].name , NULL);
483
484     /* Save Speed Limit On flag. */
485     gconf_client_set_bool(gconf_client,
486             GCONF_KEY_SPEED_LIMIT_ON, _speed_limit_on, NULL);
487
488     /* Save Speed Limit. */
489     gconf_client_set_int(gconf_client,
490             GCONF_KEY_SPEED_LIMIT, _speed_limit, NULL);
491
492     /* Save Speed Location. */
493     gconf_client_set_string(gconf_client,
494             GCONF_KEY_SPEED_LOCATION,
495             SPEED_LOCATION_ENUM_TEXT[_speed_location], NULL);
496
497     /* Save Info Font Size. */
498     gconf_client_set_string(gconf_client,
499             GCONF_KEY_INFO_FONT_SIZE,
500             INFO_FONT_ENUM_TEXT[_info_font_size], NULL);
501
502     /* Save Unblank Option. */
503     gconf_client_set_string(gconf_client,
504             GCONF_KEY_UNBLANK_SIZE,
505             UNBLANK_ENUM_TEXT[_unblank_option], NULL);
506
507     /* Save last saved latitude. */
508     gconf_client_set_float(gconf_client,
509             GCONF_KEY_LAST_LAT, _gps.lat, NULL);
510
511     /* Save last saved longitude. */
512     gconf_client_set_float(gconf_client,
513             GCONF_KEY_LAST_LON, _gps.lon, NULL);
514
515     /* Save last saved altitude. */
516     gconf_client_set_int(gconf_client,
517             GCONF_KEY_LAST_ALT, _pos.altitude, NULL);
518
519     /* Save last saved speed. */
520     gconf_client_set_float(gconf_client,
521             GCONF_KEY_LAST_SPEED, _gps.speed, NULL);
522
523     /* Save last saved heading. */
524     gconf_client_set_float(gconf_client,
525             GCONF_KEY_LAST_HEADING, _gps.heading, NULL);
526
527     /* Save last saved timestamp. */
528     gconf_client_set_float(gconf_client,
529             GCONF_KEY_LAST_TIME, _pos.time, NULL);
530
531     /* Save last center point. */
532     {
533         gdouble center_lat, center_lon;
534         unit2latlon(_center.unitx, _center.unity, center_lat, center_lon);
535
536         /* Save last center latitude. */
537         gconf_client_set_float(gconf_client,
538                 GCONF_KEY_CENTER_LAT, center_lat, NULL);
539
540         /* Save last center longitude. */
541         gconf_client_set_float(gconf_client,
542                 GCONF_KEY_CENTER_LON, center_lon, NULL);
543
544         /* Save last view angle. */
545         gconf_client_set_int(gconf_client,
546                 GCONF_KEY_CENTER_ANGLE, _map_rotate_angle, NULL);
547     }
548
549     /* Save map correction. */
550     gconf_client_set_int(gconf_client,
551             GCONF_KEY_MAP_CORRECTION_UNITX, _map_correction_unitx, NULL);
552     gconf_client_set_int(gconf_client,
553             GCONF_KEY_MAP_CORRECTION_UNITY, _map_correction_unity, NULL);
554
555     /* Save last Zoom Level. */
556     gconf_client_set_int(gconf_client,
557             GCONF_KEY_ZOOM, _zoom, NULL);
558
559     /* Save Route Directory. */
560     if(_route_dir_uri)
561         gconf_client_set_string(gconf_client,
562                 GCONF_KEY_ROUTEDIR, _route_dir_uri, NULL);
563
564     /* Save the repositories. */
565     {
566         GList *curr = _repo_list;
567         GSList *temp_list = NULL;
568         gint curr_repo_index = 0;
569
570         for(curr = _repo_list; curr != NULL; curr = curr->next)
571         {
572             /* Build from each part of a repo, delimited by newline characters:
573              * 1. name
574              * 2. url
575              * 3. db_filename
576              * 4. dl_zoom_steps
577              * 5. view_zoom_steps
578              * 6. layer_level
579              *
580              * If layer_level > 0, have additional fields:
581              * 7. layer_enabled
582              * 8. layer_refresh_interval
583              */
584             RepoData *rd = curr->data;
585             gchar buffer[BUFFER_SIZE];
586
587             while (rd) {
588                 if (!rd->layer_level)
589                     snprintf(buffer, sizeof(buffer),
590                              "%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d",
591                              rd->name,
592                              rd->url,
593                              rd->db_filename,
594                              rd->dl_zoom_steps,
595                              rd->view_zoom_steps,
596                              rd->double_size,
597                              rd->nextable,
598                              rd->min_zoom,
599                              rd->max_zoom,
600                              rd->layer_level);
601                 else
602                     snprintf(buffer, sizeof(buffer),
603                              "%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d",
604                              rd->name,
605                              rd->url,
606                              rd->db_filename,
607                              rd->dl_zoom_steps,
608                              rd->view_zoom_steps,
609                              rd->double_size,
610                              rd->nextable,
611                              rd->min_zoom,
612                              rd->max_zoom,
613                              rd->layer_level,
614                              rd->layer_enabled,
615                              rd->layer_refresh_interval
616                              );
617                 temp_list = g_slist_append(temp_list, g_strdup(buffer));
618                 if(rd == _curr_repo)
619                     gconf_client_set_int(gconf_client,
620                                          GCONF_KEY_CURRREPO, curr_repo_index, NULL);
621                 rd = rd->layers;
622             }
623             curr_repo_index++;
624         }
625         gconf_client_set_list(gconf_client,
626                 GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, temp_list, NULL);
627     }
628
629     /* Save Last Track File. */
630     if(_track_file_uri)
631         gconf_client_set_string(gconf_client,
632                 GCONF_KEY_TRACKFILE, _track_file_uri, NULL);
633
634     /* Save Auto-Center Mode. */
635     gconf_client_set_int(gconf_client,
636             GCONF_KEY_AUTOCENTER_MODE, _center_mode, NULL);
637
638     /* Save Auto-Center Rotate Flag. */
639     gconf_client_set_bool(gconf_client,
640             GCONF_KEY_AUTOCENTER_ROTATE, _center_rotate, NULL);
641
642     /* Save Show Zoom Level flag. */
643     gconf_client_set_bool(gconf_client,
644             GCONF_KEY_SHOWZOOMLEVEL, _show_zoomlevel, NULL);
645
646     /* Save Show Scale flag. */
647     gconf_client_set_bool(gconf_client,
648             GCONF_KEY_SHOWSCALE, _show_scale, NULL);
649
650     /* Save Show Compass Rose flag. */
651     gconf_client_set_bool(gconf_client,
652             GCONF_KEY_SHOWCOMPROSE, _show_comprose, NULL);
653
654     /* Save Show Tracks flag. */
655     gconf_client_set_bool(gconf_client,
656             GCONF_KEY_SHOWTRACKS, _show_paths & TRACKS_MASK, NULL);
657
658     /* Save Show Routes flag. */
659     gconf_client_set_bool(gconf_client,
660             GCONF_KEY_SHOWROUTES, _show_paths & ROUTES_MASK, NULL);
661
662     /* Save Show Velocity Vector flag. */
663     gconf_client_set_bool(gconf_client,
664             GCONF_KEY_SHOWVELVEC, _show_velvec, NULL);
665
666     /* Save Show POIs flag. */
667     gconf_client_set_bool(gconf_client,
668             GCONF_KEY_SHOWPOIS, _show_poi, NULL);
669
670     /* Save Enable GPS flag. */
671     gconf_client_set_bool(gconf_client,
672             GCONF_KEY_ENABLE_GPS, _enable_gps, NULL);
673
674     /* Save Enable Tracking flag. */
675     gconf_client_set_bool(gconf_client,
676             GCONF_KEY_ENABLE_TRACKING, _enable_tracking, NULL);
677
678     /* Save Route Locations. */
679     gconf_client_set_list(gconf_client,
680             GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, _loc_list, NULL);
681
682     /* Save GPS Info flag. */
683     gconf_client_set_bool(gconf_client,
684             GCONF_KEY_GPS_INFO, _gps_info, NULL);
685
686     /* Save Route Download URL Format. */
687     gconf_client_set_string(gconf_client,
688             GCONF_KEY_ROUTE_DL_URL, _route_dl_url, NULL);
689
690     /* Save Route Download Radius. */
691     gconf_client_set_int(gconf_client,
692             GCONF_KEY_ROUTE_DL_RADIUS, _route_dl_radius, NULL);
693
694     /* Save POI Download URL Format. */
695     gconf_client_set_string(gconf_client,
696             GCONF_KEY_POI_DL_URL, _poi_dl_url, NULL);
697
698     /* Save Colors. */
699     {
700         gint i;
701         for(i = 0; i < COLORABLE_ENUM_COUNT; i++)
702         {
703             snprintf(buffer, sizeof(buffer), "#%02x%02x%02x",
704                     _color[i].red >> 8,
705                     _color[i].green >> 8,
706                     _color[i].blue >> 8);
707             gconf_client_set_string(gconf_client,
708                     COLORABLE_GCONF[i], buffer, NULL);
709         }
710     }
711
712     /* Save POI database. */
713     if(_poi_db_filename)
714         gconf_client_set_string(gconf_client,
715                 GCONF_KEY_POI_DB, _poi_db_filename, NULL);
716     else
717         gconf_client_unset(gconf_client, GCONF_KEY_POI_DB, NULL);
718
719     /* Save Show POI below zoom. */
720     gconf_client_set_int(gconf_client,
721             GCONF_KEY_POI_ZOOM, _poi_zoom, NULL);
722
723     gconf_client_clear_cache(gconf_client);
724     g_object_unref(gconf_client);
725     g_free(settings_dir);
726
727     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
728 }
729
730 static void
731 scan_cb_dev_found(DBusGProxy *sig_proxy, const gchar *bda,
732         const gchar *name, gpointer *class, guchar rssi, gint coff,
733         ScanInfo *scan_info)
734 {
735     GtkTreeIter iter;
736     printf("%s()\n", __PRETTY_FUNCTION__);
737     gtk_list_store_append(scan_info->store, &iter);
738     gtk_list_store_set(scan_info->store, &iter,
739             0, g_strdup(bda),
740             1, g_strdup(name),
741             -1);
742     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
743 }
744
745 static void
746 scan_cb_search_complete(DBusGProxy *sig_proxy, ScanInfo *scan_info)
747 {
748     printf("%s()\n", __PRETTY_FUNCTION__);
749     gtk_widget_destroy(scan_info->banner);
750     dbus_g_proxy_disconnect_signal(sig_proxy, BTSEARCH_DEV_FOUND_SIG,
751             G_CALLBACK(scan_cb_dev_found), scan_info);
752     dbus_g_proxy_disconnect_signal(sig_proxy, BTSEARCH_SEARCH_COMPLETE_SIG,
753             G_CALLBACK(scan_cb_search_complete), scan_info);
754     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
755 }
756
757 static gint
758 scan_start_search(ScanInfo *scan_info)
759 {
760     GError *error = NULL;
761     printf("%s()\n", __PRETTY_FUNCTION__);
762
763     /* Initialize D-Bus. */
764     if(NULL == (scan_info->bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error)))
765     {
766         g_printerr("Failed to open connection to D-Bus: %s.\n",
767                 error->message);
768         return 1;
769     }
770
771     if(NULL == (scan_info->req_proxy =dbus_g_proxy_new_for_name(scan_info->bus,
772             BTSEARCH_SERVICE,
773             BTSEARCH_REQ_PATH,
774             BTSEARCH_REQ_INTERFACE)))
775     {
776         g_printerr("Failed to create D-Bus request proxy for btsearch.");
777         return 2;
778     }
779
780     if(NULL == (scan_info->sig_proxy =dbus_g_proxy_new_for_name(scan_info->bus,
781             BTSEARCH_SERVICE,
782             BTSEARCH_SIG_PATH,
783             BTSEARCH_SIG_INTERFACE)))
784     {
785         g_printerr("Failed to create D-Bus signal proxy for btsearch.");
786         return 2;
787     }
788
789     dbus_g_object_register_marshaller(
790             g_cclosure_user_marshal_VOID__STRING_STRING_POINTER_UCHAR_UINT,
791             G_TYPE_NONE,
792             G_TYPE_STRING,
793             G_TYPE_STRING,
794             DBUS_TYPE_G_UCHAR_ARRAY,
795             G_TYPE_UCHAR,
796             G_TYPE_UINT,
797             G_TYPE_INVALID);
798
799     dbus_g_proxy_add_signal(scan_info->sig_proxy,
800             BTSEARCH_DEV_FOUND_SIG,
801             G_TYPE_STRING,
802             G_TYPE_STRING,
803             DBUS_TYPE_G_UCHAR_ARRAY,
804             G_TYPE_UCHAR,
805             G_TYPE_UINT,
806             G_TYPE_INVALID);
807     dbus_g_proxy_connect_signal(scan_info->sig_proxy, BTSEARCH_DEV_FOUND_SIG,
808             G_CALLBACK(scan_cb_dev_found), scan_info, NULL);
809
810     dbus_g_proxy_add_signal(scan_info->sig_proxy,
811             BTSEARCH_SEARCH_COMPLETE_SIG,
812             G_TYPE_INVALID);
813     dbus_g_proxy_connect_signal(scan_info->sig_proxy,
814             BTSEARCH_SEARCH_COMPLETE_SIG,
815             G_CALLBACK(scan_cb_search_complete), scan_info, NULL);
816
817     error = NULL;
818     if(!dbus_g_proxy_call(scan_info->req_proxy, BTSEARCH_START_SEARCH_REQ,
819                 &error, G_TYPE_INVALID, G_TYPE_INVALID))
820     {
821         if(error->domain == DBUS_GERROR
822                 && error->code == DBUS_GERROR_REMOTE_EXCEPTION)
823         {
824             g_printerr("Caught remote method exception %s: %s",
825                     dbus_g_error_get_name(error),
826                     error->message);
827         }
828         else
829             g_printerr("Error: %s\n", error->message);
830         return 3;
831     }
832
833     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
834     return 0;
835 }
836
837 /**
838  * Scan for all bluetooth devices.  This method can take a few seconds,
839  * during which the UI will freeze.
840  */
841 static gboolean
842 scan_bluetooth(GtkWidget *widget, ScanInfo *scan_info)
843 {
844     GError *error = NULL;
845     GtkWidget *dialog = NULL;
846     GtkWidget *lst_devices = NULL;
847     GtkTreeViewColumn *column = NULL;
848     GtkCellRenderer *renderer = NULL;
849     printf("%s()\n", __PRETTY_FUNCTION__);
850
851     dialog = gtk_dialog_new_with_buttons(_("Select Bluetooth Device"),
852             GTK_WINDOW(scan_info->settings_dialog), GTK_DIALOG_MODAL,
853             GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
854             GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
855             NULL);
856
857     scan_info->scan_dialog = dialog;
858
859     scan_info->store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
860
861     gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 300);
862
863     gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
864             lst_devices = gtk_tree_view_new_with_model(
865                 GTK_TREE_MODEL(scan_info->store)), TRUE, TRUE, 0);
866
867     g_object_unref(G_OBJECT(scan_info->store));
868
869     gtk_tree_selection_set_mode(
870             gtk_tree_view_get_selection(GTK_TREE_VIEW(lst_devices)),
871             GTK_SELECTION_SINGLE);
872     gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(lst_devices), TRUE);
873
874     renderer = gtk_cell_renderer_text_new();
875     column = gtk_tree_view_column_new_with_attributes(
876             _("MAC"), renderer, "text", 0, NULL);
877     gtk_tree_view_append_column(GTK_TREE_VIEW(lst_devices), column);
878
879     renderer = gtk_cell_renderer_text_new();
880     column = gtk_tree_view_column_new_with_attributes(
881             _("Description"), renderer, "text", 1, NULL);
882     gtk_tree_view_append_column(GTK_TREE_VIEW(lst_devices), column);
883
884     gtk_widget_show_all(dialog);
885
886     scan_info->banner = hildon_banner_show_animation(dialog, NULL,
887             _("Scanning for Bluetooth Devices"));
888
889     if(scan_start_search(scan_info))
890     {
891         gtk_widget_destroy(scan_info->banner);
892         popup_error(scan_info->settings_dialog,
893                 _("An error occurred while attempting to scan for "
894                 "bluetooth devices."));
895     }
896     else while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
897     {
898         GtkTreeIter iter;
899         if(gtk_tree_selection_get_selected(
900                     gtk_tree_view_get_selection(GTK_TREE_VIEW(lst_devices)),
901                     NULL, &iter))
902         {
903             gchar *mac;
904             gtk_tree_model_get(GTK_TREE_MODEL(scan_info->store),
905                     &iter, 0, &mac, -1);
906             gtk_entry_set_text(GTK_ENTRY(scan_info->txt_gps_bt_mac), mac);
907             break;
908         }
909         else
910             popup_error(dialog,
911                     _("Please select a bluetooth device from the list."));
912     }
913
914     gtk_widget_destroy(dialog);
915
916     /* Clean up D-Bus. */
917     if(scan_info->req_proxy)
918     {
919         dbus_g_proxy_call(scan_info->req_proxy, BTSEARCH_STOP_SEARCH_REQ,
920                     &error, G_TYPE_INVALID, G_TYPE_INVALID);
921         g_object_unref(scan_info->req_proxy);
922         scan_info->req_proxy = NULL;
923     }
924     if(scan_info->sig_proxy)
925     {
926         g_object_unref(scan_info->sig_proxy);
927         scan_info->sig_proxy = NULL;
928     }
929     if(scan_info->bus)
930     {
931         dbus_g_connection_unref(scan_info->bus);
932         scan_info->bus = NULL;
933     }
934
935     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
936     return TRUE;
937 }
938
939 static gboolean
940 settings_dialog_browse_forfile(GtkWidget *widget, BrowseInfo *browse_info)
941 {
942     GtkWidget *dialog;
943     printf("%s()\n", __PRETTY_FUNCTION__);
944
945     dialog = GTK_WIDGET(
946             hildon_file_chooser_dialog_new(GTK_WINDOW(browse_info->dialog),
947             GTK_FILE_CHOOSER_ACTION_OPEN));
948
949     gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialog), TRUE);
950     gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
951             gtk_entry_get_text(GTK_ENTRY(browse_info->txt)));
952
953     if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(dialog)))
954     {
955         gchar *filename = gtk_file_chooser_get_filename(
956                 GTK_FILE_CHOOSER(dialog));
957         gtk_entry_set_text(GTK_ENTRY(browse_info->txt), filename);
958         g_free(filename);
959     }
960
961     gtk_widget_destroy(dialog);
962
963     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
964     return TRUE;
965 }
966
967 static gboolean
968 settings_dialog_hardkeys_reset(GtkWidget *widget, KeysDialogInfo *cdi)
969 {
970     GtkWidget *confirm;
971     printf("%s()\n", __PRETTY_FUNCTION__);
972
973     confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
974             _("Reset all hardware keys to their original defaults?"));
975
976     if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm)))
977     {
978         gint i;
979         for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
980             gtk_combo_box_set_active(GTK_COMBO_BOX(cdi->cmb[i]),
981                     CUSTOM_KEY_DEFAULT[i]);
982     }
983     gtk_widget_destroy(confirm);
984
985     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
986     return TRUE;
987 }
988
989 static gboolean
990 settings_dialog_hardkeys(GtkWidget *widget, GtkWidget *parent)
991 {
992     gint i;
993     static GtkWidget *dialog = NULL;
994     static GtkWidget *table = NULL;
995     static GtkWidget *label = NULL;
996     static KeysDialogInfo bdi;
997     static GtkWidget *btn_defaults = NULL;
998     printf("%s()\n", __PRETTY_FUNCTION__);
999
1000     if(dialog == NULL)
1001     {
1002         dialog = gtk_dialog_new_with_buttons(_("Hardware Keys"),
1003                 GTK_WINDOW(parent), GTK_DIALOG_MODAL,
1004                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1005                 NULL);
1006
1007         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
1008                 btn_defaults = gtk_button_new_with_label(_("Reset...")));
1009         g_signal_connect(G_OBJECT(btn_defaults), "clicked",
1010                           G_CALLBACK(settings_dialog_hardkeys_reset), &bdi);
1011
1012         gtk_dialog_add_button(GTK_DIALOG(dialog),
1013                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
1014
1015         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
1016                 table = gtk_table_new(2, 9, FALSE), TRUE, TRUE, 0);
1017         for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
1018         {
1019             gint j;
1020             gtk_table_attach(GTK_TABLE(table),
1021                     label = gtk_label_new(""),
1022                     0, 1, i, i + 1, GTK_FILL, 0, 2, 1);
1023             gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1024             gtk_label_set_markup(GTK_LABEL(label), CUSTOM_KEY_ICON[i]);
1025             gtk_table_attach(GTK_TABLE(table),
1026                     bdi.cmb[i] = gtk_combo_box_new_text(),
1027                     1, 2, i, i + 1, GTK_FILL, 0, 2, 1);
1028             for(j = 0; j < CUSTOM_ACTION_ENUM_COUNT; j++)
1029                 gtk_combo_box_append_text(GTK_COMBO_BOX(bdi.cmb[i]),
1030                         CUSTOM_ACTION_ENUM_TEXT[j]);
1031         }
1032     }
1033
1034     /* Initialize contents of the combo boxes. */
1035     for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
1036         gtk_combo_box_set_active(GTK_COMBO_BOX(bdi.cmb[i]), _action[i]);
1037
1038     gtk_widget_show_all(dialog);
1039
1040 OUTER_WHILE:
1041     while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
1042     {
1043         /* Check for duplicates. */
1044         for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
1045         {
1046             gint j;
1047             for(j = i + 1; j < CUSTOM_KEY_ENUM_COUNT; j++)
1048             {
1049                 if(gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i]))
1050                         == gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[j])))
1051                 {
1052                     GtkWidget *confirm;
1053                     gchar *buffer = g_strdup_printf("%s:\n    %s\n%s",
1054                         _("The following action is mapped to multiple keys"),
1055                         CUSTOM_ACTION_ENUM_TEXT[gtk_combo_box_get_active(
1056                             GTK_COMBO_BOX(bdi.cmb[i]))],
1057                         _("Continue?"));
1058                     confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
1059                             buffer);
1060
1061                     if(GTK_RESPONSE_OK != gtk_dialog_run(GTK_DIALOG(confirm)))
1062                     {
1063                         gtk_widget_destroy(confirm);
1064                         goto OUTER_WHILE;
1065                     }
1066                     gtk_widget_destroy(confirm);
1067                 }
1068             }
1069         }
1070         for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
1071             _action[i] = gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i]));
1072         break;
1073     }
1074
1075     gtk_widget_hide(dialog);
1076
1077     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1078     return TRUE;
1079 }
1080
1081 static gboolean
1082 settings_dialog_colors_reset(GtkWidget *widget, ColorsDialogInfo *cdi)
1083 {
1084     GtkWidget *confirm;
1085     printf("%s()\n", __PRETTY_FUNCTION__);
1086
1087     confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
1088             _("Reset all colors to their original defaults?"));
1089
1090     if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm)))
1091     {
1092         gint i;
1093         for(i = 0; i < COLORABLE_ENUM_COUNT; i++)
1094         {
1095             hildon_color_button_set_color(
1096                     HILDON_COLOR_BUTTON(cdi->col[i]),
1097                     &COLORABLE_DEFAULT[i]);
1098         }
1099     }
1100     gtk_widget_destroy(confirm);
1101
1102     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1103     return TRUE;
1104 }
1105
1106 static gboolean
1107 settings_dialog_colors(GtkWidget *widget, GtkWidget *parent)
1108 {
1109     static GtkWidget *dialog = NULL;
1110     static GtkWidget *table = NULL;
1111     static GtkWidget *label = NULL;
1112     static GtkWidget *btn_defaults = NULL;
1113     static ColorsDialogInfo cdi;
1114     printf("%s()\n", __PRETTY_FUNCTION__);
1115
1116     if(dialog == NULL)
1117     {
1118         dialog = gtk_dialog_new_with_buttons(_("Colors"),
1119                 GTK_WINDOW(parent), GTK_DIALOG_MODAL,
1120                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1121                 NULL);
1122
1123         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
1124                 btn_defaults = gtk_button_new_with_label(_("Reset...")));
1125         g_signal_connect(G_OBJECT(btn_defaults), "clicked",
1126                           G_CALLBACK(settings_dialog_colors_reset), &cdi);
1127
1128         gtk_dialog_add_button(GTK_DIALOG(dialog),
1129                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
1130
1131         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
1132                 table = gtk_table_new(4, 3, FALSE), TRUE, TRUE, 0);
1133
1134         /* GPS. */
1135         gtk_table_attach(GTK_TABLE(table),
1136                 label = gtk_label_new(_("GPS")),
1137                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1138         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1139         gtk_table_attach(GTK_TABLE(table),
1140                 cdi.col[COLORABLE_MARK] = hildon_color_button_new(),
1141                 1, 2, 0, 1, 0, 0, 2, 4);
1142         gtk_table_attach(GTK_TABLE(table),
1143                 cdi.col[COLORABLE_MARK_VELOCITY] = hildon_color_button_new(),
1144                 2, 3, 0, 1, 0, 0, 2, 4);
1145         gtk_table_attach(GTK_TABLE(table),
1146                 cdi.col[COLORABLE_MARK_OLD] = hildon_color_button_new(),
1147                 3, 4, 0, 1, 0, 0, 2, 4);
1148
1149         /* Track. */
1150         gtk_table_attach(GTK_TABLE(table),
1151                 label = gtk_label_new(_("Track")),
1152                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1153         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1154         gtk_table_attach(GTK_TABLE(table),
1155                 cdi.col[COLORABLE_TRACK] = hildon_color_button_new(),
1156                 1, 2, 1, 2, 0, 0, 2, 4);
1157         gtk_table_attach(GTK_TABLE(table),
1158                 cdi.col[COLORABLE_TRACK_MARK] = hildon_color_button_new(),
1159                 2, 3, 1, 2, 0, 0, 2, 4);
1160         gtk_table_attach(GTK_TABLE(table),
1161                 cdi.col[COLORABLE_TRACK_BREAK] = hildon_color_button_new(),
1162                 3, 4, 1, 2, 0, 0, 2, 4);
1163
1164         /* Route. */
1165         gtk_table_attach(GTK_TABLE(table),
1166                 label = gtk_label_new(_("Route")),
1167                 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1168         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1169         gtk_table_attach(GTK_TABLE(table),
1170                 cdi.col[COLORABLE_ROUTE] = hildon_color_button_new(),
1171                 1, 2, 2, 3, 0, 0, 2, 4);
1172         gtk_table_attach(GTK_TABLE(table),
1173                 cdi.col[COLORABLE_ROUTE_WAY] = hildon_color_button_new(),
1174                 2, 3, 2, 3, 0, 0, 2, 4);
1175         gtk_table_attach(GTK_TABLE(table),
1176                 cdi.col[COLORABLE_ROUTE_BREAK] = hildon_color_button_new(),
1177                 3, 4, 2, 3, 0, 0, 2, 4);
1178
1179         /* POI. */
1180         gtk_table_attach(GTK_TABLE(table),
1181                 label = gtk_label_new(_("POI")),
1182                 0, 1, 3, 4, GTK_FILL, 0, 2, 4);
1183         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1184         gtk_table_attach(GTK_TABLE(table),
1185                 cdi.col[COLORABLE_POI] = hildon_color_button_new(),
1186                 1, 2, 3, 4, 0, 0, 2, 4);
1187     }
1188
1189     /* Initialize GPS. */
1190     hildon_color_button_set_color(
1191             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK]),
1192             &_color[COLORABLE_MARK]);
1193     hildon_color_button_set_color(
1194             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]),
1195             &_color[COLORABLE_MARK_VELOCITY]);
1196     hildon_color_button_set_color(
1197             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]),
1198             &_color[COLORABLE_MARK_OLD]);
1199
1200     /* Initialize Track. */
1201     hildon_color_button_set_color(
1202             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]),
1203             &_color[COLORABLE_TRACK]);
1204     hildon_color_button_set_color(
1205             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]),
1206             &_color[COLORABLE_TRACK_MARK]);
1207     hildon_color_button_set_color(
1208             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]),
1209             &_color[COLORABLE_TRACK_BREAK]);
1210
1211     /* Initialize Route. */
1212     hildon_color_button_set_color(
1213             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]),
1214             &_color[COLORABLE_ROUTE]);
1215     hildon_color_button_set_color(
1216             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]),
1217             &_color[COLORABLE_ROUTE_WAY]);
1218     hildon_color_button_set_color(
1219             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]),
1220             &_color[COLORABLE_ROUTE_BREAK]);
1221
1222     /* Initialize POI. */
1223     hildon_color_button_set_color(
1224             HILDON_COLOR_BUTTON(cdi.col[COLORABLE_POI]),
1225             &_color[COLORABLE_POI]);
1226
1227     gtk_widget_show_all(dialog);
1228
1229     while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
1230     {
1231 #ifndef LEGACY
1232         hildon_color_button_get_color(
1233                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK]), 
1234                 &_color[COLORABLE_MARK]);
1235
1236         hildon_color_button_get_color(
1237                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]), 
1238                 &_color[COLORABLE_MARK_VELOCITY]);
1239
1240         hildon_color_button_get_color(
1241                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]),
1242                 &_color[COLORABLE_MARK_OLD]);
1243
1244         hildon_color_button_get_color(
1245                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]),
1246                 &_color[COLORABLE_TRACK]);
1247
1248         hildon_color_button_get_color(
1249                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]),
1250                 &_color[COLORABLE_TRACK_MARK]);
1251
1252         hildon_color_button_get_color(
1253                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]),
1254                 &_color[COLORABLE_TRACK_BREAK]);
1255
1256         hildon_color_button_get_color(
1257                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]),
1258                 &_color[COLORABLE_ROUTE]);
1259
1260         hildon_color_button_get_color(
1261                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]),
1262                 &_color[COLORABLE_ROUTE_WAY]);
1263
1264         hildon_color_button_get_color(
1265                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]),
1266                 &_color[COLORABLE_ROUTE_BREAK]);
1267
1268         hildon_color_button_get_color(
1269                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_POI]),
1270                 &_color[COLORABLE_POI]);
1271 #else
1272         GdkColor *color;
1273
1274         color = hildon_color_button_get_color(
1275                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK]));
1276         _color[COLORABLE_MARK] = *color;
1277
1278         color = hildon_color_button_get_color(
1279                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]));
1280         _color[COLORABLE_MARK_VELOCITY] = *color;
1281
1282         color = hildon_color_button_get_color(
1283                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]));
1284         _color[COLORABLE_MARK_OLD] = *color;
1285
1286         color = hildon_color_button_get_color(
1287                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]));
1288         _color[COLORABLE_TRACK] = *color;
1289
1290         color = hildon_color_button_get_color(
1291                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]));
1292         _color[COLORABLE_TRACK_MARK] = *color;
1293
1294         color = hildon_color_button_get_color(
1295                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]));
1296         _color[COLORABLE_TRACK_BREAK] = *color;
1297
1298         color = hildon_color_button_get_color(
1299                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]));
1300         _color[COLORABLE_ROUTE] = *color;
1301
1302         color = hildon_color_button_get_color(
1303                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]));
1304         _color[COLORABLE_ROUTE_WAY] = *color;
1305
1306         color = hildon_color_button_get_color(
1307                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]));
1308         _color[COLORABLE_ROUTE_BREAK] = *color;
1309
1310         color = hildon_color_button_get_color(
1311                 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_POI]));
1312         _color[COLORABLE_POI] = *color;
1313
1314 #endif
1315         
1316         update_gcs();
1317         break;
1318     }
1319
1320     map_force_redraw();
1321
1322     gtk_widget_hide(dialog);
1323
1324     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1325     return TRUE;
1326 }
1327
1328 #ifdef INCLUDE_APRS
1329
1330 void load_aprs_options(GConfClient *gconf_client)
1331 {
1332     _aprs_server = gconf_client_get_string(
1333             gconf_client, GCONF_KEY_APRS_SERVER, NULL);
1334
1335     _aprs_server_port = gconf_client_get_int(
1336             gconf_client, GCONF_KEY_APRS_SERVER_PORT, NULL);
1337
1338     _aprs_inet_server_validation = gconf_client_get_string(
1339             gconf_client, GCONF_KEY_APRS_SERVER_VAL, NULL);
1340
1341     _aprs_mycall = gconf_client_get_string(gconf_client, 
1342         GCONF_KEY_APRS_MYCALL, NULL);
1343     
1344
1345     _aprs_tty_port = gconf_client_get_string(gconf_client, 
1346         GCONF_KEY_APRS_TTY_PORT, NULL);
1347     
1348     
1349     
1350     _aprs_inet_beacon_comment = gconf_client_get_string(gconf_client, 
1351         GCONF_KEY_APRS_INET_BEACON, NULL);
1352
1353     _aprs_inet_beacon_interval = gconf_client_get_int(
1354         gconf_client, GCONF_KEY_APRS_INET_BEACON_INTERVAL, NULL);
1355     
1356     _aprs_std_pos_hist = gconf_client_get_int(
1357         gconf_client, GCONF_KEY_APRS_MAX_TRACK_PTS, NULL);
1358
1359     _aprs_max_stations = gconf_client_get_int(
1360             gconf_client, GCONF_KEY_APRS_MAX_STATIONS, NULL);
1361     
1362     _aprs_enable = gconf_client_get_bool(gconf_client,
1363                 GCONF_KEY_APRS_ENABLE, NULL);
1364
1365     _aprs_show_new_station_alert = gconf_client_get_bool(gconf_client,
1366                 GCONF_KEY_APRS_SHOW_NEW_STATION_ALERT, NULL);
1367
1368     _aprs_tnc_method = gconf_client_get_int(
1369             gconf_client, GCONF_KEY_APRS_TNC_CONN_METHOD, NULL);
1370
1371     _aprs_tnc_bt_mac = gconf_client_get_string(gconf_client, 
1372                 GCONF_KEY_APRS_TNC_BT_MAC, NULL);
1373     
1374     _aprs_server_auto_filter_km = gconf_client_get_int(
1375                 gconf_client, GCONF_KEY_APRS_INET_AUTO_FILTER_RANGE, NULL);
1376     
1377     _aprs_server_auto_filter_on = gconf_client_get_bool(gconf_client,
1378                 GCONF_KEY_APRS_INET_AUTO_FILTER, NULL);
1379     
1380     _aprs_beacon_comment = gconf_client_get_string(gconf_client, 
1381                 GCONF_KEY_APRS_BEACON_COMMENT, NULL);
1382     
1383     _aprs_enable_inet_tx = gconf_client_get_bool(gconf_client,
1384                 GCONF_KEY_APRS_ENABLE_INET_TX, NULL);
1385     _aprs_enable_tty_tx = gconf_client_get_bool(gconf_client,
1386                 GCONF_KEY_APRS_ENABLE_TTY_TX, NULL);
1387     
1388     _aprs_tty_beacon_interval = gconf_client_get_int(
1389             gconf_client, GCONF_KEY_APRS_TTY_BEACON_INTERVAL, NULL);
1390     
1391     
1392     //_aprs_unproto_path = g_strdup_printf("WIDE2-2");
1393     _aprs_unproto_path = gconf_client_get_string(gconf_client, 
1394                                 GCONF_KEY_APRS_BEACON_PATH, NULL);
1395     
1396     _aprs_transmit_compressed_posit = gconf_client_get_bool(gconf_client,
1397                 GCONF_KEY_APRS_BEACON_COMPRESSED, NULL);
1398     
1399     gchar *tmp;
1400     tmp = gconf_client_get_string(gconf_client, 
1401                         GCONF_KEY_APRS_BEACON_SYM_GROUP, NULL);
1402     if(tmp && strlen(tmp)>0) _aprs_beacon_group = tmp[0];
1403     else _aprs_beacon_group = '/'; 
1404     
1405     //_aprs_beacon_symbol = 'k';
1406     tmp = gconf_client_get_string(gconf_client, 
1407                                 GCONF_KEY_APRS_BEACON_SYMBOL, NULL);
1408     if(tmp && strlen(tmp)>0) _aprs_beacon_symbol  = tmp[0];
1409     else _aprs_beacon_symbol = 'l';
1410     
1411     
1412     
1413     aprs_timer_init();
1414 }
1415 #endif // INCLUDE_APRS
1416
1417 /**
1418  * Bring up the Settings dialog.  Return TRUE if and only if the recever
1419  * information has changed (MAC or channel).
1420  */
1421 gboolean settings_dialog()
1422 {
1423     static GtkWidget *dialog = NULL;
1424     static GtkWidget *notebook = NULL;
1425     static GtkWidget *table = NULL;
1426     static GtkWidget *hbox = NULL;
1427     static GtkWidget *label = NULL;
1428     static GtkWidget *rad_gps_bt = NULL;
1429     static GtkWidget *rad_gps_gpsd = NULL;
1430     static GtkWidget *rad_gps_file = NULL;
1431     static GtkWidget *txt_gps_bt_mac = NULL;
1432     static GtkWidget *txt_gps_gpsd_host = NULL;
1433     static GtkWidget *num_gps_gpsd_port = NULL;
1434     static GtkWidget *txt_gps_file_path = NULL;
1435     static GtkWidget *num_center_ratio = NULL;
1436     static GtkWidget *num_lead_ratio = NULL;
1437     static GtkWidget *chk_lead_is_fixed = NULL;
1438     static GtkWidget *num_rotate_sens = NULL;
1439     static GtkWidget *cmb_rotate_dir = NULL;
1440     static GtkWidget *num_ac_min_speed = NULL;
1441     static GtkWidget *num_announce_notice = NULL;
1442     static GtkWidget *chk_enable_voice = NULL;
1443     static GtkWidget *chk_enable_announce = NULL;
1444     static GtkWidget *num_draw_width = NULL;
1445     static GtkWidget *cmb_units = NULL;
1446     static GtkWidget *cmb_degformat = NULL;
1447     static GtkWidget *btn_scan = NULL;
1448     static GtkWidget *btn_browse_gps = NULL;
1449     static GtkWidget *btn_buttons = NULL;
1450     static GtkWidget *btn_colors = NULL;
1451
1452     static GtkWidget *txt_poi_db = NULL;
1453     static GtkWidget *btn_browse_poi = NULL;
1454     static GtkWidget *num_poi_zoom = NULL;
1455     static GtkWidget *num_auto_download_precache = NULL;
1456     static GtkWidget *chk_speed_limit_on = NULL;
1457     static GtkWidget *num_speed = NULL;
1458     static GtkWidget *cmb_speed_location = NULL;
1459     static GtkWidget *cmb_unblank_option = NULL;
1460     static GtkWidget *cmb_info_font_size = NULL;
1461
1462     static BrowseInfo poi_browse_info = {0, 0};
1463     static BrowseInfo gps_file_browse_info = {0, 0};
1464     static ScanInfo scan_info = {0};
1465     gboolean rcvr_changed = FALSE;
1466     gint i;
1467     printf("%s()\n", __PRETTY_FUNCTION__);
1468
1469     if(dialog == NULL)
1470     {
1471         dialog = gtk_dialog_new_with_buttons(_("Settings"),
1472                 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
1473                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1474                 NULL);
1475
1476         /* Enable the help button. */
1477 #ifndef LEGACY
1478         hildon_help_dialog_help_enable(
1479 #else
1480         ossohelp_dialog_help_enable(
1481 #endif 
1482                 GTK_DIALOG(dialog), HELP_ID_SETTINGS, _osso);
1483
1484         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
1485                btn_buttons = gtk_button_new_with_label(_("Hardware Keys...")));
1486
1487         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
1488                 btn_colors = gtk_button_new_with_label(_("Colors...")));
1489
1490         gtk_dialog_add_button(GTK_DIALOG(dialog),
1491                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
1492
1493         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
1494                 notebook = gtk_notebook_new(), TRUE, TRUE, 0);
1495
1496         /* Receiver page. */
1497         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1498                 table = gtk_table_new(3, 4, FALSE),
1499                 label = gtk_label_new(_("GPS")));
1500
1501         /* Receiver MAC Address. */
1502         gtk_table_attach(GTK_TABLE(table),
1503                 rad_gps_bt = gtk_radio_button_new_with_label(
1504                     NULL, _("Bluetooth")),
1505                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1506         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1507         gtk_table_attach(GTK_TABLE(table),
1508                 hbox = gtk_hbox_new(FALSE, 4),
1509                 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1510         gtk_box_pack_start(GTK_BOX(hbox),
1511                 txt_gps_bt_mac = gtk_entry_new(),
1512                 TRUE, TRUE, 0);
1513 #ifdef MAEMO_CHANGES
1514 #ifndef LEGACY
1515         g_object_set(G_OBJECT(txt_gps_bt_mac), "hildon-input-mode",
1516                 HILDON_GTK_INPUT_MODE_FULL, NULL);
1517 #else
1518         g_object_set(G_OBJECT(txt_gps_bt_mac), HILDON_AUTOCAP, FALSE, NULL);
1519 #endif
1520 #endif
1521         gtk_box_pack_start(GTK_BOX(hbox),
1522                 btn_scan = gtk_button_new_with_label(_("Scan...")),
1523                 FALSE, FALSE, 0);
1524 #ifndef HAVE_LIBGPSBT
1525         gtk_widget_set_sensitive(rad_gps_bt, FALSE);
1526         gtk_widget_set_sensitive(txt_gps_bt_mac, FALSE);
1527         gtk_widget_set_sensitive(btn_scan, FALSE);
1528 #endif
1529
1530         /* File Path (RFComm). */
1531         gtk_table_attach(GTK_TABLE(table),
1532                 rad_gps_file = gtk_radio_button_new_with_label_from_widget(
1533                     GTK_RADIO_BUTTON(rad_gps_bt), _("File Path")),
1534                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1535         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1536         gtk_table_attach(GTK_TABLE(table),
1537                 hbox = gtk_hbox_new(FALSE, 4),
1538                 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1539         gtk_box_pack_start(GTK_BOX(hbox),
1540                 txt_gps_file_path = gtk_entry_new(),
1541                 TRUE, TRUE, 0);
1542 #ifdef MAEMO_CHANGES
1543 #ifndef LEGACY
1544         g_object_set(G_OBJECT(txt_gps_file_path), "hildon-input-mode",
1545                 HILDON_GTK_INPUT_MODE_FULL, NULL);
1546 #else
1547         g_object_set(G_OBJECT(txt_gps_file_path), HILDON_AUTOCAP, FALSE, NULL);
1548 #endif
1549 #endif
1550         gtk_box_pack_start(GTK_BOX(hbox),
1551                 btn_browse_gps = gtk_button_new_with_label(_("Browse...")),
1552                 FALSE, FALSE, 0);
1553 #ifndef HAVE_LIBGPSBT
1554         gtk_widget_set_sensitive(rad_gps_file, FALSE);
1555         gtk_widget_set_sensitive(txt_gps_file_path, FALSE);
1556         gtk_widget_set_sensitive(btn_browse_gps, FALSE);
1557 #endif
1558
1559         /* GPSD Hostname and Port. */
1560         gtk_table_attach(GTK_TABLE(table),
1561                 rad_gps_gpsd = gtk_radio_button_new_with_label_from_widget(
1562                     GTK_RADIO_BUTTON(rad_gps_bt), _("GPSD Host")),
1563                 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1564         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1565         gtk_table_attach(GTK_TABLE(table),
1566                 hbox = gtk_hbox_new(FALSE, 4),
1567                 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1568         gtk_box_pack_start(GTK_BOX(hbox),
1569                 txt_gps_gpsd_host = gtk_entry_new(),
1570                 TRUE, TRUE, 0);
1571 #ifdef MAEMO_CHANGES
1572 #ifndef LEGACY
1573         g_object_set(G_OBJECT(txt_gps_gpsd_host), "hildon-input-mode",
1574                 HILDON_GTK_INPUT_MODE_FULL, NULL);
1575 #else
1576         g_object_set(G_OBJECT(txt_gps_gpsd_host), HILDON_AUTOCAP, FALSE, NULL);
1577 #endif
1578 #endif
1579         gtk_box_pack_start(GTK_BOX(hbox),
1580                 label = gtk_label_new(_("Port")),
1581                 FALSE, FALSE, 0);
1582         gtk_box_pack_start(GTK_BOX(hbox),
1583                 num_gps_gpsd_port = hildon_number_editor_new(1, 65535),
1584                 FALSE, FALSE, 0);
1585
1586
1587         /* Auto-Center page. */
1588         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1589                 table = gtk_table_new(3, 3, FALSE),
1590                 label = gtk_label_new(_("Auto-Center")));
1591
1592         /* Lead Amount. */
1593         gtk_table_attach(GTK_TABLE(table),
1594                 label = gtk_label_new(_("Lead Amount")),
1595                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1596         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1597         gtk_table_attach(GTK_TABLE(table),
1598                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1599                 1, 2, 0, 1, GTK_FILL, 0, 2, 4);
1600         gtk_container_add(GTK_CONTAINER(label),
1601                 num_lead_ratio = hildon_controlbar_new());
1602         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_lead_ratio), 1, 10);
1603         force_min_visible_bars(HILDON_CONTROLBAR(num_lead_ratio), 1);
1604
1605         gtk_table_attach(GTK_TABLE(table),
1606                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1607                 2, 3, 0, 1, GTK_FILL, 0, 2, 4);
1608         gtk_container_add(GTK_CONTAINER(label),
1609             chk_lead_is_fixed = gtk_check_button_new_with_label(_("Fixed")));
1610
1611         /* Auto-Center Pan Sensitivity. */
1612         gtk_table_attach(GTK_TABLE(table),
1613                 label = gtk_label_new(_("Pan Sensitivity")),
1614                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1615         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1616         gtk_table_attach(GTK_TABLE(table),
1617                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1618                 1, 2, 1, 2, GTK_FILL, 0, 2, 4);
1619         gtk_container_add(GTK_CONTAINER(label),
1620                 num_center_ratio = hildon_controlbar_new());
1621         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_center_ratio), 1,10);
1622         force_min_visible_bars(HILDON_CONTROLBAR(num_center_ratio), 1);
1623
1624         gtk_table_attach(GTK_TABLE(table),
1625                 hbox = gtk_hbox_new(FALSE, 4),
1626                 2, 3, 1, 2, GTK_FILL, 0, 2, 4);
1627         gtk_box_pack_start(GTK_BOX(hbox),
1628                 label = gtk_label_new(_("Min. Speed")),
1629                 TRUE, TRUE, 4);
1630         gtk_box_pack_start(GTK_BOX(hbox),
1631                 num_ac_min_speed = hildon_number_editor_new(0, 99),
1632                 TRUE, TRUE, 4);
1633
1634         /* Auto-Center Rotate Sensitivity. */
1635         gtk_table_attach(GTK_TABLE(table),
1636                 label = gtk_label_new(_("Rotate Sensit.")),
1637                 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1638         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1639         gtk_table_attach(GTK_TABLE(table),
1640                 num_rotate_sens = hildon_controlbar_new(),
1641                 1, 2, 2, 3, GTK_FILL, 0, 2, 4);
1642         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_rotate_sens), 1,10);
1643         force_min_visible_bars(HILDON_CONTROLBAR(num_rotate_sens), 1);
1644
1645         gtk_table_attach(GTK_TABLE(table),
1646                 hbox = gtk_hbox_new(FALSE, 4),
1647                 2, 3, 2, 3, GTK_FILL, 0, 2, 4);
1648         gtk_box_pack_start(GTK_BOX(hbox),
1649                 label = gtk_label_new(_("Points")),
1650                 TRUE, TRUE, 4);
1651         gtk_box_pack_start(GTK_BOX(hbox),
1652                 cmb_rotate_dir = gtk_combo_box_new_text(),
1653                 TRUE, TRUE, 4);
1654         for(i = 0; i < ROTATE_DIR_ENUM_COUNT; i++)
1655             gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_rotate_dir),
1656                     ROTATE_DIR_ENUM_TEXT[i]);
1657
1658         /* Announcement. */
1659         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1660                 table = gtk_table_new(2, 3, FALSE),
1661                 label = gtk_label_new(_("Announce")));
1662
1663         /* Enable Waypoint Announcements. */
1664         gtk_table_attach(GTK_TABLE(table),
1665                 chk_enable_announce = gtk_check_button_new_with_label(
1666                     _("Enable Waypoint Announcements")),
1667                 0, 2, 0, 1, GTK_FILL, 0, 2, 4);
1668         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_enable_announce),
1669                 _enable_announce);
1670
1671         /* Announcement Advance Notice. */
1672         gtk_table_attach(GTK_TABLE(table),
1673                 label = gtk_label_new(_("Advance Notice")),
1674                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1675         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1676         gtk_table_attach(GTK_TABLE(table),
1677                 num_announce_notice = hildon_controlbar_new(),
1678                 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1679         hildon_controlbar_set_range(
1680                 HILDON_CONTROLBAR(num_announce_notice), 1, 20);
1681         force_min_visible_bars(HILDON_CONTROLBAR(num_announce_notice), 1);
1682
1683         /* Enable Voice. */
1684         gtk_table_attach(GTK_TABLE(table),
1685                 chk_enable_voice = gtk_check_button_new_with_label(
1686                     _("Enable Voice Synthesis (requires flite)")),
1687                 0, 2, 2, 3, GTK_FILL, 0, 2, 4);
1688         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_enable_voice),
1689                 _enable_voice);
1690
1691         /* Misc. page. */
1692         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1693                 table = gtk_table_new(3, 5, FALSE),
1694                 label = gtk_label_new(_("Misc.")));
1695
1696         /* Line Width. */
1697         gtk_table_attach(GTK_TABLE(table),
1698                 label = gtk_label_new(_("Line Width")),
1699                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1700         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1701         gtk_table_attach(GTK_TABLE(table),
1702                 num_draw_width = hildon_controlbar_new(),
1703                 1, 5, 0, 1, GTK_FILL, 0, 2, 4);
1704         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_draw_width), 1, 20);
1705         force_min_visible_bars(HILDON_CONTROLBAR(num_draw_width), 1);
1706
1707         /* Unblank Screen */
1708         gtk_table_attach(GTK_TABLE(table),
1709                 label = gtk_label_new(_("Unblank Screen")),
1710                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1711         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1712         gtk_table_attach(GTK_TABLE(table),
1713                 cmb_unblank_option = gtk_combo_box_new_text(),
1714                 1, 5, 1, 2, GTK_FILL, 0, 2, 4);
1715         for(i = 0; i < UNBLANK_ENUM_COUNT; i++)
1716             gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_unblank_option),
1717                     UNBLANK_ENUM_TEXT[i]);
1718
1719         /* Information Font Size. */
1720         gtk_table_attach(GTK_TABLE(table),
1721                 label = gtk_label_new(_("Info Font Size")),
1722                 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1723         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1724         gtk_table_attach(GTK_TABLE(table),
1725                 cmb_info_font_size = gtk_combo_box_new_text(),
1726                 1, 2, 2, 3, GTK_FILL, 0, 2, 4);
1727         for(i = 0; i < INFO_FONT_ENUM_COUNT; i++)
1728             gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_info_font_size),
1729                     INFO_FONT_ENUM_TEXT[i]);
1730
1731         gtk_table_attach(GTK_TABLE(table),
1732                 gtk_vseparator_new(),
1733                 2, 3, 2, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 2,4);
1734
1735
1736         /* Units. */
1737         gtk_table_attach(GTK_TABLE(table),
1738                 label = gtk_label_new(_("Units")),
1739                 3, 4, 2, 3, GTK_FILL, 0, 2, 4);
1740         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1741         gtk_table_attach(GTK_TABLE(table),
1742                 cmb_units = gtk_combo_box_new_text(),
1743                 4, 5, 2, 3, GTK_FILL, 0, 2, 4);
1744         for(i = 0; i < UNITS_ENUM_COUNT; i++)
1745             gtk_combo_box_append_text(
1746                     GTK_COMBO_BOX(cmb_units), UNITS_ENUM_TEXT[i]);
1747
1748         /* Misc. 2 page. */
1749         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1750                 table = gtk_table_new(3, 4, FALSE),
1751                 label = gtk_label_new(_("Misc. 2")));
1752
1753         /* Degrees format */
1754         gtk_table_attach(GTK_TABLE(table),
1755                 label = gtk_label_new(_("Degrees Format")),
1756                 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1757         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1758         gtk_table_attach(GTK_TABLE(table),
1759                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1760                 1, 2, 0, 1, GTK_FILL, 0, 2, 4);
1761         gtk_container_add(GTK_CONTAINER(label),
1762                 cmb_degformat = gtk_combo_box_new_text());
1763         for(i = 0; i < DEG_FORMAT_ENUM_COUNT; i++)
1764             gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_degformat),
1765                 DEG_FORMAT_ENUM_TEXT[i].name);
1766
1767         gtk_table_attach(GTK_TABLE(table),
1768                 label = gtk_label_new(_("Auto-Download Pre-cache")),
1769                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1770         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1771         gtk_table_attach(GTK_TABLE(table),
1772                 num_auto_download_precache = hildon_controlbar_new(),
1773                 1, 2, 1, 2, GTK_FILL, 0, 2, 4);
1774         hildon_controlbar_set_range(
1775                 HILDON_CONTROLBAR(num_auto_download_precache), 1, 5);
1776         force_min_visible_bars(
1777                 HILDON_CONTROLBAR(num_auto_download_precache), 1);
1778
1779         /* Speed warner. */
1780         gtk_table_attach(GTK_TABLE(table),
1781                 hbox = gtk_hbox_new(FALSE, 4),
1782                 0, 4, 2, 3, GTK_FILL, 0, 2, 4);
1783
1784         gtk_box_pack_start(GTK_BOX(hbox),
1785                 chk_speed_limit_on = gtk_check_button_new_with_label(
1786                     _("Speed Limit")),
1787                 FALSE, FALSE, 0);
1788
1789         gtk_box_pack_start(GTK_BOX(hbox),
1790                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1791                 FALSE, FALSE, 0);
1792         gtk_container_add(GTK_CONTAINER(label),
1793                 num_speed = hildon_number_editor_new(0, 999));
1794
1795         gtk_box_pack_start(GTK_BOX(hbox),
1796                 label = gtk_label_new(_("Location")),
1797                 FALSE, FALSE, 0);
1798         gtk_box_pack_start(GTK_BOX(hbox),
1799                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1800                 FALSE, FALSE, 0);
1801         gtk_container_add(GTK_CONTAINER(label),
1802                 cmb_speed_location = gtk_combo_box_new_text());
1803         for(i = 0; i < SPEED_LOCATION_ENUM_COUNT; i++)
1804             gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_speed_location),
1805                     SPEED_LOCATION_ENUM_TEXT[i]);
1806
1807
1808         /* POI page */
1809         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1810                 table = gtk_table_new(2, 3, FALSE),
1811                 label = gtk_label_new(_("POI")));
1812
1813         /* POI database. */
1814         gtk_table_attach(GTK_TABLE(table),
1815                 label = gtk_label_new(_("POI database")),
1816                 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1817         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1818         gtk_table_attach(GTK_TABLE(table),
1819                 hbox = gtk_hbox_new(FALSE, 4),
1820                 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1821         gtk_box_pack_start(GTK_BOX(hbox),
1822                 txt_poi_db = gtk_entry_new(),
1823                 TRUE, TRUE, 0);
1824 #ifdef MAEMO_CHANGES
1825 #ifndef LEGACY
1826         g_object_set(G_OBJECT(txt_poi_db), "hildon-input-mode",
1827                 HILDON_GTK_INPUT_MODE_FULL, NULL);
1828 #else
1829         g_object_set(G_OBJECT(txt_poi_db), HILDON_AUTOCAP, FALSE, NULL);
1830 #endif
1831 #endif
1832         gtk_box_pack_start(GTK_BOX(hbox),
1833                 btn_browse_poi = gtk_button_new_with_label(_("Browse...")),
1834                 FALSE, FALSE, 0);
1835
1836         /* Show POI below zoom. */
1837         gtk_table_attach(GTK_TABLE(table),
1838                 label = gtk_label_new(_("Show POI below zoom")),
1839                 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1840         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1841         gtk_table_attach(GTK_TABLE(table),
1842                 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1843                 1, 2, 2, 3, GTK_FILL, 0, 2, 4);
1844         gtk_container_add(GTK_CONTAINER(label),
1845                 num_poi_zoom = hildon_number_editor_new(0, MAX_ZOOM));
1846
1847         /* Connect signals. */
1848         memset(&scan_info, 0, sizeof(scan_info));
1849         scan_info.settings_dialog = dialog;
1850         scan_info.txt_gps_bt_mac = txt_gps_bt_mac;
1851         g_signal_connect(G_OBJECT(btn_scan), "clicked",
1852                          G_CALLBACK(scan_bluetooth), &scan_info);
1853         g_signal_connect(G_OBJECT(btn_buttons), "clicked",
1854                          G_CALLBACK(settings_dialog_hardkeys), dialog);
1855         g_signal_connect(G_OBJECT(btn_colors), "clicked",
1856                          G_CALLBACK(settings_dialog_colors), dialog);
1857
1858         poi_browse_info.dialog = dialog;
1859         poi_browse_info.txt = txt_poi_db;
1860         g_signal_connect(G_OBJECT(btn_browse_poi), "clicked",
1861                 G_CALLBACK(settings_dialog_browse_forfile), &poi_browse_info);
1862
1863         gps_file_browse_info.dialog = dialog;
1864         gps_file_browse_info.txt = txt_gps_file_path;
1865         g_signal_connect(G_OBJECT(btn_browse_gps), "clicked",
1866                 G_CALLBACK(settings_dialog_browse_forfile),
1867                 &gps_file_browse_info);
1868     }
1869
1870
1871     /* Initialize fields. */
1872     if(_gri.bt_mac)
1873         gtk_entry_set_text(GTK_ENTRY(txt_gps_bt_mac), _gri.bt_mac);
1874     if(_gri.gpsd_host)
1875         gtk_entry_set_text(GTK_ENTRY(txt_gps_gpsd_host), _gri.gpsd_host);
1876     hildon_number_editor_set_value(
1877             HILDON_NUMBER_EDITOR(num_gps_gpsd_port), _gri.gpsd_port);
1878     if(_gri.file_path)
1879         gtk_entry_set_text(GTK_ENTRY(txt_gps_file_path), _gri.file_path);
1880     switch(_gri.type)
1881     {
1882         case GPS_RCVR_GPSD:
1883             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad_gps_gpsd),TRUE);
1884             break;
1885         case GPS_RCVR_FILE:
1886             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad_gps_file),TRUE);
1887             break;
1888         default: /* Including GPS_RCVR_BT */
1889             gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad_gps_bt), TRUE);
1890             break;
1891     }
1892
1893     if(_poi_db_filename)
1894         gtk_entry_set_text(GTK_ENTRY(txt_poi_db), _poi_db_filename);
1895     hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_poi_zoom),
1896             _poi_zoom);
1897     hildon_controlbar_set_value(HILDON_CONTROLBAR(num_center_ratio),
1898             _center_ratio);
1899     hildon_controlbar_set_value(HILDON_CONTROLBAR(num_lead_ratio),
1900             _lead_ratio);
1901     gtk_toggle_button_set_active(
1902             GTK_TOGGLE_BUTTON(chk_lead_is_fixed), _lead_is_fixed);
1903     hildon_controlbar_set_value(HILDON_CONTROLBAR(num_rotate_sens),
1904             _rotate_sens);
1905     gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_rotate_dir), _rotate_dir);
1906     hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_ac_min_speed),
1907             _ac_min_speed);
1908     hildon_controlbar_set_value(HILDON_CONTROLBAR(num_announce_notice),
1909             _announce_notice_ratio);
1910     hildon_controlbar_set_value(HILDON_CONTROLBAR(num_draw_width),
1911             _draw_width);
1912     gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_units), _units);
1913     gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_degformat), _degformat);
1914     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_speed_limit_on),
1915             _speed_limit_on);
1916     hildon_controlbar_set_value(HILDON_CONTROLBAR(num_auto_download_precache),
1917             _auto_download_precache);
1918     hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_speed),
1919             _speed_limit);
1920     gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_speed_location),
1921             _speed_location);
1922     gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_unblank_option),
1923             _unblank_option);
1924     gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_info_font_size),
1925             _info_font_size);
1926
1927     gtk_widget_show_all(dialog);
1928
1929     while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
1930     {
1931         GpsRcvrType new_grtype;
1932
1933         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_gpsd))
1934                 && !*gtk_entry_get_text(GTK_ENTRY(txt_gps_gpsd_host)))
1935         {
1936             popup_error(dialog, _("Please specify a GPSD hostname."));
1937             continue;
1938         }
1939
1940         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_file))
1941                 && !*gtk_entry_get_text(GTK_ENTRY(txt_gps_file_path)))
1942         {
1943             popup_error(dialog, _("Please specify a GPS file pathname."));
1944             continue;
1945         }
1946
1947         /* Set _gri.bt_mac if necessary. */
1948         if(!*gtk_entry_get_text(GTK_ENTRY(txt_gps_bt_mac)))
1949         {
1950             /* User specified no rcvr mac - set _gri.bt_mac to NULL. */
1951             if(_gri.bt_mac)
1952             {
1953                 g_free(_gri.bt_mac);
1954                 _gri.bt_mac = NULL;
1955                 rcvr_changed = (_gri.type == GPS_RCVR_BT);
1956             }
1957         }
1958         else if(!_gri.bt_mac || strcmp(_gri.bt_mac,
1959                       gtk_entry_get_text(GTK_ENTRY(txt_gps_bt_mac))))
1960         {
1961             /* User specified a new rcvr mac. */
1962             g_free(_gri.bt_mac);
1963             _gri.bt_mac = g_strdup(gtk_entry_get_text(
1964                         GTK_ENTRY(txt_gps_bt_mac)));
1965             rcvr_changed = (_gri.type == GPS_RCVR_BT);
1966         }
1967
1968         /* Set _gri.gpsd_host if necessary. */
1969         if(!*gtk_entry_get_text(GTK_ENTRY(txt_gps_gpsd_host)))
1970         {
1971             /* User specified no rcvr mac - set _gri.gpsd_host to NULL. */
1972             if(_gri.gpsd_host)
1973             {
1974                 g_free(_gri.gpsd_host);
1975                 _gri.gpsd_host = NULL;
1976                 rcvr_changed = (_gri.type == GPS_RCVR_GPSD);
1977             }
1978         }
1979         else if(!_gri.gpsd_host || strcmp(_gri.gpsd_host,
1980                       gtk_entry_get_text(GTK_ENTRY(txt_gps_gpsd_host))))
1981         {
1982             /* User specified a new rcvr mac. */
1983             g_free(_gri.gpsd_host);
1984             _gri.gpsd_host = g_strdup(gtk_entry_get_text(
1985                         GTK_ENTRY(txt_gps_gpsd_host)));
1986             rcvr_changed = (_gri.type == GPS_RCVR_GPSD);
1987         }
1988
1989         if(_gri.gpsd_port != hildon_number_editor_get_value(
1990                     HILDON_NUMBER_EDITOR(num_gps_gpsd_port)))
1991         {
1992             _gri.gpsd_port = hildon_number_editor_get_value(
1993                     HILDON_NUMBER_EDITOR(num_gps_gpsd_port));
1994             rcvr_changed = (_gri.type == GPS_RCVR_GPSD);
1995         }
1996
1997         /* Set _gri.file_path if necessary. */
1998         if(!*gtk_entry_get_text(GTK_ENTRY(txt_gps_file_path)))
1999         {
2000             /* User specified no rcvr mac - set _gri.file_path to NULL. */
2001             if(_gri.file_path)
2002             {
2003                 g_free(_gri.file_path);
2004                 _gri.file_path = NULL;
2005                 rcvr_changed = (_gri.type == GPS_RCVR_FILE);
2006             }
2007         }
2008         else if(!_gri.file_path || strcmp(_gri.file_path,
2009                       gtk_entry_get_text(GTK_ENTRY(txt_gps_file_path))))
2010         {
2011             /* User specified a new rcvr mac. */
2012             g_free(_gri.file_path);
2013             _gri.file_path = g_strdup(gtk_entry_get_text(
2014                         GTK_ENTRY(txt_gps_file_path)));
2015             rcvr_changed = (_gri.type == GPS_RCVR_FILE);
2016         }
2017
2018         if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_bt)))
2019             new_grtype = GPS_RCVR_BT;
2020         else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_gpsd)))
2021             new_grtype = GPS_RCVR_GPSD;
2022         else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_file)))
2023             new_grtype = GPS_RCVR_FILE;
2024         else
2025             new_grtype = GPS_RCVR_BT;
2026
2027         if(new_grtype != _gri.type)
2028         {
2029             _gri.type = new_grtype;
2030             rcvr_changed = TRUE;
2031         }
2032
2033         _center_ratio = hildon_controlbar_get_value(
2034                 HILDON_CONTROLBAR(num_center_ratio));
2035
2036         _lead_ratio = hildon_controlbar_get_value(
2037                 HILDON_CONTROLBAR(num_lead_ratio));
2038
2039         _lead_is_fixed = gtk_toggle_button_get_active(
2040                 GTK_TOGGLE_BUTTON(chk_lead_is_fixed));
2041
2042         _rotate_sens = hildon_controlbar_get_value(
2043                 HILDON_CONTROLBAR(num_rotate_sens));
2044
2045         _ac_min_speed = hildon_number_editor_get_value(
2046                 HILDON_NUMBER_EDITOR(num_ac_min_speed));
2047
2048         _rotate_dir = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_rotate_dir));
2049
2050         _auto_download_precache = hildon_controlbar_get_value(
2051                 HILDON_CONTROLBAR(num_auto_download_precache));
2052
2053         _draw_width = hildon_controlbar_get_value(
2054                 HILDON_CONTROLBAR(num_draw_width));
2055
2056         _units = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_units));
2057         _degformat = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_degformat));
2058
2059         _speed_limit_on = gtk_toggle_button_get_active(
2060                 GTK_TOGGLE_BUTTON(chk_speed_limit_on));
2061         _speed_limit = hildon_number_editor_get_value(
2062                 HILDON_NUMBER_EDITOR(num_speed));
2063         _speed_location = gtk_combo_box_get_active(
2064                 GTK_COMBO_BOX(cmb_speed_location));
2065
2066         _unblank_option = gtk_combo_box_get_active(
2067                 GTK_COMBO_BOX(cmb_unblank_option));
2068
2069         _info_font_size = gtk_combo_box_get_active(
2070                 GTK_COMBO_BOX(cmb_info_font_size));
2071
2072         _announce_notice_ratio = hildon_controlbar_get_value(
2073                 HILDON_CONTROLBAR(num_announce_notice));
2074
2075         _enable_announce = gtk_toggle_button_get_active(
2076                 GTK_TOGGLE_BUTTON(chk_enable_announce));
2077
2078         _enable_voice = gtk_toggle_button_get_active(
2079                 GTK_TOGGLE_BUTTON(chk_enable_voice));
2080
2081         /* Check if user specified a different POI database from before. */
2082         if((!_poi_db_filename && *gtk_entry_get_text(GTK_ENTRY(txt_poi_db)))
2083                 || strcmp(_poi_db_filename,
2084                     gtk_entry_get_text(GTK_ENTRY(txt_poi_db))))
2085         {
2086             /* Clear old filename/dirname, if necessary. */
2087             if(_poi_db_filename)
2088             {
2089                 g_free(_poi_db_filename);
2090                 _poi_db_filename = NULL;
2091                 g_free(_poi_db_dirname);
2092                 _poi_db_dirname = NULL;
2093             }
2094
2095             if(*gtk_entry_get_text(GTK_ENTRY(txt_poi_db)))
2096             {
2097                 _poi_db_filename = g_strdup(gtk_entry_get_text(
2098                             GTK_ENTRY(txt_poi_db)));
2099                 _poi_db_dirname = g_path_get_dirname(_poi_db_filename);
2100             }
2101
2102             poi_db_connect();
2103         }
2104
2105         _poi_zoom = hildon_number_editor_get_value(
2106                 HILDON_NUMBER_EDITOR(num_poi_zoom));
2107
2108         update_gcs();
2109
2110         settings_save();
2111
2112         map_force_redraw();
2113         map_refresh_mark(TRUE);
2114
2115         break;
2116     }
2117
2118     gtk_widget_hide(dialog);
2119
2120     vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, rcvr_changed);
2121     return rcvr_changed;
2122 }
2123
2124 RepoData*
2125 settings_parse_repo(gchar *str)
2126 {
2127     /* Parse each part of a repo, delimited by newline characters:
2128      * 1. name
2129      * 2. url
2130      * 3. db_filename
2131      * 4. dl_zoom_steps
2132      * 5. view_zoom_steps
2133      * 6. layer_level
2134      *
2135      * If layer_level > 0, have additional fields:
2136      * 7. layer_enabled
2137      * 8. layer_refresh_interval
2138      */
2139     gchar *token, *error_check;
2140     printf("%s(%s)\n", __PRETTY_FUNCTION__, str);
2141
2142     RepoData *rd = g_new0(RepoData, 1);
2143
2144     /* Parse name. */
2145     token = strsep(&str, "\n\t");
2146     if(token)
2147         rd->name = g_strdup(token);
2148
2149     /* Parse URL format. */
2150     token = strsep(&str, "\n\t");
2151     if(token)
2152         rd->url = g_strdup(token);
2153
2154     /* Parse cache dir. */
2155     token = strsep(&str, "\n\t");
2156     if(token)
2157         rd->db_filename = gnome_vfs_expand_initial_tilde(token);
2158
2159     /* Parse download zoom steps. */
2160     token = strsep(&str, "\n\t");
2161     if(!token || !*token || !(rd->dl_zoom_steps = atoi(token)))
2162         rd->dl_zoom_steps = 2;
2163
2164     /* Parse view zoom steps. */
2165     token = strsep(&str, "\n\t");
2166     if(!token || !*token || !(rd->view_zoom_steps = atoi(token)))
2167         rd->view_zoom_steps = 1;
2168
2169     /* Parse double-size. */
2170     token = strsep(&str, "\n\t");
2171     if(token)
2172         rd->double_size = atoi(token); /* Default is zero (FALSE) */
2173
2174     /* Parse next-able. */
2175     token = strsep(&str, "\n\t");
2176     if(!token || !*token
2177             || (rd->nextable = strtol(token, &error_check, 10), token == str))
2178         rd->nextable = TRUE;
2179
2180     /* Parse min zoom. */
2181     token = strsep(&str, "\n\t");
2182     if(!token || !*token
2183             || (rd->min_zoom = strtol(token, &error_check, 10), token == str))
2184         rd->min_zoom = 4;
2185
2186     /* Parse max zoom. */
2187     token = strsep(&str, "\n\t");
2188     if(!token || !*token
2189             || (rd->max_zoom = strtol(token, &error_check, 10), token == str))
2190         rd->max_zoom = 20;
2191
2192     /* Parse layer_level */
2193     token = strsep(&str, "\n\t");
2194     if(!token || !*token
2195             || (rd->layer_level = strtol(token, &error_check, 10), token == str))
2196         rd->layer_level = 0;
2197
2198     if (rd->layer_level) {
2199         /* Parse layer_enabled */
2200         token = strsep(&str, "\n\t");
2201         if(!token || !*token || (rd->layer_enabled = strtol(token, &error_check, 10), token == str))
2202             rd->layer_enabled = 0;
2203
2204         /* Parse layer_refresh_interval */
2205         token = strsep(&str, "\n\t");
2206         if(!token || !*token || (rd->layer_refresh_interval = strtol(token, &error_check, 10), token == str))
2207             rd->layer_refresh_interval = 0;
2208
2209         rd->layer_refresh_countdown = rd->layer_refresh_interval;
2210     }
2211
2212     set_repo_type(rd);
2213
2214     vprintf("%s(): return %p\n", __PRETTY_FUNCTION__, rd);
2215     return rd;
2216 }
2217
2218 /**
2219  * Initialize all configuration from GCONF.  This should not be called more
2220  * than once during execution.
2221  */
2222 void
2223 settings_init()
2224 {
2225     GConfValue *value;
2226     GConfClient *gconf_client = gconf_client_get_default();
2227     gchar *str;
2228     printf("%s()\n", __PRETTY_FUNCTION__);
2229
2230     /* Initialize some constants. */
2231     CUSTOM_KEY_GCONF[CUSTOM_KEY_UP] = GCONF_KEY_PREFIX"/key_up";
2232     CUSTOM_KEY_GCONF[CUSTOM_KEY_DOWN] = GCONF_KEY_PREFIX"/key_down";
2233     CUSTOM_KEY_GCONF[CUSTOM_KEY_LEFT] = GCONF_KEY_PREFIX"/key_left";
2234     CUSTOM_KEY_GCONF[CUSTOM_KEY_RIGHT] = GCONF_KEY_PREFIX"/key_right";
2235     CUSTOM_KEY_GCONF[CUSTOM_KEY_SELECT] = GCONF_KEY_PREFIX"/key_select";
2236     CUSTOM_KEY_GCONF[CUSTOM_KEY_INCREASE] = GCONF_KEY_PREFIX"/key_increase";
2237     CUSTOM_KEY_GCONF[CUSTOM_KEY_DECREASE] = GCONF_KEY_PREFIX"/key_decrease";
2238     CUSTOM_KEY_GCONF[CUSTOM_KEY_FULLSCREEN]= GCONF_KEY_PREFIX"/key_fullscreen";
2239     CUSTOM_KEY_GCONF[CUSTOM_KEY_ESC] = GCONF_KEY_PREFIX"/key_esc";
2240
2241     COLORABLE_GCONF[COLORABLE_MARK] = GCONF_KEY_PREFIX"/color_mark";
2242     COLORABLE_GCONF[COLORABLE_MARK_VELOCITY]
2243         = GCONF_KEY_PREFIX"/color_mark_velocity";
2244     COLORABLE_GCONF[COLORABLE_MARK_OLD] = GCONF_KEY_PREFIX"/color_mark_old";
2245     COLORABLE_GCONF[COLORABLE_TRACK] = GCONF_KEY_PREFIX"/color_track";
2246     COLORABLE_GCONF[COLORABLE_TRACK_MARK] =GCONF_KEY_PREFIX"/color_track_mark";
2247     COLORABLE_GCONF[COLORABLE_TRACK_BREAK]
2248         = GCONF_KEY_PREFIX"/color_track_break";
2249     COLORABLE_GCONF[COLORABLE_ROUTE] = GCONF_KEY_PREFIX"/color_route";
2250     COLORABLE_GCONF[COLORABLE_ROUTE_WAY] = GCONF_KEY_PREFIX"/color_route_way";
2251     COLORABLE_GCONF[COLORABLE_ROUTE_BREAK]
2252         = GCONF_KEY_PREFIX"/color_route_break";
2253     COLORABLE_GCONF[COLORABLE_POI] = GCONF_KEY_PREFIX"/color_poi";
2254     
2255 #ifdef INCLUDE_APRS
2256     COLORABLE_GCONF[COLORABLE_APRS_STATION] = GCONF_KEY_PREFIX"/color_aprs_station";
2257 #endif // INCLUDE_APRS
2258     
2259     if(!gconf_client)
2260     {
2261         popup_error(_window, _("Failed to initialize GConf.  Quitting."));
2262         exit(1);
2263     }
2264
2265     /* Get GPS Receiver Type.  Default is Bluetooth Receiver. */
2266     {
2267         gchar *gri_type_str = gconf_client_get_string(gconf_client,
2268                 GCONF_KEY_GPS_RCVR_TYPE, NULL);
2269         gint i = 0;
2270         if(gri_type_str)
2271         {
2272             for(i = GPS_RCVR_ENUM_COUNT - 1; i > 0; i--)
2273                 if(!strcmp(gri_type_str, GPS_RCVR_ENUM_TEXT[i]))
2274                     break;
2275             g_free(gri_type_str);
2276         }
2277         _gri.type = i;
2278     }
2279
2280     /* Get Bluetooth Receiver MAC.  Default is NULL. */
2281     _gri.bt_mac = gconf_client_get_string(
2282             gconf_client, GCONF_KEY_GPS_BT_MAC, NULL);
2283
2284     /* Get GPSD Host.  Default is localhost. */
2285     _gri.gpsd_host = gconf_client_get_string(
2286             gconf_client, GCONF_KEY_GPS_GPSD_HOST, NULL);
2287     if(!_gri.gpsd_host)
2288         _gri.gpsd_host = g_strdup("127.0.0.1");
2289
2290     /* Get GPSD Port.  Default is GPSD_PORT_DEFAULT (2947). */
2291     if(!(_gri.gpsd_port = gconf_client_get_int(
2292             gconf_client, GCONF_KEY_GPS_GPSD_PORT, NULL)))
2293         _gri.gpsd_port = GPSD_PORT_DEFAULT;
2294
2295     /* Get File Path.  Default is /dev/pgps. */
2296     _gri.file_path = gconf_client_get_string(
2297             gconf_client, GCONF_KEY_GPS_FILE_PATH, NULL);
2298     if(!_gri.file_path)
2299         _gri.file_path = g_strdup("/dev/pgps");
2300
2301     /* Get Auto-Download.  Default is FALSE. */
2302     _auto_download = gconf_client_get_bool(gconf_client,
2303             GCONF_KEY_AUTO_DOWNLOAD, NULL);
2304
2305     /* Get Auto-Download Pre-cache - Default is 2. */
2306     _auto_download_precache = gconf_client_get_int(gconf_client,
2307             GCONF_KEY_AUTO_DOWNLOAD_PRECACHE, NULL);
2308     if(!_auto_download_precache)
2309         _auto_download_precache = 2;
2310
2311     /* Get Center Ratio - Default is 5. */
2312     _center_ratio = gconf_client_get_int(gconf_client,
2313             GCONF_KEY_CENTER_SENSITIVITY, NULL);
2314     if(!_center_ratio)
2315         _center_ratio = 5;
2316
2317     /* Get Lead Ratio - Default is 5. */
2318     _lead_ratio = gconf_client_get_int(gconf_client,
2319             GCONF_KEY_LEAD_AMOUNT, NULL);
2320     if(!_lead_ratio)
2321         _lead_ratio = 5;
2322
2323     /* Get Lead Is Fixed flag - Default is FALSE. */
2324     _lead_is_fixed = gconf_client_get_bool(gconf_client,
2325             GCONF_KEY_LEAD_IS_FIXED, NULL);
2326
2327     /* Get Rotate Sensitivity - Default is 5. */
2328     _rotate_sens = gconf_client_get_int(gconf_client,
2329             GCONF_KEY_ROTATE_SENSITIVITY, NULL);
2330     if(!_rotate_sens)
2331         _rotate_sens = 5;
2332
2333     /* Get Auto-Center/Rotate Minimum Speed - Default is 2. */
2334     value = gconf_client_get(gconf_client, GCONF_KEY_AC_MIN_SPEED, NULL);
2335     if(value)
2336     {
2337         _ac_min_speed = gconf_value_get_int(value);
2338         gconf_value_free(value);
2339     }
2340     else
2341         _ac_min_speed = 2;
2342
2343     /* Get Rotate Dir - Default is ROTATE_DIR_UP. */
2344     {
2345         gchar *rotate_dir_str = gconf_client_get_string(gconf_client,
2346                 GCONF_KEY_ROTATE_DIR, NULL);
2347         gint i = -1;
2348         if(rotate_dir_str)
2349             for(i = ROTATE_DIR_ENUM_COUNT - 1; i >= 0; i--)
2350                 if(!strcmp(rotate_dir_str, ROTATE_DIR_ENUM_TEXT[i]))
2351                     break;
2352         if(i == -1)
2353             i = ROTATE_DIR_UP;
2354         _rotate_dir = i;
2355     }
2356
2357     /* Get Draw Line Width- Default is 5. */
2358     _draw_width = gconf_client_get_int(gconf_client,
2359             GCONF_KEY_DRAW_WIDTH, NULL);
2360     if(!_draw_width)
2361         _draw_width = 5;
2362
2363     /* Get Enable Announcements flag.  Default is TRUE. */
2364     value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_ANNOUNCE, NULL);
2365     if(value)
2366     {
2367         _enable_announce = gconf_value_get_bool(value);
2368         gconf_value_free(value);
2369     }
2370     else
2371         _enable_announce = TRUE;
2372
2373     /* Get Announce Advance Notice - Default is 30. */
2374     value = gconf_client_get(gconf_client, GCONF_KEY_ANNOUNCE_NOTICE, NULL);
2375     if(value)
2376     {
2377         _announce_notice_ratio = gconf_value_get_int(value);
2378         gconf_value_free(value);
2379     }
2380     else
2381         _announce_notice_ratio = 8;
2382
2383     /* Get Enable Voice flag.  Default is TRUE. */
2384     value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_VOICE, NULL);
2385     if(value)
2386     {
2387         _enable_voice = gconf_value_get_bool(value);
2388         gconf_value_free(value);
2389     }
2390     else
2391         _enable_voice = TRUE;
2392
2393     if(_enable_voice)
2394     {
2395         /* Make sure we actually have voice capabilities. */
2396         GnomeVFSFileInfo file_info;
2397         _enable_voice = ((GNOME_VFS_OK == gnome_vfs_get_file_info(
2398                     _voice_synth_path, &file_info,
2399                     GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS))
2400             && (file_info.permissions & GNOME_VFS_PERM_ACCESS_EXECUTABLE));
2401     }
2402
2403     /* Get Fullscreen flag. Default is FALSE. */
2404     _fullscreen = gconf_client_get_bool(gconf_client,
2405             GCONF_KEY_FULLSCREEN, NULL);
2406
2407     /* Get Units.  Default is UNITS_KM. */
2408     {
2409         gchar *units_str = gconf_client_get_string(gconf_client,
2410                 GCONF_KEY_UNITS, NULL);
2411         gint i = 0;
2412         if(units_str)
2413             for(i = UNITS_ENUM_COUNT - 1; i > 0; i--)
2414                 if(!strcmp(units_str, UNITS_ENUM_TEXT[i]))
2415                     break;
2416         _units = i;
2417     }
2418
2419     /* Get Custom Key Actions. */
2420     {
2421         gint i;
2422         for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
2423         {
2424             gint j = CUSTOM_KEY_DEFAULT[i];
2425             gchar *str = gconf_client_get_string(gconf_client,
2426                     CUSTOM_KEY_GCONF[i], NULL);
2427             if(str)
2428                 for(j = CUSTOM_ACTION_ENUM_COUNT - 1; j > 0; j--)
2429                     if(!strcmp(str, CUSTOM_ACTION_ENUM_TEXT[j]))
2430                         break;
2431             _action[i] = j;
2432         }
2433     }
2434
2435     /* Get Deg format.  Default is DDPDDDDD. */
2436     {
2437         gchar *degformat_key_str = gconf_client_get_string(gconf_client,
2438                 GCONF_KEY_DEG_FORMAT, NULL);
2439         gint i = 0;
2440         if(degformat_key_str)
2441             for(i = DEG_FORMAT_ENUM_COUNT - 1; i > 0; i--)
2442                 if(!strcmp(degformat_key_str, DEG_FORMAT_ENUM_TEXT[i].name))
2443                     break;
2444         _degformat = i;
2445     }
2446
2447     /* Get Speed Limit On flag.  Default is FALSE. */
2448     _speed_limit_on = gconf_client_get_bool(gconf_client,
2449             GCONF_KEY_SPEED_LIMIT_ON, NULL);
2450
2451     /* Get Speed Limit */
2452     _speed_limit = gconf_client_get_int(gconf_client,
2453             GCONF_KEY_SPEED_LIMIT, NULL);
2454     if(_speed_limit <= 0)
2455         _speed_limit = 100;
2456
2457     /* Get Speed Location.  Default is SPEED_LOCATION_TOP_LEFT. */
2458     {
2459         gchar *speed_location_str = gconf_client_get_string(gconf_client,
2460                 GCONF_KEY_SPEED_LOCATION, NULL);
2461         gint i = 0;
2462         if(speed_location_str)
2463             for(i = SPEED_LOCATION_ENUM_COUNT - 1; i > 0; i--)
2464                 if(!strcmp(speed_location_str, SPEED_LOCATION_ENUM_TEXT[i]))
2465                     break;
2466         _speed_location = i;
2467     }
2468
2469     /* Get Unblank Option.  Default is UNBLANK_FULLSCREEN. */
2470     {
2471         gchar *unblank_option_str = gconf_client_get_string(gconf_client,
2472                 GCONF_KEY_UNBLANK_SIZE, NULL);
2473         gint i = -1;
2474         if(unblank_option_str)
2475             for(i = UNBLANK_ENUM_COUNT - 1; i >= 0; i--)
2476                 if(!strcmp(unblank_option_str, UNBLANK_ENUM_TEXT[i]))
2477                     break;
2478         if(i == -1)
2479             i = UNBLANK_FULLSCREEN;
2480         _unblank_option = i;
2481     }
2482
2483 #ifdef INCLUDE_APRS
2484     load_aprs_options(gconf_client);
2485 #endif // INCLUDE_APRS
2486     
2487     /* Get Info Font Size.  Default is INFO_FONT_MEDIUM. */
2488     {
2489         gchar *info_font_size_str = gconf_client_get_string(gconf_client,
2490                 GCONF_KEY_INFO_FONT_SIZE, NULL);
2491         gint i = -1;
2492         if(info_font_size_str)
2493             for(i = INFO_FONT_ENUM_COUNT - 1; i >= 0; i--)
2494                 if(!strcmp(info_font_size_str, INFO_FONT_ENUM_TEXT[i]))
2495                     break;
2496         if(i == -1)
2497             i = INFO_FONT_MEDIUM;
2498         _info_font_size = i;
2499     }
2500
2501     /* Get last saved latitude.  Default is 50.f. */
2502     value = gconf_client_get(gconf_client, GCONF_KEY_LAST_LAT, NULL);
2503     if(value)
2504     {
2505         _gps.lat = gconf_value_get_float(value);
2506         gconf_value_free(value);
2507     }
2508     else
2509         _gps.lat = 50.f;
2510
2511     /* Get last saved longitude.  Default is 0. */
2512     _gps.lon = gconf_client_get_float(gconf_client, GCONF_KEY_LAST_LON, NULL);
2513
2514     /* Get last saved altitude.  Default is 0. */
2515     _pos.altitude = gconf_client_get_int(
2516             gconf_client, GCONF_KEY_LAST_ALT, NULL);
2517
2518     /* Get last saved speed.  Default is 0. */
2519     _gps.speed = gconf_client_get_float(
2520             gconf_client, GCONF_KEY_LAST_SPEED, NULL);
2521
2522     /* Get last saved speed.  Default is 0. */
2523     _gps.heading = gconf_client_get_float(
2524             gconf_client, GCONF_KEY_LAST_HEADING, NULL);
2525
2526     /* Get last saved timestamp.  Default is 0. */
2527     _pos.time= gconf_client_get_float(gconf_client, GCONF_KEY_LAST_TIME, NULL);
2528
2529     /* Get last center point. */
2530     {
2531         gdouble center_lat, center_lon;
2532
2533         /* Get last saved latitude.  Default is last saved latitude. */
2534         value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LAT, NULL);
2535         if(value)
2536         {
2537             center_lat = gconf_value_get_float(value);
2538             gconf_value_free(value);
2539         }
2540         else
2541         {
2542             _is_first_time = TRUE;
2543             center_lat = _gps.lat;
2544         }
2545
2546         /* Get last saved longitude.  Default is last saved longitude. */
2547         value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LON, NULL);
2548         if(value)
2549         {
2550             center_lon = gconf_value_get_float(value);
2551             gconf_value_free(value);
2552         }
2553         else
2554             center_lon = _gps.lon;
2555
2556         latlon2unit(center_lat, center_lon, _center.unitx, _center.unity);
2557         _next_center = _center;
2558     }
2559
2560     /* Get map correction.  Default is 0. */
2561     _map_correction_unitx = gconf_client_get_int(gconf_client,
2562             GCONF_KEY_MAP_CORRECTION_UNITX, NULL);
2563     _map_correction_unity = gconf_client_get_int(gconf_client,
2564             GCONF_KEY_MAP_CORRECTION_UNITY, NULL);
2565
2566     /* Get last viewing angle.  Default is 0. */
2567     _map_rotate_angle = _next_map_rotate_angle = gconf_client_get_int(
2568             gconf_client, GCONF_KEY_CENTER_ANGLE, NULL);
2569     gdk_pixbuf_rotate_matrix_fill_for_rotation(
2570             _map_rotate_matrix,
2571             deg2rad(ROTATE_DIR_ENUM_DEGREES[_rotate_dir] - _map_rotate_angle));
2572     gdk_pixbuf_rotate_matrix_fill_for_rotation(
2573             _map_reverse_matrix,
2574             deg2rad(_map_rotate_angle - ROTATE_DIR_ENUM_DEGREES[_rotate_dir]));
2575
2576
2577     /* Load the repositories. */
2578     {
2579         GSList *list, *curr;
2580         RepoData *prev_repo = NULL, *curr_repo = NULL;
2581         gint curr_repo_index = gconf_client_get_int(gconf_client,
2582             GCONF_KEY_CURRREPO, NULL);
2583         list = gconf_client_get_list(gconf_client,
2584             GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, NULL);
2585
2586         for(curr = list; curr != NULL; curr = curr->next)
2587         {
2588             RepoData *rd = settings_parse_repo(curr->data);
2589
2590             if (rd->layer_level == 0) {
2591                 _repo_list = g_list_append(_repo_list, rd);
2592                 if(!curr_repo_index--)
2593                     curr_repo = rd;
2594             }
2595             else
2596                 prev_repo->layers = rd;
2597             prev_repo = rd;
2598             g_free(curr->data);
2599         }
2600         g_slist_free(list);
2601
2602         if (curr_repo)
2603             repo_set_curr(curr_repo);
2604
2605         /* this timer decrements layers' counters and frefresh map if needed */
2606         g_timeout_add (60 * 1000, map_layer_refresh_cb, NULL);
2607     }
2608
2609
2610     if(_repo_list == NULL)
2611     {
2612         /* We have no repositories - create a default one. */
2613         RepoData *repo = g_new0(RepoData, 1);
2614
2615         repo->db_filename = gnome_vfs_expand_initial_tilde(
2616                 REPO_DEFAULT_CACHE_DIR);
2617         repo->url=g_strdup(REPO_DEFAULT_MAP_URI);
2618         repo->dl_zoom_steps = REPO_DEFAULT_DL_ZOOM_STEPS;
2619         repo->name = g_strdup(REPO_DEFAULT_NAME);
2620         repo->view_zoom_steps = REPO_DEFAULT_VIEW_ZOOM_STEPS;
2621         repo->double_size = FALSE;
2622         repo->nextable = TRUE;
2623         repo->min_zoom = REPO_DEFAULT_MIN_ZOOM;
2624         repo->max_zoom = REPO_DEFAULT_MAX_ZOOM;
2625         repo->layers = NULL;
2626         repo->layer_level = 0;
2627         set_repo_type(repo);
2628
2629         _repo_list = g_list_append(_repo_list, repo);
2630         repo_set_curr(repo);
2631     }
2632
2633     /* Get last Zoom Level.  Default is 16. */
2634     value = gconf_client_get(gconf_client, GCONF_KEY_ZOOM, NULL);
2635     if(value)
2636     {
2637         _zoom = gconf_value_get_int(value) / _curr_repo->view_zoom_steps
2638             * _curr_repo->view_zoom_steps;
2639         gconf_value_free(value);
2640     }
2641     else
2642         _zoom = 16 / _curr_repo->view_zoom_steps
2643             * _curr_repo->view_zoom_steps;
2644     BOUND(_zoom, 0, MAX_ZOOM);
2645     _next_zoom = _zoom;
2646
2647     /* Get Route Directory.  Default is NULL. */
2648     _route_dir_uri = gconf_client_get_string(gconf_client,
2649             GCONF_KEY_ROUTEDIR, NULL);
2650
2651     /* Get Last Track File.  Default is NULL. */
2652     _track_file_uri = gconf_client_get_string(gconf_client,
2653             GCONF_KEY_TRACKFILE, NULL);
2654
2655     /* Get Auto-Center Mode.  Default is CENTER_LEAD. */
2656     value = gconf_client_get(gconf_client, GCONF_KEY_AUTOCENTER_MODE, NULL);
2657     if(value)
2658     {
2659         _center_mode = gconf_value_get_int(value);
2660         gconf_value_free(value);
2661     }
2662     else
2663         _center_mode = CENTER_LEAD;
2664
2665     /* Get Auto-Center Rotate Flag.  Default is TRUE. */
2666     value = gconf_client_get(gconf_client, GCONF_KEY_AUTOCENTER_ROTATE, NULL);
2667     if(value)
2668     {
2669         _center_rotate = gconf_value_get_bool(value);
2670         gconf_value_free(value);
2671     }
2672     else
2673         _center_rotate = TRUE;
2674
2675     /* Get Show Zoom Level flag.  Default is FALSE. */
2676     _show_zoomlevel = gconf_client_get_bool(gconf_client,
2677             GCONF_KEY_SHOWZOOMLEVEL, NULL);
2678
2679     /* Get Show Scale flag.  Default is TRUE. */
2680     value = gconf_client_get(gconf_client, GCONF_KEY_SHOWSCALE, NULL);
2681     if(value)
2682     {
2683         _show_scale = gconf_value_get_bool(value);
2684         gconf_value_free(value);
2685     }
2686     else
2687         _show_scale = TRUE;
2688
2689     /* Get Show Compass Rose flag.  Default is TRUE. */
2690     value = gconf_client_get(gconf_client, GCONF_KEY_SHOWCOMPROSE, NULL);
2691     if(value)
2692     {
2693         _show_comprose = gconf_value_get_bool(value);
2694         gconf_value_free(value);
2695     }
2696     else
2697         _show_comprose = TRUE;
2698
2699     /* Get Show Tracks flag.  Default is TRUE. */
2700     value = gconf_client_get(gconf_client, GCONF_KEY_SHOWTRACKS, NULL);
2701     if(value)
2702     {
2703         _show_paths |= (gconf_value_get_bool(value) ? TRACKS_MASK : 0);
2704         gconf_value_free(value);
2705     }
2706     else
2707         _show_paths |= TRACKS_MASK;
2708
2709     /* Get Show Routes flag.  Default is TRUE. */
2710     value = gconf_client_get(gconf_client, GCONF_KEY_SHOWROUTES, NULL);
2711     if(value)
2712     {
2713         _show_paths |= (gconf_value_get_bool(value) ? ROUTES_MASK : 0);
2714         gconf_value_free(value);
2715     }
2716     else
2717         _show_paths |= ROUTES_MASK;
2718
2719     /* Get Show Velocity Vector flag.  Default is TRUE. */
2720     value = gconf_client_get(gconf_client, GCONF_KEY_SHOWVELVEC, NULL);
2721     if(value)
2722     {
2723         _show_velvec = gconf_value_get_bool(value);
2724         gconf_value_free(value);
2725     }
2726     else
2727         _show_velvec = TRUE;
2728
2729     /* Get Show Velocity Vector flag.  Default is TRUE. */
2730     value = gconf_client_get(gconf_client, GCONF_KEY_SHOWPOIS, NULL);
2731     if(value)
2732     {
2733         _show_poi = gconf_value_get_bool(value);
2734         gconf_value_free(value);
2735     }
2736     else
2737         _show_poi = TRUE;
2738
2739     /* Get Enable GPS flag.  Default is TRUE. */
2740     value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_GPS, NULL);
2741     if(value)
2742     {
2743         _enable_gps = gconf_value_get_bool(value);
2744         gconf_value_free(value);
2745     }
2746     else
2747         _enable_gps = TRUE;
2748
2749     /* Get Enable Tracking flag.  Default is TRUE. */
2750     value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_TRACKING, NULL);
2751     if(value)
2752     {
2753         _enable_tracking = gconf_value_get_bool(value);
2754         gconf_value_free(value);
2755     }
2756     else
2757         _enable_tracking = TRUE;
2758
2759     /* Initialize _gps_state based on _enable_gps. */
2760     _gps_state = RCVR_OFF;
2761
2762     /* Load the route locations. */
2763     {
2764         GSList *curr;
2765         _loc_list = gconf_client_get_list(gconf_client,
2766             GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, NULL);
2767         _loc_model = gtk_list_store_new(1, G_TYPE_STRING);
2768         for(curr = _loc_list; curr != NULL; curr = curr->next)
2769         {
2770             GtkTreeIter iter;
2771             gtk_list_store_insert_with_values(_loc_model, &iter, INT_MAX,
2772                     0, curr->data, -1);
2773         }
2774     }
2775
2776     /* Get POI Database.  Default is in REPO_DEFAULT_CACHE_BASE */
2777     _poi_db_filename = gconf_client_get_string(gconf_client,
2778             GCONF_KEY_POI_DB, NULL);
2779     if(_poi_db_filename == NULL)
2780     {
2781         gchar *poi_base = gnome_vfs_expand_initial_tilde(
2782                 REPO_DEFAULT_CACHE_BASE);
2783         _poi_db_filename = gnome_vfs_uri_make_full_from_relative(
2784                 poi_base, "poi.db");
2785         g_free(poi_base);
2786     }
2787
2788     _poi_db_dirname = g_path_get_dirname(_poi_db_filename);
2789
2790     _poi_zoom = gconf_client_get_int(gconf_client,
2791             GCONF_KEY_POI_ZOOM, NULL);
2792     if(!_poi_zoom)
2793         _poi_zoom = MAX_ZOOM - 10;
2794
2795
2796     /* Get GPS Info flag.  Default is FALSE. */
2797     _gps_info = gconf_client_get_bool(gconf_client, GCONF_KEY_GPS_INFO, NULL);
2798
2799     /* Get Route Download URL.  Default is:
2800      * "http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s" */
2801     _route_dl_url = gconf_client_get_string(gconf_client,
2802             GCONF_KEY_ROUTE_DL_URL, NULL);
2803     if(_route_dl_url == NULL)
2804         _route_dl_url = g_strdup(
2805                 "http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s");
2806
2807     /* Get Route Download Radius.  Default is 4. */
2808     value = gconf_client_get(gconf_client, GCONF_KEY_ROUTE_DL_RADIUS, NULL);
2809     if(value)
2810     {
2811         _route_dl_radius = gconf_value_get_int(value);
2812         gconf_value_free(value);
2813     }
2814     else
2815         _route_dl_radius = 8;
2816
2817     /* Get POI Download URL.  Default is:
2818      * "http://www.gnuite.com/cgi-bin/poi.cgi?saddr=%s&query=%s&page=%d" */
2819     _poi_dl_url = gconf_client_get_string(gconf_client,
2820             GCONF_KEY_POI_DL_URL, NULL);
2821     if(_poi_dl_url == NULL)
2822         _poi_dl_url = g_strdup(
2823             "http://www.gnuite.com/cgi-bin/poi.cgi?saddr=%s&query=%s&page=%d");
2824
2825     /* Get Colors. */
2826     {
2827         gint i;
2828         for(i = 0; i < COLORABLE_ENUM_COUNT; i++)
2829         {
2830             str = gconf_client_get_string(gconf_client,
2831                     COLORABLE_GCONF[i], NULL);
2832             if(!str || !gdk_color_parse(str, &_color[i]))
2833                 _color[i] = COLORABLE_DEFAULT[i];
2834         }
2835     }
2836
2837     gconf_client_clear_cache(gconf_client);
2838     g_object_unref(gconf_client);
2839
2840     /* GPS data init */
2841     _gps.fix = 1;
2842     _gps.satinuse = 0;
2843     _gps.satinview = 0;
2844
2845     vprintf("%s(): return\n", __PRETTY_FUNCTION__);
2846 }
2847
2848
2849 #ifdef INCLUDE_APRS
2850 ////// APRS Settings start
2851
2852 void read_aprs_options(TAprsSettings *aprsSettings )
2853 {
2854         // Basic options
2855     _aprs_mycall = g_strdup(gtk_entry_get_text(
2856         GTK_ENTRY(aprsSettings->txt_aprs_mycall)));
2857     
2858      
2859     _aprs_enable = gtk_toggle_button_get_active(
2860                         GTK_TOGGLE_BUTTON(aprsSettings->chk_aprs_enabled ));
2861
2862     _aprs_show_new_station_alert = gtk_toggle_button_get_active(
2863                         GTK_TOGGLE_BUTTON(aprsSettings->chk_aprs_show_new_station_alert ));
2864
2865     
2866     gchar * s_max_stations = g_strdup(gtk_entry_get_text(
2867             GTK_ENTRY(aprsSettings->txt_aprs_max_stations)));
2868     gint64 i64_max_stations = g_ascii_strtoll (s_max_stations, NULL, 10);
2869     _aprs_max_stations = (gint)i64_max_stations;
2870         
2871
2872     // Inet options
2873     _aprs_server = g_strdup(gtk_entry_get_text(
2874         GTK_ENTRY(aprsSettings->txt_aprs_server)));
2875
2876     
2877     _aprs_tty_port = g_strdup(gtk_entry_get_text(
2878             GTK_ENTRY(aprsSettings->txt_aprs_tty_port)));
2879     
2880     _aprs_inet_server_validation = g_strdup(gtk_entry_get_text(
2881         GTK_ENTRY(aprsSettings->txt_aprs_inet_server_validation)));
2882
2883     gchar * s_port = g_strdup(gtk_entry_get_text(
2884         GTK_ENTRY(aprsSettings->num_aprs_server_port)));
2885     gint64 i64_port = g_ascii_strtoll (s_port, NULL, 10);
2886     _aprs_server_port = (gint)i64_port;
2887
2888     
2889     gchar * s_beacon_interval = g_strdup(gtk_entry_get_text(
2890         GTK_ENTRY(aprsSettings->txt_aprs_inet_beacon_interval )));
2891     gint64 i64_beacon_interval = g_ascii_strtoll (s_beacon_interval, NULL, 10);
2892     g_free(s_beacon_interval);
2893     _aprs_inet_beacon_interval = (gint)i64_beacon_interval;
2894
2895     s_beacon_interval = g_strdup(gtk_entry_get_text(
2896         GTK_ENTRY(aprsSettings->txt_tty_beacon_interval )));
2897     i64_beacon_interval = g_ascii_strtoll (s_beacon_interval, NULL, 10);
2898     g_free(s_beacon_interval);
2899     _aprs_tty_beacon_interval = (gint)i64_beacon_interval;
2900     
2901     
2902     _aprs_inet_beacon_comment = g_strdup(gtk_entry_get_text(
2903         GTK_ENTRY(aprsSettings->txt_aprs_inet_beacon_comment )));
2904     
2905    _aprs_tnc_bt_mac =  g_strdup(gtk_entry_get_text(
2906                 GTK_ENTRY(aprsSettings->txt_tnc_bt_mac )));
2907     
2908    _aprs_tnc_method = TNC_CONNECTION_BT;
2909    if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(aprsSettings->rad_tnc_file) ))
2910    {
2911            _aprs_tnc_method = TNC_CONNECTION_FILE;
2912    }
2913
2914
2915    _aprs_server_auto_filter_on = gtk_toggle_button_get_active(
2916            GTK_TOGGLE_BUTTON(aprsSettings->chk_enable_inet_auto_filter ));
2917    
2918    gchar * s_server_auto_filter_km = g_strdup(gtk_entry_get_text(
2919        GTK_ENTRY(aprsSettings->txt_auto_filter_range )));
2920    gint64 i64_server_auto_filter_km = g_ascii_strtoll (s_server_auto_filter_km, NULL, 10);
2921    _aprs_server_auto_filter_km = (gint)i64_server_auto_filter_km;
2922
2923
2924    _aprs_enable_inet_tx = gtk_toggle_button_get_active(
2925            GTK_TOGGLE_BUTTON(aprsSettings->chk_enable_inet_tx ));
2926
2927    _aprs_enable_tty_tx = gtk_toggle_button_get_active(
2928            GTK_TOGGLE_BUTTON(aprsSettings->chk_enable_tty_tx ));
2929    
2930    _aprs_beacon_comment = g_strdup(gtk_entry_get_text(
2931            GTK_ENTRY(aprsSettings->txt_beacon_comment )));
2932    
2933    _aprs_beacon_comment = g_strdup(gtk_entry_get_text(
2934               GTK_ENTRY(aprsSettings->txt_beacon_comment )));
2935    
2936
2937    _aprs_unproto_path = g_strdup(gtk_entry_get_text(
2938                    GTK_ENTRY(aprsSettings->txt_unproto_path )));
2939    
2940    gchar *tmp;
2941    tmp = g_strdup(gtk_entry_get_text(
2942                    GTK_ENTRY(aprsSettings->txt_beacon_group )));
2943    if(strlen(tmp)>0) _aprs_beacon_group = tmp[0]; 
2944
2945    tmp = g_strdup(gtk_entry_get_text(
2946                    GTK_ENTRY(aprsSettings->txt_beacon_symbol )));
2947    if(strlen(tmp)>0) _aprs_beacon_symbol = tmp[0]; 
2948    
2949    _aprs_transmit_compressed_posit  = FALSE; // Not currently supported
2950    
2951 }
2952
2953 void save_aprs_options()
2954 {
2955         GConfClient *gconf_client = gconf_client_get_default();
2956     if(!gconf_client)
2957     {
2958         popup_error(_window,
2959                 _("Failed to initialize GConf.  Settings were not saved."));
2960         return;
2961     }
2962
2963     
2964     /* APRS */
2965     if(_aprs_server)
2966         gconf_client_set_string(gconf_client,
2967                 GCONF_KEY_APRS_SERVER, _aprs_server, NULL);
2968
2969     if(_aprs_server_port)
2970         gconf_client_set_int(gconf_client,
2971                 GCONF_KEY_APRS_SERVER_PORT, _aprs_server_port, NULL);
2972
2973     if(_aprs_inet_server_validation)
2974         gconf_client_set_string(gconf_client,
2975                 GCONF_KEY_APRS_SERVER_VAL, _aprs_inet_server_validation, NULL);
2976
2977     if(_aprs_mycall)
2978         gconf_client_set_string(gconf_client,
2979                 GCONF_KEY_APRS_MYCALL, _aprs_mycall, NULL);
2980
2981     if(_aprs_tty_port)
2982         gconf_client_set_string(gconf_client,
2983                 GCONF_KEY_APRS_TTY_PORT, _aprs_tty_port, NULL);
2984
2985     
2986     
2987     
2988     if(_aprs_inet_beacon_comment)
2989         gconf_client_set_string(gconf_client,
2990                         GCONF_KEY_APRS_INET_BEACON, _aprs_inet_beacon_comment, NULL);
2991
2992     gconf_client_set_int(gconf_client,
2993                 GCONF_KEY_APRS_INET_BEACON_INTERVAL, _aprs_inet_beacon_interval, NULL);
2994                 
2995     gconf_client_set_int(gconf_client,
2996                 GCONF_KEY_APRS_MAX_TRACK_PTS, _aprs_std_pos_hist, NULL);
2997     
2998     gconf_client_set_int(gconf_client,
2999                 GCONF_KEY_APRS_MAX_STATIONS, _aprs_max_stations, NULL);
3000     
3001     gconf_client_set_bool(gconf_client,
3002                 GCONF_KEY_APRS_ENABLE, _aprs_enable, NULL);
3003     
3004
3005     gconf_client_set_bool(gconf_client,
3006                 GCONF_KEY_APRS_SHOW_NEW_STATION_ALERT, _aprs_show_new_station_alert, NULL);
3007    
3008     if(_aprs_tnc_bt_mac)
3009         gconf_client_set_string(gconf_client,
3010                         GCONF_KEY_APRS_TNC_BT_MAC, _aprs_tnc_bt_mac, NULL);
3011   
3012     gconf_client_set_int(gconf_client,
3013                 GCONF_KEY_APRS_TNC_CONN_METHOD, _aprs_tnc_method, NULL);
3014
3015     gconf_client_set_int(gconf_client,
3016                 GCONF_KEY_APRS_INET_AUTO_FILTER_RANGE, _aprs_server_auto_filter_km, NULL);
3017
3018     gconf_client_set_bool(gconf_client,
3019                 GCONF_KEY_APRS_INET_AUTO_FILTER, _aprs_server_auto_filter_on, NULL);
3020
3021     gconf_client_set_bool(gconf_client,
3022                 GCONF_KEY_APRS_ENABLE_INET_TX, _aprs_enable_inet_tx, NULL);
3023         gconf_client_set_bool(gconf_client,
3024                         GCONF_KEY_APRS_ENABLE_TTY_TX, _aprs_enable_tty_tx, NULL);
3025         
3026     if(_aprs_beacon_comment)
3027         gconf_client_set_string(gconf_client,
3028                         GCONF_KEY_APRS_BEACON_COMMENT, _aprs_beacon_comment, NULL);
3029
3030     gconf_client_set_int(gconf_client,
3031                 GCONF_KEY_APRS_TTY_BEACON_INTERVAL, _aprs_tty_beacon_interval, NULL);
3032     
3033     gconf_client_set_bool(gconf_client,
3034                 GCONF_KEY_APRS_BEACON_COMPRESSED, _aprs_transmit_compressed_posit, NULL);
3035
3036     if(_aprs_unproto_path)
3037         gconf_client_set_string(gconf_client,
3038                         GCONF_KEY_APRS_BEACON_PATH, _aprs_unproto_path, NULL);
3039
3040     //if(_aprs_beacon_group)
3041     {
3042         gchar tmp[5];
3043         snprintf(tmp, 5, "%c", _aprs_beacon_group);
3044         
3045         gconf_client_set_string(gconf_client,
3046                         GCONF_KEY_APRS_BEACON_SYM_GROUP, tmp, NULL);
3047             
3048         //if(strlen(tmp)> 1) _aprs_beacon_group = tmp[0]; 
3049     }
3050     
3051     //if(_aprs_beacon_symbol)
3052     {
3053         gchar tmp[5];
3054         snprintf(tmp, 5, "%c", _aprs_beacon_symbol);
3055         
3056         gconf_client_set_string(gconf_client,
3057                                         GCONF_KEY_APRS_BEACON_SYMBOL, tmp, NULL);
3058         
3059         //if(strlen(tmp)> 1) _aprs_beacon_symbol = tmp[0];
3060     }
3061                 
3062 }
3063
3064
3065
3066
3067
3068 void setup_aprs_options_page(GtkWidget *notebook, TAprsSettings *aprsSettings)
3069 {
3070     GtkWidget *table;
3071     GtkWidget *label;
3072 //    GtkWidget *hbox;
3073
3074     gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
3075         table = gtk_table_new(3/*rows*/, 4/*columns*/, FALSE /*Auto re-size*/),
3076         label = gtk_label_new(_("Station")));
3077
3078     /* Callsign. */
3079     // Label
3080     add_label_box(table, 0, 1, 0, 1, -1, &label, ALIGN_TOP_LEFT, "Callsign");
3081     add_edit_box (table, 1, 2, 0, 1, -1, &(aprsSettings->txt_aprs_mycall), ALIGN_TOP_LEFT, _aprs_mycall);
3082
3083
3084     add_check_box(table, 2, 4, 0, 1, -1, &(aprsSettings->chk_compressed_beacon), ALIGN_TOP_LEFT, 
3085                 "Compress Beacons", _aprs_transmit_compressed_posit);
3086     // Not yet supported
3087     gtk_widget_set_sensitive (GTK_WIDGET (aprsSettings->chk_compressed_beacon), FALSE);
3088     
3089     
3090     
3091     add_label_box(table, 0, 1, 1, 2, -1, &label, ALIGN_TOP_LEFT, "Beacon Path");
3092     add_edit_box (table, 1, 2, 1, 2, -1, &(aprsSettings->txt_unproto_path), ALIGN_TOP_LEFT, _aprs_unproto_path);
3093
3094
3095     add_check_box(table, 2, 4, 1, 2, -1, &(aprsSettings->chk_aprs_show_new_station_alert), ALIGN_TOP_LEFT, 
3096         "Show New Station Alerts", _aprs_show_new_station_alert);
3097
3098     
3099     add_label_box(table, 0, 1, 2, 3, -1, &label, ALIGN_TOP_LEFT, "Symbol Group");
3100     gchar initialValue[2];
3101     snprintf(initialValue, 2, "%c", _aprs_beacon_group);
3102     add_edit_box (table, 1, 2, 2, 3, -1, &(aprsSettings->txt_beacon_group), ALIGN_TOP_LEFT, initialValue);
3103     
3104     add_label_box(table, 2, 3, 2, 3, -1, &label, ALIGN_TOP_LEFT, "Symbol");
3105     
3106     snprintf(initialValue, 2, "%c", _aprs_beacon_symbol);
3107     add_edit_box (table, 3, 4, 2, 3, -1, &(aprsSettings->txt_beacon_symbol), ALIGN_TOP_LEFT, initialValue);
3108    
3109 }
3110
3111
3112
3113 void setup_aprs_tty_page_options_page(GtkWidget *notebook, TAprsSettings *aprsSettings)
3114 {
3115     GtkWidget *table;
3116     GtkWidget *label;
3117     GtkWidget *hbox;
3118
3119     gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
3120         table = gtk_table_new(3/*rows*/, 2/*columns*/, FALSE /*Auto re-size*/),
3121         label = gtk_label_new(_("TNC 1")));
3122
3123     
3124         // Receiver MAC Address. 
3125     gtk_table_attach(GTK_TABLE(table),
3126                 aprsSettings->rad_tnc_bt = gtk_radio_button_new_with_label(
3127                 NULL, _("Bluetooth")),
3128             0, 1, 0, 1, GTK_FILL, 0, 2, 4);
3129 //    gtk_misc_set_alignment(/*GTK_MISC*/(aprsSettings->rad_tnc_bt), 1.f, 0.5f);
3130     gtk_table_attach(GTK_TABLE(table),
3131             hbox = gtk_hbox_new(FALSE, 4),
3132             1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
3133   
3134     gtk_box_pack_start(GTK_BOX(hbox),
3135                 aprsSettings->txt_tnc_bt_mac = gtk_entry_new(),
3136             TRUE, TRUE, 0);
3137 #ifdef MAEMO_CHANGES
3138 #ifndef LEGACY
3139     g_object_set(G_OBJECT(aprsSettings->txt_tnc_bt_mac), "hildon-input-mode",
3140             HILDON_GTK_INPUT_MODE_FULL, NULL);
3141 #else
3142     g_object_set(G_OBJECT(txt_gps_bt_mac), HILDON_AUTOCAP, FALSE, NULL);
3143 #endif
3144 #endif
3145     gtk_box_pack_start(GTK_BOX(hbox),
3146                 aprsSettings->btn_scan_bt_tnc = gtk_button_new_with_label(_("Scan...")),
3147             FALSE, FALSE, 0);
3148         
3149 #ifndef HAVE_LIBGPSBT
3150 gtk_widget_set_sensitive(aprsSettings->rad_tnc_bt, FALSE);
3151 gtk_widget_set_sensitive(aprsSettings->txt_tnc_bt_mac, FALSE);
3152 gtk_widget_set_sensitive(aprsSettings->btn_scan_bt_tnc, FALSE);
3153 #endif
3154
3155     // File Path (RFComm). 
3156         gtk_table_attach(GTK_TABLE(table),
3157                 aprsSettings->rad_tnc_file = gtk_radio_button_new_with_label_from_widget(
3158                 GTK_RADIO_BUTTON(aprsSettings->rad_tnc_bt), _("File Path")),
3159             0, 1, 1, 2, GTK_FILL, 0, 2, 4);
3160 //    gtk_misc_set_alignment(/*GTK_MISC*/(aprsSettings->rad_tnc_file), 1.f, 0.5f);
3161     gtk_table_attach(GTK_TABLE(table),
3162             hbox = gtk_hbox_new(FALSE, 4),
3163             1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
3164     gtk_box_pack_start(GTK_BOX(hbox),
3165                 aprsSettings->txt_aprs_tty_port = gtk_entry_new(),
3166             TRUE, TRUE, 0);
3167 #ifdef MAEMO_CHANGES
3168 #ifndef LEGACY
3169     g_object_set(G_OBJECT(aprsSettings->txt_aprs_tty_port), "hildon-input-mode",
3170             HILDON_GTK_INPUT_MODE_FULL, NULL);
3171 #else
3172     g_object_set(G_OBJECT(txt_gps_file_path), HILDON_AUTOCAP, FALSE, NULL);
3173 #endif
3174 #endif
3175
3176     
3177
3178         add_check_box(table, 0, 1, 2, 3, -1, &(aprsSettings->chk_enable_tty_tx), ALIGN_TOP_LEFT, 
3179                 "Enable TX", _aprs_enable_tty_tx);
3180
3181         gtk_table_attach(GTK_TABLE(table),
3182             label = gtk_label_new(_("Only KISS TNC's are supported (9600 8N1)")),
3183                 1, 2, 2, 3, GTK_FILL, 0, 2, 4);
3184         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
3185
3186         
3187         
3188         
3189         // Init
3190
3191     if(aprsSettings->txt_aprs_tty_port)
3192         gtk_entry_set_text(GTK_ENTRY(aprsSettings->txt_aprs_tty_port), _aprs_tty_port);
3193     
3194     if(aprsSettings->txt_tnc_bt_mac)
3195             gtk_entry_set_text(GTK_ENTRY(aprsSettings->txt_tnc_bt_mac), _aprs_tnc_bt_mac);
3196     
3197   
3198     if(_aprs_tnc_method == TNC_CONNECTION_BT)
3199         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(aprsSettings->rad_tnc_bt), TRUE);
3200     else if(_aprs_tnc_method == TNC_CONNECTION_FILE)
3201         gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(aprsSettings->rad_tnc_file), TRUE);
3202
3203    
3204 }
3205
3206 void setup_aprs_tty2_page_options_page(GtkWidget *notebook, TAprsSettings *aprsSettings)
3207 {
3208     GtkWidget *table;
3209     GtkWidget *label;
3210
3211     gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
3212         table = gtk_table_new(2/*rows*/, 1/*columns*/, FALSE /*Auto re-size*/),
3213         label = gtk_label_new(_("TNC 2")));
3214
3215     add_label_box(table, 0, 1, 0, 1, -1, &label, ALIGN_TOP_LEFT, "Beacon Interval");
3216     
3217     gchar s_interval[8]; s_interval[0] = 0;
3218     if(_aprs_tty_beacon_interval>0) snprintf(s_interval, 8, "%u", _aprs_tty_beacon_interval );
3219     add_edit_box (table, 1, 3, 0, 1, -1, &(aprsSettings->txt_tty_beacon_interval), ALIGN_TOP_LEFT, 
3220                 s_interval);
3221     add_label_box(table, 3, 4, 0, 1, -1, &label, ALIGN_TOP_LEFT, "seconds");
3222     
3223     add_label_box(table, 0, 1, 1, 2, -1, &label, ALIGN_TOP_LEFT, "Beacon Text");
3224     add_edit_box (table, 1, 4, 1, 2, -1, &(aprsSettings->txt_beacon_comment), ALIGN_TOP_LEFT, _aprs_beacon_comment);
3225
3226 }
3227
3228
3229 void setup_aprs_general_options_page(GtkWidget *notebook, TAprsSettings *aprsSettings)
3230 {
3231     GtkWidget *table;
3232     GtkWidget *label;
3233
3234     gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
3235         table = gtk_table_new(2/*rows*/, 1/*columns*/, FALSE /*Auto re-size*/),
3236         label = gtk_label_new(_("APRS")));
3237     
3238     // Notice
3239     add_label_box(table, 0, 1, 0, 1, -1, &label, ALIGN_TOP_LEFT, 
3240         "APRS (Automatic/Amateur Position Reporting System) is \na system used by Radio Amateurs to communicate position, \nweather, and short messages.");
3241
3242     // Enabled    
3243     add_check_box(table, 0, 1, 1, 2, -1, &(aprsSettings->chk_aprs_enabled), ALIGN_TOP_LEFT, 
3244         "Enable APRS functionality", _aprs_enable);
3245 }
3246
3247 void setup_aprs_inet_options_page(GtkWidget *notebook, TAprsSettings *aprsSettings)
3248 {
3249     GtkWidget *table;
3250     GtkWidget *label;
3251
3252     gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
3253         table = gtk_table_new(3/*rows*/, 5/*columns*/, FALSE /*Auto re-size*/),
3254         label = gtk_label_new(_("Internet")));
3255
3256
3257     /*iNet server*/
3258     add_label_box(table, 0, 1, 0, 1, -1, &label, ALIGN_TOP_LEFT, "Server");
3259     add_edit_box (table, 1, 3, 0, 1, -1, &(aprsSettings->txt_aprs_server), ALIGN_TOP_LEFT, _aprs_server);
3260
3261     /*iNet server port*/
3262     add_label_box(table, 3, 4, 0, 1, -1, &label, ALIGN_TOP_RIGHT, "Port");
3263     add_edit_box (table, 4, 5, 0, 1, 0.5, &(aprsSettings->num_aprs_server_port), ALIGN_TOP_LEFT, 
3264                 g_strdup_printf("%u", _aprs_server_port));
3265     
3266
3267     /* Validation */
3268     add_label_box(table, 0, 1, 1, 2, -1, &label, ALIGN_TOP_LEFT, "Server Validation");
3269     add_edit_box (table, 1, 3, 1, 2, 0.5, &(aprsSettings->txt_aprs_inet_server_validation), ALIGN_TOP_LEFT, _aprs_inet_server_validation);
3270     add_check_box(table, 3, 5, 1, 2, -1, &(aprsSettings->chk_enable_inet_tx), ALIGN_TOP_LEFT, 
3271         "Enable TX", _aprs_enable_inet_tx);
3272
3273     /*iNet server filter*/
3274     add_label_box(table, 0, 1, 2, 3, -1, &label, ALIGN_TOP_LEFT, "Filter data");
3275     add_check_box(table, 1, 2, 2, 3, -1, &(aprsSettings->chk_enable_inet_auto_filter), ALIGN_TOP_LEFT, "Enable", 
3276                 _aprs_server_auto_filter_on);
3277     add_label_box(table, 2, 3, 2, 3, -1, &label, ALIGN_TOP_RIGHT, "Range");
3278     add_edit_box (table, 3, 4, 2, 3, 0.75, &(aprsSettings->txt_auto_filter_range), ALIGN_TOP_LEFT, 
3279                 g_strdup_printf("%u", _aprs_server_auto_filter_km));
3280     add_label_box(table, 4, 5, 2, 3, -1, &label, ALIGN_TOP_LEFT, "km");
3281
3282 }
3283
3284
3285
3286 void setup_aprs_inet2_options_page(GtkWidget *notebook, TAprsSettings *aprsSettings)
3287 {
3288     GtkWidget *table;
3289     GtkWidget *label;
3290     GtkWidget *hbox;
3291
3292     gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
3293         table = gtk_table_new(2/*rows*/, 3/*columns*/, FALSE /*Auto re-size*/),
3294         label = gtk_label_new(_("Internet 2")));
3295
3296
3297     /* iNet Beacon interval */
3298     // Label
3299     gtk_table_attach(GTK_TABLE(table),
3300         label = gtk_label_new(_("Beacon interval")),
3301             0, 1, 0, 1, GTK_FILL, 0, 2, 4);
3302     gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
3303
3304     // Edit box
3305     gtk_table_attach(GTK_TABLE(table),
3306         hbox = gtk_hbox_new(FALSE, 4),
3307             1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
3308     gtk_box_pack_start(GTK_BOX(hbox),
3309         aprsSettings->txt_aprs_inet_beacon_interval = gtk_entry_new(),
3310         TRUE, TRUE, 0);
3311
3312 #ifdef MAEMO_CHANGES
3313 #ifndef LEGACY
3314     g_object_set(G_OBJECT(aprsSettings->txt_aprs_inet_beacon_interval), "hildon-input-mode",
3315         HILDON_GTK_INPUT_MODE_FULL, NULL);
3316 #else
3317     g_object_set(G_OBJECT(aprsSettings->txt_aprs_inet_beacon_interval), HILDON_AUTOCAP, FALSE, NULL);
3318 #endif
3319 #endif
3320
3321     gtk_table_attach(GTK_TABLE(table),
3322         label = gtk_label_new(_("seconds")),
3323             2, 3, 0, 1, GTK_FILL, 0, 2, 4);
3324     gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
3325
3326     /* Beacon comment */
3327     // Label
3328     gtk_table_attach(GTK_TABLE(table),
3329         label = gtk_label_new(_("Beacon Comment")),
3330             0, 1, 1, 2, GTK_FILL, 0, 2, 4);
3331     gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
3332
3333     // Edit box
3334     gtk_table_attach(GTK_TABLE(table),
3335         hbox = gtk_hbox_new(FALSE, 4),
3336             1, 3, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
3337     gtk_box_pack_start(GTK_BOX(hbox),
3338         aprsSettings->txt_aprs_inet_beacon_comment = gtk_entry_new(),
3339         TRUE, TRUE, 0);
3340
3341 #ifdef MAEMO_CHANGES
3342 #ifndef LEGACY
3343     g_object_set(G_OBJECT(aprsSettings->txt_aprs_inet_beacon_comment), "hildon-input-mode",
3344         HILDON_GTK_INPUT_MODE_FULL, NULL);
3345 #else
3346     g_object_set(G_OBJECT(aprsSettings->txt_aprs_inet_beacon_comment), HILDON_AUTOCAP, FALSE, NULL);
3347 #endif
3348 #endif
3349     
3350     // Init values
3351     if(_aprs_inet_beacon_interval)
3352     {
3353         gchar interval[8];
3354         snprintf(interval, 8, "%d", _aprs_inet_beacon_interval);
3355
3356         gtk_entry_set_text(GTK_ENTRY(aprsSettings->txt_aprs_inet_beacon_interval), interval);
3357     }
3358         
3359     if(_aprs_inet_beacon_comment)
3360         gtk_entry_set_text(GTK_ENTRY(aprsSettings->txt_aprs_inet_beacon_comment), _aprs_inet_beacon_comment);
3361
3362 }
3363
3364 void aprs_settings_dialog(gboolean *aprs_inet_config_changed, gboolean *aprs_tty_config_changed)
3365 {
3366     static GtkWidget *dialog = NULL;
3367     static GtkWidget *notebook = NULL;
3368     static TAprsSettings aprs_settings;
3369     static ScanInfo scan_info = {0};
3370     
3371     printf("%s()\n", __PRETTY_FUNCTION__);
3372
3373     
3374     *aprs_inet_config_changed = FALSE;
3375     *aprs_tty_config_changed = FALSE;
3376     
3377     if(dialog == NULL)
3378     {
3379         dialog = gtk_dialog_new_with_buttons(_("APRS Settings"),
3380                 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
3381                 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
3382                 NULL);
3383
3384         /* Enable the help button. */
3385 #ifndef LEGACY
3386         hildon_help_dialog_help_enable(
3387 #else
3388         ossohelp_dialog_help_enable(
3389 #endif 
3390                 GTK_DIALOG(dialog), HELP_ID_SETTINGS, _osso);
3391
3392         gtk_dialog_add_button(GTK_DIALOG(dialog),
3393                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
3394
3395         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
3396                 notebook = gtk_notebook_new(), TRUE, TRUE, 0);
3397
3398
3399         
3400         // Add enable, and info page
3401         setup_aprs_general_options_page(notebook, &aprs_settings);
3402         
3403         // Add station details page
3404         setup_aprs_options_page(notebook, &aprs_settings);
3405         
3406         // Add iNet page
3407         setup_aprs_inet_options_page(notebook, &aprs_settings);
3408         setup_aprs_inet2_options_page(notebook, &aprs_settings);
3409         
3410         // Add TTY page
3411         setup_aprs_tty_page_options_page(notebook, &aprs_settings);
3412         setup_aprs_tty2_page_options_page(notebook, &aprs_settings);
3413         
3414
3415
3416         /* Connect signals. */
3417         memset(&scan_info, 0, sizeof(scan_info));
3418         scan_info.settings_dialog = dialog;
3419         scan_info.txt_gps_bt_mac = aprs_settings.txt_tnc_bt_mac;
3420         g_signal_connect(G_OBJECT(aprs_settings.btn_scan_bt_tnc), "clicked",
3421                          G_CALLBACK(scan_bluetooth), &scan_info);
3422
3423     }
3424   
3425     gtk_widget_show_all(dialog);
3426
3427     if(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
3428     {
3429         // TODO - check if settings have really changed 
3430         *aprs_inet_config_changed = TRUE;
3431         *aprs_tty_config_changed = TRUE;
3432         
3433         
3434         read_aprs_options(&aprs_settings );
3435
3436         save_aprs_options();
3437
3438         aprs_timer_init();
3439     }
3440
3441     gtk_widget_hide(dialog);
3442
3443     vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, rcvr_changed);
3444
3445 }
3446 #endif // INCLUDE_APRS
3447