removed double setlocale(LC_NUMERIC,"C");
[navit-package] / src / main.c
1 #include <locale.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
5 #include <signal.h>
6 #include <glib.h>
7 #include <sys/types.h>
8
9 #ifndef _WIN32
10 #include <sys/wait.h>
11 #include <signal.h>
12 #endif
13
14 #include <unistd.h>
15 #include <libintl.h>
16 #ifdef USE_GTK_MAIN_LOOP
17 #include <gtk/gtk.h>
18 #endif
19 #include "config.h"
20 #include "file.h"
21 #include "debug.h"
22 #include "main.h"
23 #include "navit.h"
24 #include "gui.h"
25 #include "xmlconfig.h"
26 #include "item.h"
27 #include "coord.h"
28 #include "route.h"
29 #include "navigation.h"
30
31 #define _(STRING)    gettext(STRING)
32
33 struct map_data *map_data_default;
34
35 static void sigchld(int sig)
36 {
37 #ifndef _WIN32
38         int status;
39         while (waitpid(-1, &status, WNOHANG) > 0);
40 #endif
41 }
42
43
44 static gchar *get_home_directory(void)
45 {
46         static gchar *homedir = NULL;
47
48         if (homedir) return homedir;
49         homedir = getenv("HOME");
50         if (!homedir)
51         {
52 //              struct passwd *p;
53
54 //              p = getpwuid(getuid());
55 //              if (p) homedir = p->pw_dir;
56         }
57         if (!homedir)
58         {
59                 g_warning("Could not find home directory. Using current directory as home directory.");
60                 homedir = ".";
61         }
62         return homedir;
63 }
64
65 static GList *navit;
66 #ifndef USE_GTK_MAIN_LOOP
67 static GMainLoop *loop;
68 #endif
69
70 void
71 main_add_navit(struct navit *nav)
72 {
73         navit=g_list_prepend(navit, nav);
74 }
75
76 void
77 main_remove_navit(struct navit *nav)
78 {
79         navit=g_list_remove(navit, nav);
80         if (! navit) {
81 #ifdef USE_GTK_MAIN_LOOP
82                 gtk_main_quit();
83 #else
84                 if (loop)
85                         g_main_loop_quit(loop);
86 #endif
87         }
88 }
89
90 int main(int argc, char **argv)
91 {
92         GError *error = NULL;
93         char *config_file = NULL;
94         char *s;
95         int l;
96
97
98 #ifndef _WIN32
99         signal(SIGCHLD, sigchld);
100 #endif
101
102         setenv("LC_NUMERIC","C",1);
103         setlocale(LC_ALL,"");
104         setlocale(LC_NUMERIC,"C");
105
106         if (file_exists("navit.c") || file_exists("navit.o")) {
107                 char buffer[PATH_MAX];
108                 printf(_("Running from source directory\n"));
109                 getcwd(buffer, PATH_MAX);
110                 setenv("NAVIT_PREFIX", buffer, 0);
111                 setenv("NAVIT_LIBDIR", buffer, 0);
112                 setenv("NAVIT_SHAREDIR", buffer, 0);
113                 setenv("NAVIT_LIBPREFIX", "*/.libs/", 0);
114                 s=g_strdup_printf("%s/../locale", buffer);
115                 setenv("NAVIT_LOCALEDIR", s, 0);
116                 g_free(s);
117         } else {
118                 if (!getenv("NAVIT_PREFIX")) {
119                         l=strlen(argv[0]);
120                         if (l > 10 && !strcmp(argv[0]+l-10,"/bin/navit")) {
121                                 s=g_strdup(argv[0]);
122                                 s[l-10]='\0';
123                                 if (strcmp(s, PREFIX))
124                                         printf(_("setting '%s' to '%s'\n"), "NAVIT_PREFIX", s);
125                                 setenv("NAVIT_PREFIX", s, 0);
126                                 g_free(s);
127                         } else
128                                 setenv("NAVIT_PREFIX", PREFIX, 0);
129                 }
130 #ifdef _WIN32
131                 s=g_strdup_printf("locale");
132 #else
133                 s=g_strdup_printf("%s/share/locale", getenv("NAVIT_PREFIX"));
134 #endif
135                 setenv("NAVIT_LOCALEDIR", s, 0);
136                 g_free(s);
137 #ifdef _WIN32
138                 s=g_strdup_printf(".");
139 #else
140                 s=g_strdup_printf("%s/share/navit", getenv("NAVIT_PREFIX"));
141 #endif
142                 setenv("NAVIT_SHAREDIR", s, 0);
143                 g_free(s);
144                 s=g_strdup_printf("%s/lib/navit", getenv("NAVIT_PREFIX"));
145                 setenv("NAVIT_LIBDIR", s, 0);
146                 g_free(s);
147         }
148         bindtextdomain(PACKAGE, getenv("NAVIT_LOCALEDIR"));
149         bind_textdomain_codeset (PACKAGE, "UTF-8");
150         textdomain(PACKAGE);
151
152         debug_init();
153 #ifndef USE_PLUGINS
154         extern void builtin_init(void);
155         builtin_init();
156 #endif
157 #if 0
158         /* handled in gui/gtk */
159         gtk_set_locale();
160         gtk_init(&argc, &argv);
161         gdk_rgb_init();
162 #endif
163         s = getenv("NAVIT_WID");
164         if (s) {
165                 setenv("SDL_WINDOWID", s, 0);
166         }
167         route_init();
168         navigation_init();
169         config_file=NULL;
170         if (argc > 1)
171                 config_file=argv[1];
172         if (! config_file) {
173                 config_file=g_strjoin(NULL,get_home_directory(), "/.navit/navit.xml" , NULL);
174                 if (!file_exists(config_file)) {
175                         g_free(config_file);
176                         config_file=NULL;
177                         }
178         }
179         if (! config_file) {
180                 if (file_exists("navit.xml.local"))
181                         config_file="navit.xml.local";
182         }
183         if (! config_file) {
184                 if (file_exists("navit.xml"))
185                         config_file="navit.xml";
186         }
187         if (! config_file) {
188                 config_file=g_strjoin(NULL,getenv("NAVIT_SHAREDIR"), "/navit.xml.local" , NULL);
189                 if (!file_exists(config_file)) {
190                         g_free(config_file);
191                         config_file=NULL;
192                 }
193         }
194         if (! config_file) {
195                 config_file=g_strjoin(NULL,getenv("NAVIT_SHAREDIR"), "/navit.xml" , NULL);
196                 if (!file_exists(config_file)) {
197                         g_free(config_file);
198                         config_file=NULL;
199                 }
200         }
201         if (!config_file) {
202                 printf(_("No config file navit.xml, navit.xml.local found\n"));
203                 exit(1);
204         }
205         if (!config_load(config_file, &error)) {
206                 printf(_("Error parsing '%s': %s\n"), config_file, error->message);
207                 exit(1);
208         } else {
209                 printf(_("Using '%s'\n"), config_file);
210         }
211         if (! navit) {
212                 printf(_("No instance has been created, exiting\n"));
213                 exit(1);
214         }
215         if (main_loop_gui) {
216                 gui_run_main_loop(main_loop_gui);
217         } else {
218 #ifdef USE_GTK_MAIN_LOOP
219                 gtk_main();
220 #else
221                 loop = g_main_loop_new (NULL, TRUE);
222                 if (g_main_loop_is_running (loop))
223                 {
224                         g_main_loop_run (loop);
225                 }
226 #endif
227         }
228
229         return 0;
230 }