]> err.no Git - mapper/blobdiff - src/mapper.c
Fix GPS settings dialog so it works.
[mapper] / src / mapper.c
index b956eb81b3eeb4c5a69ef2b1406312f736c5f7d2..60374a704a3b8a48afa64fab2f56cd5b41d42773 100644 (file)
@@ -23,8 +23,6 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#define _GNU_SOURCE
-
 #include <config.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <libintl.h>
 #include <locale.h>
 
-#include "hildon-mapper.h"
+#ifdef WITH_HILDON_DBUS_BT
+#include <bt-dbus.h>
+#endif
 
+#include "mapper.h"
+#include "hildon-mapper.h"
 #include "utils.h"
 #include "mapper-types.h"
 #include "settings.h"
 #include "map.h"
 #include "route.h"
 #include "track.h"
-#include "bt.h"
 #include "ui-common.h"
 #include "db.h"
 #include "osm-db.h"
+#include "poi.h"
 #include "cb.h"
 #include "speak.h"
 #include "gpx.h"
 #include "config-gconf.h"
 
-DBusConnection *dbus_conn;
-
 gfloat UNITS_CONVERT[] = {1.85200,1.15077945,1.f,};
 
 GdkColor COLORABLE_DEFAULT[COLORABLE_ENUM_COUNT] = {
@@ -94,6 +94,105 @@ GdkColor COLORABLE_DEFAULT[COLORABLE_ENUM_COUNT] = {
        {0, 0xa000, 0x0000, 0xa000}     /* COLORABLE_POI */
 };
 
+enum {
+       MAPPER_INIT_START=0,
+       MAPPER_INIT_MISC,
+       MAPPER_INIT_CONFIG,
+       MAPPER_INIT_DB,
+       MAPPER_INIT_POI,
+       MAPPER_INIT_OSM,
+       MAPPER_INIT_VOICE,
+       MAPPER_INIT_UI,
+       MAPPER_INIT_GOTO,
+       MAPPER_INIT_DONE
+} mapper_init_state;
+
+guint mis=MAPPER_INIT_START;
+
+static GtkWidget *init_progress;
+static GtkWidget *init_dialog;
+
+/**
+ * Initialize arrays
+ */
+static void 
+variables_init(void)
+{
+UNITS_TEXT[UNITS_KM] = _("km");
+UNITS_TEXT[UNITS_MI] = _("mi.");
+UNITS_TEXT[UNITS_NM] = _("n.m.");
+
+INFO_FONT_TEXT[INFO_FONT_XXSMALL] = "xx-small";
+INFO_FONT_TEXT[INFO_FONT_XSMALL] = "x-small";
+INFO_FONT_TEXT[INFO_FONT_SMALL] = "small";
+INFO_FONT_TEXT[INFO_FONT_MEDIUM] = "medium";
+INFO_FONT_TEXT[INFO_FONT_LARGE] = "large";
+INFO_FONT_TEXT[INFO_FONT_XLARGE] = "x-large";
+INFO_FONT_TEXT[INFO_FONT_XXLARGE] = "xx-large";
+
+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";
+
+CUSTOM_KEY_ICON[CUSTOM_KEY_UP] = HWK_BUTTON_UP;
+CUSTOM_KEY_ICON[CUSTOM_KEY_LEFT] = HWK_BUTTON_LEFT;
+CUSTOM_KEY_ICON[CUSTOM_KEY_DOWN] = HWK_BUTTON_DOWN;
+CUSTOM_KEY_ICON[CUSTOM_KEY_RIGHT] = HWK_BUTTON_RIGHT;
+CUSTOM_KEY_ICON[CUSTOM_KEY_SELECT] = HWK_BUTTON_SELECT;
+CUSTOM_KEY_ICON[CUSTOM_KEY_INCREASE] = HWK_BUTTON_INCREASE;
+CUSTOM_KEY_ICON[CUSTOM_KEY_DECREASE] = HWK_BUTTON_DECREASE;
+CUSTOM_KEY_ICON[CUSTOM_KEY_FULLSCREEN] = HWK_BUTTON_VIEW;
+CUSTOM_KEY_ICON[CUSTOM_KEY_ESC] = HWK_BUTTON_CANCEL;
+
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_UP] = CUSTOM_ACTION_PAN_NORTH;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_LEFT] = CUSTOM_ACTION_PAN_WEST;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_DOWN] = CUSTOM_ACTION_PAN_SOUTH;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_RIGHT] = CUSTOM_ACTION_PAN_EAST;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_SELECT] = CUSTOM_ACTION_TOGGLE_AUTOCENTER;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_INCREASE] = CUSTOM_ACTION_ZOOM_IN;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_DECREASE] = CUSTOM_ACTION_ZOOM_OUT;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_FULLSCREEN] = CUSTOM_ACTION_TOGGLE_FULLSCREEN;
+CUSTOM_KEY_DEFAULT[CUSTOM_KEY_ESC] = CUSTOM_ACTION_TOGGLE_TRACKS;
+
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_NORTH] = _("Pan North");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_WEST] = _("Pan West");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_SOUTH] = _("Pan South");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_PAN_EAST] = _("Pan East");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_AUTOCENTER] = _("Toggle Auto-Center");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_FULLSCREEN] = _("Toggle Fullscreen");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ZOOM_IN] = _("Zoom In");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ZOOM_OUT] = _("Zoom Out");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_TRACKS] = _("Toggle Tracks");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_SCALE] = _("Toggle Scale");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_POI] = _("Toggle POIs");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_CHANGE_REPO] = _("Select Next Repository");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ROUTE_DISTNEXT] = _("Show Distance to Next Waypoint");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_ROUTE_DISTLAST] = _("Show Distance to End of Route");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_BREAK] = _("Insert Track Break");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_DISTLAST] = _("Show Distance from Last Break");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TRACK_DISTFIRST] = _("Show Distance from Beginning");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_GPS] = _("Toggle GPS");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_GPSINFO] = _("Toggle GPS Info");
+CUSTOM_ACTION_TEXT[CUSTOM_ACTION_TOGGLE_SPEEDLIMIT] = _("Toggle Speed Limit");
+
+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";
+}
+
 /**
  * Save state and destroy all non-UI elements created by this program in
  * preparation for exiting.
@@ -103,22 +202,23 @@ mapper_destroy(void)
 {
 config_save();
 config_save_repo();
-rcvr_disconnect();
 map_download_deinit();
-if (_curl_sid) {
-       g_source_remove(_curl_sid);
-       _curl_sid = 0;
-}
+map_poi_deinit();
+#if defined (WITH_GST) && defined (WITH_ESPEAK)
+speak_deinit();
+#endif
+gps_disconnect(_gps);
+gps_free(_gps);
 osm_deinit();
 db_close(&_db);
 track_deinit();
 route_deinit();
-}
 
-static void 
-set_var_defaults(void)
-{
-_conn_state = RCVR_OFF;
+gnome_vfs_shutdown();
+#ifdef WITH_OSSO
+osso_deinitialize(_osso);
+#endif
+curl_global_cleanup();
 }
 
 static gint 
@@ -138,24 +238,26 @@ return 0;
 static gint 
 mapper_osso_cb_init(void)
 {
-#ifdef WITH_OSSO
 gchar *filter_string;
 
+#ifdef WITH_OSSO
 if (OSSO_OK != osso_rpc_set_default_cb_f(_osso, dbus_cb_default, NULL)) {
        g_printerr("osso_rpc_set_default_cb_f failed.\n");
        return 1;
 }
+#endif
 
+#ifdef WITH_OSSO_IC
 filter_string = g_strdup_printf("interface=%s", ICD_DBUS_INTERFACE);
 /* add match */
 dbus_bus_add_match(dbus_conn, filter_string, NULL);
 g_free(filter_string);
