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