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