+
 /* add the callback */
 dbus_connection_add_filter(dbus_conn, get_connection_status_signal_cb, NULL, NULL);
-
 osso_iap_cb(iap_callback);
-
 #endif
+
 return 0;
 }
 
@@ -170,38 +272,113 @@ localtime_r(&time1, &time2);
 _gmtoffset = time2.tm_gmtoff;
 }
 
-static void 
-mapper_init(gint argc, gchar ** argv)
+static gboolean
+mapper_init(gpointer data)
 {
-DBusGConnection *dbus_conn;
 GError *error = NULL;
+gboolean ret=TRUE;
+gfloat p=0;
+gchar *w="Starting";
 
-g_set_application_name("Mapper");
-
-mapper_init_variables();
-track_init();
-route_init();
-config_init();
-map_download_init();
-osm_init();
-gps_init();
-mapper_ui_init();
+switch (mis) {
+       case MAPPER_INIT_START:
+               curl_global_init(CURL_GLOBAL_NOTHING);
+               gnome_vfs_init();
+               /* XXX: Load GPS configuration, then create gps */
+               _gps=gps_new(GPS_IO_SIMULATION);
+               _gps->connection_retry=gps_retry_connection;
+               timezone_init();
+               gpx_init();
+               variables_init();
+               latlon_init();
+               track_init();
+               route_init();
+               mis=MAPPER_INIT_CONFIG;
+               p=0.1;
+               w="Init";
+       break;
+       case MAPPER_INIT_CONFIG:
+               config_init();
+               map_download_init();
+               mis=MAPPER_INIT_DB;
+               p=0.2;
+               w="Config";
+       break;
+       case MAPPER_INIT_DB:
+               if (db_connect(&_db, _mapper_db)) {
+                       mis=MAPPER_INIT_POI;
+               } else {
+                       mis=MAPPER_INIT_VOICE;
+               }
+               p=0.5;
+               w="Database";
+       break;
+       case MAPPER_INIT_POI:
+               poi_init(&_db);
+               mis=MAPPER_INIT_OSM;
+               p=0.6;
+               w="POIs";
+       break;
+       case MAPPER_INIT_OSM:
+               osm_init(&_db);
+               mis=MAPPER_INIT_VOICE;
+               p=0.8;
+               w="OSM";
+       break;
+       case MAPPER_INIT_VOICE:
+               #if defined (WITH_GST) && defined (WITH_ESPEAK)
+               if (speak_init("en",_voice_speed,_voice_pitch)==FALSE) {
+                       g_printerr("Espeak init failed\n");
+                       popup_error(_window, "Speech init failed. Disabled.");
+               }
+               #endif
+               mis=MAPPER_INIT_MISC;
+               p=0.85;
+               w="Speech";
+       break;
+       case MAPPER_INIT_MISC:
+               /* Initialize D-Bus system connection. */
+               if (NULL == (dbus_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error))) {
+                       g_printerr("Failed to open connection to D-Bus: %s.\n", error->message);
+                       popup_error(_window, "Failed to connect to D-Bus.");
+                       error = NULL;
+               }
 
-#ifdef WITH_OSSO
-osso_hw_set_event_cb(_osso, NULL, osso_cb_hw_state, NULL);
-#endif
+               /* XXX: Move this */
+               #ifdef WITH_OSSO
+               osso_hw_set_event_cb(_osso, NULL, osso_cb_hw_state, NULL);
+               #endif
 
-/* Initialize D-Bus. */
-if (NULL == (dbus_conn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error))) {
-       g_printerr("Failed to open connection to D-Bus: %s.\n", error->message);
-       error = NULL;
-}
-#ifdef WITH_HILDON_DBUS_BT
-if (NULL == (_rfcomm_req_proxy = dbus_g_proxy_new_for_name(dbus_conn, BTCOND_SERVICE, BTCOND_REQ_PATH, BTCOND_REQ_INTERFACE))) {
-       g_printerr("Failed to open connection to %s.\n", BTCOND_REQ_INTERFACE);
+               mis=MAPPER_INIT_UI;
+               p=0.9;
+               w="Misc";
+       break;
+       case MAPPER_INIT_UI:
+               mapper_ui_init();
+               mis=MAPPER_INIT_GOTO;
+               p=0.99;
+               w="UI";
+       break;
+       case MAPPER_INIT_GOTO:
+               if (map_goto_position(&_home)==FALSE)
+                       g_printerr("Home is not set.\n");
+               else
+                       map_center_unit(_center.unitx, _center.unity);
+               mis=MAPPER_INIT_DONE;
+               p=1.0;
+               w="Done";
+       break;
+       case MAPPER_INIT_DONE:
+               progress_dialog_remove(init_dialog);
+               if (_enable_gps)   
+                       gps_connect_now(_gps);
+               return FALSE;
+       break;
 }
