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