4 // FIXME temporary fix for enum
5 #include "projection.h"
11 #include "transform.h"
19 #include "navigation.h"
29 // FIXME This is for 3d fonts. Needs QuesoGLC. Could probably (and should) be moved to graphics instead
30 // since fonts here are handled by CEGUI
33 #include "sdl_events.h"
34 #include "cegui_keyboard.h"
35 #include "wmcontrol.h"
52 struct navit *sdl_gui_navit;
54 #include <CEGUI/RendererModules/OpenGLGUIRenderer/openglrenderer.h>
55 #include "CEGUIDefaultResourceProvider.h"
56 CEGUI::OpenGLRenderer* renderer;
61 CEGUI::Window* myRoot;
63 #define MODULE "gui_sdl"
66 #define _(STRING) gettext(STRING)
68 char media_window_title[255], media_cmd[255];
73 struct bookmark *next;
79 struct former_dest *next;
83 gui_sdl_set_graphics(struct gui_priv *this_, struct graphics *gra)
85 dbg(1,"setting up the graphics\n");
87 DLid=(GLuint *)graphics_get_data(gra, "opengl_displaylist");
94 sdl_update_roadbook(struct navigation *nav)
97 using namespace CEGUI;
99 struct navigation_list *list;
100 list=navigation_list_new(nav);
102 // First, ensure the navigation tip is visible. quick workaround for when resuming a destination
103 WindowManager::getSingleton().getWindow("Navit/Routing/Tips")->show();
105 // update the 'Navigation Tip' on the main window
108 item_attr_get(navigation_list_get_item(list), attr_navigation_speech, &attr);
109 WindowManager::getSingleton().getWindow("Navit/Routing/Tips")->setText((CEGUI::utf8*)(attr.u.str));
111 catch (CEGUI::Exception& e)
113 fprintf(stderr,"CEGUI Exception occured: \n%s\n", e.getMessage().c_str());
114 printf("Missing control!...\n");
117 // Then, update the whole roadbook
120 /* Currently we use the 'Navit' text to display the roadbook, until Mineque design a button for that
121 if(! WindowManager::getSingleton().getWindow("OSD/RoadbookButton")->isVisible()){
122 WindowManager::getSingleton().getWindow("OSD/RoadbookButton")->show();
126 MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Roadbook"));
132 list=navigation_list_new(nav);
133 while ((item=navigation_list_get_item(list))) {
135 item_attr_get(item, attr_navigation_short, &attr);
136 ListboxTextItem* itemListbox = new ListboxTextItem(attr.u.str);
137 itemListbox->setSelectionBrushImage("TaharezLook", "MultiListSelectionBrush");
138 mcl->setItem(itemListbox, 0, mcl->getRowCount()-1);
140 navigation_list_destroy(list);
142 catch (CEGUI::Exception& e)
144 dbg(0,"CEGUI Exception occured: \n%s\n", e.getMessage().c_str());
145 dbg(0,"Missing control!\n");
150 static void show_road_name(){
151 struct tracking *tracking;
152 struct attr road_name_attr;
153 tracking=navit_get_tracking(sdl_gui_navit);
155 using namespace CEGUI;
158 if (tracking && tracking_get_current_attr(tracking, attr_label, &road_name_attr) ) {
159 WindowManager::getSingleton().getWindow("Navit/Routing/CurrentRoadName")->setText((CEGUI::utf8*)(road_name_attr.u.str));
164 static gboolean gui_timeout_cb(gpointer data)
169 static int gui_run_main_loop(struct gui_priv *this_)
172 using namespace CEGUI;
173 dbg(0,"Entering main loop\n");
175 bool must_quit = false;
177 // get "run-time" in seconds
178 double last_time_pulse = static_cast<double>(SDL_GetTicks());
183 struct map_selection sel;
185 memset(&sel, 0, sizeof(sel));
186 sel.u.c_rect.rl.x=800;
187 sel.u.c_rect.rl.y=600;
189 transform_set_screen_selection(navit_get_trans(this_->nav), &sel);
190 navit_draw(this_->nav);
194 struct navigation *navig;
195 navig=navit_get_navigation(sdl_gui_navit);
197 navigation_register_callback(navig,
198 attr_navigation_long,
199 callback_new_0((void (*)())sdl_update_roadbook)
202 timeout = g_timeout_source_new(100);
203 g_source_set_callback(timeout, gui_timeout_cb, NULL, NULL);
204 g_source_attach(timeout, NULL);
209 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
211 glMatrixMode(GL_MODELVIEW);
214 if(VIEW_MODE==VM_3D){
215 gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);
218 // FIXME This is to draw a ground. This is ugly and need to be fixed.
219 // Without it, we see the color of sky under the roads.
220 glColor4f(0.0f,0.7f,0.35f,1.0f);
222 glVertex3f( -800,-600*3, 0.0f);
223 glVertex3f( -800,600*2, 0.0f);
224 glVertex3f( 1600,600*2, 0.0f);
225 glVertex3f( 1600,-600*3, 0.0f);
230 profile(0,"graphics_redraw");
231 // if (!g_main_context_iteration (NULL, FALSE))
233 g_main_context_iteration (NULL, TRUE);
236 profile(0,"main context");
240 navit_draw_displaylist(sdl_gui_navit);
242 inject_input(must_quit);
246 // Render the cursor.
249 float cursor_size=15.0f;
250 glColor4f(0.0f,1.0f,0.0f,0.75f);
252 glBegin(GL_TRIANGLES);
253 glVertex3f( x, y-cursor_size, 0.0f);
254 glVertex3f(x-cursor_size,y+cursor_size, 0.0f);
255 glVertex3f( x+cursor_size,y+cursor_size, 0.0f);
262 if(SDL_GetTicks()-last_time_pulse>1000){
263 sprintf(fps,"%i fps",frames); // /(SDL_GetTicks()/1000));
265 last_time_pulse = SDL_GetTicks();
267 WindowManager::getSingleton().getWindow("OSD/Satellites")->setText(fps);
272 CEGUI::System::getSingleton().renderGUI();
276 SDL_GL_SwapBuffers();
278 g_source_destroy(timeout);
282 static struct menu_priv *
283 add_menu(struct menu_priv *menu, struct menu_methods *meth, char *name, enum menu_type type, struct callback *cb);
285 static struct menu_methods menu_methods = {
291 // GtkAction *action;
292 struct gui_priv *gui;
295 struct menu_priv *child;
296 struct menu_priv *sibling;
301 #define MENU_BOOKMARK 2
302 #define MENU_FORMER_DEST 3
304 static struct menu_priv *
305 add_menu(struct menu_priv *menu, struct menu_methods *meth, char *name, enum menu_type type, struct callback *cb)
307 using namespace CEGUI;
309 dbg(0,"callback : %s\n",name);
311 if(menu==(struct menu_priv *)(MENU_BOOKMARK)){
312 dbg(0,"Item is a bookmark\n");
313 MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Bookmarks/Listbox"));
315 ListboxTextItem* itemListbox = new ListboxTextItem((CEGUI::utf8*)(name));
316 itemListbox->setSelectionBrushImage("TaharezLook", "MultiListSelectionBrush");
317 mcl->addRow(itemListbox,0);
319 struct bookmark *newB = g_new0(struct bookmark, 1);
320 newB->name=g_strdup(name);
323 newB->next = bookmarks;
329 if(menu==(struct menu_priv *)(MENU_FORMER_DEST)){
330 dbg(0,"Item is a former destination\n");
331 MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("FormerDests/Listbox"));
333 ListboxTextItem* itemListbox = new ListboxTextItem((CEGUI::utf8*)(name));
334 itemListbox->setSelectionBrushImage("TaharezLook", "MultiListSelectionBrush");
335 mcl->addRow(itemListbox,0);
337 struct former_dest *newB = g_new0(struct former_dest, 1);
338 newB->name=g_strdup(name);
341 newB->next = former_dests;
347 if(!strcmp(name,"Bookmarks")){
348 dbg(0,"Menu is the bookmark menu!\n");
349 return (struct menu_priv *)MENU_BOOKMARK;
350 } else if(!strcmp(name,"Former Destinations")){
351 dbg(0,"Menu is the Former Destinations menu!\n");
352 return (struct menu_priv *)MENU_FORMER_DEST;
354 return (struct menu_priv *)1;
358 bool BookmarkGo(const char * name)
360 dbg(0,"searching for bookmark %s\n",name);
361 bookmark * bookmark_search=bookmarks;
362 while ( bookmark_search ){
363 dbg(0,"-> %s\n",bookmark_search->name);
364 if(!strcmp(bookmark_search->name,name)){
365 dbg(0,"Got it :)\n");
366 callback_call_0(bookmark_search->cb);
368 bookmark_search=bookmark_search->next;
373 bool FormerDestGo(const char * name)
375 dbg(0,"searching for former_dest %s\n",name);
376 former_dest * former_dest_search=former_dests;
377 while ( former_dest_search ){
378 dbg(0,"-> %s\n",former_dest_search->name);
379 if(!strcmp(former_dest_search->name,name)){
380 dbg(0,"Got it :)\n");
381 callback_call_0(former_dest_search->cb);
383 former_dest_search=former_dest_search->next;
387 static struct menu_priv *
388 gui_sdl_toolbar_new(struct gui_priv *this_, struct menu_methods *meth)
390 return NULL; //gui_gtk_ui_new(this_, meth, "/ui/ToolBar", nav, 0);
393 static struct statusbar_priv *
394 gui_sdl_statusbar_new(struct gui_priv *gui, struct statusbar_methods *meth)
396 return NULL; //gui_gtk_ui_new(this_, meth, "/ui/ToolBar", nav, 0);
399 static struct menu_priv *
400 gui_sdl_menubar_new(struct gui_priv *this_, struct menu_methods *meth)
403 return (struct menu_priv *) 1; //gui_gtk_ui_new(this_, meth, "/ui/MenuBar", nav, 0);
406 static struct menu_priv *
407 gui_sdl_popup_new(struct gui_priv *this_, struct menu_methods *meth)
409 return NULL; //gui_gtk_ui_new(this_, meth, "/ui/PopUp", nav, 1);
412 struct gui_methods gui_sdl_methods = {
415 gui_sdl_statusbar_new,
417 gui_sdl_set_graphics,
425 glClearColor(0.3,0.7,1.0,0);
427 if(VIEW_MODE==VM_2D){
428 glMatrixMode( GL_PROJECTION );
431 glOrtho( 0, XRES, YRES, 0, -1, 1 );
433 glMatrixMode(GL_MODELVIEW);
435 CEGUI::WindowManager::getSingleton().getWindow("OSD/ViewMode")->setText("2D");
438 // Dimensions de la fenetre de rendu
439 glViewport(0, 0, XRES, YRES);
440 // Initialisation de la matrice de projection
441 glMatrixMode(GL_PROJECTION);
443 gluPerspective(45, 1.0, 0.1, 2800.0);
444 // Rendu avec lissage de Gouraud
445 // glShadeModel(GL_SMOOTH);
446 // glEnable(GL_DEPTH_TEST);
449 glMatrixMode(GL_MODELVIEW);
451 // gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);
452 CEGUI::WindowManager::getSingleton().getWindow("OSD/ViewMode")->setText("3D");
456 // GLuint glGenLists(GLsizei numberOfIDsRequired);
457 // linesDL = glGenLists(1);
459 if( glGetError() != GL_NO_ERROR ) {
465 bool ToggleView(const CEGUI::EventArgs& event)
467 VIEW_MODE=!VIEW_MODE;
471 bool MoveCamera(const CEGUI::EventArgs& event){
473 CEGUI::Scrollbar * sb = static_cast<const CEGUI::Scrollbar *>(CEGUI::WindowManager::getSingleton().getWindow("OSD/Scrollbar1"));
474 dbg(0,"moving : %f\n",sb->getScrollPosition());
475 eyeZ=-sb->getScrollPosition();
483 static void init_sdlgui(char * skin_layout,int fullscreen,int tilt)
485 SDL_Surface * screen;
486 // atexit (SDL_Quit);
487 SDL_Init (SDL_INIT_VIDEO);
489 const SDL_VideoInfo *videoInfo;
490 videoInfo = SDL_GetVideoInfo( );
494 fprintf( stderr, "Video query failed: %s\n",
498 /* the flags to pass to SDL_SetVideoMode */
499 videoFlags = SDL_OPENGL; /* Enable OpenGL in SDL */
500 videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */
501 videoFlags |= SDL_HWPALETTE; /* Store the palette in hardware */
502 videoFlags |= SDL_RESIZABLE; /* Enable window resizing */
504 /* This checks to see if surfaces can be stored in memory */
505 if ( videoInfo->hw_available )
506 videoFlags |= SDL_HWSURFACE;
508 videoFlags |= SDL_SWSURFACE;
510 /* This checks if hardware blits can be done */
511 if ( videoInfo->blit_hw )
512 videoFlags |= SDL_HWACCEL;
514 /* Sets up OpenGL double buffering */
515 SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
517 SDL_WM_SetCaption("NavIt - The OpenSource vector based navigation engine", NULL);
519 /* get a SDL surface */
520 screen = SDL_SetVideoMode( XRES, YRES, 32,
523 if (screen == NULL) {
524 fprintf (stderr, "Can't set SDL: %s\n", SDL_GetError ());
528 SDL_WM_ToggleFullScreen(screen);
530 SDL_ShowCursor (SDL_ENABLE);
531 SDL_EnableUNICODE (1);
532 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
538 renderer = new CEGUI::OpenGLRenderer(0,XRES,YRES);
539 new CEGUI::System(renderer);
541 using namespace CEGUI;
543 SDL_ShowCursor(SDL_ENABLE);
544 SDL_EnableUNICODE(1);
545 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
547 CEGUI::DefaultResourceProvider* rp = static_cast<CEGUI::DefaultResourceProvider*>
548 (System::getSingleton().getResourceProvider());
551 // FIXME This should maybe move to navit.xml
552 static char *datafiles_path[]={
553 "./gui/sdl/datafiles",
554 "/usr/share/navit/datafiles",
555 "/usr/local/share/navit/datafiles",
559 char **filename=datafiles_path;
562 if (FILE * file = fopen(*filename, "r"))
571 // FIXME Elaborate the possible solutions
572 printf("Can't find the datafiles directory for CEGUI files. Navit will probably crash :)\n");
574 printf("Loading SDL datafiles from %s\n",*filename);
577 rp->setResourceGroupDirectory("schemes", g_strdup_printf("%s/schemes/",*filename));
578 rp->setResourceGroupDirectory("imagesets", g_strdup_printf("%s/imagesets/",*filename));
579 rp->setResourceGroupDirectory("fonts", g_strdup_printf("%s/fonts/",*filename));
580 rp->setResourceGroupDirectory("layouts", g_strdup_printf("%s/layouts/",*filename));
581 rp->setResourceGroupDirectory("looknfeels", g_strdup_printf("%s/looknfeel/",*filename));
582 rp->setResourceGroupDirectory("lua_scripts", g_strdup_printf("%s/lua_scripts/",*filename));
585 CEGUI::Imageset::setDefaultResourceGroup("imagesets");
586 CEGUI::Font::setDefaultResourceGroup("fonts");
587 CEGUI::Scheme::setDefaultResourceGroup("schemes");
588 CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");
589 CEGUI::WindowManager::setDefaultResourceGroup("layouts");
590 CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");
593 sprintf (buffer, "%s.scheme", skin_layout);
594 dbg(1,"Loading scheme : %s\n",buffer);
596 CEGUI::SchemeManager::getSingleton().loadScheme(buffer);
598 CEGUI::FontManager::getSingleton().createFont("DejaVuSans-10.font");
599 CEGUI::FontManager::getSingleton().createFont("DejaVuSans-14.font");
601 CEGUI::System::getSingleton().setDefaultFont("DejaVuSans-10");
603 CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
605 dbg(1,"Loading layout : %s\n",buffer);
607 sprintf (buffer, "%s.layout", skin_layout);
609 myRoot = CEGUI::WindowManager::getSingleton().loadWindowLayout(buffer);
611 CEGUI::System::getSingleton().setGUISheet(myRoot);
615 CEGUI::WindowManager::getSingleton().getWindow("OSD/Quit")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(ButtonQuit));
616 // CEGUI::WindowManager::getSingleton().getWindow("OSD/Quit")->setText(_("Quit"));
618 CEGUI::WindowManager::getSingleton().getWindow("ZoomInButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(ZoomIn));
619 // CEGUI::WindowManager::getSingleton().getWindow("ZoomInButton")->setText(_("ZoomIn"));
621 CEGUI::WindowManager::getSingleton().getWindow("ZoomOutButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(ZoomOut));
622 // CEGUI::WindowManager::getSingleton().getWindow("ZoomOutButton")->setText(_("ZoomOut"));
624 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/CountryEditbox")->subscribeEvent(Window::EventKeyUp, Event::Subscriber(DestinationEntryChange));
625 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/CountryEditbox")->subscribeEvent(Window::EventMouseButtonDown, Event::Subscriber(handleMouseEnters));
626 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/TownEditbox")->subscribeEvent(Window::EventKeyUp, Event::Subscriber(DestinationEntryChange));
627 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/TownEditbox")->subscribeEvent(Window::EventMouseButtonDown, Event::Subscriber(handleMouseEnters));
628 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/StreetEditbox")->subscribeEvent(Window::EventKeyUp, Event::Subscriber(DestinationEntryChange));
629 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/StreetEditbox")->subscribeEvent(Window::EventMouseButtonDown, Event::Subscriber(handleMouseEnters));
631 CEGUI::WindowManager::getSingleton().getWindow("DestinationButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(DestinationWindowSwitch));
632 CEGUI::WindowManager::getSingleton().getWindow("DestinationWindow/Address")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(AddressSearchSwitch));
633 CEGUI::WindowManager::getSingleton().getWindow("DestinationWindow/Bookmark")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(BookmarkSelectionSwitch));
634 CEGUI::WindowManager::getSingleton().getWindow("DestinationWindow/FormerDest")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(FormerDestSelectionSwitch));
637 CEGUI::WindowManager::getSingleton().getWindow("OSD/ViewMode")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(ToggleView));
639 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/GO")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(ButtonGo));
640 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/KB")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(ShowKeyboard));
642 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/Listbox")->subscribeEvent(MultiColumnList::EventSelectionChanged, Event::Subscriber(ItemSelect));
643 CEGUI::WindowManager::getSingleton().getWindow("Bookmarks/Listbox")->subscribeEvent(MultiColumnList::EventSelectionChanged, Event::Subscriber(BookmarkSelect));
644 CEGUI::WindowManager::getSingleton().getWindow("FormerDests/Listbox")->subscribeEvent(MultiColumnList::EventSelectionChanged, Event::Subscriber(FormerDestSelect));
647 // Translation for StaticTexts (labels)
648 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/Country")->setText(_("Country"));
649 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/Town")->setText(_("City"));
650 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/Street")->setText(_("Street"));
653 MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("AdressSearch/Listbox"));
655 mcl->setSelectionMode(MultiColumnList::RowSingle) ;
656 mcl->addColumn("Value", 0, cegui_absdim(200.0));
657 mcl->addColumn("ID", 1, cegui_absdim(70.0));
658 mcl->addColumn("Assoc", 2, cegui_absdim(70.0));
659 mcl->addColumn("x", 3, cegui_absdim(70.0));
660 mcl->addColumn("y", 4, cegui_absdim(70.0));
662 MultiColumnList* mcl2 = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Roadbook"));
664 mcl2->setSelectionMode(MultiColumnList::RowSingle) ;
665 mcl2->addColumn("Instructions", 0, cegui_absdim(700.0));
667 MultiColumnList* mcl3 = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Bookmarks/Listbox"));
669 mcl3->setSelectionMode(MultiColumnList::RowSingle) ;
670 mcl3->addColumn("Name", 0, cegui_absdim(700.0));
672 MultiColumnList* mcl4 = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("FormerDests/Listbox"));
674 mcl4->setSelectionMode(MultiColumnList::RowSingle) ;
675 mcl4->addColumn("Name", 0, cegui_absdim(700.0));
679 CEGUI::WindowManager::getSingleton().getWindow("OSD/Scrollbar1")->subscribeEvent(Scrollbar::EventScrollPositionChanged, Event::Subscriber(MoveCamera));
681 // FIXME : char (conf) -> int (init) -> char (property) = bad
683 sprintf (buffer,"%i",tilt);
684 CEGUI::WindowManager::getSingleton().getWindow("OSD/Scrollbar1")->setProperty("ScrollPosition",buffer);
687 CEGUI::WindowManager::getSingleton().getWindow("OSD/RoadbookButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(RoadBookSwitch));
688 CEGUI::WindowManager::getSingleton().getWindow("OSD/RoadbookButton")->setText(_("RoadBook"));
690 CEGUI::WindowManager::getSingleton().getWindow("OSD/nGhostButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(Switch_to_nGhost));
691 // this one is maybe not needed anymore
692 CEGUI::WindowManager::getSingleton().getWindow("OSD/RoadbookButton2")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(RoadBookSwitch));
695 catch (CEGUI::Exception& e)
697 fprintf(stderr,"CEGUI Exception occured: \n%s\n", e.getMessage().c_str());
698 printf("Missing control!...\n");
702 catch (CEGUI::Exception& e)
704 fprintf(stderr,"CEGUI Exception occured: \n%s\n", e.getMessage().c_str());
705 printf("quiting...\n");
709 // Force centering view on cursor
710 // navit_toggle_cursor(gui->nav);
711 // Force refresh on gps update
712 // navit_toggle_tracking(gui->nav);
716 static void vehicle_callback_handler( struct navit *nav, struct vehicle *v){
719 int sats=0, sats_used=0;
721 if (vehicle_position_attr_get(v, attr_position_speed, &attr))
722 sprintf (buffer, "%02.02f km/h", *attr.u.numd);
724 strcpy (buffer, "N/A");
725 CEGUI::WindowManager::getSingleton().getWindow("OSD/SpeedoMeter")->setText(buffer);
727 if (vehicle_position_attr_get(v, attr_position_height, &attr))
728 sprintf (buffer, "%.f m", *attr.u.numd);
730 strcpy (buffer, "N/A");
731 CEGUI::WindowManager::getSingleton().getWindow("OSD/Altimeter")->setText(buffer);
733 if (vehicle_position_attr_get(v, attr_position_sats, &attr))
735 if (vehicle_position_attr_get(v, attr_position_sats_used, &attr))
736 sats_used=attr.u.num;
737 // printf(" sats : %i, used %i: \n",sats,sats_used);
738 // Sat image hardcoded for now. may break the TaharezSkin
739 // setProperty("Image", CEGUI::PropertyHelper::imageToString( yourImageSet->getImage( "yourImageName" ) ) );
743 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar1")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOn");
745 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar1")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOff");
749 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar2")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOn");
751 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar2")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOff");
755 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar3")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOn");
757 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar3")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOff");
761 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar4")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOn");
763 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar4")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOff");
767 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar5")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOn");
769 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar5")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOff");
772 catch (CEGUI::Exception& e)
774 dbg(1,"Warning : you skin doesn't have the satellitebars. You should use Mineque's skin.\n");
779 static struct gui_priv *
780 gui_sdl_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs)
782 dbg(1,"Begin SDL init\n");
783 struct gui_priv *this_;
787 dbg(1,"VALID navit instance in gui\n");
789 dbg(1,"Invalid navit instance in gui\n");
792 dbg(1,"VALID source navit instance in gui\n");
794 dbg(1,"Invalid source navit instance in gui\n");
797 *meth=gui_sdl_methods;
799 this_=g_new0(struct gui_priv, 1);
802 struct attr *fullscreen_setting=attr_search(attrs, NULL, attr_fullscreen);
803 //FIXME currently, we only check if fullscreen is declared, but not its value
804 if(fullscreen_setting){
806 printf("fullscreen\n");
809 printf("Normal screen\n");
813 struct attr *tilt_setting=attr_search(attrs, NULL, attr_tilt);
815 if(sscanf(tilt_setting->u.str,"%i",&tilt)){
816 dbg(0,"tilt set to %i\n",tilt);
818 dbg(0,"title was not recognized : %s\n",tilt_setting->u.str);
821 dbg(0,"tilt is not set\n");
824 struct attr *view_mode_setting=attr_search(attrs, NULL, attr_view_mode);
825 if(view_mode_setting){
826 if(!strcmp(view_mode_setting->u.str,"2D")){
827 dbg(0,"View mode is 2D\n");
830 dbg(0,"view mode is something else : %s\n",view_mode_setting->u.str);
834 dbg(0,"view_mode is not set\n");
837 struct attr *media_cmd_setting=attr_search(attrs, NULL, attr_media_cmd);
838 if(media_cmd_setting){
839 dbg(0,"setting media_cmd to %s\n",media_cmd_setting->u.str);
840 strcpy(media_cmd,media_cmd_setting->u.str);
842 // strcpy(media_cmd_setting->u.str,media_window_title);
845 struct attr *media_window_title_setting=attr_search(attrs, NULL, attr_media_window_title);
846 if(media_window_title_setting){
847 strcpy(media_window_title,media_window_title_setting->u.str);
849 // strcpy(media_cmd_setting->u.str,media_window_title);
852 struct attr *skin_setting=attr_search(attrs, NULL, attr_skin);
854 init_sdlgui(skin_setting->u.str,fullscreen,tilt);
856 g_warning("Warning, no skin set for <sdl> in navit.xml. Using default one");
857 init_sdlgui("TaharezLook",fullscreen,tilt);
861 dbg(1,"End SDL init\n");
863 //gui_sdl_window.cpp:710: error: invalid conversion from 'void (*)(vehicle*)' to 'void (*)()'
864 struct callback *cb=callback_new_0(callback_cast(vehicle_callback_handler));
866 navit_add_vehicle_cb(nav,cb);
875 dbg(1,"registering sdl plugin\n");
876 plugin_register_gui_type("sdl", gui_sdl_new);