-#endif
 
+gtk_progress_bar_set_fraction(GTK_PROGRESS(init_progress), p);
+gtk_progress_bar_set_text(GTK_PROGRESS(init_progress), w);
+return ret;
 }
 
 gint 
@@ -215,32 +392,21 @@ textdomain(GETTEXT_PACKAGE);
 
 g_thread_init(NULL);
 g_type_init();
+g_set_application_name("Mapper");
+gtk_init(&argc, &argv);
 if (mapper_osso_init()!=0)
        return 1;
-set_var_defaults();    
-#if defined (WITH_GST)
-gst_init(&argc, &argv);
-#endif
-gtk_init(&argc, &argv);
-gconf_init(argc, argv, NULL);
-gnome_vfs_init();
-curl_global_init(CURL_GLOBAL_NOTHING);
-timezone_init();
-gpx_init();
-mapper_init(argc, argv);
 if (mapper_osso_cb_init()!=0)
        return 1;
-#if defined (WITH_GST) && defined (WITH_ESPEAK)
-speak_init("en",_voice_speed,_voice_pitch);
+#if defined (WITH_GST)
+gst_init(&argc, &argv);
 #endif
+
+init_progress=gtk_progress_bar_new();
+init_dialog=progress_dialog("Mapper is loading...",init_progress);
+g_idle_add((GSourceFunc)mapper_init, NULL);
 gtk_main();
 mapper_destroy();
-#if defined (WITH_GST) && defined (WITH_ESPEAK)
-speak_deinit();
-#endif
-gnome_vfs_shutdown();
-#ifdef WITH_OSSO
-osso_deinitialize(_osso);
-#endif
+
 return 0;
 }