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