/*
* Copyright (C) 2006, 2007 John Costigan.
*
* POI and GPS-Info code originally written by Cezary Jackiewicz.
*
* Default map data provided by http://www.openstreetmap.org/
*
* This file is part of Maemo Mapper.
*
* Maemo Mapper is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Maemo Mapper is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Maemo Mapper. If not, see .
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#define _GNU_SOURCE
#include
#include
#include
#include
#include
#include
#include
#ifndef LEGACY
# include
# include
# include
# include
# include
# include
#else
# include
# include
# include
# include
# include
# include
# include
#endif
#include "types.h"
#include "data.h"
#include "defines.h"
#include "gps.h"
#include "display.h"
#include "gdk-pixbuf-rotate.h"
#include "maps.h"
#include "marshal.h"
#include "poi.h"
#include "settings.h"
#include "util.h"
#define GCONF_KEY_PREFIX "/apps/maemo/maemo-mapper"
#define GCONF_KEY_GPS_RCVR_TYPE GCONF_KEY_PREFIX"/gps_rcvr_type"
#define GCONF_KEY_GPS_BT_MAC GCONF_KEY_PREFIX"/receiver_mac"
#define GCONF_KEY_GPS_GPSD_HOST GCONF_KEY_PREFIX"/gps_gpsd_host"
#define GCONF_KEY_GPS_GPSD_PORT GCONF_KEY_PREFIX"/gps_gpsd_port"
#define GCONF_KEY_GPS_FILE_PATH GCONF_KEY_PREFIX"/gps_file_path"
#define GCONF_KEY_AUTO_DOWNLOAD GCONF_KEY_PREFIX"/auto_download"
#define GCONF_KEY_AUTO_DOWNLOAD_PRECACHE \
GCONF_KEY_PREFIX"/auto_download_precache"
#define GCONF_KEY_CENTER_SENSITIVITY GCONF_KEY_PREFIX"/center_sensitivity"
#define GCONF_KEY_ENABLE_ANNOUNCE GCONF_KEY_PREFIX"/enable_announce"
#define GCONF_KEY_ANNOUNCE_NOTICE GCONF_KEY_PREFIX"/announce_notice"
#define GCONF_KEY_ROTATE_SENSITIVITY GCONF_KEY_PREFIX"/rotate_sensitivity"
#define GCONF_KEY_AC_MIN_SPEED GCONF_KEY_PREFIX"/autocenter_min_speed"
#define GCONF_KEY_ROTATE_DIR GCONF_KEY_PREFIX"/rotate_direction"
#define GCONF_KEY_DRAW_WIDTH GCONF_KEY_PREFIX"/draw_width"
#define GCONF_KEY_ENABLE_VOICE GCONF_KEY_PREFIX"/enable_voice"
#define GCONF_KEY_VOICE_SPEED GCONF_KEY_PREFIX"/voice_speed"
#define GCONF_KEY_VOICE_PITCH GCONF_KEY_PREFIX"/voice_pitch"
#define GCONF_KEY_FULLSCREEN GCONF_KEY_PREFIX"/fullscreen"
#define GCONF_KEY_UNITS GCONF_KEY_PREFIX"/units"
#define GCONF_KEY_SPEED_LIMIT_ON GCONF_KEY_PREFIX"/speed_limit_on"
#define GCONF_KEY_SPEED_LIMIT GCONF_KEY_PREFIX"/speed_limit"
#define GCONF_KEY_SPEED_LOCATION GCONF_KEY_PREFIX"/speed_location"
#define GCONF_KEY_UNBLANK_SIZE GCONF_KEY_PREFIX"/unblank_option"
#define GCONF_KEY_INFO_FONT_SIZE GCONF_KEY_PREFIX"/info_font_size"
#define GCONF_KEY_POI_DB GCONF_KEY_PREFIX"/poi_db"
#define GCONF_KEY_POI_ZOOM GCONF_KEY_PREFIX"/poi_zoom"
#define GCONF_KEY_AUTOCENTER_MODE GCONF_KEY_PREFIX"/autocenter_mode"
#define GCONF_KEY_AUTOCENTER_ROTATE GCONF_KEY_PREFIX"/autocenter_rotate"
#define GCONF_KEY_LEAD_AMOUNT GCONF_KEY_PREFIX"/lead_amount"
#define GCONF_KEY_LEAD_IS_FIXED GCONF_KEY_PREFIX"/lead_is_fixed"
#define GCONF_KEY_LAST_LAT GCONF_KEY_PREFIX"/last_latitude"
#define GCONF_KEY_LAST_LON GCONF_KEY_PREFIX"/last_longitude"
#define GCONF_KEY_LAST_ALT GCONF_KEY_PREFIX"/last_altitude"
#define GCONF_KEY_LAST_SPEED GCONF_KEY_PREFIX"/last_speed"
#define GCONF_KEY_LAST_HEADING GCONF_KEY_PREFIX"/last_heading"
#define GCONF_KEY_LAST_TIME GCONF_KEY_PREFIX"/last_timestamp"
#define GCONF_KEY_CENTER_LAT GCONF_KEY_PREFIX"/center_latitude"
#define GCONF_KEY_CENTER_LON GCONF_KEY_PREFIX"/center_longitude"
#define GCONF_KEY_CENTER_ANGLE GCONF_KEY_PREFIX"/center_angle"
#define GCONF_KEY_MAP_CORRECTION_UNITX GCONF_KEY_PREFIX"/map_correction_unitx"
#define GCONF_KEY_MAP_CORRECTION_UNITY GCONF_KEY_PREFIX"/map_correction_unity"
#define GCONF_KEY_ZOOM GCONF_KEY_PREFIX"/zoom"
#define GCONF_KEY_ROUTEDIR GCONF_KEY_PREFIX"/route_directory"
#define GCONF_KEY_TRACKFILE GCONF_KEY_PREFIX"/track_file"
#define GCONF_KEY_SHOWZOOMLEVEL GCONF_KEY_PREFIX"/show_zoomlevel"
#define GCONF_KEY_SHOWSCALE GCONF_KEY_PREFIX"/show_scale"
#define GCONF_KEY_SHOWCOMPROSE GCONF_KEY_PREFIX"/show_comprose"
#define GCONF_KEY_SHOWTRACKS GCONF_KEY_PREFIX"/show_tracks"
#define GCONF_KEY_SHOWROUTES GCONF_KEY_PREFIX"/show_routes"
#define GCONF_KEY_SHOWVELVEC GCONF_KEY_PREFIX"/show_velocity_vector"
#define GCONF_KEY_SHOWPOIS GCONF_KEY_PREFIX"/show_poi"
#define GCONF_KEY_ENABLE_GPS GCONF_KEY_PREFIX"/enable_gps"
#define GCONF_KEY_ENABLE_TRACKING GCONF_KEY_PREFIX"/enable_tracking"
#define GCONF_KEY_ROUTE_LOCATIONS GCONF_KEY_PREFIX"/route_locations"
#define GCONF_KEY_REPOSITORIES GCONF_KEY_PREFIX"/repositories"
#define GCONF_KEY_CURRREPO GCONF_KEY_PREFIX"/curr_repo"
#define GCONF_KEY_GPS_INFO GCONF_KEY_PREFIX"/gps_info"
#define GCONF_KEY_ROUTE_DL_URL GCONF_KEY_PREFIX"/route_dl_url"
#define GCONF_KEY_ROUTE_DL_RADIUS GCONF_KEY_PREFIX"/route_dl_radius"
#define GCONF_KEY_POI_DL_URL GCONF_KEY_PREFIX"/poi_dl_url"
#define GCONF_KEY_DEG_FORMAT GCONF_KEY_PREFIX"/deg_format"
// APRS
#ifdef INCLUDE_APRS
#define GCONF_KEY_APRS_SERVER GCONF_KEY_PREFIX"/aprs_server"
#define GCONF_KEY_APRS_SERVER_PORT GCONF_KEY_PREFIX"/aprs_server_port"
#define GCONF_KEY_APRS_SERVER_VAL GCONF_KEY_PREFIX"/aprs_mycall_val"
#define GCONF_KEY_APRS_MYCALL GCONF_KEY_PREFIX"/aprs_mycall"
#define GCONF_KEY_APRS_INET_BEACON GCONF_KEY_PREFIX"/aprs_inet_beacon"
#define GCONF_KEY_APRS_INET_BEACON_INTERVAL GCONF_KEY_PREFIX"/aprs_inet_beacon_interval"
#define GCONF_KEY_APRS_ENABLE GCONF_KEY_PREFIX"/aprs_enable"
#define GCONF_KEY_APRS_ENABLE_INET_TX GCONF_KEY_PREFIX"/aprs_enable_inet_tx"
#define GCONF_KEY_APRS_ENABLE_TTY_TX GCONF_KEY_PREFIX"/aprs_enable_tty_tx"
#define GCONF_KEY_APRS_MAX_TRACK_PTS GCONF_KEY_PREFIX"/aprs_max_track_points"
#define GCONF_KEY_APRS_MAX_STATIONS GCONF_KEY_PREFIX"/aprs_max_stations"
#define GCONF_KEY_APRS_TTY_PORT GCONF_KEY_PREFIX"/aprs_tty_port"
#define GCONF_KEY_APRS_TNC_CONN_METHOD GCONF_KEY_PREFIX"/aprs_tnc_conn_method"
#define GCONF_KEY_APRS_TNC_BT_MAC GCONF_KEY_PREFIX"/aprs_tnc_bt_mac"
#define GCONF_KEY_APRS_INET_AUTO_FILTER GCONF_KEY_PREFIX"/aprs_inet_auto_filter"
#define GCONF_KEY_APRS_INET_AUTO_FILTER_RANGE GCONF_KEY_PREFIX"/aprs_inet_auto_filter_range"
#define GCONF_KEY_APRS_SHOW_NEW_STATION_ALERT GCONF_KEY_PREFIX"/aprs_show_new_station_alert"
#define GCONF_KEY_APRS_BEACON_COMMENT GCONF_KEY_PREFIX"/aprs_beacon_comment"
#define GCONF_KEY_APRS_TTY_BEACON_INTERVAL GCONF_KEY_PREFIX"/aprs_tty_beacon_interval"
#define GCONF_KEY_APRS_BEACON_PATH GCONF_KEY_PREFIX"/aprs_beacon_path"
#define GCONF_KEY_APRS_BEACON_SYM_GROUP GCONF_KEY_PREFIX"/aprs_beacon_symbol_group"
#define GCONF_KEY_APRS_BEACON_SYMBOL GCONF_KEY_PREFIX"/aprs_beacon_symbol"
#define GCONF_KEY_APRS_BEACON_COMPRESSED GCONF_KEY_PREFIX"/aprs_beacon_compressed"
//////////
#endif // INCLUDE_APRS
typedef struct _ScanInfo ScanInfo;
struct _ScanInfo {
GtkWidget *settings_dialog;
GtkWidget *txt_gps_bt_mac;
GtkWidget *scan_dialog;
GtkWidget *banner;
GtkListStore *store;
gint sid;
DBusGConnection *bus;
DBusGProxy *req_proxy;
DBusGProxy *sig_proxy;
};
#ifdef INCLUDE_APRS
typedef struct
{
GtkWidget *txt_aprs_mycall;
GtkWidget *txt_aprs_inet_server_validation;
GtkWidget *txt_aprs_server;
GtkWidget *txt_aprs_inet_beacon_interval;
GtkWidget *txt_aprs_inet_beacon_comment;
GtkWidget *txt_aprs_max_stations;
GtkWidget *txt_aprs_tty_port;
GtkWidget *txt_tnc_bt_mac;
GtkWidget *txt_auto_filter_range;
GtkWidget *txt_beacon_comment;
GtkWidget *num_aprs_server_port;
GtkWidget *txt_tty_beacon_interval;
GtkWidget *rad_aprs_file;
GtkWidget *rad_tnc_bt;
GtkWidget *rad_tnc_file;
GtkWidget *chk_enable_inet_auto_filter;
GtkWidget *chk_enable_inet_tx;
GtkWidget *chk_enable_tty_tx;
GtkWidget *chk_aprs_show_new_station_alert;
GtkWidget *chk_aprs_enabled;
GtkWidget *btn_scan_bt_tnc;
GtkWidget *txt_unproto_path;
GtkWidget *chk_compressed_beacon;
GtkWidget *txt_beacon_group;
GtkWidget *txt_beacon_symbol;
} TAprsSettings;
#endif // INCLUDE_APRS
typedef struct _KeysDialogInfo KeysDialogInfo;
struct _KeysDialogInfo {
GtkWidget *cmb[CUSTOM_KEY_ENUM_COUNT];
};
typedef struct _ColorsDialogInfo ColorsDialogInfo;
struct _ColorsDialogInfo {
GtkWidget *col[COLORABLE_ENUM_COUNT];
};
#ifdef INCLUDE_APRS
typedef enum
{
ALIGN_TOP_LEFT,
ALIGN_TOP_CENTER,
ALIGN_TOP_RIGHT,
ALIGN_CENTER_LEFT,
ALIGN_CENTER_CENTER,
ALIGN_CENTER_RIGHT,
ALIGN_BOTTOM_LEFT,
ALIGN_BOTTOM_CENTER,
ALIGN_BOTTOM_RIGHT
} TCellAlignment;
void set_ctrl_alignment(GtkWidget *ctrl, TCellAlignment alignment)
{
gfloat align_hor = 0.0f, align_vert = 0.0f;
switch(alignment)
{
case ALIGN_CENTER_LEFT:
case ALIGN_CENTER_CENTER:
case ALIGN_CENTER_RIGHT:
align_vert = 0.5f;
break;
case ALIGN_BOTTOM_LEFT:
case ALIGN_BOTTOM_CENTER:
case ALIGN_BOTTOM_RIGHT:
align_vert = 1.0f;
break;
case ALIGN_TOP_LEFT:
case ALIGN_TOP_CENTER:
case ALIGN_TOP_RIGHT:
default:
align_vert = 0.0f;
break;
}
switch(alignment)
{
case ALIGN_CENTER_CENTER:
case ALIGN_BOTTOM_CENTER:
case ALIGN_TOP_CENTER:
align_hor = 0.5f;
break;
case ALIGN_CENTER_RIGHT:
case ALIGN_BOTTOM_RIGHT:
case ALIGN_TOP_RIGHT:
align_hor = 1.0f;
break;
case ALIGN_CENTER_LEFT:
case ALIGN_BOTTOM_LEFT:
case ALIGN_TOP_LEFT:
default:
align_hor = 0.0f;
break;
}
gtk_misc_set_alignment(GTK_MISC(ctrl), align_hor, align_vert);
}
void set_ctrl_width(GtkWidget *ctrl, gint width)
{
gtk_widget_set_size_request(ctrl, width, -1);
}
void add_edit_box(GtkWidget *table, gint xmin, gint xmax, gint ymin, gint ymax, gint width,
GtkWidget **ctrl, TCellAlignment alignment, gchar * initial_value)
{
GtkWidget * hbox;
gtk_table_attach(GTK_TABLE(table),
hbox = gtk_hbox_new(FALSE, 4),
xmin, xmax, ymin, ymax, GTK_EXPAND | GTK_FILL, 0, 2, 4);
gtk_box_pack_start(GTK_BOX(hbox),
*ctrl = gtk_entry_new(),
TRUE, TRUE, 0);
#ifdef MAEMO_CHANGES
#ifndef LEGACY
g_object_set(G_OBJECT(*ctrl), "hildon-input-mode",
HILDON_GTK_INPUT_MODE_FULL, NULL);
#else
g_object_set(G_OBJECT(*ctrl), HILDON_AUTOCAP, FALSE, NULL);
#endif
#endif
//set_ctrl_alignment(*ctrl, alignment);
//set_ctrl_width(*ctrl, width);
// Set the initial value
if(initial_value)
{
gtk_entry_set_text(GTK_ENTRY(*ctrl), initial_value);
}
}
void add_check_box(GtkWidget *table, gint xmin, gint xmax, gint ymin, gint ymax, gint width,
GtkWidget **ctrl, TCellAlignment alignment, gchar * caption, gboolean initial_value)
{
gtk_table_attach(GTK_TABLE(table),
*ctrl = gtk_check_button_new_with_label(caption),
xmin, xmax, ymin, ymax, GTK_FILL, 0, 2, 4);
//set_ctrl_alignment(*ctrl, alignment);
//set_ctrl_width(*ctrl, width);
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(*ctrl), initial_value);
}
void add_label_box(GtkWidget *table, gint xmin, gint xmax, gint ymin, gint ymax, gint width,
GtkWidget **ctrl, TCellAlignment alignment, gchar * initial_value)
{
gtk_table_attach(GTK_TABLE(table),
*ctrl = gtk_label_new(initial_value),
xmin, xmax, ymin, ymax, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(*ctrl), 1.f, 0.5f);
set_ctrl_alignment(*ctrl, alignment);
set_ctrl_width(*ctrl, width);
}
#endif // INCLUDE_APRS
/**
* Save all configuration data to GCONF.
*/
void
settings_save()
{
gchar *settings_dir;
GConfClient *gconf_client;
gchar buffer[16];
printf("%s()\n", __PRETTY_FUNCTION__);
/* Initialize settings_dir. */
settings_dir = gnome_vfs_expand_initial_tilde(CONFIG_DIR_NAME);
g_mkdir_with_parents(settings_dir, 0700);
/* SAVE ALL GCONF SETTINGS. */
gconf_client = gconf_client_get_default();
if(!gconf_client)
{
popup_error(_window,
_("Failed to initialize GConf. Settings were not saved."));
return;
}
/* Save GPS Receiver Type. */
gconf_client_set_string(gconf_client,
GCONF_KEY_GPS_RCVR_TYPE,
GPS_RCVR_ENUM_TEXT[_gri.type], NULL);
/* Save Bluetooth Receiver MAC. */
if(_gri.bt_mac)
gconf_client_set_string(gconf_client,
GCONF_KEY_GPS_BT_MAC, _gri.bt_mac, NULL);
else
gconf_client_unset(gconf_client,
GCONF_KEY_GPS_BT_MAC, NULL);
/* Save GPSD Host. */
if(_gri.gpsd_host)
gconf_client_set_string(gconf_client,
GCONF_KEY_GPS_GPSD_HOST, _gri.gpsd_host, NULL);
else
gconf_client_unset(gconf_client,
GCONF_KEY_GPS_GPSD_HOST, NULL);
/* Save GPSD Port. */
gconf_client_set_int(gconf_client,
GCONF_KEY_GPS_GPSD_PORT, _gri.gpsd_port, NULL);
/* Save File Path. */
if(_gri.file_path)
gconf_client_set_string(gconf_client,
GCONF_KEY_GPS_FILE_PATH, _gri.file_path, NULL);
else
gconf_client_unset(gconf_client,
GCONF_KEY_GPS_FILE_PATH, NULL);
/* Save Auto-Download. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_AUTO_DOWNLOAD, _auto_download, NULL);
/* Save Auto-Download Pre-cache. */
gconf_client_set_int(gconf_client,
GCONF_KEY_AUTO_DOWNLOAD_PRECACHE, _auto_download_precache, NULL);
/* Save Auto-Center Sensitivity. */
gconf_client_set_int(gconf_client,
GCONF_KEY_CENTER_SENSITIVITY, _center_ratio, NULL);
/* Save Auto-Center Lead Amount. */
gconf_client_set_int(gconf_client,
GCONF_KEY_LEAD_AMOUNT, _lead_ratio, NULL);
/* Save Auto-Center Lead Fixed flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_LEAD_IS_FIXED, _lead_is_fixed, NULL);
/* Save Auto-Rotate Sensitivity. */
gconf_client_set_int(gconf_client,
GCONF_KEY_ROTATE_SENSITIVITY, _rotate_sens, NULL);
/* Save Auto-Center/Rotate Minimum Speed. */
gconf_client_set_int(gconf_client,
GCONF_KEY_AC_MIN_SPEED, _ac_min_speed, NULL);
/* Save Auto-Rotate Sensitivity. */
gconf_client_set_string(gconf_client,
GCONF_KEY_ROTATE_DIR, ROTATE_DIR_ENUM_TEXT[_rotate_dir], NULL);
/* Save Draw Line Width. */
gconf_client_set_int(gconf_client,
GCONF_KEY_DRAW_WIDTH, _draw_width, NULL);
/* Save Announce Flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_ENABLE_ANNOUNCE, _enable_announce, NULL);
/* Save Announce Advance Notice Ratio. */
gconf_client_set_int(gconf_client,
GCONF_KEY_ANNOUNCE_NOTICE, _announce_notice_ratio, NULL);
/* Save Enable Voice flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_ENABLE_VOICE, _enable_voice, NULL);
/* Save fullscreen flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_FULLSCREEN, _fullscreen, NULL);
/* Save Units. */
gconf_client_set_string(gconf_client,
GCONF_KEY_UNITS, UNITS_ENUM_TEXT[_units], NULL);
/* Save Custom Key Actions. */
{
gint i;
for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
gconf_client_set_string(gconf_client,
CUSTOM_KEY_GCONF[i],
CUSTOM_ACTION_ENUM_TEXT[_action[i]], NULL);
}
/* Save Deg Format. */
gconf_client_set_string(gconf_client,
GCONF_KEY_DEG_FORMAT, DEG_FORMAT_ENUM_TEXT[_degformat].name , NULL);
/* Save Speed Limit On flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_SPEED_LIMIT_ON, _speed_limit_on, NULL);
/* Save Speed Limit. */
gconf_client_set_int(gconf_client,
GCONF_KEY_SPEED_LIMIT, _speed_limit, NULL);
/* Save Speed Location. */
gconf_client_set_string(gconf_client,
GCONF_KEY_SPEED_LOCATION,
SPEED_LOCATION_ENUM_TEXT[_speed_location], NULL);
/* Save Info Font Size. */
gconf_client_set_string(gconf_client,
GCONF_KEY_INFO_FONT_SIZE,
INFO_FONT_ENUM_TEXT[_info_font_size], NULL);
/* Save Unblank Option. */
gconf_client_set_string(gconf_client,
GCONF_KEY_UNBLANK_SIZE,
UNBLANK_ENUM_TEXT[_unblank_option], NULL);
/* Save last saved latitude. */
gconf_client_set_float(gconf_client,
GCONF_KEY_LAST_LAT, _gps.lat, NULL);
/* Save last saved longitude. */
gconf_client_set_float(gconf_client,
GCONF_KEY_LAST_LON, _gps.lon, NULL);
/* Save last saved altitude. */
gconf_client_set_int(gconf_client,
GCONF_KEY_LAST_ALT, _pos.altitude, NULL);
/* Save last saved speed. */
gconf_client_set_float(gconf_client,
GCONF_KEY_LAST_SPEED, _gps.speed, NULL);
/* Save last saved heading. */
gconf_client_set_float(gconf_client,
GCONF_KEY_LAST_HEADING, _gps.heading, NULL);
/* Save last saved timestamp. */
gconf_client_set_float(gconf_client,
GCONF_KEY_LAST_TIME, _pos.time, NULL);
/* Save last center point. */
{
gdouble center_lat, center_lon;
unit2latlon(_center.unitx, _center.unity, center_lat, center_lon);
/* Save last center latitude. */
gconf_client_set_float(gconf_client,
GCONF_KEY_CENTER_LAT, center_lat, NULL);
/* Save last center longitude. */
gconf_client_set_float(gconf_client,
GCONF_KEY_CENTER_LON, center_lon, NULL);
/* Save last view angle. */
gconf_client_set_int(gconf_client,
GCONF_KEY_CENTER_ANGLE, _map_rotate_angle, NULL);
}
/* Save map correction. */
gconf_client_set_int(gconf_client,
GCONF_KEY_MAP_CORRECTION_UNITX, _map_correction_unitx, NULL);
gconf_client_set_int(gconf_client,
GCONF_KEY_MAP_CORRECTION_UNITY, _map_correction_unity, NULL);
/* Save last Zoom Level. */
gconf_client_set_int(gconf_client,
GCONF_KEY_ZOOM, _zoom, NULL);
/* Save Route Directory. */
if(_route_dir_uri)
gconf_client_set_string(gconf_client,
GCONF_KEY_ROUTEDIR, _route_dir_uri, NULL);
/* Save the repositories. */
{
GList *curr = _repo_list;
GSList *temp_list = NULL;
gint curr_repo_index = 0;
for(curr = _repo_list; curr != NULL; curr = curr->next)
{
/* Build from each part of a repo, delimited by newline characters:
* 1. name
* 2. url
* 3. db_filename
* 4. dl_zoom_steps
* 5. view_zoom_steps
* 6. layer_level
* If layer_level > 0, have additional fields:
* 8. layer_enabled
* 9. layer_refresh_interval
* 7/9. is_sqlite
*/
RepoData *rd = curr->data;
gchar buffer[BUFFER_SIZE];
while (rd) {
if (!rd->layer_level)
snprintf(buffer, sizeof(buffer),
"%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d",
rd->name,
rd->url,
rd->db_filename,
rd->dl_zoom_steps,
rd->view_zoom_steps,
rd->double_size,
rd->nextable,
rd->min_zoom,
rd->max_zoom,
rd->layer_level,
rd->is_sqlite);
else
snprintf(buffer, sizeof(buffer),
"%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d",
rd->name,
rd->url,
rd->db_filename,
rd->dl_zoom_steps,
rd->view_zoom_steps,
rd->double_size,
rd->nextable,
rd->min_zoom,
rd->max_zoom,
rd->layer_level,
rd->layer_enabled,
rd->layer_refresh_interval,
rd->is_sqlite);
temp_list = g_slist_append(temp_list, g_strdup(buffer));
if(rd == _curr_repo)
gconf_client_set_int(gconf_client,
GCONF_KEY_CURRREPO, curr_repo_index, NULL);
rd = rd->layers;
}
curr_repo_index++;
}
gconf_client_set_list(gconf_client,
GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, temp_list, NULL);
}
/* Save Last Track File. */
if(_track_file_uri)
gconf_client_set_string(gconf_client,
GCONF_KEY_TRACKFILE, _track_file_uri, NULL);
/* Save Auto-Center Mode. */
gconf_client_set_int(gconf_client,
GCONF_KEY_AUTOCENTER_MODE, _center_mode, NULL);
/* Save Auto-Center Rotate Flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_AUTOCENTER_ROTATE, _center_rotate, NULL);
/* Save Show Zoom Level flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_SHOWZOOMLEVEL, _show_zoomlevel, NULL);
/* Save Show Scale flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_SHOWSCALE, _show_scale, NULL);
/* Save Show Compass Rose flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_SHOWCOMPROSE, _show_comprose, NULL);
/* Save Show Tracks flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_SHOWTRACKS, _show_paths & TRACKS_MASK, NULL);
/* Save Show Routes flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_SHOWROUTES, _show_paths & ROUTES_MASK, NULL);
/* Save Show Velocity Vector flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_SHOWVELVEC, _show_velvec, NULL);
/* Save Show POIs flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_SHOWPOIS, _show_poi, NULL);
/* Save Enable GPS flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_ENABLE_GPS, _enable_gps, NULL);
/* Save Enable Tracking flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_ENABLE_TRACKING, _enable_tracking, NULL);
/* Save Route Locations. */
gconf_client_set_list(gconf_client,
GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, _loc_list, NULL);
/* Save GPS Info flag. */
gconf_client_set_bool(gconf_client,
GCONF_KEY_GPS_INFO, _gps_info, NULL);
/* Save Route Download URL Format. */
gconf_client_set_string(gconf_client,
GCONF_KEY_ROUTE_DL_URL, _route_dl_url, NULL);
/* Save Route Download Radius. */
gconf_client_set_int(gconf_client,
GCONF_KEY_ROUTE_DL_RADIUS, _route_dl_radius, NULL);
/* Save POI Download URL Format. */
gconf_client_set_string(gconf_client,
GCONF_KEY_POI_DL_URL, _poi_dl_url, NULL);
/* Save Colors. */
{
gint i;
for(i = 0; i < COLORABLE_ENUM_COUNT; i++)
{
snprintf(buffer, sizeof(buffer), "#%02x%02x%02x",
_color[i].red >> 8,
_color[i].green >> 8,
_color[i].blue >> 8);
gconf_client_set_string(gconf_client,
COLORABLE_GCONF[i], buffer, NULL);
}
}
/* Save POI database. */
if(_poi_db_filename)
gconf_client_set_string(gconf_client,
GCONF_KEY_POI_DB, _poi_db_filename, NULL);
else
gconf_client_unset(gconf_client, GCONF_KEY_POI_DB, NULL);
/* Save Show POI below zoom. */
gconf_client_set_int(gconf_client,
GCONF_KEY_POI_ZOOM, _poi_zoom, NULL);
gconf_client_clear_cache(gconf_client);
g_object_unref(gconf_client);
g_free(settings_dir);
vprintf("%s(): return\n", __PRETTY_FUNCTION__);
}
static void
scan_cb_dev_found(DBusGProxy *sig_proxy, const gchar *bda,
const gchar *name, gpointer *class, guchar rssi, gint coff,
ScanInfo *scan_info)
{
GtkTreeIter iter;
printf("%s()\n", __PRETTY_FUNCTION__);
gtk_list_store_append(scan_info->store, &iter);
gtk_list_store_set(scan_info->store, &iter,
0, g_strdup(bda),
1, g_strdup(name),
-1);
vprintf("%s(): return\n", __PRETTY_FUNCTION__);
}
static void
scan_cb_search_complete(DBusGProxy *sig_proxy, ScanInfo *scan_info)
{
printf("%s()\n", __PRETTY_FUNCTION__);
gtk_widget_destroy(scan_info->banner);
dbus_g_proxy_disconnect_signal(sig_proxy, BTSEARCH_DEV_FOUND_SIG,
G_CALLBACK(scan_cb_dev_found), scan_info);
dbus_g_proxy_disconnect_signal(sig_proxy, BTSEARCH_SEARCH_COMPLETE_SIG,
G_CALLBACK(scan_cb_search_complete), scan_info);
vprintf("%s(): return\n", __PRETTY_FUNCTION__);
}
static gint
scan_start_search(ScanInfo *scan_info)
{
GError *error = NULL;
printf("%s()\n", __PRETTY_FUNCTION__);
/* Initialize D-Bus. */
if(NULL == (scan_info->bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error)))
{
g_printerr("Failed to open connection to D-Bus: %s.\n",
error->message);
return 1;
}
if(NULL == (scan_info->req_proxy =dbus_g_proxy_new_for_name(scan_info->bus,
BTSEARCH_SERVICE,
BTSEARCH_REQ_PATH,
BTSEARCH_REQ_INTERFACE)))
{
g_printerr("Failed to create D-Bus request proxy for btsearch.");
return 2;
}
if(NULL == (scan_info->sig_proxy =dbus_g_proxy_new_for_name(scan_info->bus,
BTSEARCH_SERVICE,
BTSEARCH_SIG_PATH,
BTSEARCH_SIG_INTERFACE)))
{
g_printerr("Failed to create D-Bus signal proxy for btsearch.");
return 2;
}
dbus_g_object_register_marshaller(
g_cclosure_user_marshal_VOID__STRING_STRING_POINTER_UCHAR_UINT,
G_TYPE_NONE,
G_TYPE_STRING,
G_TYPE_STRING,
DBUS_TYPE_G_UCHAR_ARRAY,
G_TYPE_UCHAR,
G_TYPE_UINT,
G_TYPE_INVALID);
dbus_g_proxy_add_signal(scan_info->sig_proxy,
BTSEARCH_DEV_FOUND_SIG,
G_TYPE_STRING,
G_TYPE_STRING,
DBUS_TYPE_G_UCHAR_ARRAY,
G_TYPE_UCHAR,
G_TYPE_UINT,
G_TYPE_INVALID);
dbus_g_proxy_connect_signal(scan_info->sig_proxy, BTSEARCH_DEV_FOUND_SIG,
G_CALLBACK(scan_cb_dev_found), scan_info, NULL);
dbus_g_proxy_add_signal(scan_info->sig_proxy,
BTSEARCH_SEARCH_COMPLETE_SIG,
G_TYPE_INVALID);
dbus_g_proxy_connect_signal(scan_info->sig_proxy,
BTSEARCH_SEARCH_COMPLETE_SIG,
G_CALLBACK(scan_cb_search_complete), scan_info, NULL);
error = NULL;
if(!dbus_g_proxy_call(scan_info->req_proxy, BTSEARCH_START_SEARCH_REQ,
&error, G_TYPE_INVALID, G_TYPE_INVALID))
{
if(error->domain == DBUS_GERROR
&& error->code == DBUS_GERROR_REMOTE_EXCEPTION)
{
g_printerr("Caught remote method exception %s: %s",
dbus_g_error_get_name(error),
error->message);
}
else
g_printerr("Error: %s\n", error->message);
return 3;
}
vprintf("%s(): return\n", __PRETTY_FUNCTION__);
return 0;
}
/**
* Scan for all bluetooth devices. This method can take a few seconds,
* during which the UI will freeze.
*/
static gboolean
scan_bluetooth(GtkWidget *widget, ScanInfo *scan_info)
{
GError *error = NULL;
GtkWidget *dialog = NULL;
GtkWidget *lst_devices = NULL;
GtkTreeViewColumn *column = NULL;
GtkCellRenderer *renderer = NULL;
printf("%s()\n", __PRETTY_FUNCTION__);
dialog = gtk_dialog_new_with_buttons(_("Select Bluetooth Device"),
GTK_WINDOW(scan_info->settings_dialog), GTK_DIALOG_MODAL,
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
NULL);
scan_info->scan_dialog = dialog;
scan_info->store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 300);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
lst_devices = gtk_tree_view_new_with_model(
GTK_TREE_MODEL(scan_info->store)), TRUE, TRUE, 0);
g_object_unref(G_OBJECT(scan_info->store));
gtk_tree_selection_set_mode(
gtk_tree_view_get_selection(GTK_TREE_VIEW(lst_devices)),
GTK_SELECTION_SINGLE);
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(lst_devices), TRUE);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(
_("MAC"), renderer, "text", 0, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(lst_devices), column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes(
_("Description"), renderer, "text", 1, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(lst_devices), column);
gtk_widget_show_all(dialog);
scan_info->banner = hildon_banner_show_animation(dialog, NULL,
_("Scanning for Bluetooth Devices"));
if(scan_start_search(scan_info))
{
gtk_widget_destroy(scan_info->banner);
popup_error(scan_info->settings_dialog,
_("An error occurred while attempting to scan for "
"bluetooth devices."));
}
else while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
{
GtkTreeIter iter;
if(gtk_tree_selection_get_selected(
gtk_tree_view_get_selection(GTK_TREE_VIEW(lst_devices)),
NULL, &iter))
{
gchar *mac;
gtk_tree_model_get(GTK_TREE_MODEL(scan_info->store),
&iter, 0, &mac, -1);
gtk_entry_set_text(GTK_ENTRY(scan_info->txt_gps_bt_mac), mac);
break;
}
else
popup_error(dialog,
_("Please select a bluetooth device from the list."));
}
gtk_widget_destroy(dialog);
/* Clean up D-Bus. */
if(scan_info->req_proxy)
{
dbus_g_proxy_call(scan_info->req_proxy, BTSEARCH_STOP_SEARCH_REQ,
&error, G_TYPE_INVALID, G_TYPE_INVALID);
g_object_unref(scan_info->req_proxy);
scan_info->req_proxy = NULL;
}
if(scan_info->sig_proxy)
{
g_object_unref(scan_info->sig_proxy);
scan_info->sig_proxy = NULL;
}
if(scan_info->bus)
{
dbus_g_connection_unref(scan_info->bus);
scan_info->bus = NULL;
}
vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
return TRUE;
}
static gboolean
settings_dialog_browse_forfile(GtkWidget *widget, BrowseInfo *browse_info)
{
GtkWidget *dialog;
printf("%s()\n", __PRETTY_FUNCTION__);
dialog = GTK_WIDGET(
hildon_file_chooser_dialog_new(GTK_WINDOW(browse_info->dialog),
GTK_FILE_CHOOSER_ACTION_OPEN));
gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(dialog), TRUE);
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
gtk_entry_get_text(GTK_ENTRY(browse_info->txt)));
if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(dialog)))
{
gchar *filename = gtk_file_chooser_get_filename(
GTK_FILE_CHOOSER(dialog));
gtk_entry_set_text(GTK_ENTRY(browse_info->txt), filename);
g_free(filename);
}
gtk_widget_destroy(dialog);
vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
return TRUE;
}
static gboolean
settings_dialog_hardkeys_reset(GtkWidget *widget, KeysDialogInfo *cdi)
{
GtkWidget *confirm;
printf("%s()\n", __PRETTY_FUNCTION__);
confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
_("Reset all hardware keys to their original defaults?"));
if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm)))
{
gint i;
for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
gtk_combo_box_set_active(GTK_COMBO_BOX(cdi->cmb[i]),
CUSTOM_KEY_DEFAULT[i]);
}
gtk_widget_destroy(confirm);
vprintf("%s(): return\n", __PRETTY_FUNCTION__);
return TRUE;
}
static gboolean
settings_dialog_hardkeys(GtkWidget *widget, GtkWidget *parent)
{
gint i;
static GtkWidget *dialog = NULL;
static GtkWidget *table = NULL;
static GtkWidget *label = NULL;
static KeysDialogInfo bdi;
static GtkWidget *btn_defaults = NULL;
printf("%s()\n", __PRETTY_FUNCTION__);
if(dialog == NULL)
{
dialog = gtk_dialog_new_with_buttons(_("Hardware Keys"),
GTK_WINDOW(parent), GTK_DIALOG_MODAL,
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
NULL);
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
btn_defaults = gtk_button_new_with_label(_("Reset...")));
g_signal_connect(G_OBJECT(btn_defaults), "clicked",
G_CALLBACK(settings_dialog_hardkeys_reset), &bdi);
gtk_dialog_add_button(GTK_DIALOG(dialog),
GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
table = gtk_table_new(2, 9, FALSE), TRUE, TRUE, 0);
for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
{
gint j;
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(""),
0, 1, i, i + 1, GTK_FILL, 0, 2, 1);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_label_set_markup(GTK_LABEL(label), CUSTOM_KEY_ICON[i]);
gtk_table_attach(GTK_TABLE(table),
bdi.cmb[i] = gtk_combo_box_new_text(),
1, 2, i, i + 1, GTK_FILL, 0, 2, 1);
for(j = 0; j < CUSTOM_ACTION_ENUM_COUNT; j++)
gtk_combo_box_append_text(GTK_COMBO_BOX(bdi.cmb[i]),
CUSTOM_ACTION_ENUM_TEXT[j]);
}
}
/* Initialize contents of the combo boxes. */
for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
gtk_combo_box_set_active(GTK_COMBO_BOX(bdi.cmb[i]), _action[i]);
gtk_widget_show_all(dialog);
OUTER_WHILE:
while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
{
/* Check for duplicates. */
for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
{
gint j;
for(j = i + 1; j < CUSTOM_KEY_ENUM_COUNT; j++)
{
if(gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i]))
== gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[j])))
{
GtkWidget *confirm;
gchar *buffer = g_strdup_printf("%s:\n %s\n%s",
_("The following action is mapped to multiple keys"),
CUSTOM_ACTION_ENUM_TEXT[gtk_combo_box_get_active(
GTK_COMBO_BOX(bdi.cmb[i]))],
_("Continue?"));
confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
buffer);
if(GTK_RESPONSE_OK != gtk_dialog_run(GTK_DIALOG(confirm)))
{
gtk_widget_destroy(confirm);
goto OUTER_WHILE;
}
gtk_widget_destroy(confirm);
}
}
}
for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
_action[i] = gtk_combo_box_get_active(GTK_COMBO_BOX(bdi.cmb[i]));
break;
}
gtk_widget_hide(dialog);
vprintf("%s(): return\n", __PRETTY_FUNCTION__);
return TRUE;
}
static gboolean
settings_dialog_colors_reset(GtkWidget *widget, ColorsDialogInfo *cdi)
{
GtkWidget *confirm;
printf("%s()\n", __PRETTY_FUNCTION__);
confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),
_("Reset all colors to their original defaults?"));
if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm)))
{
gint i;
for(i = 0; i < COLORABLE_ENUM_COUNT; i++)
{
hildon_color_button_set_color(
HILDON_COLOR_BUTTON(cdi->col[i]),
&COLORABLE_DEFAULT[i]);
}
}
gtk_widget_destroy(confirm);
vprintf("%s(): return\n", __PRETTY_FUNCTION__);
return TRUE;
}
static gboolean
settings_dialog_colors(GtkWidget *widget, GtkWidget *parent)
{
static GtkWidget *dialog = NULL;
static GtkWidget *table = NULL;
static GtkWidget *label = NULL;
static GtkWidget *btn_defaults = NULL;
static ColorsDialogInfo cdi;
printf("%s()\n", __PRETTY_FUNCTION__);
if(dialog == NULL)
{
dialog = gtk_dialog_new_with_buttons(_("Colors"),
GTK_WINDOW(parent), GTK_DIALOG_MODAL,
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
NULL);
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
btn_defaults = gtk_button_new_with_label(_("Reset...")));
g_signal_connect(G_OBJECT(btn_defaults), "clicked",
G_CALLBACK(settings_dialog_colors_reset), &cdi);
gtk_dialog_add_button(GTK_DIALOG(dialog),
GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
table = gtk_table_new(4, 3, FALSE), TRUE, TRUE, 0);
/* GPS. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("GPS")),
0, 1, 0, 1, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
cdi.col[COLORABLE_MARK] = hildon_color_button_new(),
1, 2, 0, 1, 0, 0, 2, 4);
gtk_table_attach(GTK_TABLE(table),
cdi.col[COLORABLE_MARK_VELOCITY] = hildon_color_button_new(),
2, 3, 0, 1, 0, 0, 2, 4);
gtk_table_attach(GTK_TABLE(table),
cdi.col[COLORABLE_MARK_OLD] = hildon_color_button_new(),
3, 4, 0, 1, 0, 0, 2, 4);
/* Track. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Track")),
0, 1, 1, 2, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
cdi.col[COLORABLE_TRACK] = hildon_color_button_new(),
1, 2, 1, 2, 0, 0, 2, 4);
gtk_table_attach(GTK_TABLE(table),
cdi.col[COLORABLE_TRACK_MARK] = hildon_color_button_new(),
2, 3, 1, 2, 0, 0, 2, 4);
gtk_table_attach(GTK_TABLE(table),
cdi.col[COLORABLE_TRACK_BREAK] = hildon_color_button_new(),
3, 4, 1, 2, 0, 0, 2, 4);
/* Route. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Route")),
0, 1, 2, 3, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
cdi.col[COLORABLE_ROUTE] = hildon_color_button_new(),
1, 2, 2, 3, 0, 0, 2, 4);
gtk_table_attach(GTK_TABLE(table),
cdi.col[COLORABLE_ROUTE_WAY] = hildon_color_button_new(),
2, 3, 2, 3, 0, 0, 2, 4);
gtk_table_attach(GTK_TABLE(table),
cdi.col[COLORABLE_ROUTE_BREAK] = hildon_color_button_new(),
3, 4, 2, 3, 0, 0, 2, 4);
/* POI. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("POI")),
0, 1, 3, 4, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
cdi.col[COLORABLE_POI] = hildon_color_button_new(),
1, 2, 3, 4, 0, 0, 2, 4);
}
/* Initialize GPS. */
hildon_color_button_set_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK]),
&_color[COLORABLE_MARK]);
hildon_color_button_set_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]),
&_color[COLORABLE_MARK_VELOCITY]);
hildon_color_button_set_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]),
&_color[COLORABLE_MARK_OLD]);
/* Initialize Track. */
hildon_color_button_set_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]),
&_color[COLORABLE_TRACK]);
hildon_color_button_set_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]),
&_color[COLORABLE_TRACK_MARK]);
hildon_color_button_set_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]),
&_color[COLORABLE_TRACK_BREAK]);
/* Initialize Route. */
hildon_color_button_set_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]),
&_color[COLORABLE_ROUTE]);
hildon_color_button_set_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]),
&_color[COLORABLE_ROUTE_WAY]);
hildon_color_button_set_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]),
&_color[COLORABLE_ROUTE_BREAK]);
/* Initialize POI. */
hildon_color_button_set_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_POI]),
&_color[COLORABLE_POI]);
gtk_widget_show_all(dialog);
while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
{
#ifndef LEGACY
hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK]),
&_color[COLORABLE_MARK]);
hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]),
&_color[COLORABLE_MARK_VELOCITY]);
hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]),
&_color[COLORABLE_MARK_OLD]);
hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]),
&_color[COLORABLE_TRACK]);
hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]),
&_color[COLORABLE_TRACK_MARK]);
hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]),
&_color[COLORABLE_TRACK_BREAK]);
hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]),
&_color[COLORABLE_ROUTE]);
hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]),
&_color[COLORABLE_ROUTE_WAY]);
hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]),
&_color[COLORABLE_ROUTE_BREAK]);
hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_POI]),
&_color[COLORABLE_POI]);
#else
GdkColor *color;
color = hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK]));
_color[COLORABLE_MARK] = *color;
color = hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_VELOCITY]));
_color[COLORABLE_MARK_VELOCITY] = *color;
color = hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_MARK_OLD]));
_color[COLORABLE_MARK_OLD] = *color;
color = hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK]));
_color[COLORABLE_TRACK] = *color;
color = hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_MARK]));
_color[COLORABLE_TRACK_MARK] = *color;
color = hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_TRACK_BREAK]));
_color[COLORABLE_TRACK_BREAK] = *color;
color = hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE]));
_color[COLORABLE_ROUTE] = *color;
color = hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_WAY]));
_color[COLORABLE_ROUTE_WAY] = *color;
color = hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_ROUTE_BREAK]));
_color[COLORABLE_ROUTE_BREAK] = *color;
color = hildon_color_button_get_color(
HILDON_COLOR_BUTTON(cdi.col[COLORABLE_POI]));
_color[COLORABLE_POI] = *color;
#endif
update_gcs();
break;
}
map_force_redraw();
gtk_widget_hide(dialog);
vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
return TRUE;
}
#ifdef INCLUDE_APRS
void load_aprs_options(GConfClient *gconf_client)
{
_aprs_server = gconf_client_get_string(
gconf_client, GCONF_KEY_APRS_SERVER, NULL);
_aprs_server_port = gconf_client_get_int(
gconf_client, GCONF_KEY_APRS_SERVER_PORT, NULL);
_aprs_inet_server_validation = gconf_client_get_string(
gconf_client, GCONF_KEY_APRS_SERVER_VAL, NULL);
_aprs_mycall = gconf_client_get_string(gconf_client,
GCONF_KEY_APRS_MYCALL, NULL);
_aprs_tty_port = gconf_client_get_string(gconf_client,
GCONF_KEY_APRS_TTY_PORT, NULL);
_aprs_inet_beacon_comment = gconf_client_get_string(gconf_client,
GCONF_KEY_APRS_INET_BEACON, NULL);
_aprs_inet_beacon_interval = gconf_client_get_int(
gconf_client, GCONF_KEY_APRS_INET_BEACON_INTERVAL, NULL);
_aprs_std_pos_hist = gconf_client_get_int(
gconf_client, GCONF_KEY_APRS_MAX_TRACK_PTS, NULL);
_aprs_max_stations = gconf_client_get_int(
gconf_client, GCONF_KEY_APRS_MAX_STATIONS, NULL);
_aprs_enable = gconf_client_get_bool(gconf_client,
GCONF_KEY_APRS_ENABLE, NULL);
_aprs_show_new_station_alert = gconf_client_get_bool(gconf_client,
GCONF_KEY_APRS_SHOW_NEW_STATION_ALERT, NULL);
_aprs_tnc_method = gconf_client_get_int(
gconf_client, GCONF_KEY_APRS_TNC_CONN_METHOD, NULL);
_aprs_tnc_bt_mac = gconf_client_get_string(gconf_client,
GCONF_KEY_APRS_TNC_BT_MAC, NULL);
_aprs_server_auto_filter_km = gconf_client_get_int(
gconf_client, GCONF_KEY_APRS_INET_AUTO_FILTER_RANGE, NULL);
_aprs_server_auto_filter_on = gconf_client_get_bool(gconf_client,
GCONF_KEY_APRS_INET_AUTO_FILTER, NULL);
_aprs_beacon_comment = gconf_client_get_string(gconf_client,
GCONF_KEY_APRS_BEACON_COMMENT, NULL);
_aprs_enable_inet_tx = gconf_client_get_bool(gconf_client,
GCONF_KEY_APRS_ENABLE_INET_TX, NULL);
_aprs_enable_tty_tx = gconf_client_get_bool(gconf_client,
GCONF_KEY_APRS_ENABLE_TTY_TX, NULL);
_aprs_tty_beacon_interval = gconf_client_get_int(
gconf_client, GCONF_KEY_APRS_TTY_BEACON_INTERVAL, NULL);
//_aprs_unproto_path = g_strdup_printf("WIDE2-2");
_aprs_unproto_path = gconf_client_get_string(gconf_client,
GCONF_KEY_APRS_BEACON_PATH, NULL);
_aprs_transmit_compressed_posit = gconf_client_get_bool(gconf_client,
GCONF_KEY_APRS_BEACON_COMPRESSED, NULL);
gchar *tmp;
tmp = gconf_client_get_string(gconf_client,
GCONF_KEY_APRS_BEACON_SYM_GROUP, NULL);
if(tmp && strlen(tmp)>0) _aprs_beacon_group = tmp[0];
else _aprs_beacon_group = '/';
//_aprs_beacon_symbol = 'k';
tmp = gconf_client_get_string(gconf_client,
GCONF_KEY_APRS_BEACON_SYMBOL, NULL);
if(tmp && strlen(tmp)>0) _aprs_beacon_symbol = tmp[0];
else _aprs_beacon_symbol = 'l';
aprs_timer_init();
}
#endif // INCLUDE_APRS
/**
* Bring up the Settings dialog. Return TRUE if and only if the recever
* information has changed (MAC or channel).
*/
gboolean settings_dialog()
{
static GtkWidget *dialog = NULL;
static GtkWidget *notebook = NULL;
static GtkWidget *table = NULL;
static GtkWidget *hbox = NULL;
static GtkWidget *label = NULL;
static GtkWidget *rad_gps_bt = NULL;
static GtkWidget *rad_gps_gpsd = NULL;
static GtkWidget *rad_gps_file = NULL;
static GtkWidget *txt_gps_bt_mac = NULL;
static GtkWidget *txt_gps_gpsd_host = NULL;
static GtkWidget *num_gps_gpsd_port = NULL;
static GtkWidget *txt_gps_file_path = NULL;
static GtkWidget *num_center_ratio = NULL;
static GtkWidget *num_lead_ratio = NULL;
static GtkWidget *chk_lead_is_fixed = NULL;
static GtkWidget *num_rotate_sens = NULL;
static GtkWidget *cmb_rotate_dir = NULL;
static GtkWidget *num_ac_min_speed = NULL;
static GtkWidget *num_announce_notice = NULL;
static GtkWidget *chk_enable_voice = NULL;
static GtkWidget *chk_enable_announce = NULL;
static GtkWidget *num_draw_width = NULL;
static GtkWidget *cmb_units = NULL;
static GtkWidget *cmb_degformat = NULL;
static GtkWidget *btn_scan = NULL;
static GtkWidget *btn_browse_gps = NULL;
static GtkWidget *btn_buttons = NULL;
static GtkWidget *btn_colors = NULL;
static GtkWidget *txt_poi_db = NULL;
static GtkWidget *btn_browse_poi = NULL;
static GtkWidget *num_poi_zoom = NULL;
static GtkWidget *num_auto_download_precache = NULL;
static GtkWidget *chk_speed_limit_on = NULL;
static GtkWidget *num_speed = NULL;
static GtkWidget *cmb_speed_location = NULL;
static GtkWidget *cmb_unblank_option = NULL;
static GtkWidget *cmb_info_font_size = NULL;
static BrowseInfo poi_browse_info = {0, 0};
static BrowseInfo gps_file_browse_info = {0, 0};
static ScanInfo scan_info = {0};
gboolean rcvr_changed = FALSE;
gint i;
printf("%s()\n", __PRETTY_FUNCTION__);
if(dialog == NULL)
{
dialog = gtk_dialog_new_with_buttons(_("Settings"),
GTK_WINDOW(_window), GTK_DIALOG_MODAL,
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
NULL);
/* Enable the help button. */
#ifndef LEGACY
hildon_help_dialog_help_enable(
#else
ossohelp_dialog_help_enable(
#endif
GTK_DIALOG(dialog), HELP_ID_SETTINGS, _osso);
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
btn_buttons = gtk_button_new_with_label(_("Hardware Keys...")));
gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
btn_colors = gtk_button_new_with_label(_("Colors...")));
gtk_dialog_add_button(GTK_DIALOG(dialog),
GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
notebook = gtk_notebook_new(), TRUE, TRUE, 0);
/* Receiver page. */
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
table = gtk_table_new(3, 4, FALSE),
label = gtk_label_new(_("GPS")));
/* Receiver MAC Address. */
gtk_table_attach(GTK_TABLE(table),
rad_gps_bt = gtk_radio_button_new_with_label(
NULL, _("Bluetooth")),
0, 1, 0, 1, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
hbox = gtk_hbox_new(FALSE, 4),
1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
gtk_box_pack_start(GTK_BOX(hbox),
txt_gps_bt_mac = gtk_entry_new(),
TRUE, TRUE, 0);
#ifdef MAEMO_CHANGES
#ifndef LEGACY
g_object_set(G_OBJECT(txt_gps_bt_mac), "hildon-input-mode",
HILDON_GTK_INPUT_MODE_FULL, NULL);
#else
g_object_set(G_OBJECT(txt_gps_bt_mac), HILDON_AUTOCAP, FALSE, NULL);
#endif
#endif
gtk_box_pack_start(GTK_BOX(hbox),
btn_scan = gtk_button_new_with_label(_("Scan...")),
FALSE, FALSE, 0);
#ifndef HAVE_LIBGPSBT
gtk_widget_set_sensitive(rad_gps_bt, FALSE);
gtk_widget_set_sensitive(txt_gps_bt_mac, FALSE);
gtk_widget_set_sensitive(btn_scan, FALSE);
#endif
/* File Path (RFComm). */
gtk_table_attach(GTK_TABLE(table),
rad_gps_file = gtk_radio_button_new_with_label_from_widget(
GTK_RADIO_BUTTON(rad_gps_bt), _("File Path")),
0, 1, 1, 2, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
hbox = gtk_hbox_new(FALSE, 4),
1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
gtk_box_pack_start(GTK_BOX(hbox),
txt_gps_file_path = gtk_entry_new(),
TRUE, TRUE, 0);
#ifdef MAEMO_CHANGES
#ifndef LEGACY
g_object_set(G_OBJECT(txt_gps_file_path), "hildon-input-mode",
HILDON_GTK_INPUT_MODE_FULL, NULL);
#else
g_object_set(G_OBJECT(txt_gps_file_path), HILDON_AUTOCAP, FALSE, NULL);
#endif
#endif
gtk_box_pack_start(GTK_BOX(hbox),
btn_browse_gps = gtk_button_new_with_label(_("Browse...")),
FALSE, FALSE, 0);
#ifndef HAVE_LIBGPSBT
gtk_widget_set_sensitive(rad_gps_file, FALSE);
gtk_widget_set_sensitive(txt_gps_file_path, FALSE);
gtk_widget_set_sensitive(btn_browse_gps, FALSE);
#endif
/* GPSD Hostname and Port. */
gtk_table_attach(GTK_TABLE(table),
rad_gps_gpsd = gtk_radio_button_new_with_label_from_widget(
GTK_RADIO_BUTTON(rad_gps_bt), _("GPSD Host")),
0, 1, 2, 3, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
hbox = gtk_hbox_new(FALSE, 4),
1, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 4);
gtk_box_pack_start(GTK_BOX(hbox),
txt_gps_gpsd_host = gtk_entry_new(),
TRUE, TRUE, 0);
#ifdef MAEMO_CHANGES
#ifndef LEGACY
g_object_set(G_OBJECT(txt_gps_gpsd_host), "hildon-input-mode",
HILDON_GTK_INPUT_MODE_FULL, NULL);
#else
g_object_set(G_OBJECT(txt_gps_gpsd_host), HILDON_AUTOCAP, FALSE, NULL);
#endif
#endif
gtk_box_pack_start(GTK_BOX(hbox),
label = gtk_label_new(_("Port")),
FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox),
num_gps_gpsd_port = hildon_number_editor_new(1, 65535),
FALSE, FALSE, 0);
/* Auto-Center page. */
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
table = gtk_table_new(3, 3, FALSE),
label = gtk_label_new(_("Auto-Center")));
/* Lead Amount. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Lead Amount")),
0, 1, 0, 1, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1, 2, 0, 1, GTK_FILL, 0, 2, 4);
gtk_container_add(GTK_CONTAINER(label),
num_lead_ratio = hildon_controlbar_new());
hildon_controlbar_set_range(HILDON_CONTROLBAR(num_lead_ratio), 1, 10);
force_min_visible_bars(HILDON_CONTROLBAR(num_lead_ratio), 1);
gtk_table_attach(GTK_TABLE(table),
label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
2, 3, 0, 1, GTK_FILL, 0, 2, 4);
gtk_container_add(GTK_CONTAINER(label),
chk_lead_is_fixed = gtk_check_button_new_with_label(_("Fixed")));
/* Auto-Center Pan Sensitivity. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Pan Sensitivity")),
0, 1, 1, 2, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1, 2, 1, 2, GTK_FILL, 0, 2, 4);
gtk_container_add(GTK_CONTAINER(label),
num_center_ratio = hildon_controlbar_new());
hildon_controlbar_set_range(HILDON_CONTROLBAR(num_center_ratio), 1,10);
force_min_visible_bars(HILDON_CONTROLBAR(num_center_ratio), 1);
gtk_table_attach(GTK_TABLE(table),
hbox = gtk_hbox_new(FALSE, 4),
2, 3, 1, 2, GTK_FILL, 0, 2, 4);
gtk_box_pack_start(GTK_BOX(hbox),
label = gtk_label_new(_("Min. Speed")),
TRUE, TRUE, 4);
gtk_box_pack_start(GTK_BOX(hbox),
num_ac_min_speed = hildon_number_editor_new(0, 99),
TRUE, TRUE, 4);
/* Auto-Center Rotate Sensitivity. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Rotate Sensit.")),
0, 1, 2, 3, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
num_rotate_sens = hildon_controlbar_new(),
1, 2, 2, 3, GTK_FILL, 0, 2, 4);
hildon_controlbar_set_range(HILDON_CONTROLBAR(num_rotate_sens), 1,10);
force_min_visible_bars(HILDON_CONTROLBAR(num_rotate_sens), 1);
gtk_table_attach(GTK_TABLE(table),
hbox = gtk_hbox_new(FALSE, 4),
2, 3, 2, 3, GTK_FILL, 0, 2, 4);
gtk_box_pack_start(GTK_BOX(hbox),
label = gtk_label_new(_("Points")),
TRUE, TRUE, 4);
gtk_box_pack_start(GTK_BOX(hbox),
cmb_rotate_dir = gtk_combo_box_new_text(),
TRUE, TRUE, 4);
for(i = 0; i < ROTATE_DIR_ENUM_COUNT; i++)
gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_rotate_dir),
ROTATE_DIR_ENUM_TEXT[i]);
/* Announcement. */
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
table = gtk_table_new(2, 3, FALSE),
label = gtk_label_new(_("Announce")));
/* Enable Waypoint Announcements. */
gtk_table_attach(GTK_TABLE(table),
chk_enable_announce = gtk_check_button_new_with_label(
_("Enable Waypoint Announcements")),
0, 2, 0, 1, GTK_FILL, 0, 2, 4);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_enable_announce),
_enable_announce);
/* Announcement Advance Notice. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Advance Notice")),
0, 1, 1, 2, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
num_announce_notice = hildon_controlbar_new(),
1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
hildon_controlbar_set_range(
HILDON_CONTROLBAR(num_announce_notice), 1, 20);
force_min_visible_bars(HILDON_CONTROLBAR(num_announce_notice), 1);
/* Enable Voice. */
gtk_table_attach(GTK_TABLE(table),
chk_enable_voice = gtk_check_button_new_with_label(
_("Enable Voice Synthesis (requires flite)")),
0, 2, 2, 3, GTK_FILL, 0, 2, 4);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_enable_voice),
_enable_voice);
/* Misc. page. */
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
table = gtk_table_new(3, 5, FALSE),
label = gtk_label_new(_("Misc.")));
/* Line Width. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Line Width")),
0, 1, 0, 1, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
num_draw_width = hildon_controlbar_new(),
1, 5, 0, 1, GTK_FILL, 0, 2, 4);
hildon_controlbar_set_range(HILDON_CONTROLBAR(num_draw_width), 1, 20);
force_min_visible_bars(HILDON_CONTROLBAR(num_draw_width), 1);
/* Unblank Screen */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Unblank Screen")),
0, 1, 1, 2, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
cmb_unblank_option = gtk_combo_box_new_text(),
1, 5, 1, 2, GTK_FILL, 0, 2, 4);
for(i = 0; i < UNBLANK_ENUM_COUNT; i++)
gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_unblank_option),
UNBLANK_ENUM_TEXT[i]);
/* Information Font Size. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Info Font Size")),
0, 1, 2, 3, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
cmb_info_font_size = gtk_combo_box_new_text(),
1, 2, 2, 3, GTK_FILL, 0, 2, 4);
for(i = 0; i < INFO_FONT_ENUM_COUNT; i++)
gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_info_font_size),
INFO_FONT_ENUM_TEXT[i]);
gtk_table_attach(GTK_TABLE(table),
gtk_vseparator_new(),
2, 3, 2, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 2,4);
/* Units. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Units")),
3, 4, 2, 3, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
cmb_units = gtk_combo_box_new_text(),
4, 5, 2, 3, GTK_FILL, 0, 2, 4);
for(i = 0; i < UNITS_ENUM_COUNT; i++)
gtk_combo_box_append_text(
GTK_COMBO_BOX(cmb_units), UNITS_ENUM_TEXT[i]);
/* Misc. 2 page. */
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
table = gtk_table_new(3, 4, FALSE),
label = gtk_label_new(_("Misc. 2")));
/* Degrees format */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Degrees Format")),
0, 1, 0, 1, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1, 2, 0, 1, GTK_FILL, 0, 2, 4);
gtk_container_add(GTK_CONTAINER(label),
cmb_degformat = gtk_combo_box_new_text());
for(i = 0; i < DEG_FORMAT_ENUM_COUNT; i++)
gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_degformat),
DEG_FORMAT_ENUM_TEXT[i].name);
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Auto-Download Pre-cache")),
0, 1, 1, 2, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
num_auto_download_precache = hildon_controlbar_new(),
1, 2, 1, 2, GTK_FILL, 0, 2, 4);
hildon_controlbar_set_range(
HILDON_CONTROLBAR(num_auto_download_precache), 1, 5);
force_min_visible_bars(
HILDON_CONTROLBAR(num_auto_download_precache), 1);
/* Speed warner. */
gtk_table_attach(GTK_TABLE(table),
hbox = gtk_hbox_new(FALSE, 4),
0, 4, 2, 3, GTK_FILL, 0, 2, 4);
gtk_box_pack_start(GTK_BOX(hbox),
chk_speed_limit_on = gtk_check_button_new_with_label(
_("Speed Limit")),
FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox),
label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
FALSE, FALSE, 0);
gtk_container_add(GTK_CONTAINER(label),
num_speed = hildon_number_editor_new(0, 999));
gtk_box_pack_start(GTK_BOX(hbox),
label = gtk_label_new(_("Location")),
FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox),
label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
FALSE, FALSE, 0);
gtk_container_add(GTK_CONTAINER(label),
cmb_speed_location = gtk_combo_box_new_text());
for(i = 0; i < SPEED_LOCATION_ENUM_COUNT; i++)
gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_speed_location),
SPEED_LOCATION_ENUM_TEXT[i]);
/* POI page */
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
table = gtk_table_new(2, 3, FALSE),
label = gtk_label_new(_("POI")));
/* POI database. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("POI database")),
0, 1, 1, 2, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
hbox = gtk_hbox_new(FALSE, 4),
1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
gtk_box_pack_start(GTK_BOX(hbox),
txt_poi_db = gtk_entry_new(),
TRUE, TRUE, 0);
#ifdef MAEMO_CHANGES
#ifndef LEGACY
g_object_set(G_OBJECT(txt_poi_db), "hildon-input-mode",
HILDON_GTK_INPUT_MODE_FULL, NULL);
#else
g_object_set(G_OBJECT(txt_poi_db), HILDON_AUTOCAP, FALSE, NULL);
#endif
#endif
gtk_box_pack_start(GTK_BOX(hbox),
btn_browse_poi = gtk_button_new_with_label(_("Browse...")),
FALSE, FALSE, 0);
/* Show POI below zoom. */
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Show POI below zoom")),
0, 1, 2, 3, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
label = gtk_alignment_new(0.f, 0.5f, 0.f, 0.f),
1, 2, 2, 3, GTK_FILL, 0, 2, 4);
gtk_container_add(GTK_CONTAINER(label),
num_poi_zoom = hildon_number_editor_new(0, MAX_ZOOM));
/* Connect signals. */
memset(&scan_info, 0, sizeof(scan_info));
scan_info.settings_dialog = dialog;
scan_info.txt_gps_bt_mac = txt_gps_bt_mac;
g_signal_connect(G_OBJECT(btn_scan), "clicked",
G_CALLBACK(scan_bluetooth), &scan_info);
g_signal_connect(G_OBJECT(btn_buttons), "clicked",
G_CALLBACK(settings_dialog_hardkeys), dialog);
g_signal_connect(G_OBJECT(btn_colors), "clicked",
G_CALLBACK(settings_dialog_colors), dialog);
poi_browse_info.dialog = dialog;
poi_browse_info.txt = txt_poi_db;
g_signal_connect(G_OBJECT(btn_browse_poi), "clicked",
G_CALLBACK(settings_dialog_browse_forfile), &poi_browse_info);
gps_file_browse_info.dialog = dialog;
gps_file_browse_info.txt = txt_gps_file_path;
g_signal_connect(G_OBJECT(btn_browse_gps), "clicked",
G_CALLBACK(settings_dialog_browse_forfile),
&gps_file_browse_info);
}
/* Initialize fields. */
if(_gri.bt_mac)
gtk_entry_set_text(GTK_ENTRY(txt_gps_bt_mac), _gri.bt_mac);
if(_gri.gpsd_host)
gtk_entry_set_text(GTK_ENTRY(txt_gps_gpsd_host), _gri.gpsd_host);
hildon_number_editor_set_value(
HILDON_NUMBER_EDITOR(num_gps_gpsd_port), _gri.gpsd_port);
if(_gri.file_path)
gtk_entry_set_text(GTK_ENTRY(txt_gps_file_path), _gri.file_path);
switch(_gri.type)
{
case GPS_RCVR_GPSD:
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad_gps_gpsd),TRUE);
break;
case GPS_RCVR_FILE:
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad_gps_file),TRUE);
break;
default: /* Including GPS_RCVR_BT */
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad_gps_bt), TRUE);
break;
}
if(_poi_db_filename)
gtk_entry_set_text(GTK_ENTRY(txt_poi_db), _poi_db_filename);
hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_poi_zoom),
_poi_zoom);
hildon_controlbar_set_value(HILDON_CONTROLBAR(num_center_ratio),
_center_ratio);
hildon_controlbar_set_value(HILDON_CONTROLBAR(num_lead_ratio),
_lead_ratio);
gtk_toggle_button_set_active(
GTK_TOGGLE_BUTTON(chk_lead_is_fixed), _lead_is_fixed);
hildon_controlbar_set_value(HILDON_CONTROLBAR(num_rotate_sens),
_rotate_sens);
gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_rotate_dir), _rotate_dir);
hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_ac_min_speed),
_ac_min_speed);
hildon_controlbar_set_value(HILDON_CONTROLBAR(num_announce_notice),
_announce_notice_ratio);
hildon_controlbar_set_value(HILDON_CONTROLBAR(num_draw_width),
_draw_width);
gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_units), _units);
gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_degformat), _degformat);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_speed_limit_on),
_speed_limit_on);
hildon_controlbar_set_value(HILDON_CONTROLBAR(num_auto_download_precache),
_auto_download_precache);
hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_speed),
_speed_limit);
gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_speed_location),
_speed_location);
gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_unblank_option),
_unblank_option);
gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_info_font_size),
_info_font_size);
gtk_widget_show_all(dialog);
while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
{
GpsRcvrType new_grtype;
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_gpsd))
&& !*gtk_entry_get_text(GTK_ENTRY(txt_gps_gpsd_host)))
{
popup_error(dialog, _("Please specify a GPSD hostname."));
continue;
}
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_file))
&& !*gtk_entry_get_text(GTK_ENTRY(txt_gps_file_path)))
{
popup_error(dialog, _("Please specify a GPS file pathname."));
continue;
}
/* Set _gri.bt_mac if necessary. */
if(!*gtk_entry_get_text(GTK_ENTRY(txt_gps_bt_mac)))
{
/* User specified no rcvr mac - set _gri.bt_mac to NULL. */
if(_gri.bt_mac)
{
g_free(_gri.bt_mac);
_gri.bt_mac = NULL;
rcvr_changed = (_gri.type == GPS_RCVR_BT);
}
}
else if(!_gri.bt_mac || strcmp(_gri.bt_mac,
gtk_entry_get_text(GTK_ENTRY(txt_gps_bt_mac))))
{
/* User specified a new rcvr mac. */
g_free(_gri.bt_mac);
_gri.bt_mac = g_strdup(gtk_entry_get_text(
GTK_ENTRY(txt_gps_bt_mac)));
rcvr_changed = (_gri.type == GPS_RCVR_BT);
}
/* Set _gri.gpsd_host if necessary. */
if(!*gtk_entry_get_text(GTK_ENTRY(txt_gps_gpsd_host)))
{
/* User specified no rcvr mac - set _gri.gpsd_host to NULL. */
if(_gri.gpsd_host)
{
g_free(_gri.gpsd_host);
_gri.gpsd_host = NULL;
rcvr_changed = (_gri.type == GPS_RCVR_GPSD);
}
}
else if(!_gri.gpsd_host || strcmp(_gri.gpsd_host,
gtk_entry_get_text(GTK_ENTRY(txt_gps_gpsd_host))))
{
/* User specified a new rcvr mac. */
g_free(_gri.gpsd_host);
_gri.gpsd_host = g_strdup(gtk_entry_get_text(
GTK_ENTRY(txt_gps_gpsd_host)));
rcvr_changed = (_gri.type == GPS_RCVR_GPSD);
}
if(_gri.gpsd_port != hildon_number_editor_get_value(
HILDON_NUMBER_EDITOR(num_gps_gpsd_port)))
{
_gri.gpsd_port = hildon_number_editor_get_value(
HILDON_NUMBER_EDITOR(num_gps_gpsd_port));
rcvr_changed = (_gri.type == GPS_RCVR_GPSD);
}
/* Set _gri.file_path if necessary. */
if(!*gtk_entry_get_text(GTK_ENTRY(txt_gps_file_path)))
{
/* User specified no rcvr mac - set _gri.file_path to NULL. */
if(_gri.file_path)
{
g_free(_gri.file_path);
_gri.file_path = NULL;
rcvr_changed = (_gri.type == GPS_RCVR_FILE);
}
}
else if(!_gri.file_path || strcmp(_gri.file_path,
gtk_entry_get_text(GTK_ENTRY(txt_gps_file_path))))
{
/* User specified a new rcvr mac. */
g_free(_gri.file_path);
_gri.file_path = g_strdup(gtk_entry_get_text(
GTK_ENTRY(txt_gps_file_path)));
rcvr_changed = (_gri.type == GPS_RCVR_FILE);
}
if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_bt)))
new_grtype = GPS_RCVR_BT;
else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_gpsd)))
new_grtype = GPS_RCVR_GPSD;
else if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rad_gps_file)))
new_grtype = GPS_RCVR_FILE;
else
new_grtype = GPS_RCVR_BT;
if(new_grtype != _gri.type)
{
_gri.type = new_grtype;
rcvr_changed = TRUE;
}
_center_ratio = hildon_controlbar_get_value(
HILDON_CONTROLBAR(num_center_ratio));
_lead_ratio = hildon_controlbar_get_value(
HILDON_CONTROLBAR(num_lead_ratio));
_lead_is_fixed = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(chk_lead_is_fixed));
_rotate_sens = hildon_controlbar_get_value(
HILDON_CONTROLBAR(num_rotate_sens));
_ac_min_speed = hildon_number_editor_get_value(
HILDON_NUMBER_EDITOR(num_ac_min_speed));
_rotate_dir = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_rotate_dir));
_auto_download_precache = hildon_controlbar_get_value(
HILDON_CONTROLBAR(num_auto_download_precache));
_draw_width = hildon_controlbar_get_value(
HILDON_CONTROLBAR(num_draw_width));
_units = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_units));
_degformat = gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_degformat));
_speed_limit_on = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(chk_speed_limit_on));
_speed_limit = hildon_number_editor_get_value(
HILDON_NUMBER_EDITOR(num_speed));
_speed_location = gtk_combo_box_get_active(
GTK_COMBO_BOX(cmb_speed_location));
_unblank_option = gtk_combo_box_get_active(
GTK_COMBO_BOX(cmb_unblank_option));
_info_font_size = gtk_combo_box_get_active(
GTK_COMBO_BOX(cmb_info_font_size));
_announce_notice_ratio = hildon_controlbar_get_value(
HILDON_CONTROLBAR(num_announce_notice));
_enable_announce = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(chk_enable_announce));
_enable_voice = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(chk_enable_voice));
/* Check if user specified a different POI database from before. */
if((!_poi_db_filename && *gtk_entry_get_text(GTK_ENTRY(txt_poi_db)))
|| strcmp(_poi_db_filename,
gtk_entry_get_text(GTK_ENTRY(txt_poi_db))))
{
/* Clear old filename/dirname, if necessary. */
if(_poi_db_filename)
{
g_free(_poi_db_filename);
_poi_db_filename = NULL;
g_free(_poi_db_dirname);
_poi_db_dirname = NULL;
}
if(*gtk_entry_get_text(GTK_ENTRY(txt_poi_db)))
{
_poi_db_filename = g_strdup(gtk_entry_get_text(
GTK_ENTRY(txt_poi_db)));
_poi_db_dirname = g_path_get_dirname(_poi_db_filename);
}
poi_db_connect();
}
_poi_zoom = hildon_number_editor_get_value(
HILDON_NUMBER_EDITOR(num_poi_zoom));
update_gcs();
settings_save();
map_force_redraw();
map_refresh_mark(TRUE);
break;
}
gtk_widget_hide(dialog);
vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, rcvr_changed);
return rcvr_changed;
}
RepoData*
settings_parse_repo(gchar *str)
{
/* Parse each part of a repo, delimited by newline characters:
* 1. name
* 2. url
* 3. db_filename
* 4. dl_zoom_steps
* 5. view_zoom_steps
* 6. layer_level
* If layer_level > 0, have additional fields:
* 8. layer_enabled
* 9. layer_refresh_interval
* 7/9. is_sqlite
*/
gchar *token, *error_check;
printf("%s(%s)\n", __PRETTY_FUNCTION__, str);
RepoData *rd = g_new0(RepoData, 1);
/* Parse name. */
token = strsep(&str, "\n\t");
if(token)
rd->name = g_strdup(token);
/* Parse URL format. */
token = strsep(&str, "\n\t");
if(token)
rd->url = g_strdup(token);
/* Parse cache dir. */
token = strsep(&str, "\n\t");
if(token)
rd->db_filename = gnome_vfs_expand_initial_tilde(token);
/* Parse download zoom steps. */
token = strsep(&str, "\n\t");
if(!token || !*token || !(rd->dl_zoom_steps = atoi(token)))
rd->dl_zoom_steps = 2;
/* Parse view zoom steps. */
token = strsep(&str, "\n\t");
if(!token || !*token || !(rd->view_zoom_steps = atoi(token)))
rd->view_zoom_steps = 1;
/* Parse double-size. */
token = strsep(&str, "\n\t");
if(token)
rd->double_size = atoi(token); /* Default is zero (FALSE) */
/* Parse next-able. */
token = strsep(&str, "\n\t");
if(!token || !*token
|| (rd->nextable = strtol(token, &error_check, 10), token == str))
rd->nextable = TRUE;
/* Parse min zoom. */
token = strsep(&str, "\n\t");
if(!token || !*token
|| (rd->min_zoom = strtol(token, &error_check, 10), token == str))
rd->min_zoom = 4;
/* Parse max zoom. */
token = strsep(&str, "\n\t");
if(!token || !*token
|| (rd->max_zoom = strtol(token, &error_check, 10), token == str))
rd->max_zoom = 20;
/* Parse layer_level */
token = strsep(&str, "\n\t");
if(!token || !*token
|| (rd->layer_level = strtol(token, &error_check, 10), token == str))
rd->layer_level = 0;
if (rd->layer_level) {
/* Parse layer_enabled */
token = strsep(&str, "\n\t");
if(!token || !*token || (rd->layer_enabled = strtol(token, &error_check, 10), token == str))
rd->layer_enabled = 0;
/* Parse layer_refresh_interval */
token = strsep(&str, "\n\t");
if(!token || !*token || (rd->layer_refresh_interval = strtol(token, &error_check, 10), token == str))
rd->layer_refresh_interval = 0;
rd->layer_refresh_countdown = rd->layer_refresh_interval;
}
/* Parse is_sqlite. */
token = strsep(&str, "\n\t");
if(!token || !*token
|| (rd->is_sqlite = strtol(token, &error_check, 10), token == str))
/* If the bool is not present, then this is a gdbm database. */
rd->is_sqlite = FALSE;
set_repo_type(rd);
vprintf("%s(): return %p\n", __PRETTY_FUNCTION__, rd);
return rd;
}
/**
* Initialize all configuration from GCONF. This should not be called more
* than once during execution.
*/
void
settings_init()
{
GConfValue *value;
GConfClient *gconf_client = gconf_client_get_default();
gchar *str;
printf("%s()\n", __PRETTY_FUNCTION__);
/* Initialize some constants. */
CUSTOM_KEY_GCONF[CUSTOM_KEY_UP] = GCONF_KEY_PREFIX"/key_up";
CUSTOM_KEY_GCONF[CUSTOM_KEY_DOWN] = GCONF_KEY_PREFIX"/key_down";
CUSTOM_KEY_GCONF[CUSTOM_KEY_LEFT] = GCONF_KEY_PREFIX"/key_left";
CUSTOM_KEY_GCONF[CUSTOM_KEY_RIGHT] = GCONF_KEY_PREFIX"/key_right";
CUSTOM_KEY_GCONF[CUSTOM_KEY_SELECT] = GCONF_KEY_PREFIX"/key_select";
CUSTOM_KEY_GCONF[CUSTOM_KEY_INCREASE] = GCONF_KEY_PREFIX"/key_increase";
CUSTOM_KEY_GCONF[CUSTOM_KEY_DECREASE] = GCONF_KEY_PREFIX"/key_decrease";
CUSTOM_KEY_GCONF[CUSTOM_KEY_FULLSCREEN]= GCONF_KEY_PREFIX"/key_fullscreen";
CUSTOM_KEY_GCONF[CUSTOM_KEY_ESC] = GCONF_KEY_PREFIX"/key_esc";
COLORABLE_GCONF[COLORABLE_MARK] = GCONF_KEY_PREFIX"/color_mark";
COLORABLE_GCONF[COLORABLE_MARK_VELOCITY]
= GCONF_KEY_PREFIX"/color_mark_velocity";
COLORABLE_GCONF[COLORABLE_MARK_OLD] = GCONF_KEY_PREFIX"/color_mark_old";
COLORABLE_GCONF[COLORABLE_TRACK] = GCONF_KEY_PREFIX"/color_track";
COLORABLE_GCONF[COLORABLE_TRACK_MARK] =GCONF_KEY_PREFIX"/color_track_mark";
COLORABLE_GCONF[COLORABLE_TRACK_BREAK]
= GCONF_KEY_PREFIX"/color_track_break";
COLORABLE_GCONF[COLORABLE_ROUTE] = GCONF_KEY_PREFIX"/color_route";
COLORABLE_GCONF[COLORABLE_ROUTE_WAY] = GCONF_KEY_PREFIX"/color_route_way";
COLORABLE_GCONF[COLORABLE_ROUTE_BREAK]
= GCONF_KEY_PREFIX"/color_route_break";
COLORABLE_GCONF[COLORABLE_POI] = GCONF_KEY_PREFIX"/color_poi";
#ifdef INCLUDE_APRS
COLORABLE_GCONF[COLORABLE_APRS_STATION] = GCONF_KEY_PREFIX"/color_aprs_station";
#endif // INCLUDE_APRS
if(!gconf_client)
{
popup_error(_window, _("Failed to initialize GConf. Quitting."));
exit(1);
}
/* Get GPS Receiver Type. Default is Bluetooth Receiver. */
{
gchar *gri_type_str = gconf_client_get_string(gconf_client,
GCONF_KEY_GPS_RCVR_TYPE, NULL);
gint i = 0;
if(gri_type_str)
{
for(i = GPS_RCVR_ENUM_COUNT - 1; i > 0; i--)
if(!strcmp(gri_type_str, GPS_RCVR_ENUM_TEXT[i]))
break;
g_free(gri_type_str);
}
_gri.type = i;
}
/* Get Bluetooth Receiver MAC. Default is NULL. */
_gri.bt_mac = gconf_client_get_string(
gconf_client, GCONF_KEY_GPS_BT_MAC, NULL);
/* Get GPSD Host. Default is localhost. */
_gri.gpsd_host = gconf_client_get_string(
gconf_client, GCONF_KEY_GPS_GPSD_HOST, NULL);
if(!_gri.gpsd_host)
_gri.gpsd_host = g_strdup("127.0.0.1");
/* Get GPSD Port. Default is GPSD_PORT_DEFAULT (2947). */
if(!(_gri.gpsd_port = gconf_client_get_int(
gconf_client, GCONF_KEY_GPS_GPSD_PORT, NULL)))
_gri.gpsd_port = GPSD_PORT_DEFAULT;
/* Get File Path. Default is /dev/pgps. */
_gri.file_path = gconf_client_get_string(
gconf_client, GCONF_KEY_GPS_FILE_PATH, NULL);
if(!_gri.file_path)
_gri.file_path = g_strdup("/dev/pgps");
/* Get Auto-Download. Default is FALSE. */
_auto_download = gconf_client_get_bool(gconf_client,
GCONF_KEY_AUTO_DOWNLOAD, NULL);
/* Get Auto-Download Pre-cache - Default is 2. */
_auto_download_precache = gconf_client_get_int(gconf_client,
GCONF_KEY_AUTO_DOWNLOAD_PRECACHE, NULL);
if(!_auto_download_precache)
_auto_download_precache = 2;
/* Get Center Ratio - Default is 5. */
_center_ratio = gconf_client_get_int(gconf_client,
GCONF_KEY_CENTER_SENSITIVITY, NULL);
if(!_center_ratio)
_center_ratio = 5;
/* Get Lead Ratio - Default is 5. */
_lead_ratio = gconf_client_get_int(gconf_client,
GCONF_KEY_LEAD_AMOUNT, NULL);
if(!_lead_ratio)
_lead_ratio = 5;
/* Get Lead Is Fixed flag - Default is FALSE. */
_lead_is_fixed = gconf_client_get_bool(gconf_client,
GCONF_KEY_LEAD_IS_FIXED, NULL);
/* Get Rotate Sensitivity - Default is 5. */
_rotate_sens = gconf_client_get_int(gconf_client,
GCONF_KEY_ROTATE_SENSITIVITY, NULL);
if(!_rotate_sens)
_rotate_sens = 5;
/* Get Auto-Center/Rotate Minimum Speed - Default is 2. */
value = gconf_client_get(gconf_client, GCONF_KEY_AC_MIN_SPEED, NULL);
if(value)
{
_ac_min_speed = gconf_value_get_int(value);
gconf_value_free(value);
}
else
_ac_min_speed = 2;
/* Get Rotate Dir - Default is ROTATE_DIR_UP. */
{
gchar *rotate_dir_str = gconf_client_get_string(gconf_client,
GCONF_KEY_ROTATE_DIR, NULL);
gint i = -1;
if(rotate_dir_str)
for(i = ROTATE_DIR_ENUM_COUNT - 1; i >= 0; i--)
if(!strcmp(rotate_dir_str, ROTATE_DIR_ENUM_TEXT[i]))
break;
if(i == -1)
i = ROTATE_DIR_UP;
_rotate_dir = i;
}
/* Get Draw Line Width- Default is 5. */
_draw_width = gconf_client_get_int(gconf_client,
GCONF_KEY_DRAW_WIDTH, NULL);
if(!_draw_width)
_draw_width = 5;
/* Get Enable Announcements flag. Default is TRUE. */
value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_ANNOUNCE, NULL);
if(value)
{
_enable_announce = gconf_value_get_bool(value);
gconf_value_free(value);
}
else
_enable_announce = TRUE;
/* Get Announce Advance Notice - Default is 30. */
value = gconf_client_get(gconf_client, GCONF_KEY_ANNOUNCE_NOTICE, NULL);
if(value)
{
_announce_notice_ratio = gconf_value_get_int(value);
gconf_value_free(value);
}
else
_announce_notice_ratio = 8;
/* Get Enable Voice flag. Default is TRUE. */
value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_VOICE, NULL);
if(value)
{
_enable_voice = gconf_value_get_bool(value);
gconf_value_free(value);
}
else
_enable_voice = TRUE;
if(_enable_voice)
{
/* Make sure we actually have voice capabilities. */
GnomeVFSFileInfo file_info;
_enable_voice = ((GNOME_VFS_OK == gnome_vfs_get_file_info(
_voice_synth_path, &file_info,
GNOME_VFS_FILE_INFO_GET_ACCESS_RIGHTS))
&& (file_info.permissions & GNOME_VFS_PERM_ACCESS_EXECUTABLE));
}
/* Get Fullscreen flag. Default is FALSE. */
_fullscreen = gconf_client_get_bool(gconf_client,
GCONF_KEY_FULLSCREEN, NULL);
/* Get Units. Default is UNITS_KM. */
{
gchar *units_str = gconf_client_get_string(gconf_client,
GCONF_KEY_UNITS, NULL);
gint i = 0;
if(units_str)
for(i = UNITS_ENUM_COUNT - 1; i > 0; i--)
if(!strcmp(units_str, UNITS_ENUM_TEXT[i]))
break;
_units = i;
}
/* Get Custom Key Actions. */
{
gint i;
for(i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
{
gint j = CUSTOM_KEY_DEFAULT[i];
gchar *str = gconf_client_get_string(gconf_client,
CUSTOM_KEY_GCONF[i], NULL);
if(str)
for(j = CUSTOM_ACTION_ENUM_COUNT - 1; j > 0; j--)
if(!strcmp(str, CUSTOM_ACTION_ENUM_TEXT[j]))
break;
_action[i] = j;
}
}
/* Get Deg format. Default is DDPDDDDD. */
{
gchar *degformat_key_str = gconf_client_get_string(gconf_client,
GCONF_KEY_DEG_FORMAT, NULL);
gint i = 0;
if(degformat_key_str)
for(i = DEG_FORMAT_ENUM_COUNT - 1; i > 0; i--)
if(!strcmp(degformat_key_str, DEG_FORMAT_ENUM_TEXT[i].name))
break;
_degformat = i;
}
/* Get Speed Limit On flag. Default is FALSE. */
_speed_limit_on = gconf_client_get_bool(gconf_client,
GCONF_KEY_SPEED_LIMIT_ON, NULL);
/* Get Speed Limit */
_speed_limit = gconf_client_get_int(gconf_client,
GCONF_KEY_SPEED_LIMIT, NULL);
if(_speed_limit <= 0)
_speed_limit = 100;
/* Get Speed Location. Default is SPEED_LOCATION_TOP_LEFT. */
{
gchar *speed_location_str = gconf_client_get_string(gconf_client,
GCONF_KEY_SPEED_LOCATION, NULL);
gint i = 0;
if(speed_location_str)
for(i = SPEED_LOCATION_ENUM_COUNT - 1; i > 0; i--)
if(!strcmp(speed_location_str, SPEED_LOCATION_ENUM_TEXT[i]))
break;
_speed_location = i;
}
/* Get Unblank Option. Default is UNBLANK_FULLSCREEN. */
{
gchar *unblank_option_str = gconf_client_get_string(gconf_client,
GCONF_KEY_UNBLANK_SIZE, NULL);
gint i = -1;
if(unblank_option_str)
for(i = UNBLANK_ENUM_COUNT - 1; i >= 0; i--)
if(!strcmp(unblank_option_str, UNBLANK_ENUM_TEXT[i]))
break;
if(i == -1)
i = UNBLANK_FULLSCREEN;
_unblank_option = i;
}
#ifdef INCLUDE_APRS
load_aprs_options(gconf_client);
#endif // INCLUDE_APRS
/* Get Info Font Size. Default is INFO_FONT_MEDIUM. */
{
gchar *info_font_size_str = gconf_client_get_string(gconf_client,
GCONF_KEY_INFO_FONT_SIZE, NULL);
gint i = -1;
if(info_font_size_str)
for(i = INFO_FONT_ENUM_COUNT - 1; i >= 0; i--)
if(!strcmp(info_font_size_str, INFO_FONT_ENUM_TEXT[i]))
break;
if(i == -1)
i = INFO_FONT_MEDIUM;
_info_font_size = i;
}
/* Get last saved latitude. Default is 50.f. */
value = gconf_client_get(gconf_client, GCONF_KEY_LAST_LAT, NULL);
if(value)
{
_gps.lat = gconf_value_get_float(value);
gconf_value_free(value);
}
else
_gps.lat = 50.f;
/* Get last saved longitude. Default is 0. */
_gps.lon = gconf_client_get_float(gconf_client, GCONF_KEY_LAST_LON, NULL);
/* Get last saved altitude. Default is 0. */
_pos.altitude = gconf_client_get_int(
gconf_client, GCONF_KEY_LAST_ALT, NULL);
/* Get last saved speed. Default is 0. */
_gps.speed = gconf_client_get_float(
gconf_client, GCONF_KEY_LAST_SPEED, NULL);
/* Get last saved speed. Default is 0. */
_gps.heading = gconf_client_get_float(
gconf_client, GCONF_KEY_LAST_HEADING, NULL);
/* Get last saved timestamp. Default is 0. */
_pos.time= gconf_client_get_float(gconf_client, GCONF_KEY_LAST_TIME, NULL);
/* Get last center point. */
{
gdouble center_lat, center_lon;
/* Get last saved latitude. Default is last saved latitude. */
value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LAT, NULL);
if(value)
{
center_lat = gconf_value_get_float(value);
gconf_value_free(value);
}
else
{
_is_first_time = TRUE;
center_lat = _gps.lat;
}
/* Get last saved longitude. Default is last saved longitude. */
value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LON, NULL);
if(value)
{
center_lon = gconf_value_get_float(value);
gconf_value_free(value);
}
else
center_lon = _gps.lon;
latlon2unit(center_lat, center_lon, _center.unitx, _center.unity);
_next_center = _center;
}
/* Get map correction. Default is 0. */
_map_correction_unitx = gconf_client_get_int(gconf_client,
GCONF_KEY_MAP_CORRECTION_UNITX, NULL);
_map_correction_unity = gconf_client_get_int(gconf_client,
GCONF_KEY_MAP_CORRECTION_UNITY, NULL);
/* Get last viewing angle. Default is 0. */
_map_rotate_angle = _next_map_rotate_angle = gconf_client_get_int(
gconf_client, GCONF_KEY_CENTER_ANGLE, NULL);
gdk_pixbuf_rotate_matrix_fill_for_rotation(
_map_rotate_matrix,
deg2rad(ROTATE_DIR_ENUM_DEGREES[_rotate_dir] - _map_rotate_angle));
gdk_pixbuf_rotate_matrix_fill_for_rotation(
_map_reverse_matrix,
deg2rad(_map_rotate_angle - ROTATE_DIR_ENUM_DEGREES[_rotate_dir]));
/* Load the repositories. */
{
GSList *list, *curr;
RepoData *prev_repo = NULL, *curr_repo = NULL;
gint curr_repo_index = gconf_client_get_int(gconf_client,
GCONF_KEY_CURRREPO, NULL);
list = gconf_client_get_list(gconf_client,
GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, NULL);
for(curr = list; curr != NULL; curr = curr->next)
{
RepoData *rd = settings_parse_repo(curr->data);
if (rd->layer_level == 0) {
_repo_list = g_list_append(_repo_list, rd);
if(!curr_repo_index--)
curr_repo = rd;
}
else
prev_repo->layers = rd;
prev_repo = rd;
g_free(curr->data);
}
g_slist_free(list);
if (curr_repo)
repo_set_curr(curr_repo);
}
if(_repo_list == NULL)
{
RepoData *repo = create_default_repo();
_repo_list = g_list_append(_repo_list, repo);
repo_set_curr(repo);
}
/* Get last Zoom Level. Default is 16. */
value = gconf_client_get(gconf_client, GCONF_KEY_ZOOM, NULL);
if(value)
{
_zoom = gconf_value_get_int(value) / _curr_repo->view_zoom_steps
* _curr_repo->view_zoom_steps;
gconf_value_free(value);
}
else
_zoom = 16 / _curr_repo->view_zoom_steps
* _curr_repo->view_zoom_steps;
BOUND(_zoom, 0, MAX_ZOOM);
_next_zoom = _zoom;
/* Get Route Directory. Default is NULL. */
_route_dir_uri = gconf_client_get_string(gconf_client,
GCONF_KEY_ROUTEDIR, NULL);
/* Get Last Track File. Default is NULL. */
_track_file_uri = gconf_client_get_string(gconf_client,
GCONF_KEY_TRACKFILE, NULL);
/* Get Auto-Center Mode. Default is CENTER_LEAD. */
value = gconf_client_get(gconf_client, GCONF_KEY_AUTOCENTER_MODE, NULL);
if(value)
{
_center_mode = gconf_value_get_int(value);
gconf_value_free(value);
}
else
_center_mode = CENTER_LEAD;
/* Get Auto-Center Rotate Flag. Default is TRUE. */
value = gconf_client_get(gconf_client, GCONF_KEY_AUTOCENTER_ROTATE, NULL);
if(value)
{
_center_rotate = gconf_value_get_bool(value);
gconf_value_free(value);
}
else
_center_rotate = TRUE;
/* Get Show Zoom Level flag. Default is FALSE. */
_show_zoomlevel = gconf_client_get_bool(gconf_client,
GCONF_KEY_SHOWZOOMLEVEL, NULL);
/* Get Show Scale flag. Default is TRUE. */
value = gconf_client_get(gconf_client, GCONF_KEY_SHOWSCALE, NULL);
if(value)
{
_show_scale = gconf_value_get_bool(value);
gconf_value_free(value);
}
else
_show_scale = TRUE;
/* Get Show Compass Rose flag. Default is TRUE. */
value = gconf_client_get(gconf_client, GCONF_KEY_SHOWCOMPROSE, NULL);
if(value)
{
_show_comprose = gconf_value_get_bool(value);
gconf_value_free(value);
}
else
_show_comprose = TRUE;
/* Get Show Tracks flag. Default is TRUE. */
value = gconf_client_get(gconf_client, GCONF_KEY_SHOWTRACKS, NULL);
if(value)
{
_show_paths |= (gconf_value_get_bool(value) ? TRACKS_MASK : 0);
gconf_value_free(value);
}
else
_show_paths |= TRACKS_MASK;
/* Get Show Routes flag. Default is TRUE. */
value = gconf_client_get(gconf_client, GCONF_KEY_SHOWROUTES, NULL);
if(value)
{
_show_paths |= (gconf_value_get_bool(value) ? ROUTES_MASK : 0);
gconf_value_free(value);
}
else
_show_paths |= ROUTES_MASK;
/* Get Show Velocity Vector flag. Default is TRUE. */
value = gconf_client_get(gconf_client, GCONF_KEY_SHOWVELVEC, NULL);
if(value)
{
_show_velvec = gconf_value_get_bool(value);
gconf_value_free(value);
}
else
_show_velvec = TRUE;
/* Get Show Velocity Vector flag. Default is TRUE. */
value = gconf_client_get(gconf_client, GCONF_KEY_SHOWPOIS, NULL);
if(value)
{
_show_poi = gconf_value_get_bool(value);
gconf_value_free(value);
}
else
_show_poi = TRUE;
/* Get Enable GPS flag. Default is TRUE. */
value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_GPS, NULL);
if(value)
{
_enable_gps = gconf_value_get_bool(value);
gconf_value_free(value);
}
else
_enable_gps = TRUE;
/* Get Enable Tracking flag. Default is TRUE. */
value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_TRACKING, NULL);
if(value)
{
_enable_tracking = gconf_value_get_bool(value);
gconf_value_free(value);
}
else
_enable_tracking = TRUE;
/* Initialize _gps_state based on _enable_gps. */
_gps_state = RCVR_OFF;
/* Load the route locations. */
{
GSList *curr;
_loc_list = gconf_client_get_list(gconf_client,
GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, NULL);
_loc_model = gtk_list_store_new(1, G_TYPE_STRING);
for(curr = _loc_list; curr != NULL; curr = curr->next)
{
GtkTreeIter iter;
gtk_list_store_insert_with_values(_loc_model, &iter, INT_MAX,
0, curr->data, -1);
}
}
/* Get POI Database. Default is in REPO_DEFAULT_CACHE_BASE */
_poi_db_filename = gconf_client_get_string(gconf_client,
GCONF_KEY_POI_DB, NULL);
if(_poi_db_filename == NULL)
{
gchar *poi_base = gnome_vfs_expand_initial_tilde(
REPO_DEFAULT_CACHE_BASE);
_poi_db_filename = gnome_vfs_uri_make_full_from_relative(
poi_base, "poi.db");
g_free(poi_base);
}
_poi_db_dirname = g_path_get_dirname(_poi_db_filename);
_poi_zoom = gconf_client_get_int(gconf_client,
GCONF_KEY_POI_ZOOM, NULL);
if(!_poi_zoom)
_poi_zoom = MAX_ZOOM - 10;
/* Get GPS Info flag. Default is FALSE. */
_gps_info = gconf_client_get_bool(gconf_client, GCONF_KEY_GPS_INFO, NULL);
/* Get Route Download URL. Default is:
* "http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s" */
_route_dl_url = gconf_client_get_string(gconf_client,
GCONF_KEY_ROUTE_DL_URL, NULL);
if(_route_dl_url == NULL)
_route_dl_url = g_strdup(
"http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s");
/* Get Route Download Radius. Default is 4. */
value = gconf_client_get(gconf_client, GCONF_KEY_ROUTE_DL_RADIUS, NULL);
if(value)
{
_route_dl_radius = gconf_value_get_int(value);
gconf_value_free(value);
}
else
_route_dl_radius = 8;
/* Get POI Download URL. Default is:
* "http://www.gnuite.com/cgi-bin/poi.cgi?saddr=%s&query=%s&page=%d" */
_poi_dl_url = gconf_client_get_string(gconf_client,
GCONF_KEY_POI_DL_URL, NULL);
if(_poi_dl_url == NULL)
_poi_dl_url = g_strdup(
"http://www.gnuite.com/cgi-bin/poi.cgi?saddr=%s&query=%s&page=%d");
/* Get Colors. */
{
gint i;
for(i = 0; i < COLORABLE_ENUM_COUNT; i++)
{
str = gconf_client_get_string(gconf_client,
COLORABLE_GCONF[i], NULL);
if(!str || !gdk_color_parse(str, &_color[i]))
_color[i] = COLORABLE_DEFAULT[i];
}
}
gconf_client_clear_cache(gconf_client);
g_object_unref(gconf_client);
/* GPS data init */
_gps.fix = 1;
_gps.satinuse = 0;
_gps.satinview = 0;
vprintf("%s(): return\n", __PRETTY_FUNCTION__);
}
#ifdef INCLUDE_APRS
////// APRS Settings start
void read_aprs_options(TAprsSettings *aprsSettings )
{
// Basic options
_aprs_mycall = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_aprs_mycall)));
_aprs_enable = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(aprsSettings->chk_aprs_enabled ));
_aprs_show_new_station_alert = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(aprsSettings->chk_aprs_show_new_station_alert ));
//gchar * s_max_stations = g_strdup(gtk_entry_get_text(
// GTK_ENTRY(aprsSettings->txt_aprs_max_stations)));
//_aprs_max_stations = convert_str_to_int(s_max_stations);
//g_free(s_max_stations);
// Inet options
_aprs_server = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_aprs_server)));
_aprs_tty_port = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_aprs_tty_port)));
_aprs_inet_server_validation = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_aprs_inet_server_validation)));
gchar * s_port = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->num_aprs_server_port)));
_aprs_server_port = convert_str_to_int(s_port);
g_free(s_port);
gchar * s_beacon_interval = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_aprs_inet_beacon_interval )));
_aprs_inet_beacon_interval = convert_str_to_int(s_beacon_interval);
g_free(s_beacon_interval);
s_beacon_interval = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_tty_beacon_interval )));
_aprs_tty_beacon_interval = convert_str_to_int(s_beacon_interval);
g_free(s_beacon_interval);
_aprs_inet_beacon_comment = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_aprs_inet_beacon_comment )));
_aprs_tnc_bt_mac = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_tnc_bt_mac )));
_aprs_tnc_method = TNC_CONNECTION_BT;
if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(aprsSettings->rad_tnc_file) ))
{
_aprs_tnc_method = TNC_CONNECTION_FILE;
}
_aprs_server_auto_filter_on = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(aprsSettings->chk_enable_inet_auto_filter ));
gchar * s_server_auto_filter_km = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_auto_filter_range )));
_aprs_server_auto_filter_km = convert_str_to_int(s_server_auto_filter_km);
_aprs_enable_inet_tx = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(aprsSettings->chk_enable_inet_tx ));
_aprs_enable_tty_tx = gtk_toggle_button_get_active(
GTK_TOGGLE_BUTTON(aprsSettings->chk_enable_tty_tx ));
_aprs_beacon_comment = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_beacon_comment )));
_aprs_beacon_comment = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_beacon_comment )));
_aprs_unproto_path = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_unproto_path )));
gchar *tmp;
tmp = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_beacon_group )));
if(strlen(tmp)>0) _aprs_beacon_group = tmp[0];
tmp = g_strdup(gtk_entry_get_text(
GTK_ENTRY(aprsSettings->txt_beacon_symbol )));
if(strlen(tmp)>0) _aprs_beacon_symbol = tmp[0];
_aprs_transmit_compressed_posit = FALSE; // Not currently supported
}
void save_aprs_options()
{
GConfClient *gconf_client = gconf_client_get_default();
if(!gconf_client)
{
popup_error(_window,
_("Failed to initialize GConf. Settings were not saved."));
return;
}
/* APRS */
if(_aprs_server)
gconf_client_set_string(gconf_client,
GCONF_KEY_APRS_SERVER, _aprs_server, NULL);
if(_aprs_server_port)
gconf_client_set_int(gconf_client,
GCONF_KEY_APRS_SERVER_PORT, _aprs_server_port, NULL);
if(_aprs_inet_server_validation)
gconf_client_set_string(gconf_client,
GCONF_KEY_APRS_SERVER_VAL, _aprs_inet_server_validation, NULL);
if(_aprs_mycall)
gconf_client_set_string(gconf_client,
GCONF_KEY_APRS_MYCALL, _aprs_mycall, NULL);
if(_aprs_tty_port)
gconf_client_set_string(gconf_client,
GCONF_KEY_APRS_TTY_PORT, _aprs_tty_port, NULL);
if(_aprs_inet_beacon_comment)
gconf_client_set_string(gconf_client,
GCONF_KEY_APRS_INET_BEACON, _aprs_inet_beacon_comment, NULL);
gconf_client_set_int(gconf_client,
GCONF_KEY_APRS_INET_BEACON_INTERVAL, _aprs_inet_beacon_interval, NULL);
gconf_client_set_int(gconf_client,
GCONF_KEY_APRS_MAX_TRACK_PTS, _aprs_std_pos_hist, NULL);
gconf_client_set_int(gconf_client,
GCONF_KEY_APRS_MAX_STATIONS, _aprs_max_stations, NULL);
gconf_client_set_bool(gconf_client,
GCONF_KEY_APRS_ENABLE, _aprs_enable, NULL);
gconf_client_set_bool(gconf_client,
GCONF_KEY_APRS_SHOW_NEW_STATION_ALERT, _aprs_show_new_station_alert, NULL);
if(_aprs_tnc_bt_mac)
gconf_client_set_string(gconf_client,
GCONF_KEY_APRS_TNC_BT_MAC, _aprs_tnc_bt_mac, NULL);
gconf_client_set_int(gconf_client,
GCONF_KEY_APRS_TNC_CONN_METHOD, _aprs_tnc_method, NULL);
gconf_client_set_int(gconf_client,
GCONF_KEY_APRS_INET_AUTO_FILTER_RANGE, _aprs_server_auto_filter_km, NULL);
gconf_client_set_bool(gconf_client,
GCONF_KEY_APRS_INET_AUTO_FILTER, _aprs_server_auto_filter_on, NULL);
gconf_client_set_bool(gconf_client,
GCONF_KEY_APRS_ENABLE_INET_TX, _aprs_enable_inet_tx, NULL);
gconf_client_set_bool(gconf_client,
GCONF_KEY_APRS_ENABLE_TTY_TX, _aprs_enable_tty_tx, NULL);
if(_aprs_beacon_comment)
gconf_client_set_string(gconf_client,
GCONF_KEY_APRS_BEACON_COMMENT, _aprs_beacon_comment, NULL);
gconf_client_set_int(gconf_client,
GCONF_KEY_APRS_TTY_BEACON_INTERVAL, _aprs_tty_beacon_interval, NULL);
gconf_client_set_bool(gconf_client,
GCONF_KEY_APRS_BEACON_COMPRESSED, _aprs_transmit_compressed_posit, NULL);
if(_aprs_unproto_path)
gconf_client_set_string(gconf_client,
GCONF_KEY_APRS_BEACON_PATH, _aprs_unproto_path, NULL);
//if(_aprs_beacon_group)
{
gchar tmp[5];
snprintf(tmp, 5, "%c", _aprs_beacon_group);
gconf_client_set_string(gconf_client,
GCONF_KEY_APRS_BEACON_SYM_GROUP, tmp, NULL);
//if(strlen(tmp)> 1) _aprs_beacon_group = tmp[0];
}
//if(_aprs_beacon_symbol)
{
gchar tmp[5];
snprintf(tmp, 5, "%c", _aprs_beacon_symbol);
gconf_client_set_string(gconf_client,
GCONF_KEY_APRS_BEACON_SYMBOL, tmp, NULL);
//if(strlen(tmp)> 1) _aprs_beacon_symbol = tmp[0];
}
}
void setup_aprs_options_page(GtkWidget *notebook, TAprsSettings *aprsSettings)
{
GtkWidget *table;
GtkWidget *label;
// GtkWidget *hbox;
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
table = gtk_table_new(3/*rows*/, 4/*columns*/, FALSE /*Auto re-size*/),
label = gtk_label_new(_("Station")));
/* Callsign. */
// Label
add_label_box(table, 0, 1, 0, 1, -1, &label, ALIGN_TOP_LEFT, "Callsign");
add_edit_box (table, 1, 2, 0, 1, -1, &(aprsSettings->txt_aprs_mycall), ALIGN_TOP_LEFT, _aprs_mycall);
add_check_box(table, 2, 4, 0, 1, -1, &(aprsSettings->chk_compressed_beacon), ALIGN_TOP_LEFT,
"Compress Beacons", _aprs_transmit_compressed_posit);
// Not yet supported
gtk_widget_set_sensitive (GTK_WIDGET (aprsSettings->chk_compressed_beacon), FALSE);
add_label_box(table, 0, 1, 1, 2, -1, &label, ALIGN_TOP_LEFT, "Beacon Path");
add_edit_box (table, 1, 2, 1, 2, -1, &(aprsSettings->txt_unproto_path), ALIGN_TOP_LEFT, _aprs_unproto_path);
add_check_box(table, 2, 4, 1, 2, -1, &(aprsSettings->chk_aprs_show_new_station_alert), ALIGN_TOP_LEFT,
"Show New Station Alerts", _aprs_show_new_station_alert);
add_label_box(table, 0, 1, 2, 3, -1, &label, ALIGN_TOP_LEFT, "Symbol Group");
gchar initialValue[2];
snprintf(initialValue, 2, "%c", _aprs_beacon_group);
add_edit_box (table, 1, 2, 2, 3, -1, &(aprsSettings->txt_beacon_group), ALIGN_TOP_LEFT, initialValue);
add_label_box(table, 2, 3, 2, 3, -1, &label, ALIGN_TOP_LEFT, "Symbol");
snprintf(initialValue, 2, "%c", _aprs_beacon_symbol);
add_edit_box (table, 3, 4, 2, 3, -1, &(aprsSettings->txt_beacon_symbol), ALIGN_TOP_LEFT, initialValue);
}
void setup_aprs_tty_page_options_page(GtkWidget *notebook, TAprsSettings *aprsSettings)
{
GtkWidget *table;
GtkWidget *label;
GtkWidget *hbox;
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
table = gtk_table_new(3/*rows*/, 2/*columns*/, FALSE /*Auto re-size*/),
label = gtk_label_new(_("TNC 1")));
// Receiver MAC Address.
gtk_table_attach(GTK_TABLE(table),
aprsSettings->rad_tnc_bt = gtk_radio_button_new_with_label(
NULL, _("Bluetooth")),
0, 1, 0, 1, GTK_FILL, 0, 2, 4);
// gtk_misc_set_alignment(/*GTK_MISC*/(aprsSettings->rad_tnc_bt), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
hbox = gtk_hbox_new(FALSE, 4),
1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
gtk_box_pack_start(GTK_BOX(hbox),
aprsSettings->txt_tnc_bt_mac = gtk_entry_new(),
TRUE, TRUE, 0);
#ifdef MAEMO_CHANGES
#ifndef LEGACY
g_object_set(G_OBJECT(aprsSettings->txt_tnc_bt_mac), "hildon-input-mode",
HILDON_GTK_INPUT_MODE_FULL, NULL);
#else
g_object_set(G_OBJECT(txt_gps_bt_mac), HILDON_AUTOCAP, FALSE, NULL);
#endif
#endif
gtk_box_pack_start(GTK_BOX(hbox),
aprsSettings->btn_scan_bt_tnc = gtk_button_new_with_label(_("Scan...")),
FALSE, FALSE, 0);
#ifndef HAVE_LIBGPSBT
gtk_widget_set_sensitive(aprsSettings->rad_tnc_bt, FALSE);
gtk_widget_set_sensitive(aprsSettings->txt_tnc_bt_mac, FALSE);
gtk_widget_set_sensitive(aprsSettings->btn_scan_bt_tnc, FALSE);
#endif
// File Path (RFComm).
gtk_table_attach(GTK_TABLE(table),
aprsSettings->rad_tnc_file = gtk_radio_button_new_with_label_from_widget(
GTK_RADIO_BUTTON(aprsSettings->rad_tnc_bt), _("File Path")),
0, 1, 1, 2, GTK_FILL, 0, 2, 4);
// gtk_misc_set_alignment(/*GTK_MISC*/(aprsSettings->rad_tnc_file), 1.f, 0.5f);
gtk_table_attach(GTK_TABLE(table),
hbox = gtk_hbox_new(FALSE, 4),
1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
gtk_box_pack_start(GTK_BOX(hbox),
aprsSettings->txt_aprs_tty_port = gtk_entry_new(),
TRUE, TRUE, 0);
#ifdef MAEMO_CHANGES
#ifndef LEGACY
g_object_set(G_OBJECT(aprsSettings->txt_aprs_tty_port), "hildon-input-mode",
HILDON_GTK_INPUT_MODE_FULL, NULL);
#else
g_object_set(G_OBJECT(txt_gps_file_path), HILDON_AUTOCAP, FALSE, NULL);
#endif
#endif
add_check_box(table, 0, 1, 2, 3, -1, &(aprsSettings->chk_enable_tty_tx), ALIGN_TOP_LEFT,
"Enable TX", _aprs_enable_tty_tx);
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Only KISS TNC's are supported (9600 8N1)")),
1, 2, 2, 3, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
// Init
if(aprsSettings->txt_aprs_tty_port)
gtk_entry_set_text(GTK_ENTRY(aprsSettings->txt_aprs_tty_port), _aprs_tty_port);
if(aprsSettings->txt_tnc_bt_mac)
gtk_entry_set_text(GTK_ENTRY(aprsSettings->txt_tnc_bt_mac), _aprs_tnc_bt_mac);
if(_aprs_tnc_method == TNC_CONNECTION_BT)
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(aprsSettings->rad_tnc_bt), TRUE);
else if(_aprs_tnc_method == TNC_CONNECTION_FILE)
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(aprsSettings->rad_tnc_file), TRUE);
}
void setup_aprs_tty2_page_options_page(GtkWidget *notebook, TAprsSettings *aprsSettings)
{
GtkWidget *table;
GtkWidget *label;
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
table = gtk_table_new(2/*rows*/, 1/*columns*/, FALSE /*Auto re-size*/),
label = gtk_label_new(_("TNC 2")));
add_label_box(table, 0, 1, 0, 1, -1, &label, ALIGN_TOP_LEFT, "Beacon Interval");
gchar s_interval[8]; s_interval[0] = 0;
if(_aprs_tty_beacon_interval>0) snprintf(s_interval, 8, "%u", _aprs_tty_beacon_interval );
add_edit_box (table, 1, 3, 0, 1, -1, &(aprsSettings->txt_tty_beacon_interval), ALIGN_TOP_LEFT,
s_interval);
add_label_box(table, 3, 4, 0, 1, -1, &label, ALIGN_TOP_LEFT, "seconds");
add_label_box(table, 0, 1, 1, 2, -1, &label, ALIGN_TOP_LEFT, "Beacon Text");
add_edit_box (table, 1, 4, 1, 2, -1, &(aprsSettings->txt_beacon_comment), ALIGN_TOP_LEFT, _aprs_beacon_comment);
}
void setup_aprs_general_options_page(GtkWidget *notebook, TAprsSettings *aprsSettings)
{
GtkWidget *table;
GtkWidget *label;
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
table = gtk_table_new(2/*rows*/, 1/*columns*/, FALSE /*Auto re-size*/),
label = gtk_label_new(_("APRS")));
// Notice
add_label_box(table, 0, 1, 0, 1, -1, &label, ALIGN_TOP_LEFT,
"APRS (Automatic/Amateur Position Reporting System) is \na system used by Radio Amateurs to communicate position, \nweather, and short messages.");
// Enabled
add_check_box(table, 0, 1, 1, 2, -1, &(aprsSettings->chk_aprs_enabled), ALIGN_TOP_LEFT,
"Enable APRS functionality", _aprs_enable);
}
void setup_aprs_inet_options_page(GtkWidget *notebook, TAprsSettings *aprsSettings)
{
GtkWidget *table;
GtkWidget *label;
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
table = gtk_table_new(3/*rows*/, 5/*columns*/, FALSE /*Auto re-size*/),
label = gtk_label_new(_("Internet")));
/*iNet server*/
add_label_box(table, 0, 1, 0, 1, -1, &label, ALIGN_TOP_LEFT, "Server");
add_edit_box (table, 1, 3, 0, 1, -1, &(aprsSettings->txt_aprs_server), ALIGN_TOP_LEFT, _aprs_server);
/*iNet server port*/
add_label_box(table, 3, 4, 0, 1, -1, &label, ALIGN_TOP_RIGHT, "Port");
add_edit_box (table, 4, 5, 0, 1, 0.5, &(aprsSettings->num_aprs_server_port), ALIGN_TOP_LEFT,
g_strdup_printf("%u", _aprs_server_port));
/* Validation */
add_label_box(table, 0, 1, 1, 2, -1, &label, ALIGN_TOP_LEFT, "Server Validation");
add_edit_box (table, 1, 3, 1, 2, 0.5, &(aprsSettings->txt_aprs_inet_server_validation), ALIGN_TOP_LEFT, _aprs_inet_server_validation);
add_check_box(table, 3, 5, 1, 2, -1, &(aprsSettings->chk_enable_inet_tx), ALIGN_TOP_LEFT,
"Enable TX", _aprs_enable_inet_tx);
/*iNet server filter*/
add_label_box(table, 0, 1, 2, 3, -1, &label, ALIGN_TOP_LEFT, "Filter data");
add_check_box(table, 1, 2, 2, 3, -1, &(aprsSettings->chk_enable_inet_auto_filter), ALIGN_TOP_LEFT, "Enable",
_aprs_server_auto_filter_on);
add_label_box(table, 2, 3, 2, 3, -1, &label, ALIGN_TOP_RIGHT, "Range");
add_edit_box (table, 3, 4, 2, 3, 0.75, &(aprsSettings->txt_auto_filter_range), ALIGN_TOP_LEFT,
g_strdup_printf("%u", _aprs_server_auto_filter_km));
add_label_box(table, 4, 5, 2, 3, -1, &label, ALIGN_TOP_LEFT, "km");
}
void setup_aprs_inet2_options_page(GtkWidget *notebook, TAprsSettings *aprsSettings)
{
GtkWidget *table;
GtkWidget *label;
GtkWidget *hbox;
gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
table = gtk_table_new(2/*rows*/, 3/*columns*/, FALSE /*Auto re-size*/),
label = gtk_label_new(_("Internet 2")));
/* iNet Beacon interval */
// Label
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Beacon interval")),
0, 1, 0, 1, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
// Edit box
gtk_table_attach(GTK_TABLE(table),
hbox = gtk_hbox_new(FALSE, 4),
1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
gtk_box_pack_start(GTK_BOX(hbox),
aprsSettings->txt_aprs_inet_beacon_interval = gtk_entry_new(),
TRUE, TRUE, 0);
#ifdef MAEMO_CHANGES
#ifndef LEGACY
g_object_set(G_OBJECT(aprsSettings->txt_aprs_inet_beacon_interval), "hildon-input-mode",
HILDON_GTK_INPUT_MODE_FULL, NULL);
#else
g_object_set(G_OBJECT(aprsSettings->txt_aprs_inet_beacon_interval), HILDON_AUTOCAP, FALSE, NULL);
#endif
#endif
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("seconds")),
2, 3, 0, 1, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
/* Beacon comment */
// Label
gtk_table_attach(GTK_TABLE(table),
label = gtk_label_new(_("Beacon Comment")),
0, 1, 1, 2, GTK_FILL, 0, 2, 4);
gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
// Edit box
gtk_table_attach(GTK_TABLE(table),
hbox = gtk_hbox_new(FALSE, 4),
1, 3, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
gtk_box_pack_start(GTK_BOX(hbox),
aprsSettings->txt_aprs_inet_beacon_comment = gtk_entry_new(),
TRUE, TRUE, 0);
#ifdef MAEMO_CHANGES
#ifndef LEGACY
g_object_set(G_OBJECT(aprsSettings->txt_aprs_inet_beacon_comment), "hildon-input-mode",
HILDON_GTK_INPUT_MODE_FULL, NULL);
#else
g_object_set(G_OBJECT(aprsSettings->txt_aprs_inet_beacon_comment), HILDON_AUTOCAP, FALSE, NULL);
#endif
#endif
// Init values
if(_aprs_inet_beacon_interval)
{
gchar interval[8];
snprintf(interval, 8, "%d", _aprs_inet_beacon_interval);
gtk_entry_set_text(GTK_ENTRY(aprsSettings->txt_aprs_inet_beacon_interval), interval);
}
if(_aprs_inet_beacon_comment)
gtk_entry_set_text(GTK_ENTRY(aprsSettings->txt_aprs_inet_beacon_comment), _aprs_inet_beacon_comment);
}
void aprs_settings_dialog(gboolean *aprs_inet_config_changed, gboolean *aprs_tty_config_changed)
{
static GtkWidget *dialog = NULL;
static GtkWidget *notebook = NULL;
static TAprsSettings aprs_settings;
static ScanInfo scan_info = {0};
printf("%s()\n", __PRETTY_FUNCTION__);
*aprs_inet_config_changed = FALSE;
*aprs_tty_config_changed = FALSE;
if(dialog == NULL)
{
dialog = gtk_dialog_new_with_buttons(_("APRS Settings"),
GTK_WINDOW(_window), GTK_DIALOG_MODAL,
GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
NULL);
/* Enable the help button. */
#ifndef LEGACY
hildon_help_dialog_help_enable(
#else
ossohelp_dialog_help_enable(
#endif
GTK_DIALOG(dialog), HELP_ID_SETTINGS, _osso);
gtk_dialog_add_button(GTK_DIALOG(dialog),
GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
notebook = gtk_notebook_new(), TRUE, TRUE, 0);
// Add enable, and info page
setup_aprs_general_options_page(notebook, &aprs_settings);
// Add station details page
setup_aprs_options_page(notebook, &aprs_settings);
// Add iNet page
setup_aprs_inet_options_page(notebook, &aprs_settings);
setup_aprs_inet2_options_page(notebook, &aprs_settings);
// Add TTY page
setup_aprs_tty_page_options_page(notebook, &aprs_settings);
setup_aprs_tty2_page_options_page(notebook, &aprs_settings);
/* Connect signals. */
memset(&scan_info, 0, sizeof(scan_info));
scan_info.settings_dialog = dialog;
scan_info.txt_gps_bt_mac = aprs_settings.txt_tnc_bt_mac;
g_signal_connect(G_OBJECT(aprs_settings.btn_scan_bt_tnc), "clicked",
G_CALLBACK(scan_bluetooth), &scan_info);
}
gtk_widget_show_all(dialog);
if(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
{
// TODO - check if settings have really changed
*aprs_inet_config_changed = TRUE;
*aprs_tty_config_changed = TRUE;
read_aprs_options(&aprs_settings );
save_aprs_options();
aprs_timer_init();
}
gtk_widget_hide(dialog);
vprintf("%s(): return\n", __PRETTY_FUNCTION__);
}
#endif // INCLUDE_APRS