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