Contents of /trunk/src/main.c

Parent Directory Parent Directory | Revision Log Revision Log


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