Contents of /trunk/src/main.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations)
Tue Dec 9 20:06:06 2008 UTC (15 years, 5 months ago) by harbaum
Original Path: src/main.c
File MIME type: text/plain
File size: 22110 byte(s)
Initial import
1 /*
2 * This file is part of OSM2Go.
3 *
4 * OSM2Go is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * OSM2Go is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with OSM2Go. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 #include <stdio.h>
19 #include <string.h>
20
21 #include <curl/curl.h>
22
23 #include "appdata.h"
24
25 /* disable/enable main screen control dependant on presence of open project */
26 static void main_project_loaded(appdata_t *appdata) {
27 gboolean loaded = (appdata->project != NULL);
28
29 /* cancel any action in progress */
30 if(GTK_WIDGET_FLAGS(appdata->iconbar->cancel) & GTK_SENSITIVE)
31 map_action_cancel(appdata);
32
33 /* ---- set project name as window title ----- */
34 #ifndef USE_HILDON
35 char *str = NULL;
36 if(loaded)
37 str = g_strdup_printf("OSM2Go - %s", appdata->project->name);
38 else
39 str = g_strdup_printf("OSM2Go");
40
41 gtk_window_set_title(GTK_WINDOW(appdata->window), str);
42 g_free(str);
43 #else
44 if(loaded)
45 gtk_window_set_title(GTK_WINDOW(appdata->window), appdata->project->name);
46 else
47 gtk_window_set_title(GTK_WINDOW(appdata->window), "");
48 #endif
49
50 if(appdata->iconbar && appdata->iconbar->toolbar)
51 gtk_widget_set_sensitive(appdata->iconbar->toolbar, loaded);
52
53 /* disable all menu entries related to map */
54 gtk_widget_set_sensitive(appdata->track.menu_track, loaded);
55 gtk_widget_set_sensitive(appdata->menu_view, loaded);
56 gtk_widget_set_sensitive(appdata->menu_osm, loaded);
57 gtk_widget_set_sensitive(appdata->menu_wms, loaded);
58 gtk_widget_set_sensitive(appdata->menu_map, loaded);
59 gtk_widget_set_sensitive(appdata->menu_item_project_close, loaded);
60
61 if(!loaded)
62 statusbar_set(appdata, _("Plase load or create a project"), FALSE);
63 }
64
65 /******************** begin of menu *********************/
66
67 #if 0 // simplify menu
68 static struct {
69 enum { MENU_END, MENU_ITEM, MENU_SUB, MENU_SUB_END, MENU_SEP } type;
70
71 char *title;
72 GCallback c_handler;
73 } menu[] = {
74 { MENU_SUB, "OSM", NULL },
75
76 { MENU_END, NULL, NULL },
77 };
78 #endif
79
80 static void
81 cb_menu_project_open(GtkWidget *window, gpointer data) {
82 appdata_t *appdata = (appdata_t*)data;
83 project_load(appdata, NULL);
84 main_project_loaded(appdata);
85 }
86
87 static void
88 cb_menu_project_close(GtkWidget *window, gpointer data) {
89 appdata_t *appdata = (appdata_t*)data;
90 project_close(appdata);
91 main_project_loaded(appdata);
92 }
93
94 static void
95 cb_menu_about(GtkWidget *window, gpointer data) {
96 GtkAboutDialog *about = GTK_ABOUT_DIALOG(gtk_about_dialog_new());
97
98 gtk_about_dialog_set_name(about, "OSM2Go");
99 gtk_about_dialog_set_version(about, VERSION);
100 gtk_about_dialog_set_copyright(about, _("Copyright 2008"));
101
102 const gchar *authors[] = {
103 "Till Harbaum <till@harbaum.org>",
104 "Andrew Chadwick",
105 NULL };
106
107 gtk_about_dialog_set_authors(about, authors);
108
109 gtk_about_dialog_set_website(about,
110 _("http://www.harbaum.org/till/maemo"));
111
112 gtk_about_dialog_set_comments(about,
113 _("Mobile OSM Editor"));
114
115 gtk_widget_show_all(GTK_WIDGET(about));
116 gtk_dialog_run(GTK_DIALOG(about));
117 gtk_widget_destroy(GTK_WIDGET(about));
118 }
119
120 void on_window_destroy (GtkWidget *widget, gpointer data);
121
122 static void
123 cb_menu_quit(GtkWidget *window, gpointer data) {
124 appdata_t *appdata = (appdata_t*)data;
125 gtk_widget_destroy(GTK_WIDGET(appdata->window));
126 }
127
128 static void
129 cb_menu_upload(GtkWidget *window, gpointer data) {
130 appdata_t *appdata = (appdata_t*)data;
131 if(!appdata->osm || !appdata->project) return;
132
133 osm_upload(appdata, appdata->osm, appdata->project);
134 }
135
136 static void
137 cb_menu_download(GtkWidget *window, gpointer data) {
138 appdata_t *appdata = (appdata_t*)data;
139 if(!appdata->osm || !appdata->project) return;
140
141 /* redraw the entire map by destroying all map items and redrawing them */
142 diff_save(appdata->project, appdata->osm);
143 map_clear(appdata, MAP_LAYER_OBJECTS_ONLY);
144 osm_free(&appdata->icon, appdata->osm);
145
146 // download
147 osm_download(GTK_WIDGET(appdata->window), appdata->project);
148
149 appdata->osm = osm_parse(appdata->project->osm);
150 diff_restore(appdata, appdata->project, appdata->osm);
151 map_paint(appdata);
152 }
153
154 static void
155 cb_menu_wms_import(GtkWidget *window, gpointer data) {
156 appdata_t *appdata = (appdata_t*)data;
157 wms_import(appdata);
158 }
159
160 static void
161 cb_menu_wms_clear(GtkWidget *window, gpointer data) {
162 appdata_t *appdata = (appdata_t*)data;
163 wms_remove(appdata);
164 }
165
166 static void
167 cb_menu_wms_adjust(GtkWidget *window, gpointer data) {
168 appdata_t *appdata = (appdata_t*)data;
169 map_action_set(appdata, MAP_ACTION_BG_ADJUST);
170 }
171
172 /* ----------- hide objects for performance reasons ----------- */
173
174 static void
175 cb_menu_map_hide_sel(GtkWidget *window, gpointer data) {
176 appdata_t *appdata = (appdata_t*)data;
177 map_hide_selected(appdata);
178 }
179
180 static void
181 cb_menu_map_show_all(GtkWidget *window, gpointer data) {
182 appdata_t *appdata = (appdata_t*)data;
183 map_show_all(appdata);
184 }
185
186 /* ----------------------------------------------- ----------- */
187
188 #if 1 // mainly for testing
189 static void
190 cb_menu_redraw(GtkWidget *window, gpointer data) {
191 appdata_t *appdata = (appdata_t*)data;
192
193 /* redraw the entire map by destroying all map items and redrawing them */
194 track_save(appdata->project, appdata->track.track);
195 diff_save(appdata->project, appdata->osm);
196 map_clear(appdata, MAP_LAYER_ALL);
197 osm_free(&appdata->icon, appdata->osm);
198
199 appdata->osm = osm_parse(appdata->project->osm);
200 diff_restore(appdata, appdata->project, appdata->osm);
201 map_paint(appdata);
202
203 appdata->track.track = track_restore(appdata, appdata->project);
204 if(appdata->track.track)
205 map_track_draw(appdata->map, appdata->track.track);
206
207 wms_load(appdata);
208 }
209 #endif
210
211 static void
212 cb_menu_style(GtkWidget *window, gpointer data) {
213 appdata_t *appdata = (appdata_t*)data;
214
215 style_select(GTK_WIDGET(appdata->window), appdata);
216 }
217
218 static void
219 cb_menu_save_changes(GtkWidget *window, gpointer data) {
220 appdata_t *appdata = (appdata_t*)data;
221
222 diff_save(appdata->project, appdata->osm);
223 statusbar_set(appdata, _("Saved all changes in projects diff file"), FALSE);
224 }
225
226
227 #ifdef USE_HILDON
228 static void
229 cb_menu_fullscreen(GtkWidget *widget, gpointer data) {
230 appdata_t *appdata = (appdata_t *)data;
231
232 if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)))
233 gtk_window_fullscreen(GTK_WINDOW(appdata->window));
234 else
235 gtk_window_unfullscreen(GTK_WINDOW(appdata->window));
236 }
237 #endif
238
239 static void
240 cb_menu_zoomin(GtkWidget *widget, appdata_t *appdata) {
241 if(!appdata || !appdata->map) return;
242
243 map_set_zoom(appdata->map, appdata->map->state->zoom*ZOOM_FACTOR_MENU, TRUE);
244 printf("zoom is now %f\n", appdata->map->state->zoom);
245 }
246
247 static void
248 cb_menu_zoomout(GtkWidget *widget, appdata_t *appdata) {
249 if(!appdata || !appdata->map) return;
250
251 map_set_zoom(appdata->map, appdata->map->state->zoom/ZOOM_FACTOR_MENU, TRUE);
252 printf("zoom is now %f\n", appdata->map->state->zoom);
253 }
254
255 static void
256 cb_menu_track_import(GtkWidget *window, appdata_t *appdata) {
257
258 /* open a file selector */
259 GtkWidget *dialog;
260
261 #ifdef USE_HILDON
262 dialog = hildon_file_chooser_dialog_new(GTK_WINDOW(appdata->window),
263 GTK_FILE_CHOOSER_ACTION_OPEN);
264 #else
265 dialog = gtk_file_chooser_dialog_new (_("Import track file"),
266 GTK_WINDOW(appdata->window),
267 GTK_FILE_CHOOSER_ACTION_OPEN,
268 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
269 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
270 NULL);
271 #endif
272
273 /* use path if one is present */
274 if(appdata->track.import_path)
275 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
276 appdata->track.import_path);
277
278 gtk_widget_show_all (GTK_WIDGET(dialog));
279 if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_FM_OK) {
280 char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
281
282 /* load a track */
283 track_do(appdata, TRACK_IMPORT, filename);
284 if(appdata->track.track) {
285
286 /* save path if gpx was successfully loaded */
287 char *r = strrchr(filename, '/');
288
289 /* there is a delimiter, use everything left of it as path */
290 if(r) {
291 *r = 0;
292 if(appdata->track.import_path) g_free(appdata->track.import_path);
293 appdata->track.import_path = g_strdup(filename);
294 /* restore path ... just in case ... */
295 *r = '/';
296 }
297 }
298 g_free (filename);
299 }
300
301 gtk_widget_destroy (dialog);
302 }
303
304 static void
305 cb_menu_track_gps(GtkWidget *window, gpointer data) {
306 appdata_t *appdata = (appdata_t*)data;
307
308 if(gtk_check_menu_item_get_active(
309 GTK_CHECK_MENU_ITEM(appdata->track.menu_item_gps))) {
310 track_do(appdata, TRACK_GPS, NULL);
311 } else {
312 track_do(appdata, TRACK_NONE, NULL);
313 }
314 }
315
316 static void
317 cb_menu_track_export(GtkWidget *window, gpointer data) {
318 appdata_t *appdata = (appdata_t*)data;
319 messagef(GTK_WIDGET(appdata->window), _("NIY"),
320 _("Track export is not yet supported."));
321 }
322
323 static void
324 cb_menu_track_clear(GtkWidget *window, gpointer data) {
325 appdata_t *appdata = (appdata_t*)data;
326 track_do(appdata, TRACK_NONE, NULL);
327 }
328
329 void menu_create(appdata_t *appdata) {
330 GtkWidget *menu, *item, *submenu;
331 menu = gtk_menu_new();
332
333
334 /* -------------------- Project submenu -------------------- */
335
336 item = gtk_menu_item_new_with_label( _("Project") );
337 gtk_menu_append(GTK_MENU_SHELL(menu), item);
338 submenu = gtk_menu_new();
339 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
340
341 item = gtk_menu_item_new_with_label( _("Open...") );
342 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
343 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_project_open),
344 appdata);
345
346 appdata->menu_item_project_close = item =
347 gtk_menu_item_new_with_label( _("Close") );
348 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
349 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_project_close),
350 appdata);
351
352 /* --------------- view menu ------------------- */
353
354 gtk_menu_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
355
356 appdata->menu_view = item =
357 gtk_menu_item_new_with_label( _("View") );
358 gtk_menu_append(GTK_MENU_SHELL(menu), item);
359 submenu = gtk_menu_new();
360 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
361
362 #ifdef USE_HILDON
363 appdata->fullscreen_menu_item =
364 item = gtk_check_menu_item_new_with_label( _("Fullscreen") );
365 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
366 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_fullscreen),
367 appdata);
368 #endif
369
370 item = gtk_menu_item_new_with_label( _("Zoom +" ));
371 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
372 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_zoomin), appdata);
373
374 item = gtk_menu_item_new_with_label( _("Zoom -") );
375 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
376 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_zoomout), appdata);
377
378 /* -------------------- OSM submenu -------------------- */
379
380 appdata->menu_osm = item = gtk_menu_item_new_with_label( _("OSM") );
381 gtk_menu_append(GTK_MENU_SHELL(menu), item);
382 submenu = gtk_menu_new();
383 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
384
385 item = gtk_menu_item_new_with_label( _("Upload...") );
386 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
387 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_upload), appdata);
388
389 item = gtk_menu_item_new_with_label( _("Download...") );
390 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
391 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_download), appdata);
392
393 gtk_menu_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
394
395 item = gtk_menu_item_new_with_label( _("Save diff file") );
396 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
397 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_save_changes),
398 appdata);
399
400 /* -------------------- wms submenu -------------------- */
401
402 appdata->menu_wms = item = gtk_menu_item_new_with_label( _("WMS") );
403 gtk_menu_append(GTK_MENU_SHELL(menu), item);
404 submenu = gtk_menu_new();
405 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
406
407 item = gtk_menu_item_new_with_label( _("Import...") );
408 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
409 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_wms_import),
410 appdata);
411
412 appdata->menu_item_wms_clear = item =
413 gtk_menu_item_new_with_label( _("Clear") );
414 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
415 gtk_widget_set_sensitive(item, FALSE);
416 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_wms_clear),
417 appdata);
418
419 appdata->menu_item_wms_adjust = item =
420 gtk_menu_item_new_with_label( _("Adjust") );
421 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
422 gtk_widget_set_sensitive(item, FALSE);
423 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_wms_adjust),
424 appdata);
425
426 /* -------------------- map submenu -------------------- */
427
428 appdata->menu_map = item = gtk_menu_item_new_with_label( _("Map") );
429 gtk_menu_append(GTK_MENU_SHELL(menu), item);
430 submenu = gtk_menu_new();
431 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
432
433 appdata->menu_item_map_hide_sel = item =
434 gtk_menu_item_new_with_label( _("Hide selected") );
435 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
436 gtk_widget_set_sensitive(item, FALSE);
437 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_hide_sel),
438 appdata);
439
440 appdata->menu_item_map_show_all = item =
441 gtk_menu_item_new_with_label( _("Show all") );
442 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
443 gtk_widget_set_sensitive(item, FALSE);
444 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_map_show_all),
445 appdata);
446
447 gtk_menu_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
448
449 item = gtk_menu_item_new_with_label( _("Redraw") );
450 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
451 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_redraw), appdata);
452
453 gtk_menu_append(GTK_MENU_SHELL(submenu), gtk_separator_menu_item_new());
454
455 item = gtk_menu_item_new_with_label( _("Style...") );
456 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
457 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_style), appdata);
458
459 /* -------------------- track submenu -------------------- */
460
461 appdata->track.menu_track = item = gtk_menu_item_new_with_label(_("Track"));
462 gtk_menu_append(GTK_MENU_SHELL(menu), item);
463 submenu = gtk_menu_new();
464 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
465
466 appdata->track.menu_item_import =
467 item = gtk_menu_item_new_with_label( _("Import...") );
468 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
469 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_import),
470 appdata);
471
472 appdata->track.menu_item_export =
473 item = gtk_menu_item_new_with_label( _("Export...") );
474 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
475 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_export),
476 appdata);
477
478 appdata->track.menu_item_clear =
479 item = gtk_menu_item_new_with_label( _("Clear") );
480 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
481 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_clear),
482 appdata);
483
484 appdata->track.menu_item_gps =
485 item = gtk_check_menu_item_new_with_label( _("GPS") );
486 gtk_menu_append(GTK_MENU_SHELL(submenu), item);
487 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_track_gps),
488 appdata);
489
490 /* ------------------------------------------------------- */
491
492 gtk_menu_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
493
494
495 item = gtk_menu_item_new_with_label( _("About...") );
496 gtk_menu_append(GTK_MENU_SHELL(menu), item);
497 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_about), appdata);
498
499
500 item = gtk_menu_item_new_with_label( _("Quit") );
501 gtk_menu_append(GTK_MENU_SHELL(menu), item);
502 g_signal_connect(item, "activate", GTK_SIGNAL_FUNC(cb_menu_quit), appdata);
503
504 #ifdef USE_HILDON
505 hildon_window_set_menu(appdata->window, GTK_MENU(menu));
506 #else
507 /* attach ordinary gtk menu */
508 GtkWidget *menu_bar = gtk_menu_bar_new();
509
510 GtkWidget *root_menu = gtk_menu_item_new_with_label (_("Menu"));
511 gtk_widget_show(root_menu);
512
513 gtk_menu_bar_append(menu_bar, root_menu);
514 gtk_menu_item_set_submenu(GTK_MENU_ITEM (root_menu), menu);
515
516 gtk_widget_show(menu_bar);
517 gtk_box_pack_start(GTK_BOX(appdata->vbox), menu_bar, 0, 0, 0);
518 #endif
519 }
520
521 /********************* end of menu **********************/
522
523
524 void cleanup(appdata_t *appdata) {
525 settings_save(appdata->settings);
526
527 #ifdef USE_HILDON
528 if(appdata->osso_context)
529 osso_deinitialize(appdata->osso_context);
530
531 appdata->program = NULL;
532 #endif
533
534 printf("waiting for gtk to shut down ");
535
536 /* let gtk clean up first */
537 while(gtk_events_pending()) {
538 putchar('.');
539 gtk_main_iteration();
540 }
541
542 printf(" ok\n");
543
544 /* save project file */
545 if(appdata->project)
546 project_save(GTK_WIDGET(appdata->window), appdata->project);
547
548 map_remove_bg_image(appdata->map);
549
550 osm_free(&appdata->icon, appdata->osm);
551
552 curl_global_cleanup();
553
554 josm_presets_free(appdata->presets);
555
556 icon_free_all(&appdata->icon);
557
558 gps_release(appdata);
559
560 settings_free(appdata->settings);
561
562 statusbar_free(appdata->statusbar);
563
564 iconbar_free(appdata->iconbar);
565
566 project_free(appdata->project);
567
568 puts("everything is gone");
569 }
570
571 void on_window_destroy (GtkWidget *widget, gpointer data) {
572 appdata_t *appdata = (appdata_t*)data;
573
574 gtk_main_quit();
575 appdata->window = NULL;
576 }
577
578 gboolean on_window_key_press(GtkWidget *widget,
579 GdkEventKey *event, gpointer data) {
580 appdata_t *appdata = (appdata_t*)data;
581 int handled = FALSE;
582
583 // printf("key event %d\n", event->keyval);
584
585 // the map handles some keys on its own ...
586 switch(event->keyval) {
587 #ifdef USE_HILDON
588
589 #if 0
590 case HILDON_HARDKEY_SELECT:
591 handled = TRUE;
592 break;
593 #endif
594
595 case HILDON_HARDKEY_FULLSCREEN:
596 {
597 gboolean fullscreen = !gtk_check_menu_item_get_active(
598 GTK_CHECK_MENU_ITEM(appdata->fullscreen_menu_item));
599 gtk_check_menu_item_set_active(
600 GTK_CHECK_MENU_ITEM(appdata->fullscreen_menu_item), fullscreen);
601
602 if(fullscreen)
603 gtk_window_fullscreen(GTK_WINDOW(appdata->window));
604 else
605 gtk_window_unfullscreen(GTK_WINDOW(appdata->window));
606
607 handled = TRUE;
608 }
609 break;
610 #endif
611 }
612
613 /* forward unprocessed key presses to map */
614 if(!handled && appdata->project && appdata->osm)
615 handled = map_key_press_event(appdata, event);
616
617 return handled;
618 }
619
620 int main(int argc, char *argv[]) {
621 appdata_t appdata;
622
623 /* init appdata */
624 memset(&appdata, 0, sizeof(appdata));
625
626 printf("Using locale for %s in %s\n", PACKAGE, LOCALEDIR);
627
628 setlocale(LC_ALL, "");
629 bindtextdomain(PACKAGE, LOCALEDIR);
630 bind_textdomain_codeset(PACKAGE, "UTF-8");
631 textdomain(PACKAGE);
632
633 /* Must initialize libcurl before any threads are started */
634 curl_global_init(CURL_GLOBAL_ALL);
635
636 g_thread_init(NULL);
637
638 gps_init(&appdata);
639
640 gtk_init (&argc, &argv);
641
642 #ifdef USE_HILDON
643 printf("Installing osso context for \"org.harbaum." PACKAGE "\"\n");
644 appdata.osso_context = osso_initialize("org.harbaum."PACKAGE,
645 VERSION, TRUE, NULL);
646 if(appdata.osso_context == NULL)
647 fprintf(stderr, "error initiating osso context\n");
648
649 dbus_register(&appdata);
650 #endif
651
652 #ifdef USE_HILDON
653 /* Create the hildon program and setup the title */
654 appdata.program = HILDON_PROGRAM(hildon_program_get_instance());
655 g_set_application_name("OSM2Go");
656
657 /* Create HildonWindow and set it to HildonProgram */
658 appdata.window = HILDON_WINDOW(hildon_window_new());
659 hildon_program_add_window(appdata.program, appdata.window);
660 #else
661 /* Create a Window. */
662 appdata.window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
663 gtk_window_set_title(GTK_WINDOW(appdata.window), "OSM2Go");
664 /* Set a decent default size for the window. */
665 gtk_window_set_default_size(GTK_WINDOW(appdata.window),
666 DEFAULT_WIDTH, DEFAULT_HEIGHT);
667 gtk_window_set_icon(GTK_WINDOW(appdata.window),
668 icon_load(&appdata.icon, PACKAGE));
669 #endif
670
671 g_signal_connect(G_OBJECT(appdata.window), "destroy",
672 G_CALLBACK(on_window_destroy), &appdata);
673
674 g_signal_connect(G_OBJECT(appdata.window), "key_press_event",
675 G_CALLBACK(on_window_key_press), &appdata);
676
677 appdata.vbox = gtk_vbox_new(FALSE,0);
678 menu_create(&appdata);
679
680 /* user specific init */
681 appdata.settings = settings_load();
682
683 /* ----------------------- setup main window ---------------- */
684
685 GtkWidget *hbox = gtk_hbox_new(FALSE,0);
686 GtkWidget *vbox = gtk_vbox_new(FALSE,0);
687
688 #ifdef PORTRAIT
689 gtk_box_pack_start(GTK_BOX(vbox), iconbar_new(&appdata), FALSE, FALSE, 0);
690 #endif
691 gtk_box_pack_start(GTK_BOX(vbox), map_new(&appdata), TRUE, TRUE, 0);
692 gtk_box_pack_start(GTK_BOX(vbox), statusbar_new(&appdata), FALSE, FALSE, 0);
693
694 #ifndef PORTRAIT
695 gtk_box_pack_start(GTK_BOX(hbox), iconbar_new(&appdata), FALSE, FALSE, 0);
696 #endif
697 gtk_box_pack_start(GTK_BOX(hbox), gtk_vseparator_new(), FALSE, FALSE, 0);
698 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
699
700 gtk_box_pack_start(GTK_BOX(appdata.vbox), hbox, TRUE, TRUE, 0);
701
702 gtk_container_add(GTK_CONTAINER(appdata.window), appdata.vbox);
703
704 gtk_widget_show_all(GTK_WIDGET(appdata.window));
705
706 appdata.presets = josm_presets_load();
707
708 /* let gtk do its thing before loading the data, */
709 /* so the user sees something */
710 while(gtk_events_pending()) {
711 putchar('.');
712 gtk_main_iteration();
713 }
714
715 /* load project if one is specified in the settings */
716 if(appdata.settings->project)
717 project_load(&appdata, appdata.settings->project);
718
719 main_project_loaded(&appdata);
720
721 /* ------------ jump into main loop ---------------- */
722
723 gtk_main();
724
725 track_save(appdata.project, appdata.track.track);
726
727 /* save a diff if there are dirty entries */
728 diff_save(appdata.project, appdata.osm);
729
730 cleanup(&appdata);
731
732 return 0;
733 }