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