]> err.no Git - mapper/blob - src/settings-gui.c
Misc fixes.
[mapper] / src / settings-gui.c
1 #include <config.h>
2
3 #define _GNU_SOURCE
4
5 #include <unistd.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <strings.h>
9 #include <stddef.h>
10 #include <locale.h>
11 #include <math.h>
12 #include <errno.h>
13 #include <sys/wait.h>
14 #include <glib/gstdio.h>
15 #include <gtk/gtk.h>
16 #include <fcntl.h>
17 #include <libgnomevfs/gnome-vfs.h>
18 #include <curl/multi.h>
19 #include <gconf/gconf-client.h>
20 #include <libxml/parser.h>
21 #include <libintl.h>
22 #include <locale.h>
23 #include <sqlite3.h>
24
25 #ifdef WITH_OSSO
26 #include <libosso.h>
27 #include <osso-helplib.h>
28 #endif
29 #ifdef WITH_HILDON
30 #include <hildon-widgets/hildon-program.h>
31 #include <hildon-widgets/hildon-controlbar.h>
32 #include <hildon-widgets/hildon-note.h>
33 #include <hildon-widgets/hildon-color-button.h>
34 #include <hildon-widgets/hildon-file-chooser-dialog.h>
35 #include <hildon-widgets/hildon-number-editor.h>
36 #include <hildon-widgets/hildon-banner.h>
37 #include <hildon-widgets/hildon-system-sound.h>
38 #include <hildon-widgets/hildon-input-mode-hint.h>
39 #include <device_symbols.h>
40 #endif
41
42 #include "utils.h"
43 #include "poi.h"
44 #include "gps.h"
45 #include "map.h"
46 #include "mapper-types.h"
47 #include "bt.h"
48 #include "ui-common.h"
49 #include "settings.h"
50 #include "db.h"
51
52 #include "hildon-wrappers.h"
53
54 gboolean
55 settings_dialog_browse_forfile(GtkWidget * widget, BrowseInfo * browse_info)
56 {
57         GtkWidget *dialog;
58         gint res;
59         printf("%s()\n", __PRETTY_FUNCTION__);
60
61         dialog =
62             GTK_WIDGET(hildon_file_chooser_dialog_new
63                        (GTK_WINDOW(browse_info->dialog),
64                         GTK_FILE_CHOOSER_ACTION_OPEN));
65
66         gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialog), TRUE);
67         gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
68                                             gtk_entry_get_text(GTK_ENTRY
69                                                                (browse_info->
70                                                                 txt)));
71
72         res=gtk_dialog_run(GTK_DIALOG(dialog));
73         if (res==GTK_RESPONSE_OK || res==GTK_RESPONSE_ACCEPT) {
74                 gchar *filename =
75                     gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
76                 gtk_entry_set_text(GTK_ENTRY(browse_info->txt), filename);
77                 g_free(filename);
78         }
79
80         gtk_widget_destroy(dialog);
81
82         vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
83         return TRUE;
84 }
85
86 typedef struct _KeysDialogInfo KeysDialogInfo;
87 struct _KeysDialogInfo {
88         GtkWidget *cmb[CUSTOM_KEY_ENUM_COUNT];
89 };
90
91 gboolean
92 settings_dialog_hardkeys_reset(GtkWidget * widget, KeysDialogInfo * cdi)
93 {
94         GtkWidget *confirm;
95         printf("%s()\n", __PRETTY_FUNCTION__);
96
97         confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
98                                                _("Reset all hardware keys to their original defaults?"));
99
100         if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) {
101                 gint i;
102                 for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
103                         gtk_combo_box_set_active(GTK_COMBO_BOX(cdi->cmb[i]),
104                                                  CUSTOM_KEY_DEFAULT[i]);
105         }
106         gtk_widget_destroy(confirm);
107
108         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
109         return TRUE;
110 }
111
112 gboolean 
113 settings_dialog_hardkeys(GtkWidget * widget, GtkWidget * parent)
114 {
115         gint i;
116         GtkWidget *dialog;
117         GtkWidget *table;
118         GtkWidget *label;
119         KeysDialogInfo bdi;
120         GtkWidget *btn_defaults;
121         printf("%s()\n", __PRETTY_FUNCTION__);
122
123         dialog = gtk_dialog_new_with_buttons(_("Hardware Keys"),
124                                              GTK_WINDOW(parent),
125                                              GTK_DIALOG_MODAL, GTK_STOCK_OK,
126                                              GTK_RESPONSE_ACCEPT, NULL);
127
128         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
129                           btn_defaults =
130                           gtk_button_new_with_label(_("Reset...")));
131         g_signal_connect(G_OBJECT(btn_defaults), "clicked",
132                          G_CALLBACK(settings_dialog_hardkeys_reset), &bdi);
133
134         gtk_dialog_add_button(GTK_DIALOG(dialog),
135                               GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
136
137         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
138                            table = gtk_table_new(2, 9, FALSE), TRUE, TRUE, 0);
139
140         for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++) {
141                 gint j;
142                 gtk_table_attach(GTK_TABLE(table),
143                                  label = gtk_label_new(""),
144                                  0, 1, i, i + 1, GTK_FILL, 0, 2, 1);
145                 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
146 #ifdef WITH_HILDON
147                 gtk_label_set_markup(GTK_LABEL(label), CUSTOM_KEY_ICON[i]);
148 #endif
149                 gtk_table_attach(GTK_TABLE(table),
150                                  bdi.cmb[i] = gtk_combo_box_new_text(),
151                                  1, 2, i, i + 1, GTK_FILL, 0, 2, 1);
152                 for (j = 0; j < CUSTOM_ACTION_ENUM_COUNT; j++)
153                         gtk_combo_box_append_text(GTK_COMBO_BOX(bdi.cmb[i]),
154                                                   CUSTOM_ACTION_TEXT[j]);
155                 gtk_combo_box_set_active(GTK_COMBO_BOX(bdi.cmb[i]), _action[i]);
156         }
157
158         gtk_widget_show_all(dialog);
159
160       OUTER_WHILE:
161         while (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
162                 /* Check for duplicates. */
163                 for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++) {
164                         gint j;
165                         for (j = i + 1; j < CUSTOM_KEY_ENUM_COUNT; j++) {
166                                 if (gtk_combo_box_get_active
167                                     (GTK_COMBO_BOX(bdi.cmb[i]))
168                                     ==
169                                     gtk_combo_box_get_active(GTK_COMBO_BOX
170                                                              (bdi.cmb[j]))) {
171                                         GtkWidget *confirm;
172                                         gchar *buffer =
173                                             g_strdup_printf("%s:\n    %s\n%s",
174                                                             _
175                                                             ("The following action is mapped to multiple keys"),
176                                                             CUSTOM_ACTION_TEXT
177                                                             [gtk_combo_box_get_active
178                                                              (GTK_COMBO_BOX
179                                                               (bdi.cmb[i]))],
180                                                             _("Continue?"));
181                                         confirm =
182                                             hildon_note_new_confirmation
183                                             (GTK_WINDOW(_window), buffer);
184
185                                         if (GTK_RESPONSE_OK !=
186                                             gtk_dialog_run(GTK_DIALOG(confirm)))
187                                         {
188                                                 gtk_widget_destroy(confirm);
189                                                 goto OUTER_WHILE;
190                                         }
191                                         gtk_widget_destroy(confirm);
192                                 }
193                         }
194                 }
195                 for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
196                         _action[i] =
197                             gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i]));
198                 break;
199         }
200
201         gtk_widget_destroy(dialog);
202
203         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
204         return TRUE;
205 }
206
207 typedef struct _ColorsDialogInfo ColorsDialogInfo;
208 struct _ColorsDialogInfo {
209         GtkWidget *col[COLORABLE_ENUM_COUNT];
210 };
211
212 static gboolean
213 settings_dialog_colors_reset(GtkWidget * widget, ColorsDialogInfo * cdi)
214 {
215         GtkWidget *confirm;
216         printf("%s()\n", __PRETTY_FUNCTION__);
217
218         confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
219                                                _
220                                                ("Reset all colors to their original defaults?"));
221
222         if (GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm))) {
223                 gint i;
224                 for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
225                         gtk_color_button_set_color(GTK_COLOR_BUTTON
226                                                       (cdi->col[i]),
227                                                       &COLORABLE_DEFAULT[i]);
228                 }
229         }
230         gtk_widget_destroy(confirm);
231
232         vprintf("%s(): return\n", __PRETTY_FUNCTION__);
233         return TRUE;
234 }
235
236 static gboolean 
237 settings_dialog_colors(GtkWidget * widget, GtkWidget * parent)
238 {
239         GtkWidget *dialog;
240         GtkWidget *table;
241         GtkWidget *label;
242         GtkWidget *btn_defaults;
243         ColorsDialogInfo cdi;
244         printf("%s()\n", __PRETTY_FUNCTION__);
245
246         dialog = gtk_dialog_new_with_buttons(_("Colors"),
247                                              GTK_WINDOW(parent),
248                                              GTK_DIALOG_MODAL, GTK_STOCK_OK,
249                                              GTK_RESPONSE_ACCEPT, NULL);
250
251         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
252                           btn_defaults = gtk_button_new_with_label(_("Reset...")));
253         g_signal_connect(G_OBJECT(btn_defaults), "clicked",
254                          G_CALLBACK(settings_dialog_colors_reset), &cdi);
255
256         gtk_dialog_add_button(GTK_DIALOG(dialog),
257                               GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
258
259         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
260                            table = gtk_table_new(4, 3, TRUE), TRUE, TRUE, 0);
261
262         /* GPS. */
263         gtk_table_attach(GTK_TABLE(table),
264                          label = gtk_label_new(_("GPS")),
265                          0, 1, 0, 1, GTK_FILL, 0, 2, 4);
266         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
267         gtk_table_attach(GTK_TABLE(table),
268                          cdi.col[COLORABLE_MARK] = gtk_color_button_new(),
269                          1, 2, 0, 1, 0, 0, 2, 4);
270         gtk_color_button_set_color(GTK_COLOR_BUTTON
271                                       (cdi.col[COLORABLE_MARK]),
272                                       &_color[COLORABLE_MARK]);
273         gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_MARK_VELOCITY] =
274                          gtk_color_button_new(), 2, 3, 0, 1, 0, 0, 2, 4);
275         gtk_color_button_set_color(GTK_COLOR_BUTTON
276                                       (cdi.col[COLORABLE_MARK_VELOCITY]),
277                                       &_color[COLORABLE_MARK_VELOCITY]);
278         gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_MARK_OLD] =
279                          gtk_color_button_new(), 3, 4, 0, 1, 0, 0, 2, 4);
280         gtk_color_button_set_color(GTK_COLOR_BUTTON
281                                       (cdi.col[COLORABLE_MARK_OLD]),
282                                       &_color[COLORABLE_MARK_OLD]);
283
284         /* Track. */
285         gtk_table_attach(GTK_TABLE(table),
286                          label = gtk_label_new(_("Track")),
287                          0, 1, 1, 2, GTK_FILL, 0, 2, 4);
288         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
289         gtk_table_attach(GTK_TABLE(table),
290                          cdi.col[COLORABLE_TRACK] = gtk_color_button_new(),
291                          1, 2, 1, 2, 0, 0, 2, 4);
292         gtk_color_button_set_color(GTK_COLOR_BUTTON
293                                       (cdi.col[COLORABLE_TRACK]),
294                                       &_color[COLORABLE_TRACK]);
295         gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_TRACK_MARK] =
296                          gtk_color_button_new(), 2, 3, 1, 2, 0, 0, 2, 4);
297         gtk_color_button_set_color(GTK_COLOR_BUTTON
298                                       (cdi.col[COLORABLE_TRACK_MARK]),
299                                       &_color[COLORABLE_TRACK_MARK]);
300         gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_TRACK_BREAK] =
301                          gtk_color_button_new(), 3, 4, 1, 2, 0, 0, 2, 4);
302         gtk_color_button_set_color(GTK_COLOR_BUTTON
303                                       (cdi.col[COLORABLE_TRACK_BREAK]),
304                                       &_color[COLORABLE_TRACK_BREAK]);
305
306         /* Route. */
307         gtk_table_attach(GTK_TABLE(table),
308                          label = gtk_label_new(_("Route")),
309                          0, 1, 2, 3, GTK_FILL, 0, 2, 4);
310         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
311         gtk_table_attach(GTK_TABLE(table),
312                          cdi.col[COLORABLE_ROUTE] = gtk_color_button_new(),
313                          1, 2, 2, 3, 0, 0, 2, 4);
314         gtk_color_button_set_color(GTK_COLOR_BUTTON
315                                       (cdi.col[COLORABLE_ROUTE]),
316                                       &_color[COLORABLE_ROUTE]);
317         gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_ROUTE_WAY] =
318                          gtk_color_button_new(), 2, 3, 2, 3, 0, 0, 2, 4);
319         gtk_color_button_set_color(GTK_COLOR_BUTTON
320                                       (cdi.col[COLORABLE_ROUTE_WAY]),
321                                       &_color[COLORABLE_ROUTE_WAY]);
322         gtk_table_attach(GTK_TABLE(table), cdi.col[COLORABLE_ROUTE_BREAK] =
323                          gtk_color_button_new(), 3, 4, 2, 3, 0, 0, 2, 4);
324         gtk_color_button_set_color(GTK_COLOR_BUTTON
325                                       (cdi.col[COLORABLE_ROUTE_BREAK]),
326                                       &_color[COLORABLE_ROUTE_BREAK]);
327
328         /* POI. */
329         gtk_table_attach(GTK_TABLE(table),
330                          label = gtk_label_new(_("POI")),
331                          0, 1, 3, 4, GTK_FILL, 0, 2, 4);
332         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
333         gtk_table_attach(GTK_TABLE(table),
334                          cdi.col[COLORABLE_POI] = gtk_color_button_new(),
335                          1, 2, 3, 4, 0, 0, 2, 4);
336         gtk_color_button_set_color(GTK_COLOR_BUTTON
337                                       (cdi.col[COLORABLE_POI]),
338                                       &_color[COLORABLE_POI]);
339
340         gtk_widget_show_all(dialog);
341
342         while (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
343                 GdkColor *color;
344
345                 gtk_color_button_get_color(GTK_COLOR_BUTTON
346                                                   (cdi.col[COLORABLE_MARK]),color);
347                 _color[COLORABLE_MARK] = *color;
348
349                 gtk_color_button_get_color(GTK_COLOR_BUTTON
350                                                   (cdi.col[COLORABLE_MARK_VELOCITY]) ,color);
351                 _color[COLORABLE_MARK_VELOCITY] = *color;
352
353                 gtk_color_button_get_color(GTK_COLOR_BUTTON
354                                                   (cdi.col[COLORABLE_MARK_OLD]),color);
355                 _color[COLORABLE_MARK_OLD] = *color;
356
357                 gtk_color_button_get_color(GTK_COLOR_BUTTON
358                                                   (cdi.col[COLORABLE_TRACK]),color);
359                 _color[COLORABLE_TRACK] = *color;
360
361                 gtk_color_button_get_color(GTK_COLOR_BUTTON
362                                                   (cdi.col[COLORABLE_TRACK_MARK]),color);
363                 _color[COLORABLE_TRACK_MARK] = *color;
364
365                 gtk_color_button_get_color(GTK_COLOR_BUTTON
366                                                   (cdi.col[COLORABLE_TRACK_BREAK]),color);
367                 _color[COLORABLE_TRACK_BREAK] = *color;
368
369                 gtk_color_button_get_color(GTK_COLOR_BUTTON
370                                                   (cdi.col[COLORABLE_ROUTE]),color);
371                 _color[COLORABLE_ROUTE] = *color;
372
373                 gtk_color_button_get_color(GTK_COLOR_BUTTON
374                                                   (cdi.col[COLORABLE_ROUTE_WAY]),color);
375                 _color[COLORABLE_ROUTE_WAY] = *color;
376
377                 gtk_color_button_get_color(GTK_COLOR_BUTTON
378                                                   (cdi.col[COLORABLE_ROUTE_BREAK]),color);
379                 _color[COLORABLE_ROUTE_BREAK] = *color;
380
381                 gtk_color_button_get_color(GTK_COLOR_BUTTON
382                                                   (cdi.col[COLORABLE_POI]),color);
383                 _color[COLORABLE_POI] = *color;
384
385                 update_gcs();
386                 break;
387         }
388
389         gtk_widget_destroy(dialog);
390
391         vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
392         return TRUE;
393 }
394
395 /**
396  * Bring up the Settings dialog.  Return TRUE if and only if the recever
397  * information has changed (MAC or channel).
398  */
399 gboolean 
400 settings_dialog(void)
401 {
402         GtkWidget *dialog;
403         GtkWidget *notebook;
404         GtkWidget *table;
405         GtkWidget *hbox;
406         GtkWidget *hbox2;
407         GtkWidget *label;
408         GtkWidget *txt_rcvr_mac;
409         GtkWidget *num_center_ratio;
410         GtkWidget *num_lead_ratio;
411         GtkWidget *num_announce_notice;
412         GtkWidget *chk_enable_voice;
413         GtkWidget *num_voice_speed;
414         GtkWidget *num_voice_pitch;
415         GtkWidget *lbl_voice_speed;
416         GtkWidget *lbl_voice_pitch;
417         GtkWidget *num_draw_width;
418         GtkWidget *chk_always_keep_on;
419         GtkWidget *cmb_units;
420         GtkWidget *cmb_degformat;
421         GtkWidget *btn_scan;
422         GtkWidget *btn_buttons;
423         GtkWidget *btn_colors;
424
425         GtkWidget *txt_mapper_db;
426         GtkWidget *btn_browsedb;
427         GtkWidget *num_poi_zoom;
428         GtkWidget *chk_speed_limit_on;
429         GtkWidget *num_speed;
430         GtkWidget *cmb_speed_location;
431         GtkWidget *cmb_info_font_size;
432
433         GtkWidget *chk_gps_filter;
434         GtkWidget *num_angle;
435         GtkWidget *num_hdop;
436         GtkWidget *num_vdop;
437         GtkWidget *num_osm_dist;
438
439         BrowseInfo browse_info = { 0, 0 };
440         ScanInfo scan_info = { 0 };
441         gboolean rcvr_changed = FALSE;
442         guint i;
443         printf("%s()\n", __PRETTY_FUNCTION__);
444
445         dialog = gtk_dialog_new_with_buttons(_("Settings"),
446                                              GTK_WINDOW(_window),
447                                              GTK_DIALOG_MODAL, GTK_STOCK_OK,
448                                              GTK_RESPONSE_ACCEPT, NULL);
449
450 #ifdef WITH_HILDON
451         /* Enable the help button. */
452         ossohelp_dialog_help_enable(GTK_DIALOG(dialog), HELP_ID_SETTINGS, _osso);
453
454         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
455                           btn_buttons = gtk_button_new_with_label(_("Hardware Keys...")));
456 #endif
457
458         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
459                           btn_colors = gtk_button_new_with_label(_("Colors...")));
460
461         gtk_dialog_add_button(GTK_DIALOG(dialog),
462                               GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
463
464         gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
465                            notebook = gtk_notebook_new(), TRUE, TRUE, 0);
466
467         /* Receiver page. */
468         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
469                                  table = gtk_table_new(2, 3, FALSE),
470                                  label = gtk_label_new(_("GPS")));
471
472         /* Receiver MAC Address. */
473         gtk_table_attach(GTK_TABLE(table),
474                          label = gtk_label_new(_("MAC")),
475                          0, 1, 0, 1, GTK_FILL, 0, 2, 4);
476         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
477         gtk_table_attach(GTK_TABLE(table),
478                          hbox = gtk_hbox_new(FALSE, 4),
479                          1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
480         gtk_box_pack_start(GTK_BOX(hbox),
481                            txt_rcvr_mac = gtk_entry_new(), TRUE, TRUE, 0);
482         gtk_box_pack_start(GTK_BOX(hbox),
483                            btn_scan = gtk_button_new_with_label(_("Scan...")),
484                            FALSE, FALSE, 0);
485
486         /* Note!. */
487         gtk_table_attach(GTK_TABLE(table),
488                          label = gtk_label_new(_
489                                        ("Note: You can enter a device path\n"
490                                         "(e.g. \"/dev/rfcomm0\").")), 0, 2, 1,
491                          2, GTK_FILL, 0, 2, 4);
492         gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
493         gtk_misc_set_alignment(GTK_MISC(label), 0.5f, 0.5f);
494
495         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
496                                  table = gtk_table_new(2, 5, FALSE),
497                                  label = gtk_label_new(_("Filter")));
498
499         gtk_table_attach(GTK_TABLE(table),
500                          chk_gps_filter = gtk_check_button_new_with_label(_("Enable GPS track filter")),
501                          0, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
502         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_gps_filter), _gps_filter);
503
504         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Horizontal")),
505                          0, 1, 1, 2, GTK_FILL, 0, 2, 4);
506         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
507         gtk_table_attach(GTK_TABLE(table), num_hdop = gtk_hscale_new_with_range(0, 200, 0.1),
508                          1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
509
510         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Vertical")),
511                          0, 1, 2, 3, GTK_FILL, 0, 2, 4);
512         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
513         gtk_table_attach(GTK_TABLE(table), num_vdop = gtk_hscale_new_with_range(0, 200, 0.1),
514                          1, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 4);
515
516         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Angle")),
517                          0, 1, 3, 4, GTK_FILL, 0, 2, 4);
518         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
519         gtk_table_attach(GTK_TABLE(table), num_angle = gtk_hscale_new_with_range(0, 45, 0.5),
520                          1, 2, 3, 4, GTK_EXPAND | GTK_FILL, 0, 2, 4);
521
522         /* Distance to OSM data */
523         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Distance to OSM Data")),
524                          0, 1, 4, 5, GTK_FILL, 0, 2, 4);
525         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
526         gtk_table_attach(GTK_TABLE(table), num_osm_dist = gtk_hscale_new_with_range(0, 5000, 1),
527                          1, 2, 4, 5, GTK_EXPAND | GTK_FILL, 0, 2, 4);
528
529         /* Auto-Center page. */
530         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
531                                  table = gtk_table_new(2, 2, FALSE),
532                                  label = gtk_label_new(_("Auto-Center")));
533
534         /* Auto-Center Sensitivity. */
535         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Sensitivity")),
536                          0, 1, 0, 1, GTK_FILL, 0, 2, 4);
537         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
538         gtk_table_attach(GTK_TABLE(table), num_center_ratio = hildon_controlbar_new(),
539                          1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
540         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_center_ratio), 1, 10);
541         force_min_visible_bars(HILDON_CONTROLBAR(num_center_ratio), 1);
542
543         /* Lead Amount. */
544         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Lead Amount")),
545                          0, 1, 1, 2, GTK_FILL, 0, 2, 4);
546         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
547
548         gtk_table_attach(GTK_TABLE(table), num_lead_ratio = hildon_controlbar_new(),
549                          1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
550         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_lead_ratio), 1, 10);
551         force_min_visible_bars(HILDON_CONTROLBAR(num_lead_ratio), 1);
552
553         /* Announcement page */
554         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
555                                  table = gtk_table_new(2, 3, FALSE),
556                                  label = gtk_label_new(_("Announce")));
557
558         /* Announcement Advance Notice. */
559         gtk_table_attach(GTK_TABLE(table),
560                          label = gtk_label_new(_("Advance Notice")),
561                          0, 1, 0, 1, GTK_FILL, 0, 2, 4);
562         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
563         gtk_table_attach(GTK_TABLE(table), num_announce_notice = hildon_controlbar_new(),
564                          1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
565         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_announce_notice), 1, 20);
566         force_min_visible_bars(HILDON_CONTROLBAR(num_announce_notice), 1);
567
568         /* Enable Voice. */
569         gtk_table_attach(GTK_TABLE(table),
570                          chk_enable_voice =
571                          gtk_check_button_new_with_label(_
572                                                          ("Enable Voice Synthesis (requires flite)")),
573                          0, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
574         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_enable_voice),
575                                      _enable_voice);
576
577         /* Voice Speed and Pitch. */
578         gtk_table_attach(GTK_TABLE(table),
579                          hbox = gtk_hbox_new(FALSE, 12),
580                          0, 2, 2, 3, 0, 0, 2, 6);
581         gtk_box_pack_start(GTK_BOX(hbox),
582                            hbox2 = gtk_hbox_new(FALSE, 4), TRUE, TRUE, 4);
583         gtk_box_pack_start(GTK_BOX(hbox2),
584                            lbl_voice_speed = gtk_label_new(_("Speed")),
585                            TRUE, TRUE, 0);
586         gtk_box_pack_start(GTK_BOX(hbox2),
587                            num_voice_speed = hildon_controlbar_new(),
588                            TRUE, TRUE, 0);
589         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_voice_speed), 1, 10);
590         force_min_visible_bars(HILDON_CONTROLBAR(num_voice_speed), 1);
591
592         gtk_box_pack_start(GTK_BOX(hbox),
593                            hbox2 = gtk_hbox_new(FALSE, 4), TRUE, TRUE, 4);
594         gtk_box_pack_start(GTK_BOX(hbox2),
595                            lbl_voice_pitch = gtk_label_new(_("Pitch")),
596                            TRUE, TRUE, 0);
597         gtk_box_pack_start(GTK_BOX(hbox2),
598                            num_voice_pitch = hildon_controlbar_new(),
599                            TRUE, TRUE, 0);
600         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_voice_pitch), -2, 8);
601         force_min_visible_bars(HILDON_CONTROLBAR(num_voice_pitch), 1);
602
603         /* Display settings page. */
604         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
605                                  table = gtk_table_new(2, 3, FALSE),
606                                  label = gtk_label_new(_("Display")));
607
608         /* Line Width. */
609         gtk_table_attach(GTK_TABLE(table),
610                          label = gtk_label_new(_("Line Width")),
611                          0, 1, 0, 1, GTK_FILL, 0, 2, 4);
612         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
613         gtk_table_attach(GTK_TABLE(table),
614                          num_draw_width = hildon_controlbar_new(),
615                          1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
616         hildon_controlbar_set_range(HILDON_CONTROLBAR(num_draw_width), 1, 20);
617         force_min_visible_bars(HILDON_CONTROLBAR(num_draw_width), 1);
618
619         /* Keep Display On Only When Fullscreen. */
620         gtk_table_attach(GTK_TABLE(table),
621                          chk_always_keep_on =
622                          gtk_check_button_new_with_label(_("Keep Display On Only in Fullscreen Mode")),
623                          0, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
624
625         /* Information Font Size. */
626         gtk_table_attach(GTK_TABLE(table),
627                          hbox = gtk_hbox_new(FALSE, 4),
628                          0, 2, 2, 3, GTK_FILL, 0, 2, 4);
629         gtk_box_pack_start(GTK_BOX(hbox),
630                            label = gtk_label_new(_("Information Font Size")),
631                            FALSE, FALSE, 0);
632         gtk_box_pack_start(GTK_BOX(hbox),
633                            cmb_info_font_size = gtk_combo_box_new_text(),
634                            FALSE, FALSE, 0);
635         for (i = 0; i < INFO_FONT_ENUM_COUNT; i++)
636                 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_info_font_size),
637                                           INFO_FONT_TEXT[i]);
638
639         /* Units page. */
640         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
641                                  table = gtk_table_new(2, 3, FALSE),
642                                  label = gtk_label_new(_("Units")));
643
644         /* Units. */
645         gtk_table_attach(GTK_TABLE(table),
646                          label = gtk_label_new(_("Units")),
647                          0, 1, 0, 1, GTK_FILL, 0, 2, 4);
648         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
649         gtk_table_attach(GTK_TABLE(table),
650                          cmb_units = gtk_combo_box_new_text(),
651                          1, 2, 0, 1, GTK_FILL, 0, 2, 4);
652         for (i = 0; i < UNITS_ENUM_COUNT; i++)
653                 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_units),
654                                           UNITS_TEXT[i]);
655
656         /* Degrees format */
657         gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(_("Degrees Format")),
658                          0, 1, 1, 2, GTK_FILL, 0, 2, 4);
659         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
660         gtk_table_attach(GTK_TABLE(table), label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
661                          1, 2, 1, 2, GTK_FILL, 0, 2, 4);
662         gtk_container_add(GTK_CONTAINER(label),
663                           cmb_degformat = gtk_combo_box_new_text());
664         for (i = 0; i < DEG_FORMAT_ENUM_COUNT; i++)
665                 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_degformat),
666                                           DEG_FORMAT_TEXT[i]);
667
668         gtk_table_attach(GTK_TABLE(table),
669                          gtk_label_new(""),
670                          2, 3, 0, 2, GTK_FILL | GTK_EXPAND, 0, 2, 4);
671
672         /* Speed warner. */
673         gtk_table_attach(GTK_TABLE(table),
674                          hbox = gtk_hbox_new(FALSE, 4),
675                          0, 3, 2, 3, GTK_FILL, 0, 2, 4);
676
677         gtk_box_pack_start(GTK_BOX(hbox),
678                            chk_speed_limit_on =
679                            gtk_check_button_new_with_label(_("Speed Limit")),
680                            FALSE, FALSE, 0);
681
682         gtk_box_pack_start(GTK_BOX(hbox),
683                            label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
684                            FALSE, FALSE, 0);
685         gtk_container_add(GTK_CONTAINER(label),
686                           num_speed = hildon_number_editor_new(0, 999));
687
688         gtk_box_pack_start(GTK_BOX(hbox),
689                            label = gtk_label_new(_("Location")),
690                            FALSE, FALSE, 0);
691         gtk_box_pack_start(GTK_BOX(hbox),
692                            label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
693                            FALSE, FALSE, 0);
694         gtk_container_add(GTK_CONTAINER(label),
695                           cmb_speed_location = gtk_combo_box_new_text());
696         for (i = 0; i < SPEED_LOCATION_ENUM_COUNT; i++)
697                 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_speed_location),
698                                           SPEED_LOCATION_TEXT[i]);
699
700         /* Database page */
701         gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
702                                  table = gtk_table_new(2, 3, FALSE),
703                                  label = gtk_label_new(_("Database")));
704
705         /* Database. */
706         gtk_table_attach(GTK_TABLE(table),
707                          label = gtk_label_new(_("Database")),
708                          0, 1, 1, 2, GTK_FILL, 0, 2, 4);
709         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
710         gtk_table_attach(GTK_TABLE(table),
711                          hbox = gtk_hbox_new(FALSE, 4),
712                          1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
713         gtk_box_pack_start(GTK_BOX(hbox),
714                            txt_mapper_db = gtk_entry_new(), TRUE, TRUE, 0);
715         gtk_box_pack_start(GTK_BOX(hbox),
716                            btn_browsedb =
717                            gtk_button_new_with_label(_("Browse...")), FALSE,
718                            FALSE, 0);
719
720         /* Show POI below zoom. */
721         gtk_table_attach(GTK_TABLE(table),
722                          label = gtk_label_new(_("Show POI below zoom")),
723                          0, 1, 2, 3, GTK_FILL, 0, 2, 4);
724         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
725         gtk_table_attach(GTK_TABLE(table),
726                          label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
727                          1, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 4);
728         gtk_container_add(GTK_CONTAINER(label),
729                           num_poi_zoom = hildon_number_editor_new(0, MAX_ZOOM));
730
731         /* Connect signals. */
732         scan_info.settings_dialog = dialog;
733         scan_info.txt_rcvr_mac = txt_rcvr_mac;
734         g_signal_connect(G_OBJECT(btn_scan), "clicked",
735                          G_CALLBACK(scan_bluetooth), &scan_info);
736         g_signal_connect(G_OBJECT(btn_buttons), "clicked",
737                          G_CALLBACK(settings_dialog_hardkeys), dialog);
738         g_signal_connect(G_OBJECT(btn_colors), "clicked",
739                          G_CALLBACK(settings_dialog_colors), dialog);
740
741         browse_info.dialog = dialog;
742         browse_info.txt = txt_mapper_db;
743         g_signal_connect(G_OBJECT(btn_browsedb), "clicked",
744                          G_CALLBACK(settings_dialog_browse_forfile),
745                          &browse_info);
746
747         /* Initialize fields. */
748         if (_rcvr_mac)
749                 gtk_entry_set_text(GTK_ENTRY(txt_rcvr_mac), _rcvr_mac);
750         if (_mapper_db)
751                 gtk_entry_set_text(GTK_ENTRY(txt_mapper_db), _mapper_db);
752
753         hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_poi_zoom),
754                                        _poi_zoom);
755         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_center_ratio),
756                                     _center_ratio);
757         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_lead_ratio),
758                                     _lead_ratio);
759         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_announce_notice),
760                                     _announce_notice_ratio);
761         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_voice_speed),
762                                     (gint) (_voice_speed * 3 + 0.5));
763         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_voice_pitch),
764                                     _voice_pitch);
765         hildon_controlbar_set_value(HILDON_CONTROLBAR(num_draw_width),
766                                     _draw_width);
767         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_always_keep_on),
768                                      !_always_keep_on);
769         gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_units), _units);
770         gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_degformat), _degformat);
771         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_speed_limit_on),
772                                      _speed_limit_on);
773         hildon_number_editor_set_range(HILDON_NUMBER_EDITOR(num_speed), 1, 300);
774         hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_speed), _speed_limit);
775         gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_speed_location), _speed_location);
776         gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_info_font_size), _info_font_size);
777
778         gtk_range_set_value(num_hdop, _filter_hdop);
779         gtk_range_set_value(num_vdop, _filter_vdop);
780         gtk_range_set_value(num_angle, _filter_angle);
781         gtk_range_set_value(num_osm_dist, _filter_osm);
782
783         gtk_widget_show_all(dialog);
784
785         /* TODO: Uncomment the following hide function calls if moimart ever
786          * releases his dbus-based flite software. */
787         gtk_widget_hide(lbl_voice_speed);
788         gtk_widget_hide(num_voice_speed);
789         gtk_widget_hide(lbl_voice_pitch);
790         gtk_widget_hide(num_voice_pitch);
791
792         while (GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) {
793                 /* Set _rcvr_mac if necessary. */
794                 if (!*gtk_entry_get_text(GTK_ENTRY(txt_rcvr_mac))) {
795                         /* User specified no rcvr mac - set _rcvr_mac to NULL. */
796                         if (_rcvr_mac) {
797                                 g_free(_rcvr_mac);
798                                 _rcvr_mac = NULL;
799                                 rcvr_changed = TRUE;
800                                 gtk_widget_set_sensitive(GTK_WIDGET
801                                                          (_menu_gps_details_item),
802                                                          FALSE);
803                         }
804                         if (_enable_gps) {
805                                 gtk_check_menu_item_set_active
806                                     (GTK_CHECK_MENU_ITEM(_menu_enable_gps_item),
807                                      FALSE);
808                                 popup_error(dialog,
809                                             _("No GPS Receiver MAC provided.\n"
810                                               "GPS will be disabled."));
811                                 rcvr_changed = TRUE;
812                                 gtk_widget_set_sensitive(GTK_WIDGET
813                                                          (_menu_gps_details_item),
814                                                          FALSE);
815                         }
816                 } else if (!_rcvr_mac || strcmp(_rcvr_mac, gtk_entry_get_text(GTK_ENTRY(txt_rcvr_mac)))) {
817                         /* User specified a new rcvr mac. */
818                         g_free(_rcvr_mac);
819                         _rcvr_mac = g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_rcvr_mac)));
820                         rcvr_changed = TRUE;
821                 }
822
823                 _center_ratio = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_center_ratio));
824                 _lead_ratio = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_lead_ratio));
825                 _draw_width = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_draw_width));
826                 _always_keep_on = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_always_keep_on));
827                 _units = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_units));
828                 _degformat = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_degformat));
829                 _speed_limit_on = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_speed_limit_on));
830                 _speed_limit = hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(num_speed));
831                 _speed_location = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_speed_location));
832                 _info_font_size = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_info_font_size));
833
834                 _announce_notice_ratio = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_announce_notice));
835
836                 _voice_speed = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_voice_speed)) / 3.0;
837                 _voice_pitch = hildon_controlbar_get_value(HILDON_CONTROLBAR(num_voice_pitch));
838                 _enable_voice = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_enable_voice));
839
840                 _filter_angle = gtk_range_get_value(GTK_RANGE(num_angle));
841                 _filter_hdop = gtk_range_get_value(GTK_RANGE(num_hdop));
842                 _filter_vdop = gtk_range_get_value(GTK_RANGE(num_vdop));
843                 _filter_osm = gtk_range_get_value(GTK_RANGE(num_osm_dist));
844                 _gps_filter = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk_gps_filter));
845
846                 if (_db) {
847                         mapper_db_disconnect(&_db);
848                         _db = NULL;
849                 }
850                 g_free(_mapper_db);
851                 if (strlen(gtk_entry_get_text(GTK_ENTRY(txt_mapper_db)))) {
852                         _mapper_db = g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_mapper_db)));
853                         mapper_db_connect(&_db, _mapper_db);
854                 } else {
855                         _mapper_db = NULL;
856                 }
857
858                 /* Sensitize menus based on whether we have a database conn. */
859                 gtk_widget_set_sensitive(_cmenu_loc_add_poi, _db != NULL);
860                 gtk_widget_set_sensitive(_cmenu_way_add_poi, _db != NULL);
861                 gtk_widget_set_sensitive(_cmenu_poi, _db != NULL);
862                 gtk_widget_set_sensitive(_menu_poi_item, _db != NULL);
863
864                 _poi_zoom = hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(num_poi_zoom));
865
866                 update_gcs();
867
868                 config_save();
869                 break;
870         }
871
872 #ifndef WITH_HILDON
873         /* Destroying causes a crash (!?!?!??!)  huh? in hildon (770?) only, plain gtk is ok...*/
874         gtk_widget_destroy(dialog);     
875 #else
876         gtk_widget_hide(dialog);
877 #endif
878
879         vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, rcvr_changed);
880         return rcvr_changed;
881 }