2 * Copyright (C) 2006, 2007 John Costigan.
4 * POI and GPS-Info code originally written by Cezary Jackiewicz.
6 * Default map data provided by http://www.openstreetmap.org/
8 * This file is part of Maemo Mapper.
10 * Maemo Mapper is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
15 * Maemo Mapper is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with Maemo Mapper. If not, see <http://www.gnu.org/licenses/>.
33 #include <dbus/dbus-glib.h>
35 #include <gconf/gconf-client.h>
38 # include <hildon/hildon-help.h>
39 # include <hildon/hildon-note.h>
40 # include <hildon/hildon-color-button.h>
41 # include <hildon/hildon-file-chooser-dialog.h>
42 # include <hildon/hildon-number-editor.h>
43 # include <hildon/hildon-banner.h>
45 # include <osso-helplib.h>
46 # include <hildon-widgets/hildon-note.h>
47 # include <hildon-widgets/hildon-color-button.h>
48 # include <hildon-widgets/hildon-file-chooser-dialog.h>
49 # include <hildon-widgets/hildon-number-editor.h>
50 # include <hildon-widgets/hildon-banner.h>
51 # include <hildon-widgets/hildon-input-mode-hint.h>
60 #include "gdk-pixbuf-rotate.h"
67 typedef struct _ScanInfo ScanInfo;
69 GtkWidget *settings_dialog;
70 GtkWidget *txt_gps_bt_mac;
71 GtkWidget *scan_dialog;
76 DBusGProxy *req_proxy;
77 DBusGProxy *sig_proxy;
80 typedef struct _KeysDialogInfo KeysDialogInfo;
81 struct _KeysDialogInfo {
82 GtkWidget *cmb[CUSTOM_KEY_ENUM_COUNT];
85 typedef struct _ColorsDialogInfo ColorsDialogInfo;
86 struct _ColorsDialogInfo {
87 GtkWidget *col[COLORABLE_ENUM_COUNT];
92 * Save all configuration data to GCONF.
98 GConfClient *gconf_client;
100 printf("%s()\n", __PRETTY_FUNCTION__);
102 /* Initialize settings_dir. */
103 settings_dir = gnome_vfs_expand_initial_tilde(CONFIG_DIR_NAME);
104 g_mkdir_with_parents(settings_dir, 0700);
106 /* SAVE ALL GCONF SETTINGS. */
108 gconf_client = gconf_client_get_default();
112 _("Failed to initialize GConf. Settings were not saved."));
116 /* Save GPS Receiver Type. */
117 gconf_client_set_string(gconf_client,
118 GCONF_KEY_GPS_RCVR_TYPE,
119 GPS_RCVR_ENUM_TEXT[_gri.type], NULL);
121 /* Save Bluetooth Receiver MAC. */
123 gconf_client_set_string(gconf_client,
124 GCONF_KEY_GPS_BT_MAC, _gri.bt_mac, NULL);
126 gconf_client_unset(gconf_client,
127 GCONF_KEY_GPS_BT_MAC, NULL);
129 /* Save GPSD Host. */
131 gconf_client_set_string(gconf_client,
132 GCONF_KEY_GPS_GPSD_HOST, _gri.gpsd_host, NULL);
134 gconf_client_unset(gconf_client,
135 GCONF_KEY_GPS_GPSD_HOST, NULL);
137 /* Save GPSD Port. */
138 gconf_client_set_int(gconf_client,
139 GCONF_KEY_GPS_GPSD_PORT, _gri.gpsd_port, NULL);
141 /* Save File Path. */
143 gconf_client_set_string(gconf_client,
144 GCONF_KEY_GPS_FILE_PATH, _gri.file_path, NULL);
146 gconf_client_unset(gconf_client,
147 GCONF_KEY_GPS_FILE_PATH, NULL);
149 /* Save Auto-Download. */
150 gconf_client_set_bool(gconf_client,
151 GCONF_KEY_AUTO_DOWNLOAD, _auto_download, NULL);
153 /* Save Auto-Download Pre-cache. */
154 gconf_client_set_int(gconf_client,
155 GCONF_KEY_AUTO_DOWNLOAD_PRECACHE, _auto_download_precache, NULL);
157 /* Save Auto-Center Sensitivity. */
158 gconf_client_set_int(gconf_client,
159 GCONF_KEY_CENTER_SENSITIVITY, _center_ratio, NULL);
161 /* Save Auto-Center Lead Amount. */
162 gconf_client_set_int(gconf_client,
163 GCONF_KEY_LEAD_AMOUNT, _lead_ratio, NULL);
165 /* Save Auto-Center Lead Fixed flag. */
166 gconf_client_set_bool(gconf_client,
167 GCONF_KEY_LEAD_IS_FIXED, _lead_is_fixed, NULL);
169 /* Save Auto-Rotate Sensitivity. */
170 gconf_client_set_int(gconf_client,
171 GCONF_KEY_ROTATE_SENSITIVITY, _rotate_sens, NULL);
173 /* Save Auto-Center/Rotate Minimum Speed. */
174 gconf_client_set_int(gconf_client,
175 GCONF_KEY_AC_MIN_SPEED, _ac_min_speed, NULL);
177 /* Save Auto-Rotate Sensitivity. */
178 gconf_client_set_string(gconf_client,
179 GCONF_KEY_ROTATE_DIR, ROTATE_DIR_ENUM_TEXT[_rotate_dir], NULL);
181 /* Save Draw Line Width. */
182 gconf_client_set_int(gconf_client,
183 GCONF_KEY_DRAW_WIDTH, _draw_width, NULL);
185 /* Save Announce Advance Notice Ratio. */
186 gconf_client_set_int(gconf_client,
187 GCONF_KEY_ANNOUNCE_NOTICE, _announce_notice_ratio, NULL);
189 /* Save Enable Voice flag. */
190 gconf_client_set_bool(gconf_client,
191 GCONF_KEY_ENABLE_VOICE, _enable_voice, NULL);
193 /* Save fullscreen flag. */
194 gconf_client_set_bool(gconf_client,
195 GCONF_KEY_FULLSCREEN, _fullscreen, NULL);
198 gconf_client_set_string(gconf_client,
199 GCONF_KEY_UNITS, UNITS_ENUM_TEXT[_units], NULL);
201 /* Save Custom Key Actions. */
204 for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
205 gconf_client_set_string(gconf_client,
207 CUSTOM_ACTION_ENUM_TEXT[_action[i]], NULL);
210 /* Save Deg Format. */
211 gconf_client_set_string(gconf_client,
212 GCONF_KEY_DEG_FORMAT, DEG_FORMAT_ENUM_TEXT[_degformat], NULL);
214 /* Save Speed Limit On flag. */
215 gconf_client_set_bool(gconf_client,
216 GCONF_KEY_SPEED_LIMIT_ON, _speed_limit_on, NULL);
218 /* Save Speed Limit. */
219 gconf_client_set_int(gconf_client,
220 GCONF_KEY_SPEED_LIMIT, _speed_limit, NULL);
222 /* Save Speed Location. */
223 gconf_client_set_string(gconf_client,
224 GCONF_KEY_SPEED_LOCATION,
225 SPEED_LOCATION_ENUM_TEXT[_speed_location], NULL);
227 /* Save Info Font Size. */
228 gconf_client_set_string(gconf_client,
229 GCONF_KEY_INFO_FONT_SIZE,
230 INFO_FONT_ENUM_TEXT[_info_font_size], NULL);
232 /* Save Unblank Option. */
233 gconf_client_set_string(gconf_client,
234 GCONF_KEY_UNBLANK_SIZE,
235 UNBLANK_ENUM_TEXT[_unblank_option], NULL);
237 /* Save last saved latitude. */
238 gconf_client_set_float(gconf_client,
239 GCONF_KEY_LAST_LAT, _gps.lat, NULL);
241 /* Save last saved longitude. */
242 gconf_client_set_float(gconf_client,
243 GCONF_KEY_LAST_LON, _gps.lon, NULL);
245 /* Save last saved altitude. */
246 gconf_client_set_int(gconf_client,
247 GCONF_KEY_LAST_ALT, _pos.altitude, NULL);
249 /* Save last saved speed. */
250 gconf_client_set_float(gconf_client,
251 GCONF_KEY_LAST_SPEED, _gps.speed, NULL);
253 /* Save last saved heading. */
254 gconf_client_set_float(gconf_client,
255 GCONF_KEY_LAST_HEADING, _gps.heading, NULL);
257 /* Save last saved timestamp. */
258 gconf_client_set_float(gconf_client,
259 GCONF_KEY_LAST_TIME, _pos.time, NULL);
261 /* Save last center point. */
263 gdouble center_lat, center_lon;
264 unit2latlon(_center.unitx, _center.unity, center_lat, center_lon);
266 /* Save last center latitude. */
267 gconf_client_set_float(gconf_client,
268 GCONF_KEY_CENTER_LAT, center_lat, NULL);
270 /* Save last center longitude. */
271 gconf_client_set_float(gconf_client,
272 GCONF_KEY_CENTER_LON, center_lon, NULL);
274 /* Save last view angle. */
275 gconf_client_set_int(gconf_client,
276 GCONF_KEY_CENTER_ANGLE, _map_rotate_angle, NULL);
279 /* Save last Zoom Level. */
280 gconf_client_set_int(gconf_client,
281 GCONF_KEY_ZOOM, _zoom, NULL);
283 /* Save Route Directory. */
285 gconf_client_set_string(gconf_client,
286 GCONF_KEY_ROUTEDIR, _route_dir_uri, NULL);
288 /* Save the repositories. */
290 GList *curr = _repo_list;
291 GSList *temp_list = NULL;
292 gint curr_repo_index = 0;
294 for(curr = _repo_list; curr != NULL; curr = curr->next)
296 /* Build from each part of a repo, delimited by newline characters:
302 RepoData *rd = curr->data;
303 gchar buffer[BUFFER_SIZE];
304 snprintf(buffer, sizeof(buffer),
305 "%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d",
315 temp_list = g_slist_append(temp_list, g_strdup(buffer));
317 gconf_client_set_int(gconf_client,
318 GCONF_KEY_CURRREPO, curr_repo_index, NULL);
321 gconf_client_set_list(gconf_client,
322 GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, temp_list, NULL);
325 /* Save Last Track File. */
327 gconf_client_set_string(gconf_client,
328 GCONF_KEY_TRACKFILE, _track_file_uri, NULL);
330 /* Save Auto-Center Mode. */
331 gconf_client_set_int(gconf_client,
332 GCONF_KEY_AUTOCENTER_MODE, _center_mode, NULL);
334 /* Save Auto-Center Rotate Flag. */
335 gconf_client_set_bool(gconf_client,
336 GCONF_KEY_AUTOCENTER_ROTATE, _center_rotate, NULL);
338 /* Save Show Zoom Level flag. */
339 gconf_client_set_bool(gconf_client,
340 GCONF_KEY_SHOWZOOMLEVEL, _show_zoomlevel, NULL);
342 /* Save Show Scale flag. */
343 gconf_client_set_bool(gconf_client,
344 GCONF_KEY_SHOWSCALE, _show_scale, NULL);
346 /* Save Show Compass Rose flag. */
347 gconf_client_set_bool(gconf_client,
348 GCONF_KEY_SHOWCOMPROSE, _show_comprose, NULL);
350 /* Save Show Tracks flag. */
351 gconf_client_set_bool(gconf_client,
352 GCONF_KEY_SHOWTRACKS, _show_paths & TRACKS_MASK, NULL);
354 /* Save Show Routes flag. */
355 gconf_client_set_bool(gconf_client,
356 GCONF_KEY_SHOWROUTES, _show_paths & ROUTES_MASK, NULL);
358 /* Save Show Velocity Vector flag. */
359 gconf_client_set_bool(gconf_client,
360 GCONF_KEY_SHOWVELVEC, _show_velvec, NULL);
362 /* Save Show POIs flag. */
363 gconf_client_set_bool(gconf_client,
364 GCONF_KEY_SHOWPOIS, _show_poi, NULL);
366 /* Save Enable GPS flag. */
367 gconf_client_set_bool(gconf_client,
368 GCONF_KEY_ENABLE_GPS, _enable_gps, NULL);
370 /* Save Route Locations. */
371 gconf_client_set_list(gconf_client,
372 GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, _loc_list, NULL);
374 /* Save GPS Info flag. */
375 gconf_client_set_bool(gconf_client,
376 GCONF_KEY_GPS_INFO, _gps_info, NULL);
378 /* Save Route Download URL Format. */
379 gconf_client_set_string(gconf_client,
380 GCONF_KEY_ROUTE_DL_URL, _route_dl_url, NULL);
382 /* Save Route Download Radius. */
383 gconf_client_set_int(gconf_client,
384 GCONF_KEY_ROUTE_DL_RADIUS, _route_dl_radius, NULL);
386 /* Save POI Download URL Format. */
387 gconf_client_set_string(gconf_client,
388 GCONF_KEY_POI_DL_URL, _poi_dl_url, NULL);
393 for(i = 0; i < COLORABLE_ENUM_COUNT; i++)
395 snprintf(buffer, sizeof(buffer), "#%02x%02x%02x",
397 _color[i].green >> 8,
398 _color[i].blue >> 8);
399 gconf_client_set_string(gconf_client,
400 COLORABLE_GCONF[i], buffer, NULL);
404 /* Save POI database. */
406 gconf_client_set_string(gconf_client,
407 GCONF_KEY_POI_DB, _poi_db_filename, NULL);
409 gconf_client_unset(gconf_client, GCONF_KEY_POI_DB, NULL);
411 /* Save Show POI below zoom. */
412 gconf_client_set_int(gconf_client,
413 GCONF_KEY_POI_ZOOM, _poi_zoom, NULL);
415 gconf_client_clear_cache(gconf_client);
416 g_object_unref(gconf_client);
417 g_free(settings_dir);
419 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
423 scan_cb_dev_found(DBusGProxy *sig_proxy, const gchar *bda,
424 const gchar *name, gpointer *class, guchar rssi, gint coff,
428 printf("%s()\n", __PRETTY_FUNCTION__);
429 gtk_list_store_append(scan_info->store, &iter);
430 gtk_list_store_set(scan_info->store, &iter,
434 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
438 scan_cb_search_complete(DBusGProxy *sig_proxy, ScanInfo *scan_info)
440 printf("%s()\n", __PRETTY_FUNCTION__);
441 gtk_widget_destroy(scan_info->banner);
442 dbus_g_proxy_disconnect_signal(sig_proxy, BTSEARCH_DEV_FOUND_SIG,
443 G_CALLBACK(scan_cb_dev_found), scan_info);
444 dbus_g_proxy_disconnect_signal(sig_proxy, BTSEARCH_SEARCH_COMPLETE_SIG,
445 G_CALLBACK(scan_cb_search_complete), scan_info);
446 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
450 scan_start_search(ScanInfo *scan_info)
452 GError *error = NULL;
453 printf("%s()\n", __PRETTY_FUNCTION__);
455 /* Initialize D-Bus. */
456 if(NULL == (scan_info->bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error)))
458 g_printerr("Failed to open connection to D-Bus: %s.\n",
463 if(NULL == (scan_info->req_proxy =dbus_g_proxy_new_for_name(scan_info->bus,
466 BTSEARCH_REQ_INTERFACE)))
468 g_printerr("Failed to create D-Bus request proxy for btsearch.");
472 if(NULL == (scan_info->sig_proxy =dbus_g_proxy_new_for_name(scan_info->bus,
475 BTSEARCH_SIG_INTERFACE)))
477 g_printerr("Failed to create D-Bus signal proxy for btsearch.");
481 dbus_g_object_register_marshaller(
482 g_cclosure_user_marshal_VOID__STRING_STRING_POINTER_UCHAR_UINT,
486 DBUS_TYPE_G_UCHAR_ARRAY,
491 dbus_g_proxy_add_signal(scan_info->sig_proxy,
492 BTSEARCH_DEV_FOUND_SIG,
495 DBUS_TYPE_G_UCHAR_ARRAY,
499 dbus_g_proxy_connect_signal(scan_info->sig_proxy, BTSEARCH_DEV_FOUND_SIG,
500 G_CALLBACK(scan_cb_dev_found), scan_info, NULL);
502 dbus_g_proxy_add_signal(scan_info->sig_proxy,
503 BTSEARCH_SEARCH_COMPLETE_SIG,
505 dbus_g_proxy_connect_signal(scan_info->sig_proxy,
506 BTSEARCH_SEARCH_COMPLETE_SIG,
507 G_CALLBACK(scan_cb_search_complete), scan_info, NULL);
510 if(!dbus_g_proxy_call(scan_info->req_proxy, BTSEARCH_START_SEARCH_REQ,
511 &error, G_TYPE_INVALID, G_TYPE_INVALID))
513 if(error->domain == DBUS_GERROR
514 && error->code == DBUS_GERROR_REMOTE_EXCEPTION)
516 g_printerr("Caught remote method exception %s: %s",
517 dbus_g_error_get_name(error),
521 g_printerr("Error: %s\n", error->message);
525 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
530 * Scan for all bluetooth devices. This method can take a few seconds,
531 * during which the UI will freeze.
534 scan_bluetooth(GtkWidget *widget, ScanInfo *scan_info)
536 GError *error = NULL;
537 GtkWidget *dialog = NULL;
538 GtkWidget *lst_devices = NULL;
539 GtkTreeViewColumn *column = NULL;
540 GtkCellRenderer *renderer = NULL;
541 printf("%s()\n", __PRETTY_FUNCTION__);
543 dialog = gtk_dialog_new_with_buttons(_("Select Bluetooth Device"),
544 GTK_WINDOW(scan_info->settings_dialog), GTK_DIALOG_MODAL,
545 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
546 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
549 scan_info->scan_dialog = dialog;
551 scan_info->store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
553 gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 300);
555 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
556 lst_devices = gtk_tree_view_new_with_model(
557 GTK_TREE_MODEL(scan_info->store)), TRUE, TRUE, 0);
559 g_object_unref(G_OBJECT(scan_info->store));
561 gtk_tree_selection_set_mode(
562 gtk_tree_view_get_selection(GTK_TREE_VIEW(lst_devices)),
563 GTK_SELECTION_SINGLE);
564 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(lst_devices), TRUE);
566 renderer = gtk_cell_renderer_text_new();
567 column = gtk_tree_view_column_new_with_attributes(
568 _("MAC"), renderer, "text", 0, NULL);
569 gtk_tree_view_append_column(GTK_TREE_VIEW(lst_devices), column);
571 renderer = gtk_cell_renderer_text_new();
572 column = gtk_tree_view_column_new_with_attributes(
573 _("Description"), renderer, "text", 1, NULL);
574 gtk_tree_view_append_column(GTK_TREE_VIEW(lst_devices), column);
576 gtk_widget_show_all(dialog);
578 scan_info->banner = hildon_banner_show_animation(dialog, NULL,
579 _("Scanning for Bluetooth Devices"));
581 if(scan_start_search(scan_info))
583 gtk_widget_destroy(scan_info->banner);
584 popup_error(scan_info->settings_dialog,
585 _("An error occurred while attempting to scan for "
586 "bluetooth devices."));
588 else while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
591 if(gtk_tree_selection_get_selected(
592 gtk_tree_view_get_selection(GTK_TREE_VIEW(lst_devices)),
596 gtk_tree_model_get(GTK_TREE_MODEL(scan_info->store),
598 gtk_entry_set_text(GTK_ENTRY(scan_info->txt_gps_bt_mac), mac);
603 _("Please select a bluetooth device from the list."));
606 gtk_widget_destroy(dialog);
608 /* Clean up D-Bus. */
609 if(scan_info->req_proxy)
611 dbus_g_proxy_call(scan_info->req_proxy, BTSEARCH_STOP_SEARCH_REQ,
612 &error, G_TYPE_INVALID, G_TYPE_INVALID);
613 g_object_unref(scan_info->req_proxy);
614 scan_info->req_proxy = NULL;
616 if(scan_info->sig_proxy)
618 g_object_unref(scan_info->sig_proxy);
619 scan_info->sig_proxy = NULL;
623 dbus_g_connection_unref(scan_info->bus);
624 scan_info->bus = NULL;
627 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
632 settings_dialog_browse_forfile(GtkWidget *widget, BrowseInfo *browse_info)
635 printf("%s()\n", __PRETTY_FUNCTION__);
638 hildon_file_chooser_dialog_new(GTK_WINDOW(browse_info->dialog),
639 GTK_FILE_CHOOSER_ACTION_OPEN));
641 gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialog), TRUE);
642 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
643 gtk_entry_get_text(GTK_ENTRY(browse_info->txt)));
645 if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(dialog)))
647 gchar *filename = gtk_file_chooser_get_filename(
648 GTK_FILE_CHOOSER(dialog));
649 gtk_entry_set_text(GTK_ENTRY(browse_info->txt), filename);
653 gtk_widget_destroy(dialog);
655 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
660 settings_dialog_hardkeys_reset(GtkWidget *widget, KeysDialogInfo *cdi)
663 printf("%s()\n", __PRETTY_FUNCTION__);
665 confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
666 _("Reset all hardware keys to their original defaults?"));
668 if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm)))
671 for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
672 gtk_combo_box_set_active(GTK_COMBO_BOX(cdi->cmb[i]),
673 CUSTOM_KEY_DEFAULT[i]);
675 gtk_widget_destroy(confirm);
677 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
682 settings_dialog_hardkeys(GtkWidget *widget, GtkWidget *parent)
685 static GtkWidget *dialog = NULL;
686 static GtkWidget *table = NULL;
687 static GtkWidget *label = NULL;
688 static KeysDialogInfo bdi;
689 static GtkWidget *btn_defaults = NULL;
690 printf("%s()\n", __PRETTY_FUNCTION__);
694 dialog = gtk_dialog_new_with_buttons(_("Hardware Keys"),
695 GTK_WINDOW(parent), GTK_DIALOG_MODAL,
696 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
699 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
700 btn_defaults = gtk_button_new_with_label(_("Reset...")));
701 g_signal_connect(G_OBJECT(btn_defaults), "clicked",
702 G_CALLBACK(settings_dialog_hardkeys_reset), &bdi);
704 gtk_dialog_add_button(GTK_DIALOG(dialog),
705 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
707 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
708 table = gtk_table_new(2, 9, FALSE), TRUE, TRUE, 0);
709 for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
712 gtk_table_attach(GTK_TABLE(table),
713 label = gtk_label_new(""),
714 0, 1, i, i + 1, GTK_FILL, 0, 2, 1);
715 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
716 gtk_label_set_markup(GTK_LABEL(label), CUSTOM_KEY_ICON[i]);
717 gtk_table_attach(GTK_TABLE(table),
718 bdi.cmb[i] = gtk_combo_box_new_text(),
719 1, 2, i, i + 1, GTK_FILL, 0, 2, 1);
720 for(j = 0; j < CUSTOM_ACTION_ENUM_COUNT; j++)
721 gtk_combo_box_append_text(GTK_COMBO_BOX(bdi.cmb[i]),
722 CUSTOM_ACTION_ENUM_TEXT[j]);
726 /* Initialize contents of the combo boxes. */
727 for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
728 gtk_combo_box_set_active(GTK_COMBO_BOX(bdi.cmb[i]), _action[i]);
730 gtk_widget_show_all(dialog);
733 while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
735 /* Check for duplicates. */
736 for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
739 for(j = i + 1; j < CUSTOM_KEY_ENUM_COUNT; j++)
741 if(gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i]))
742 == gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[j])))
745 gchar *buffer = g_strdup_printf("%s:\n %s\n%s",
746 _("The following action is mapped to multiple keys"),
747 CUSTOM_ACTION_ENUM_TEXT[gtk_combo_box_get_active(
748 GTK_COMBO_BOX(bdi.cmb[i]))],
750 confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
753 if(GTK_RESPONSE_OK != gtk_dialog_run(GTK_DIALOG(confirm)))
755 gtk_widget_destroy(confirm);
758 gtk_widget_destroy(confirm);
762 for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
763 _action[i] = gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i]));
767 gtk_widget_hide(dialog);
769 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
774 settings_dialog_colors_reset(GtkWidget *widget, ColorsDialogInfo *cdi)
777 printf("%s()\n", __PRETTY_FUNCTION__);
779 confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
780 _("Reset all colors to their original defaults?"));
782 if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm)))
785 for(i = 0; i < COLORABLE_ENUM_COUNT; i++)
787 hildon_color_button_set_color(
788 HILDON_COLOR_BUTTON(cdi->col[i]),
789 &COLORABLE_DEFAULT[i]);
792 gtk_widget_destroy(confirm);
794 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
799 settings_dialog_colors(GtkWidget *widget, GtkWidget *parent)
801 static GtkWidget *dialog = NULL;
802 static GtkWidget *table = NULL;
803 static GtkWidget *label = NULL;
804 static GtkWidget *btn_defaults = NULL;
805 static ColorsDialogInfo cdi;
806 printf("%s()\n", __PRETTY_FUNCTION__);
810 dialog = gtk_dialog_new_with_buttons(_("Colors"),
811 GTK_WINDOW(parent), GTK_DIALOG_MODAL,
812 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
815 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
816 btn_defaults = gtk_button_new_with_label(_("Reset...")));
817 g_signal_connect(G_OBJECT(btn_defaults), "clicked",
818 G_CALLBACK(settings_dialog_colors_reset), &cdi);
820 gtk_dialog_add_button(GTK_DIALOG(dialog),
821 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
823 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
824 table = gtk_table_new(4, 3, FALSE), TRUE, TRUE, 0);
827 gtk_table_attach(GTK_TABLE(table),
828 label = gtk_label_new(_("GPS")),
829 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
830 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
831 gtk_table_attach(GTK_TABLE(table),
832 cdi.col[COLORABLE_MARK] = hildon_color_button_new(),
833 1, 2, 0, 1, 0, 0, 2, 4);
834 gtk_table_attach(GTK_TABLE(table),
835 cdi.col[COLORABLE_MARK_VELOCITY] = hildon_color_button_new(),
836 2, 3, 0, 1, 0, 0, 2, 4);
837 gtk_table_attach(GTK_TABLE(table),
838 cdi.col[COLORABLE_MARK_OLD] = hildon_color_button_new(),
839 3, 4, 0, 1, 0, 0, 2, 4);
842 gtk_table_attach(GTK_TABLE(table),
843 label = gtk_label_new(_("Track")),
844 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
845 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
846 gtk_table_attach(GTK_TABLE(table),
847 cdi.col[COLORABLE_TRACK] = hildon_color_button_new(),
848 1, 2, 1, 2, 0, 0, 2, 4);
849 gtk_table_attach(GTK_TABLE(table),
850 cdi.col[COLORABLE_TRACK_MARK] = hildon_color_button_new(),
851 2, 3, 1, 2, 0, 0, 2, 4);
852 gtk_table_attach(GTK_TABLE(table),
853 cdi.col[COLORABLE_TRACK_BREAK] = hildon_color_button_new(),
854 3, 4, 1, 2, 0, 0, 2, 4);
857 gtk_table_attach(GTK_TABLE(table),
858 label = gtk_label_new(_("Route")),
859 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
860 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
861 gtk_table_attach(GTK_TABLE(table),
862 cdi.col[COLORABLE_ROUTE] = hildon_color_button_new(),
863 1, 2, 2, 3, 0, 0, 2, 4);
864 gtk_table_attach(GTK_TABLE(table),
865 cdi.col[COLORABLE_ROUTE_WAY] = hildon_color_button_new(),
866 2, 3, 2, 3, 0, 0, 2, 4);
867 gtk_table_attach(GTK_TABLE(table),
868 cdi.col[COLORABLE_ROUTE_BREAK] = hildon_color_button_new(),
869 3, 4, 2, 3, 0, 0, 2, 4);
872 gtk_table_attach(GTK_TABLE(table),
873 label = gtk_label_new(_("POI")),
874 0, 1, 3, 4, GTK_FILL, 0, 2, 4);
875 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
876 gtk_table_attach(GTK_TABLE(table),
877 cdi.col[COLORABLE_POI] = hildon_color_button_new(),
878 1, 2, 3, 4, 0, 0, 2, 4);
881 /* Initialize GPS. */
882 hildon_color_button_set_color(
883 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK]),
884 &_color[COLORABLE_MARK]);
885 hildon_color_button_set_color(
886 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]),
887 &_color[COLORABLE_MARK_VELOCITY]);
888 hildon_color_button_set_color(
889 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]),
890 &_color[COLORABLE_MARK_OLD]);
892 /* Initialize Track. */
893 hildon_color_button_set_color(
894 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]),
895 &_color[COLORABLE_TRACK]);
896 hildon_color_button_set_color(
897 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]),
898 &_color[COLORABLE_TRACK_MARK]);
899 hildon_color_button_set_color(
900 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]),
901 &_color[COLORABLE_TRACK_BREAK]);
903 /* Initialize Route. */
904 hildon_color_button_set_color(
905 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]),
906 &_color[COLORABLE_ROUTE]);
907 hildon_color_button_set_color(
908 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]),
909 &_color[COLORABLE_ROUTE_WAY]);
910 hildon_color_button_set_color(
911 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]),
912 &_color[COLORABLE_ROUTE_BREAK]);
914 /* Initialize POI. */
915 hildon_color_button_set_color(
916 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_POI]),
917 &_color[COLORABLE_POI]);
919 gtk_widget_show_all(dialog);
921 while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
924 hildon_color_button_get_color(
925 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK]),
926 &_color[COLORABLE_MARK]);
928 hildon_color_button_get_color(
929 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]),
930 &_color[COLORABLE_MARK_VELOCITY]);
932 hildon_color_button_get_color(
933 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]),
934 &_color[COLORABLE_MARK_OLD]);
936 hildon_color_button_get_color(
937 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]),
938 &_color[COLORABLE_TRACK]);
940 hildon_color_button_get_color(
941 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]),
942 &_color[COLORABLE_TRACK_MARK]);
944 hildon_color_button_get_color(
945 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]),
946 &_color[COLORABLE_TRACK_BREAK]);
948 hildon_color_button_get_color(
949 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]),
950 &_color[COLORABLE_ROUTE]);
952 hildon_color_button_get_color(
953 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]),
954 &_color[COLORABLE_ROUTE_WAY]);
956 hildon_color_button_get_color(
957 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]),
958 &_color[COLORABLE_ROUTE_BREAK]);
960 hildon_color_button_get_color(
961 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_POI]),
962 &_color[COLORABLE_POI]);
966 color = hildon_color_button_get_color(
967 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK]));
968 _color[COLORABLE_MARK] = *color;
970 color = hildon_color_button_get_color(
971 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]));
972 _color[COLORABLE_MARK_VELOCITY] = *color;
974 color = hildon_color_button_get_color(
975 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]));
976 _color[COLORABLE_MARK_OLD] = *color;
978 color = hildon_color_button_get_color(
979 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]));
980 _color[COLORABLE_TRACK] = *color;
982 color = hildon_color_button_get_color(
983 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]));
984 _color[COLORABLE_TRACK_MARK] = *color;
986 color = hildon_color_button_get_color(
987 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]));
988 _color[COLORABLE_TRACK_BREAK] = *color;
990 color = hildon_color_button_get_color(
991 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]));
992 _color[COLORABLE_ROUTE] = *color;
994 color = hildon_color_button_get_color(
995 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]));
996 _color[COLORABLE_ROUTE_WAY] = *color;
998 color = hildon_color_button_get_color(
999 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]));
1000 _color[COLORABLE_ROUTE_BREAK] = *color;
1002 color = hildon_color_button_get_color(
1003 HILDON_COLOR_BUTTON(cdi.col[COLORABLE_POI]));
1004 _color[COLORABLE_POI] = *color;
1014 gtk_widget_hide(dialog);
1016 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1021 * Bring up the Settings dialog. Return TRUE if and only if the recever
1022 * information has changed (MAC or channel).
1027 static GtkWidget *dialog = NULL;
1028 static GtkWidget *notebook = NULL;
1029 static GtkWidget *table = NULL;
1030 static GtkWidget *hbox = NULL;
1031 static GtkWidget *label = NULL;
1032 static GtkWidget *rad_gps_bt = NULL;
1033 static GtkWidget *rad_gps_gpsd = NULL;
1034 static GtkWidget *rad_gps_file = NULL;
1035 static GtkWidget *txt_gps_bt_mac = NULL;
1036 static GtkWidget *txt_gps_gpsd_host = NULL;
1037 static GtkWidget *num_gps_gpsd_port = NULL;
1038 static GtkWidget *txt_gps_file_path = NULL;
1039 static GtkWidget *num_center_ratio = NULL;
1040 static GtkWidget *num_lead_ratio = NULL;
1041 static GtkWidget *chk_lead_is_fixed = NULL;
1042 static GtkWidget *num_rotate_sens = NULL;
1043 static GtkWidget *cmb_rotate_dir = NULL;
1044 static GtkWidget *num_ac_min_speed = NULL;
1045 static GtkWidget *num_announce_notice = NULL;
1046 static GtkWidget *chk_enable_voice = NULL;
1047 static GtkWidget *num_draw_width = NULL;
1048 static GtkWidget *cmb_units = NULL;
1049 static GtkWidget *cmb_degformat = NULL;
1050 static GtkWidget *btn_scan = NULL;
1051 static GtkWidget *btn_browse_gps = NULL;
1052 static GtkWidget *btn_buttons = NULL;
1053 static GtkWidget *btn_colors = NULL;
1055 static GtkWidget *txt_poi_db = NULL;
1056 static GtkWidget *btn_browse_poi = NULL;
1057 static GtkWidget *num_poi_zoom = NULL;
1058 static GtkWidget *num_auto_download_precache = NULL;
1059 static GtkWidget *chk_speed_limit_on = NULL;
1060 static GtkWidget *num_speed = NULL;
1061 static GtkWidget *cmb_speed_location = NULL;
1062 static GtkWidget *cmb_unblank_option = NULL;
1063 static GtkWidget *cmb_info_font_size = NULL;
1065 static BrowseInfo poi_browse_info = {0, 0};
1066 static BrowseInfo gps_file_browse_info = {0, 0};
1067 static ScanInfo scan_info = {0};
1068 gboolean rcvr_changed = FALSE;
1070 printf("%s()\n", __PRETTY_FUNCTION__);
1074 dialog = gtk_dialog_new_with_buttons(_("Settings"),
1075 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
1076 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1079 /* Enable the help button. */
1081 hildon_help_dialog_help_enable(
1083 ossohelp_dialog_help_enable(
1085 GTK_DIALOG(dialog), HELP_ID_SETTINGS, _osso);
1087 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
1088 btn_buttons = gtk_button_new_with_label(_("Hardware Keys...")));
1090 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
1091 btn_colors = gtk_button_new_with_label(_("Colors...")));
1093 gtk_dialog_add_button(GTK_DIALOG(dialog),
1094 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
1096 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
1097 notebook = gtk_notebook_new(), TRUE, TRUE, 0);
1099 /* Receiver page. */
1100 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1101 table = gtk_table_new(3, 4, FALSE),
1102 label = gtk_label_new(_("GPS")));
1104 /* Receiver MAC Address. */
1105 gtk_table_attach(GTK_TABLE(table),
1106 rad_gps_bt = gtk_radio_button_new_with_label(
1107 NULL, _("Bluetooth")),
1108 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1109 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1110 gtk_table_attach(GTK_TABLE(table),
1111 hbox = gtk_hbox_new(FALSE, 4),
1112 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1113 gtk_box_pack_start(GTK_BOX(hbox),
1114 txt_gps_bt_mac = gtk_entry_new(),
1117 g_object_set(G_OBJECT(txt_gps_bt_mac), "hildon-input-mode",
1118 HILDON_GTK_INPUT_MODE_FULL, NULL);
1120 g_object_set(G_OBJECT(txt_gps_bt_mac), HILDON_AUTOCAP, FALSE, NULL);
1122 gtk_box_pack_start(GTK_BOX(hbox),
1123 btn_scan = gtk_button_new_with_label(_("Scan...")),
1126 /* File Path (RFComm). */
1127 gtk_table_attach(GTK_TABLE(table),
1128 rad_gps_file = gtk_radio_button_new_with_label_from_widget(
1129 GTK_RADIO_BUTTON(rad_gps_bt), _("File Path")),
1130 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1131 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1132 gtk_table_attach(GTK_TABLE(table),
1133 hbox = gtk_hbox_new(FALSE, 4),
1134 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1135 gtk_box_pack_start(GTK_BOX(hbox),
1136 txt_gps_file_path = gtk_entry_new(),
1139 g_object_set(G_OBJECT(txt_gps_file_path), "hildon-input-mode",
1140 HILDON_GTK_INPUT_MODE_FULL, NULL);
1142 g_object_set(G_OBJECT(txt_gps_file_path), HILDON_AUTOCAP, FALSE, NULL);
1144 gtk_box_pack_start(GTK_BOX(hbox),
1145 btn_browse_gps = gtk_button_new_with_label(_("Browse...")),
1148 /* GPSD Hostname and Port. */
1149 gtk_table_attach(GTK_TABLE(table),
1150 rad_gps_gpsd = gtk_radio_button_new_with_label_from_widget(
1151 GTK_RADIO_BUTTON(rad_gps_bt), _("GPSD Host")),
1152 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1153 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1154 gtk_table_attach(GTK_TABLE(table),
1155 hbox = gtk_hbox_new(FALSE, 4),
1156 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1157 gtk_box_pack_start(GTK_BOX(hbox),
1158 txt_gps_gpsd_host = gtk_entry_new(),
1161 g_object_set(G_OBJECT(txt_gps_gpsd_host), "hildon-input-mode",
1162 HILDON_GTK_INPUT_MODE_FULL, NULL);
1164 g_object_set(G_OBJECT(txt_gps_gpsd_host), HILDON_AUTOCAP, FALSE, NULL);
1166 gtk_box_pack_start(GTK_BOX(hbox),
1167 label = gtk_label_new(_("Port")),
1169 gtk_box_pack_start(GTK_BOX(hbox),
1170 num_gps_gpsd_port = hildon_number_editor_new(1, 65535),
1174 /* Auto-Center page. */
1175 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1176 table = gtk_table_new(3, 3, FALSE),
1177 label = gtk_label_new(_("Auto-Center")));
1180 gtk_table_attach(GTK_TABLE(table),
1181 label = gtk_label_new(_("Lead Amount")),
1182 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1183 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1184 gtk_table_attach(GTK_TABLE(table),
1185 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1186 1, 2, 0, 1, GTK_FILL, 0, 2, 4);
1187 gtk_container_add(GTK_CONTAINER(label),
1188 num_lead_ratio = hildon_controlbar_new());
1189 hildon_controlbar_set_range(HILDON_CONTROLBAR(num_lead_ratio), 1, 10);
1190 force_min_visible_bars(HILDON_CONTROLBAR(num_lead_ratio), 1);
1192 gtk_table_attach(GTK_TABLE(table),
1193 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1194 2, 3, 0, 1, GTK_FILL, 0, 2, 4);
1195 gtk_container_add(GTK_CONTAINER(label),
1196 chk_lead_is_fixed = gtk_check_button_new_with_label(_("Fixed")));
1198 /* Auto-Center Pan Sensitivity. */
1199 gtk_table_attach(GTK_TABLE(table),
1200 label = gtk_label_new(_("Pan Sensitivity")),
1201 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1202 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1203 gtk_table_attach(GTK_TABLE(table),
1204 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1205 1, 2, 1, 2, GTK_FILL, 0, 2, 4);
1206 gtk_container_add(GTK_CONTAINER(label),
1207 num_center_ratio = hildon_controlbar_new());
1208 hildon_controlbar_set_range(HILDON_CONTROLBAR(num_center_ratio), 1,10);
1209 force_min_visible_bars(HILDON_CONTROLBAR(num_center_ratio), 1);
1211 gtk_table_attach(GTK_TABLE(table),
1212 hbox = gtk_hbox_new(FALSE, 4),
1213 2, 3, 1, 2, GTK_FILL, 0, 2, 4);
1214 gtk_box_pack_start(GTK_BOX(hbox),
1215 label = gtk_label_new(_("Min. Speed")),
1217 gtk_box_pack_start(GTK_BOX(hbox),
1218 num_ac_min_speed = hildon_number_editor_new(0, 99),
1221 /* Auto-Center Rotate Sensitivity. */
1222 gtk_table_attach(GTK_TABLE(table),
1223 label = gtk_label_new(_("Rotate Sensit.")),
1224 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1225 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1226 gtk_table_attach(GTK_TABLE(table),
1227 num_rotate_sens = hildon_controlbar_new(),
1228 1, 2, 2, 3, GTK_FILL, 0, 2, 4);
1229 hildon_controlbar_set_range(HILDON_CONTROLBAR(num_rotate_sens), 1,10);
1230 force_min_visible_bars(HILDON_CONTROLBAR(num_rotate_sens), 1);
1232 gtk_table_attach(GTK_TABLE(table),
1233 hbox = gtk_hbox_new(FALSE, 4),
1234 2, 3, 2, 3, GTK_FILL, 0, 2, 4);
1235 gtk_box_pack_start(GTK_BOX(hbox),
1236 label = gtk_label_new(_("Points")),
1238 gtk_box_pack_start(GTK_BOX(hbox),
1239 cmb_rotate_dir = gtk_combo_box_new_text(),
1241 for(i = 0; i < ROTATE_DIR_ENUM_COUNT; i++)
1242 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_rotate_dir),
1243 ROTATE_DIR_ENUM_TEXT[i]);
1246 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1247 table = gtk_table_new(2, 3, FALSE),
1248 label = gtk_label_new(_("Announce")));
1250 /* Announcement Advance Notice. */
1251 gtk_table_attach(GTK_TABLE(table),
1252 label = gtk_label_new(_("Advance Notice")),
1253 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1254 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1255 gtk_table_attach(GTK_TABLE(table),
1256 num_announce_notice = hildon_controlbar_new(),
1257 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1258 hildon_controlbar_set_range(
1259 HILDON_CONTROLBAR(num_announce_notice), 1, 20);
1260 force_min_visible_bars(HILDON_CONTROLBAR(num_announce_notice), 1);
1263 gtk_table_attach(GTK_TABLE(table),
1264 chk_enable_voice = gtk_check_button_new_with_label(
1265 _("Enable Voice Synthesis (requires flite)")),
1266 0, 2, 1, 2, GTK_FILL, 0, 2, 4);
1267 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_enable_voice),
1271 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1272 table = gtk_table_new(3, 5, FALSE),
1273 label = gtk_label_new(_("Misc.")));
1276 gtk_table_attach(GTK_TABLE(table),
1277 label = gtk_label_new(_("Line Width")),
1278 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1279 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1280 gtk_table_attach(GTK_TABLE(table),
1281 num_draw_width = hildon_controlbar_new(),
1282 1, 5, 0, 1, GTK_FILL, 0, 2, 4);
1283 hildon_controlbar_set_range(HILDON_CONTROLBAR(num_draw_width), 1, 20);
1284 force_min_visible_bars(HILDON_CONTROLBAR(num_draw_width), 1);
1286 /* Unblank Screen */
1287 gtk_table_attach(GTK_TABLE(table),
1288 label = gtk_label_new(_("Unblank Screen")),
1289 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1290 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1291 gtk_table_attach(GTK_TABLE(table),
1292 cmb_unblank_option = gtk_combo_box_new_text(),
1293 1, 5, 1, 2, GTK_FILL, 0, 2, 4);
1294 for(i = 0; i < UNBLANK_ENUM_COUNT; i++)
1295 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_unblank_option),
1296 UNBLANK_ENUM_TEXT[i]);
1298 /* Information Font Size. */
1299 gtk_table_attach(GTK_TABLE(table),
1300 label = gtk_label_new(_("Info Font Size")),
1301 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1302 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1303 gtk_table_attach(GTK_TABLE(table),
1304 cmb_info_font_size = gtk_combo_box_new_text(),
1305 1, 2, 2, 3, GTK_FILL, 0, 2, 4);
1306 for(i = 0; i < INFO_FONT_ENUM_COUNT; i++)
1307 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_info_font_size),
1308 INFO_FONT_ENUM_TEXT[i]);
1310 gtk_table_attach(GTK_TABLE(table),
1311 gtk_vseparator_new(),
1312 2, 3, 2, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 2,4);
1316 gtk_table_attach(GTK_TABLE(table),
1317 label = gtk_label_new(_("Units")),
1318 3, 4, 2, 3, GTK_FILL, 0, 2, 4);
1319 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1320 gtk_table_attach(GTK_TABLE(table),
1321 cmb_units = gtk_combo_box_new_text(),
1322 4, 5, 2, 3, GTK_FILL, 0, 2, 4);
1323 for(i = 0; i < UNITS_ENUM_COUNT; i++)
1324 gtk_combo_box_append_text(
1325 GTK_COMBO_BOX(cmb_units), UNITS_ENUM_TEXT[i]);
1328 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1329 table = gtk_table_new(3, 4, FALSE),
1330 label = gtk_label_new(_("Misc. 2")));
1332 /* Degrees format */
1333 gtk_table_attach(GTK_TABLE(table),
1334 label = gtk_label_new(_("Degrees Format")),
1335 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
1336 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1337 gtk_table_attach(GTK_TABLE(table),
1338 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1339 1, 2, 0, 1, GTK_FILL, 0, 2, 4);
1340 gtk_container_add(GTK_CONTAINER(label),
1341 cmb_degformat = gtk_combo_box_new_text());
1342 for(i = 0; i < DEG_FORMAT_ENUM_COUNT; i++)
1343 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_degformat),
1344 DEG_FORMAT_ENUM_TEXT[i]);
1346 gtk_table_attach(GTK_TABLE(table),
1347 label = gtk_label_new(_("Auto-Download Pre-cache")),
1348 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1349 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1350 gtk_table_attach(GTK_TABLE(table),
1351 num_auto_download_precache = hildon_controlbar_new(),
1352 1, 2, 1, 2, GTK_FILL, 0, 2, 4);
1353 hildon_controlbar_set_range(
1354 HILDON_CONTROLBAR(num_auto_download_precache), 1, 5);
1355 force_min_visible_bars(
1356 HILDON_CONTROLBAR(num_auto_download_precache), 1);
1359 gtk_table_attach(GTK_TABLE(table),
1360 hbox = gtk_hbox_new(FALSE, 4),
1361 0, 4, 2, 3, GTK_FILL, 0, 2, 4);
1363 gtk_box_pack_start(GTK_BOX(hbox),
1364 chk_speed_limit_on = gtk_check_button_new_with_label(
1368 gtk_box_pack_start(GTK_BOX(hbox),
1369 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1371 gtk_container_add(GTK_CONTAINER(label),
1372 num_speed = hildon_number_editor_new(0, 999));
1374 gtk_box_pack_start(GTK_BOX(hbox),
1375 label = gtk_label_new(_("Location")),
1377 gtk_box_pack_start(GTK_BOX(hbox),
1378 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1380 gtk_container_add(GTK_CONTAINER(label),
1381 cmb_speed_location = gtk_combo_box_new_text());
1382 for(i = 0; i < SPEED_LOCATION_ENUM_COUNT; i++)
1383 gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_speed_location),
1384 SPEED_LOCATION_ENUM_TEXT[i]);
1388 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
1389 table = gtk_table_new(2, 3, FALSE),
1390 label = gtk_label_new(_("POI")));
1393 gtk_table_attach(GTK_TABLE(table),
1394 label = gtk_label_new(_("POI database")),
1395 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
1396 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1397 gtk_table_attach(GTK_TABLE(table),
1398 hbox = gtk_hbox_new(FALSE, 4),
1399 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
1400 gtk_box_pack_start(GTK_BOX(hbox),
1401 txt_poi_db = gtk_entry_new(),
1404 g_object_set(G_OBJECT(txt_poi_db), "hildon-input-mode",
1405 HILDON_GTK_INPUT_MODE_FULL, NULL);
1407 g_object_set(G_OBJECT(txt_poi_db), HILDON_AUTOCAP, FALSE, NULL);
1409 gtk_box_pack_start(GTK_BOX(hbox),
1410 btn_browse_poi = gtk_button_new_with_label(_("Browse...")),
1413 /* Show POI below zoom. */
1414 gtk_table_attach(GTK_TABLE(table),
1415 label = gtk_label_new(_("Show POI below zoom")),
1416 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
1417 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1418 gtk_table_attach(GTK_TABLE(table),
1419 label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1420 1, 2, 2, 3, GTK_FILL, 0, 2, 4);
1421 gtk_container_add(GTK_CONTAINER(label),
1422 num_poi_zoom = hildon_number_editor_new(0, MAX_ZOOM));
1424 /* Connect signals. */
1425 memset(&scan_info, 0, sizeof(scan_info));
1426 scan_info.settings_dialog = dialog;
1427 scan_info.txt_gps_bt_mac = txt_gps_bt_mac;
1428 g_signal_connect(G_OBJECT(btn_scan), "clicked",
1429 G_CALLBACK(scan_bluetooth), &scan_info);
1430 g_signal_connect(G_OBJECT(btn_buttons), "clicked",
1431 G_CALLBACK(settings_dialog_hardkeys), dialog);
1432 g_signal_connect(G_OBJECT(btn_colors), "clicked",
1433 G_CALLBACK(settings_dialog_colors), dialog);
1435 poi_browse_info.dialog = dialog;
1436 poi_browse_info.txt = txt_poi_db;
1437 g_signal_connect(G_OBJECT(btn_browse_poi), "clicked",
1438 G_CALLBACK(settings_dialog_browse_forfile), &poi_browse_info);
1440 gps_file_browse_info.dialog = dialog;
1441 gps_file_browse_info.txt = txt_gps_file_path;
1442 g_signal_connect(G_OBJECT(btn_browse_gps), "clicked",
1443 G_CALLBACK(settings_dialog_browse_forfile),
1444 &gps_file_browse_info);
1448 /* Initialize fields. */
1450 gtk_entry_set_text(GTK_ENTRY(txt_gps_bt_mac), _gri.bt_mac);
1452 gtk_entry_set_text(GTK_ENTRY(txt_gps_gpsd_host), _gri.gpsd_host);
1453 hildon_number_editor_set_value(
1454 HILDON_NUMBER_EDITOR(num_gps_gpsd_port), _gri.gpsd_port);
1456 gtk_entry_set_text(GTK_ENTRY(txt_gps_file_path), _gri.file_path);
1460 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad_gps_gpsd),TRUE);
1463 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad_gps_file),TRUE);
1465 default: /* Including GPS_RCVR_BT */
1466 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad_gps_bt), TRUE);
1470 if(_poi_db_filename)
1471 gtk_entry_set_text(GTK_ENTRY(txt_poi_db), _poi_db_filename);
1472 hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_poi_zoom),
1474 hildon_controlbar_set_value(HILDON_CONTROLBAR(num_center_ratio),
1476 hildon_controlbar_set_value(HILDON_CONTROLBAR(num_lead_ratio),
1478 gtk_toggle_button_set_active(
1479 GTK_TOGGLE_BUTTON(chk_lead_is_fixed), _lead_is_fixed);
1480 hildon_controlbar_set_value(HILDON_CONTROLBAR(num_rotate_sens),
1482 gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_rotate_dir), _rotate_dir);
1483 hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_ac_min_speed),
1485 hildon_controlbar_set_value(HILDON_CONTROLBAR(num_announce_notice),
1486 _announce_notice_ratio);
1487 hildon_controlbar_set_value(HILDON_CONTROLBAR(num_draw_width),
1489 gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_units), _units);
1490 gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_degformat), _degformat);
1491 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_speed_limit_on),
1493 hildon_controlbar_set_value(HILDON_CONTROLBAR(num_auto_download_precache),
1494 _auto_download_precache);
1495 hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_speed),
1497 gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_speed_location),
1499 gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_unblank_option),
1501 gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_info_font_size),
1504 gtk_widget_show_all(dialog);
1506 while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
1508 GpsRcvrType new_grtype;
1510 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_gpsd))
1511 && !*gtk_entry_get_text(GTK_ENTRY(txt_gps_gpsd_host)))
1513 popup_error(dialog, _("Please specify a GPSD hostname."));
1517 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_file))
1518 && !*gtk_entry_get_text(GTK_ENTRY(txt_gps_file_path)))
1520 popup_error(dialog, _("Please specify a GPS file pathname."));
1524 /* Set _gri.bt_mac if necessary. */
1525 if(!*gtk_entry_get_text(GTK_ENTRY(txt_gps_bt_mac)))
1527 /* User specified no rcvr mac - set _gri.bt_mac to NULL. */
1530 g_free(_gri.bt_mac);
1532 rcvr_changed = (_gri.type == GPS_RCVR_BT);
1535 else if(!_gri.bt_mac || strcmp(_gri.bt_mac,
1536 gtk_entry_get_text(GTK_ENTRY(txt_gps_bt_mac))))
1538 /* User specified a new rcvr mac. */
1539 g_free(_gri.bt_mac);
1540 _gri.bt_mac = g_strdup(gtk_entry_get_text(
1541 GTK_ENTRY(txt_gps_bt_mac)));
1542 rcvr_changed = (_gri.type == GPS_RCVR_BT);
1545 /* Set _gri.gpsd_host if necessary. */
1546 if(!*gtk_entry_get_text(GTK_ENTRY(txt_gps_gpsd_host)))
1548 /* User specified no rcvr mac - set _gri.gpsd_host to NULL. */
1551 g_free(_gri.gpsd_host);
1552 _gri.gpsd_host = NULL;
1553 rcvr_changed = (_gri.type == GPS_RCVR_GPSD);
1556 else if(!_gri.gpsd_host || strcmp(_gri.gpsd_host,
1557 gtk_entry_get_text(GTK_ENTRY(txt_gps_gpsd_host))))
1559 /* User specified a new rcvr mac. */
1560 g_free(_gri.gpsd_host);
1561 _gri.gpsd_host = g_strdup(gtk_entry_get_text(
1562 GTK_ENTRY(txt_gps_gpsd_host)));
1563 rcvr_changed = (_gri.type == GPS_RCVR_GPSD);
1566 if(_gri.gpsd_port != hildon_number_editor_get_value(
1567 HILDON_NUMBER_EDITOR(num_gps_gpsd_port)))
1569 _gri.gpsd_port = hildon_number_editor_get_value(
1570 HILDON_NUMBER_EDITOR(num_gps_gpsd_port));
1571 rcvr_changed = (_gri.type == GPS_RCVR_GPSD);
1574 /* Set _gri.file_path if necessary. */
1575 if(!*gtk_entry_get_text(GTK_ENTRY(txt_gps_file_path)))
1577 /* User specified no rcvr mac - set _gri.file_path to NULL. */
1580 g_free(_gri.file_path);
1581 _gri.file_path = NULL;
1582 rcvr_changed = (_gri.type == GPS_RCVR_FILE);
1585 else if(!_gri.file_path || strcmp(_gri.file_path,
1586 gtk_entry_get_text(GTK_ENTRY(txt_gps_file_path))))
1588 /* User specified a new rcvr mac. */
1589 g_free(_gri.file_path);
1590 _gri.file_path = g_strdup(gtk_entry_get_text(
1591 GTK_ENTRY(txt_gps_file_path)));
1592 rcvr_changed = (_gri.type == GPS_RCVR_FILE);
1595 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_bt)))
1596 new_grtype = GPS_RCVR_BT;
1597 else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_gpsd)))
1598 new_grtype = GPS_RCVR_GPSD;
1599 else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_file)))
1600 new_grtype = GPS_RCVR_FILE;
1602 new_grtype = GPS_RCVR_BT;
1604 if(new_grtype != _gri.type)
1606 _gri.type = new_grtype;
1607 rcvr_changed = TRUE;
1610 _center_ratio = hildon_controlbar_get_value(
1611 HILDON_CONTROLBAR(num_center_ratio));
1613 _lead_ratio = hildon_controlbar_get_value(
1614 HILDON_CONTROLBAR(num_lead_ratio));
1616 _lead_is_fixed = gtk_toggle_button_get_active(
1617 GTK_TOGGLE_BUTTON(chk_lead_is_fixed));
1619 _rotate_sens = hildon_controlbar_get_value(
1620 HILDON_CONTROLBAR(num_rotate_sens));
1622 _ac_min_speed = hildon_number_editor_get_value(
1623 HILDON_NUMBER_EDITOR(num_ac_min_speed));
1625 _rotate_dir = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_rotate_dir));
1627 _auto_download_precache = hildon_controlbar_get_value(
1628 HILDON_CONTROLBAR(num_auto_download_precache));
1630 _draw_width = hildon_controlbar_get_value(
1631 HILDON_CONTROLBAR(num_draw_width));
1633 _units = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_units));
1634 _degformat = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_degformat));
1636 _speed_limit_on = gtk_toggle_button_get_active(
1637 GTK_TOGGLE_BUTTON(chk_speed_limit_on));
1638 _speed_limit = hildon_number_editor_get_value(
1639 HILDON_NUMBER_EDITOR(num_speed));
1640 _speed_location = gtk_combo_box_get_active(
1641 GTK_COMBO_BOX(cmb_speed_location));
1643 _unblank_option = gtk_combo_box_get_active(
1644 GTK_COMBO_BOX(cmb_unblank_option));
1646 _info_font_size = gtk_combo_box_get_active(
1647 GTK_COMBO_BOX(cmb_info_font_size));
1649 _announce_notice_ratio = hildon_controlbar_get_value(
1650 HILDON_CONTROLBAR(num_announce_notice));
1652 _enable_voice = gtk_toggle_button_get_active(
1653 GTK_TOGGLE_BUTTON(chk_enable_voice));
1655 /* Check if user specified a different POI database from before. */
1656 if((!_poi_db_filename && *gtk_entry_get_text(GTK_ENTRY(txt_poi_db)))
1657 || strcmp(_poi_db_filename,
1658 gtk_entry_get_text(GTK_ENTRY(txt_poi_db))))
1660 /* Clear old filename/dirname, if necessary. */
1661 if(_poi_db_filename)
1663 g_free(_poi_db_filename);
1664 _poi_db_filename = NULL;
1665 g_free(_poi_db_dirname);
1666 _poi_db_dirname = NULL;
1669 if(*gtk_entry_get_text(GTK_ENTRY(txt_poi_db)))
1671 _poi_db_filename = g_strdup(gtk_entry_get_text(
1672 GTK_ENTRY(txt_poi_db)));
1673 _poi_db_dirname = g_path_get_dirname(_poi_db_filename);
1679 _poi_zoom = hildon_number_editor_get_value(
1680 HILDON_NUMBER_EDITOR(num_poi_zoom));
1687 map_refresh_mark(TRUE);
1692 gtk_widget_hide(dialog);
1694 vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, rcvr_changed);
1695 return rcvr_changed;
1699 settings_parse_repo(gchar *str)
1701 /* Parse each part of a repo, delimited by newline characters:
1706 * 5. view_zoom_steps
1708 gchar *token, *error_check;
1709 printf("%s(%s)\n", __PRETTY_FUNCTION__, str);
1711 RepoData *rd = g_new0(RepoData, 1);
1714 token = strsep(&str, "\n\t");
1716 rd->name = g_strdup(token);
1718 /* Parse URL format. */
1719 token = strsep(&str, "\n\t");
1721 rd->url = g_strdup(token);
1723 /* Parse cache dir. */
1724 token = strsep(&str, "\n\t");
1726 rd->db_filename = gnome_vfs_expand_initial_tilde(token);
1728 /* Parse download zoom steps. */
1729 token = strsep(&str, "\n\t");
1730 if(!token || !*token || !(rd->dl_zoom_steps = atoi(token)))
1731 rd->dl_zoom_steps = 2;
1733 /* Parse view zoom steps. */
1734 token = strsep(&str, "\n\t");
1735 if(!token || !*token || !(rd->view_zoom_steps = atoi(token)))
1736 rd->view_zoom_steps = 1;
1738 /* Parse double-size. */
1739 token = strsep(&str, "\n\t");
1741 rd->double_size = atoi(token); /* Default is zero (FALSE) */
1743 /* Parse next-able. */
1744 token = strsep(&str, "\n\t");
1745 if(!token || !*token
1746 || (rd->nextable = strtol(token, &error_check, 10), token == str))
1747 rd->nextable = TRUE;
1749 /* Parse min zoom. */
1750 token = strsep(&str, "\n\t");
1751 if(!token || !*token
1752 || (rd->min_zoom = strtol(token, &error_check, 10), token == str))
1755 /* Parse max zoom. */
1756 token = strsep(&str, "\n\t");
1757 if(!token || !*token
1758 || (rd->max_zoom = strtol(token, &error_check, 10), token == str))
1763 vprintf("%s(): return %p\n", __PRETTY_FUNCTION__, rd);
1768 * Initialize all configuration from GCONF. This should not be called more
1769 * than once during execution.
1775 GConfClient *gconf_client = gconf_client_get_default();
1777 printf("%s()\n", __PRETTY_FUNCTION__);
1781 popup_error(_window, _("Failed to initialize GConf. Quitting."));
1785 /* Get GPS Receiver Type. Default is Bluetooth Receiver. */
1787 gchar *gri_type_str = gconf_client_get_string(gconf_client,
1788 GCONF_KEY_GPS_RCVR_TYPE, NULL);
1791 for(i = GPS_RCVR_ENUM_COUNT - 1; i > 0; i--)
1792 if(!strcmp(gri_type_str, GPS_RCVR_ENUM_TEXT[i]))
1797 /* Get Bluetooth Receiver MAC. Default is NULL. */
1798 _gri.bt_mac = gconf_client_get_string(
1799 gconf_client, GCONF_KEY_GPS_BT_MAC, NULL);
1801 /* Get GPSD Host. Default is localhost. */
1802 _gri.gpsd_host = gconf_client_get_string(
1803 gconf_client, GCONF_KEY_GPS_GPSD_HOST, NULL);
1805 _gri.gpsd_host = g_strdup("127.0.0.1");
1807 /* Get GPSD Port. Default is GPSD_PORT_DEFAULT (2947). */
1808 if(!(_gri.gpsd_port = gconf_client_get_int(
1809 gconf_client, GCONF_KEY_GPS_GPSD_PORT, NULL)))
1810 _gri.gpsd_port = GPSD_PORT_DEFAULT;
1812 /* Get File Path. Default is /dev/pgps. */
1813 _gri.file_path = gconf_client_get_string(
1814 gconf_client, GCONF_KEY_GPS_FILE_PATH, NULL);
1816 _gri.file_path = g_strdup("/dev/pgps");
1818 /* Get Auto-Download. Default is FALSE. */
1819 _auto_download = gconf_client_get_bool(gconf_client,
1820 GCONF_KEY_AUTO_DOWNLOAD, NULL);
1822 /* Get Auto-Download Pre-cache - Default is 2. */
1823 _auto_download_precache = gconf_client_get_int(gconf_client,
1824 GCONF_KEY_AUTO_DOWNLOAD_PRECACHE, NULL);
1825 if(!_auto_download_precache)
1826 _auto_download_precache = 2;
1828 /* Get Center Ratio - Default is 5. */
1829 _center_ratio = gconf_client_get_int(gconf_client,
1830 GCONF_KEY_CENTER_SENSITIVITY, NULL);
1834 /* Get Lead Ratio - Default is 5. */
1835 _lead_ratio = gconf_client_get_int(gconf_client,
1836 GCONF_KEY_LEAD_AMOUNT, NULL);
1840 /* Get Lead Is Fixed flag - Default is FALSE. */
1841 _lead_is_fixed = gconf_client_get_bool(gconf_client,
1842 GCONF_KEY_LEAD_IS_FIXED, NULL);
1844 /* Get Rotate Sensitivity - Default is 5. */
1845 _rotate_sens = gconf_client_get_int(gconf_client,
1846 GCONF_KEY_ROTATE_SENSITIVITY, NULL);
1850 /* Get Auto-Center/Rotate Minimum Speed - Default is 2. */
1851 value = gconf_client_get(gconf_client, GCONF_KEY_AC_MIN_SPEED, NULL);
1854 _ac_min_speed = gconf_value_get_int(value);
1855 gconf_value_free(value);
1860 /* Get Rotate Dir - Default is ROTATE_DIR_UP. */
1862 gchar *rotate_dir_str = gconf_client_get_string(gconf_client,
1863 GCONF_KEY_ROTATE_DIR, NULL);
1866 for(i = ROTATE_DIR_ENUM_COUNT - 1; i >= 0; i--)
1867 if(!strcmp(rotate_dir_str, ROTATE_DIR_ENUM_TEXT[i]))
1874 /* Get Draw Line Width- Default is 5. */
1875 _draw_width = gconf_client_get_int(gconf_client,
1876 GCONF_KEY_DRAW_WIDTH, NULL);
1880 /* Get Announce Advance Notice - Default is 30. */
1881 value = gconf_client_get(gconf_client, GCONF_KEY_ANNOUNCE_NOTICE, NULL);
1884 _announce_notice_ratio = gconf_value_get_int(value);
1885 gconf_value_free(value);
1888 _announce_notice_ratio = 8;
1890 /* Get Enable Voice flag. Default is TRUE. */
1891 value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_VOICE, NULL);
1894 _enable_voice = gconf_value_get_bool(value);
1895 gconf_value_free(value);
1898 _enable_voice = TRUE;
1900 /* Get Fullscreen flag. Default is FALSE. */
1901 _fullscreen = gconf_client_get_bool(gconf_client,
1902 GCONF_KEY_FULLSCREEN, NULL);
1904 /* Get Units. Default is UNITS_KM. */
1906 gchar *units_str = gconf_client_get_string(gconf_client,
1907 GCONF_KEY_UNITS, NULL);
1910 for(i = UNITS_ENUM_COUNT - 1; i > 0; i--)
1911 if(!strcmp(units_str, UNITS_ENUM_TEXT[i]))
1916 /* Get Custom Key Actions. */
1919 for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
1921 gint j = CUSTOM_KEY_DEFAULT[i];
1922 gchar *str = gconf_client_get_string(gconf_client,
1923 CUSTOM_KEY_GCONF[i], NULL);
1925 for(j = CUSTOM_ACTION_ENUM_COUNT - 1; j > 0; j--)
1926 if(!strcmp(str, CUSTOM_ACTION_ENUM_TEXT[j]))
1932 /* Get Deg format. Default is DDPDDDDD. */
1934 gchar *degformat_key_str = gconf_client_get_string(gconf_client,
1935 GCONF_KEY_DEG_FORMAT, NULL);
1937 if(degformat_key_str)
1938 for(i = DEG_FORMAT_ENUM_COUNT - 1; i > 0; i--)
1939 if(!strcmp(degformat_key_str, DEG_FORMAT_ENUM_TEXT[i]))
1944 /* Get Speed Limit On flag. Default is FALSE. */
1945 _speed_limit_on = gconf_client_get_bool(gconf_client,
1946 GCONF_KEY_SPEED_LIMIT_ON, NULL);
1948 /* Get Speed Limit */
1949 _speed_limit = gconf_client_get_int(gconf_client,
1950 GCONF_KEY_SPEED_LIMIT, NULL);
1951 if(_speed_limit <= 0)
1954 /* Get Speed Location. Default is SPEED_LOCATION_TOP_LEFT. */
1956 gchar *speed_location_str = gconf_client_get_string(gconf_client,
1957 GCONF_KEY_SPEED_LOCATION, NULL);
1959 if(speed_location_str)
1960 for(i = SPEED_LOCATION_ENUM_COUNT - 1; i > 0; i--)
1961 if(!strcmp(speed_location_str, SPEED_LOCATION_ENUM_TEXT[i]))
1963 _speed_location = i;
1966 /* Get Unblank Option. Default is UNBLANK_FULLSCREEN. */
1968 gchar *unblank_option_str = gconf_client_get_string(gconf_client,
1969 GCONF_KEY_UNBLANK_SIZE, NULL);
1971 if(unblank_option_str)
1972 for(i = UNBLANK_ENUM_COUNT - 1; i >= 0; i--)
1973 if(!strcmp(unblank_option_str, UNBLANK_ENUM_TEXT[i]))
1976 i = UNBLANK_FULLSCREEN;
1977 _unblank_option = i;
1980 /* Get Info Font Size. Default is INFO_FONT_MEDIUM. */
1982 gchar *info_font_size_str = gconf_client_get_string(gconf_client,
1983 GCONF_KEY_INFO_FONT_SIZE, NULL);
1985 if(info_font_size_str)
1986 for(i = INFO_FONT_ENUM_COUNT - 1; i >= 0; i--)
1987 if(!strcmp(info_font_size_str, INFO_FONT_ENUM_TEXT[i]))
1990 i = INFO_FONT_MEDIUM;
1991 _info_font_size = i;
1994 /* Get last saved latitude. Default is 50.f. */
1995 value = gconf_client_get(gconf_client, GCONF_KEY_LAST_LAT, NULL);
1998 _gps.lat = gconf_value_get_float(value);
1999 gconf_value_free(value);
2004 /* Get last saved longitude. Default is 0. */
2005 _gps.lon = gconf_client_get_float(gconf_client, GCONF_KEY_LAST_LON, NULL);
2007 /* Get last saved altitude. Default is 0. */
2008 _pos.altitude = gconf_client_get_int(
2009 gconf_client, GCONF_KEY_LAST_ALT, NULL);
2011 /* Get last saved speed. Default is 0. */
2012 _gps.speed = gconf_client_get_float(
2013 gconf_client, GCONF_KEY_LAST_SPEED, NULL);
2015 /* Get last saved speed. Default is 0. */
2016 _gps.heading = gconf_client_get_float(
2017 gconf_client, GCONF_KEY_LAST_HEADING, NULL);
2019 /* Get last saved timestamp. Default is 0. */
2020 _pos.time= gconf_client_get_float(gconf_client, GCONF_KEY_LAST_TIME, NULL);
2022 /* Get last center point. */
2024 gdouble center_lat, center_lon;
2026 /* Get last saved latitude. Default is last saved latitude. */
2027 value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LAT, NULL);
2030 center_lat = gconf_value_get_float(value);
2031 gconf_value_free(value);
2035 _is_first_time = TRUE;
2036 center_lat = _gps.lat;
2039 /* Get last saved longitude. Default is last saved longitude. */
2040 value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LON, NULL);
2043 center_lon = gconf_value_get_float(value);
2044 gconf_value_free(value);
2047 center_lon = _gps.lon;
2049 latlon2unit(center_lat, center_lon, _center.unitx, _center.unity);
2050 _next_center = _center;
2053 /* Get last viewing angle. Default is 0. */
2054 _map_rotate_angle = _next_map_rotate_angle = gconf_client_get_int(
2055 gconf_client, GCONF_KEY_CENTER_ANGLE, NULL);
2056 gdk_pixbuf_rotate_matrix_fill_for_rotation(
2058 deg2rad(ROTATE_DIR_ENUM_DEGREES[_rotate_dir] - _map_rotate_angle));
2059 gdk_pixbuf_rotate_matrix_fill_for_rotation(
2060 _map_reverse_matrix,
2061 deg2rad(_map_rotate_angle - ROTATE_DIR_ENUM_DEGREES[_rotate_dir]));
2064 /* Load the repositories. */
2066 GSList *list, *curr;
2067 gint curr_repo_index = gconf_client_get_int(gconf_client,
2068 GCONF_KEY_CURRREPO, NULL);
2069 list = gconf_client_get_list(gconf_client,
2070 GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, NULL);
2072 for(curr = list; curr != NULL; curr = curr->next)
2074 RepoData *rd = settings_parse_repo(curr->data);
2075 _repo_list = g_list_append(_repo_list, rd);
2076 if(!curr_repo_index--)
2084 if(_repo_list == NULL)
2086 /* We have no repositories - create a default one. */
2087 RepoData *repo = g_new(RepoData, 1);
2089 repo->db_filename = gnome_vfs_expand_initial_tilde(
2090 REPO_DEFAULT_CACHE_DIR);
2091 repo->url=g_strdup(REPO_DEFAULT_MAP_URI);
2092 repo->dl_zoom_steps = REPO_DEFAULT_DL_ZOOM_STEPS;
2093 repo->name = g_strdup(REPO_DEFAULT_NAME);
2094 repo->view_zoom_steps = REPO_DEFAULT_VIEW_ZOOM_STEPS;
2095 repo->double_size = FALSE;
2096 repo->nextable = TRUE;
2097 repo->min_zoom = REPO_DEFAULT_MIN_ZOOM;
2098 repo->max_zoom = REPO_DEFAULT_MAX_ZOOM;
2099 set_repo_type(repo);
2101 _repo_list = g_list_append(_repo_list, repo);
2102 repo_set_curr(repo);
2105 /* Get last Zoom Level. Default is 16. */
2106 value = gconf_client_get(gconf_client, GCONF_KEY_ZOOM, NULL);
2109 _zoom = gconf_value_get_int(value) / _curr_repo->view_zoom_steps
2110 * _curr_repo->view_zoom_steps;
2111 gconf_value_free(value);
2114 _zoom = 16 / _curr_repo->view_zoom_steps
2115 * _curr_repo->view_zoom_steps;
2116 BOUND(_zoom, 0, MAX_ZOOM);
2119 /* Get Route Directory. Default is NULL. */
2120 _route_dir_uri = gconf_client_get_string(gconf_client,
2121 GCONF_KEY_ROUTEDIR, NULL);
2123 /* Get Last Track File. Default is NULL. */
2124 _track_file_uri = gconf_client_get_string(gconf_client,
2125 GCONF_KEY_TRACKFILE, NULL);
2127 /* Get Auto-Center Mode. Default is CENTER_LEAD. */
2128 value = gconf_client_get(gconf_client, GCONF_KEY_AUTOCENTER_MODE, NULL);
2131 _center_mode = gconf_value_get_int(value);
2132 gconf_value_free(value);
2135 _center_mode = CENTER_LEAD;
2137 /* Get Auto-Center Rotate Flag. Default is TRUE. */
2138 value = gconf_client_get(gconf_client, GCONF_KEY_AUTOCENTER_ROTATE, NULL);
2141 _center_rotate = gconf_value_get_bool(value);
2142 gconf_value_free(value);
2145 _center_rotate = TRUE;
2147 /* Get Show Zoom Level flag. Default is FALSE. */
2148 _show_zoomlevel = gconf_client_get_bool(gconf_client,
2149 GCONF_KEY_SHOWZOOMLEVEL, NULL);
2151 /* Get Show Scale flag. Default is TRUE. */
2152 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWSCALE, NULL);
2155 _show_scale = gconf_value_get_bool(value);
2156 gconf_value_free(value);
2161 /* Get Show Compass Rose flag. Default is TRUE. */
2162 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWCOMPROSE, NULL);
2165 _show_comprose = gconf_value_get_bool(value);
2166 gconf_value_free(value);
2169 _show_comprose = TRUE;
2171 /* Get Show Tracks flag. Default is TRUE. */
2172 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWTRACKS, NULL);
2175 _show_paths |= (gconf_value_get_bool(value) ? TRACKS_MASK : 0);
2176 gconf_value_free(value);
2179 _show_paths |= TRACKS_MASK;
2181 /* Get Show Routes flag. Default is TRUE. */
2182 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWROUTES, NULL);
2185 _show_paths |= (gconf_value_get_bool(value) ? ROUTES_MASK : 0);
2186 gconf_value_free(value);
2189 _show_paths |= ROUTES_MASK;
2191 /* Get Show Velocity Vector flag. Default is TRUE. */
2192 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWVELVEC, NULL);
2195 _show_velvec = gconf_value_get_bool(value);
2196 gconf_value_free(value);
2199 _show_velvec = TRUE;
2201 /* Get Show Velocity Vector flag. Default is TRUE. */
2202 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWPOIS, NULL);
2205 _show_poi = gconf_value_get_bool(value);
2206 gconf_value_free(value);
2211 /* Get Enable GPS flag. Default is TRUE. */
2212 value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_GPS, NULL);
2215 _enable_gps = gconf_value_get_bool(value);
2216 gconf_value_free(value);
2221 /* Initialize _gps_state based on _enable_gps. */
2222 _gps_state = RCVR_OFF;
2224 /* Load the route locations. */
2227 _loc_list = gconf_client_get_list(gconf_client,
2228 GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, NULL);
2229 _loc_model = gtk_list_store_new(1, G_TYPE_STRING);
2230 for(curr = _loc_list; curr != NULL; curr = curr->next)
2233 gtk_list_store_insert_with_values(_loc_model, &iter, INT_MAX,
2238 /* Get POI Database. Default is in REPO_DEFAULT_CACHE_BASE */
2239 _poi_db_filename = gconf_client_get_string(gconf_client,
2240 GCONF_KEY_POI_DB, NULL);
2241 if(_poi_db_filename == NULL)
2243 gchar *poi_base = gnome_vfs_expand_initial_tilde(
2244 REPO_DEFAULT_CACHE_BASE);
2245 _poi_db_filename = gnome_vfs_uri_make_full_from_relative(
2246 poi_base, "poi.db");
2250 _poi_db_dirname = g_path_get_dirname(_poi_db_filename);
2252 _poi_zoom = gconf_client_get_int(gconf_client,
2253 GCONF_KEY_POI_ZOOM, NULL);
2255 _poi_zoom = MAX_ZOOM - 10;
2258 /* Get GPS Info flag. Default is FALSE. */
2259 _gps_info = gconf_client_get_bool(gconf_client, GCONF_KEY_GPS_INFO, NULL);
2261 /* Get Route Download URL. Default is:
2262 * "http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s" */
2263 _route_dl_url = gconf_client_get_string(gconf_client,
2264 GCONF_KEY_ROUTE_DL_URL, NULL);
2265 if(_route_dl_url == NULL)
2266 _route_dl_url = g_strdup(
2267 "http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s");
2269 /* Get Route Download Radius. Default is 4. */
2270 value = gconf_client_get(gconf_client, GCONF_KEY_ROUTE_DL_RADIUS, NULL);
2273 _route_dl_radius = gconf_value_get_int(value);
2274 gconf_value_free(value);
2277 _route_dl_radius = 8;
2279 /* Get POI Download URL. Default is:
2280 * "http://www.gnuite.com/cgi-bin/poi.cgi?saddr=%s&query=%s&page=%d" */
2281 _poi_dl_url = gconf_client_get_string(gconf_client,
2282 GCONF_KEY_POI_DL_URL, NULL);
2283 if(_poi_dl_url == NULL)
2284 _poi_dl_url = g_strdup(
2285 "http://www.gnuite.com/cgi-bin/poi.cgi?saddr=%s&query=%s&page=%d");
2290 for(i = 0; i < COLORABLE_ENUM_COUNT; i++)
2292 str = gconf_client_get_string(gconf_client,
2293 COLORABLE_GCONF[i], NULL);
2294 if(!str || !gdk_color_parse(str, &_color[i]))
2295 _color[i] = COLORABLE_DEFAULT[i];
2299 gconf_client_clear_cache(gconf_client);
2300 g_object_unref(gconf_client);
2307 vprintf("%s(): return\n", __PRETTY_FUNCTION__);