4 // FIXME temporary fix for enum
5 #include "projection.h"
11 #include "transform.h"
20 #include "navigation.h"
30 // FIXME This is for 3d fonts. Needs QuesoGLC. Could probably (and should) be moved to graphics instead
31 // since fonts here are handled by CEGUI
34 #include "sdl_events.h"
35 #include "cegui_keyboard.h"
36 #include "wmcontrol.h"
53 struct navit *sdl_gui_navit;
55 #include <CEGUI/RendererModules/OpenGLGUIRenderer/openglrenderer.h>
56 #include "CEGUIDefaultResourceProvider.h"
57 CEGUI::OpenGLRenderer* renderer;
62 CEGUI::Window* myRoot;
64 // Temp fix for pluginless mode
65 // #define MODULE "gui_sdl"
68 #define _(STRING) gettext(STRING)
70 char media_window_title[255], media_cmd[255];
75 struct bookmark *next;
81 struct former_dest *next;
85 gui_sdl_set_graphics(struct gui_priv *this_, struct graphics *gra)
87 dbg(1,"setting up the graphics\n");
89 DLid=(GLuint *)graphics_get_data(gra, "opengl_displaylist");
96 sdl_update_roadbook(struct navigation *nav)
99 using namespace CEGUI;
106 map=navigation_get_map(nav);
109 mr=map_rect_new(map, NULL);
113 // First, ensure the navigation tip is visible. quick workaround for when resuming a destination
114 WindowManager::getSingleton().getWindow("Navit/Routing/Tips")->show();
116 // update the 'Navigation Tip' on the main window
119 item_attr_get(map_rect_get_item(mr), attr_navigation_speech, &attr);
120 map_rect_destroy(mr);
121 mr=map_rect_new(map, NULL);
122 WindowManager::getSingleton().getWindow("Navit/Routing/Tips")->setText((CEGUI::utf8*)(attr.u.str));
124 catch (CEGUI::Exception& e)
126 fprintf(stderr,"CEGUI Exception occured: \n%s\n", e.getMessage().c_str());
127 printf("Missing control!...\n");
130 // Then, update the whole roadbook
133 /* Currently we use the 'Navit' text to display the roadbook, until Mineque design a button for that
134 if(! WindowManager::getSingleton().getWindow("OSD/RoadbookButton")->isVisible()){
135 WindowManager::getSingleton().getWindow("OSD/RoadbookButton")->show();
139 MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Roadbook"));
145 while ((item=map_rect_get_item(mr))) {
147 item_attr_get(item, attr_navigation_short, &attr);
148 ListboxTextItem* itemListbox = new ListboxTextItem(attr.u.str);
149 itemListbox->setSelectionBrushImage("TaharezLook", "MultiListSelectionBrush");
150 mcl->setItem(itemListbox, 0, mcl->getRowCount()-1);
152 map_rect_destroy(mr);
154 catch (CEGUI::Exception& e)
156 dbg(0,"CEGUI Exception occured: \n%s\n", e.getMessage().c_str());
157 dbg(0,"Missing control!\n");
162 static void show_road_name(){
163 struct tracking *tracking;
164 struct attr road_name_attr;
165 tracking=navit_get_tracking(sdl_gui_navit);
167 using namespace CEGUI;
170 if (tracking && tracking_get_current_attr(tracking, attr_label, &road_name_attr) ) {
171 WindowManager::getSingleton().getWindow("Navit/Routing/CurrentRoadName")->setText((CEGUI::utf8*)(road_name_attr.u.str));
176 static gboolean gui_timeout_cb(gpointer data)
181 static int gui_run_main_loop(struct gui_priv *this_)
184 using namespace CEGUI;
185 dbg(0,"Entering main loop\n");
187 bool must_quit = false;
189 // get "run-time" in seconds
190 double last_time_pulse = static_cast<double>(SDL_GetTicks());
195 struct map_selection sel,sel2;
197 memset(&sel, 0, sizeof(sel));
198 memset(&sel2, 0, sizeof(sel2));
199 sel.u.c_rect.rl.x=800;
200 sel.u.c_rect.rl.y=600;
203 sel2.u.c_rect.rl.x=-200;
204 sel2.u.c_rect.rl.y=0;
205 sel2.u.c_rect.lu.x=1000;
206 sel2.u.c_rect.lu.y=-800;
207 for (int i=0 ; i < layer_end ; i++)
211 transform_set_screen_selection(navit_get_trans(this_->nav), &sel);
212 navit_draw(this_->nav);
216 struct navigation *navig;
217 navig=navit_get_navigation(sdl_gui_navit);
219 navigation_register_callback(navig,
220 attr_navigation_long,
221 callback_new_0((void (*)())sdl_update_roadbook)
224 timeout = g_timeout_source_new(100);
225 g_source_set_callback(timeout, gui_timeout_cb, NULL, NULL);
226 g_source_attach(timeout, NULL);
231 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
233 glMatrixMode(GL_MODELVIEW);
236 if(VIEW_MODE==VM_3D){
237 gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);
240 // FIXME This is to draw a ground. This is ugly and need to be fixed.
241 // Without it, we see the color of sky under the roads.
242 glColor4f(0.0f,0.7f,0.35f,1.0f);
244 glVertex3f( -800,-600*3, 0.0f);
245 glVertex3f( -800,600*2, 0.0f);
246 glVertex3f( 1600,600*2, 0.0f);
247 glVertex3f( 1600,-600*3, 0.0f);
252 profile(0,"graphics_redraw");
253 // if (!g_main_context_iteration (NULL, FALSE))
255 g_main_context_iteration (NULL, TRUE);
258 profile(0,"main context");
265 navit_draw_displaylist(sdl_gui_navit);
267 inject_input(must_quit);
271 // Render the cursor.
274 float cursor_size=15.0f;
275 glColor4f(0.0f,1.0f,0.0f,0.75f);
277 glBegin(GL_TRIANGLES);
278 glVertex3f( x, y-cursor_size, 0.0f);
279 glVertex3f(x-cursor_size,y+cursor_size, 0.0f);
280 glVertex3f( x+cursor_size,y+cursor_size, 0.0f);
287 if(SDL_GetTicks()-last_time_pulse>1000){
288 sprintf(fps,"%i fps",frames); // /(SDL_GetTicks()/1000));
290 last_time_pulse = SDL_GetTicks();
292 WindowManager::getSingleton().getWindow("OSD/Satellites")->setText(fps);
297 CEGUI::System::getSingleton().renderGUI();
301 SDL_GL_SwapBuffers();
303 g_source_destroy(timeout);
307 static struct menu_priv *
308 add_menu(struct menu_priv *menu, struct menu_methods *meth, char *name, enum menu_type type, struct callback *cb);
310 static struct menu_methods menu_methods = {
316 // GtkAction *action;
317 struct gui_priv *gui;
320 struct menu_priv *child;
321 struct menu_priv *sibling;
326 #define MENU_BOOKMARK 2
327 #define MENU_FORMER_DEST 3
329 static struct menu_priv *
330 add_menu(struct menu_priv *menu, struct menu_methods *meth, char *name, enum menu_type type, struct callback *cb)
332 using namespace CEGUI;
334 dbg(0,"callback : %s\n",name);
336 if(menu==(struct menu_priv *)(MENU_BOOKMARK)){
337 dbg(0,"Item is a bookmark\n");
338 MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Bookmarks/Listbox"));
340 ListboxTextItem* itemListbox = new ListboxTextItem((CEGUI::utf8*)(name));
341 itemListbox->setSelectionBrushImage("TaharezLook", "MultiListSelectionBrush");
342 mcl->addRow(itemListbox,0);
344 struct bookmark *newB = g_new0(struct bookmark, 1);
345 newB->name=g_strdup(name);
348 newB->next = bookmarks;
354 if(menu==(struct menu_priv *)(MENU_FORMER_DEST)){
355 dbg(0,"Item is a former destination\n");
356 MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("FormerDests/Listbox"));
358 ListboxTextItem* itemListbox = new ListboxTextItem((CEGUI::utf8*)(name));
359 itemListbox->setSelectionBrushImage("TaharezLook", "MultiListSelectionBrush");
360 mcl->addRow(itemListbox,0);
362 struct former_dest *newB = g_new0(struct former_dest, 1);
363 newB->name=g_strdup(name);
366 newB->next = former_dests;
372 if(!strcmp(name,"Bookmarks")){
373 dbg(0,"Menu is the bookmark menu!\n");
374 return (struct menu_priv *)MENU_BOOKMARK;
375 } else if(!strcmp(name,"Former Destinations")){
376 dbg(0,"Menu is the Former Destinations menu!\n");
377 return (struct menu_priv *)MENU_FORMER_DEST;
379 return (struct menu_priv *)1;
383 bool BookmarkGo(const char * name)
385 dbg(0,"searching for bookmark %s\n",name);
386 bookmark * bookmark_search=bookmarks;
387 while ( bookmark_search ){
388 dbg(0,"-> %s\n",bookmark_search->name);
389 if(!strcmp(bookmark_search->name,name)){
390 dbg(0,"Got it :)\n");
391 callback_call_0(bookmark_search->cb);
393 bookmark_search=bookmark_search->next;
398 bool FormerDestGo(const char * name)
400 dbg(0,"searching for former_dest %s\n",name);
401 former_dest * former_dest_search=former_dests;
402 while ( former_dest_search ){
403 dbg(0,"-> %s\n",former_dest_search->name);
404 if(!strcmp(former_dest_search->name,name)){
405 dbg(0,"Got it :)\n");
406 callback_call_0(former_dest_search->cb);
408 former_dest_search=former_dest_search->next;
412 static struct menu_priv *
413 gui_sdl_toolbar_new(struct gui_priv *this_, struct menu_methods *meth)
415 return NULL; //gui_gtk_ui_new(this_, meth, "/ui/ToolBar", nav, 0);
418 static struct statusbar_priv *
419 gui_sdl_statusbar_new(struct gui_priv *gui, struct statusbar_methods *meth)
421 return NULL; //gui_gtk_ui_new(this_, meth, "/ui/ToolBar", nav, 0);
424 static struct menu_priv *
425 gui_sdl_menubar_new(struct gui_priv *this_, struct menu_methods *meth)
428 return (struct menu_priv *) 1; //gui_gtk_ui_new(this_, meth, "/ui/MenuBar", nav, 0);
431 static struct menu_priv *
432 gui_sdl_popup_new(struct gui_priv *this_, struct menu_methods *meth)
434 return NULL; //gui_gtk_ui_new(this_, meth, "/ui/PopUp", nav, 1);
437 struct gui_methods gui_sdl_methods = {
440 gui_sdl_statusbar_new,
442 gui_sdl_set_graphics,
450 glClearColor(0.3,0.7,1.0,0);
452 if(VIEW_MODE==VM_2D){
453 glMatrixMode( GL_PROJECTION );
456 glOrtho( 0, XRES, YRES, 0, -1, 1 );
458 glMatrixMode(GL_MODELVIEW);
460 CEGUI::WindowManager::getSingleton().getWindow("OSD/ViewMode")->setText("2D");
463 // Dimensions de la fenetre de rendu
464 glViewport(0, 0, XRES, YRES);
465 // Initialisation de la matrice de projection
466 glMatrixMode(GL_PROJECTION);
468 gluPerspective(45, 1.0, 0.1, 2800.0);
469 // Rendu avec lissage de Gouraud
470 // glShadeModel(GL_SMOOTH);
471 // glEnable(GL_DEPTH_TEST);
474 glMatrixMode(GL_MODELVIEW);
476 // gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);
477 CEGUI::WindowManager::getSingleton().getWindow("OSD/ViewMode")->setText("3D");
481 // GLuint glGenLists(GLsizei numberOfIDsRequired);
482 // linesDL = glGenLists(1);
484 if( glGetError() != GL_NO_ERROR ) {
490 bool ToggleView(const CEGUI::EventArgs& event)
492 VIEW_MODE=!VIEW_MODE;
496 bool MoveCamera(const CEGUI::EventArgs& event){
498 CEGUI::Scrollbar * sb = static_cast<const CEGUI::Scrollbar *>(CEGUI::WindowManager::getSingleton().getWindow("OSD/Scrollbar1"));
499 dbg(0,"moving : %f\n",sb->getScrollPosition());
500 eyeZ=-sb->getScrollPosition();
508 static void init_sdlgui(char * skin_layout,int fullscreen,int tilt)
510 SDL_Surface * screen;
511 // atexit (SDL_Quit);
512 SDL_Init (SDL_INIT_VIDEO);
514 const SDL_VideoInfo *videoInfo;
515 videoInfo = SDL_GetVideoInfo( );
519 fprintf( stderr, "Video query failed: %s\n",
523 /* the flags to pass to SDL_SetVideoMode */
524 videoFlags = SDL_OPENGL; /* Enable OpenGL in SDL */
525 videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */
526 videoFlags |= SDL_HWPALETTE; /* Store the palette in hardware */
527 videoFlags |= SDL_RESIZABLE; /* Enable window resizing */
529 /* This checks to see if surfaces can be stored in memory */
530 if ( videoInfo->hw_available )
531 videoFlags |= SDL_HWSURFACE;
533 videoFlags |= SDL_SWSURFACE;
535 /* This checks if hardware blits can be done */
536 if ( videoInfo->blit_hw )
537 videoFlags |= SDL_HWACCEL;
539 /* Sets up OpenGL double buffering */
540 SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
542 SDL_WM_SetCaption("NavIt - The OpenSource vector based navigation engine", NULL);
544 /* get a SDL surface */
545 screen = SDL_SetVideoMode( XRES, YRES, 32,
548 if (screen == NULL) {
549 fprintf (stderr, "Can't set SDL: %s\n", SDL_GetError ());
553 SDL_WM_ToggleFullScreen(screen);
555 SDL_ShowCursor (SDL_ENABLE);
556 SDL_EnableUNICODE (1);
557 SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
563 dbg(0, "Forcing silly image codec\n");
564 CEGUI::OpenGLRenderer::setDefaultImageCodecName("SILLYImageCodec");
565 CEGUI::System::setDefaultXMLParserName(CEGUI::String("TinyXMLParser"));
566 dbg(0, "Using %s as the default CEGUI XML Parser\n", CEGUI::System::getDefaultXMLParserName().c_str());
567 renderer = new CEGUI::OpenGLRenderer(0,XRES,YRES);
568 new CEGUI::System(renderer);
570 using namespace CEGUI;
572 SDL_ShowCursor(SDL_ENABLE);
573 SDL_EnableUNICODE(1);
574 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
576 CEGUI::DefaultResourceProvider* rp = static_cast<CEGUI::DefaultResourceProvider*>
577 (System::getSingleton().getResourceProvider());
582 filename=g_strdup_printf("%s/share/navit/datafiles", getenv("NAVIT_PREFIX"));
584 if (FILE * file = fopen(filename, "r")){
586 dbg(0,"Ressources can be loaded from %s\n",filename);
588 filename=g_strdup_printf("./gui/sdl/datafiles");
589 dbg(0,"Failling back to %s",filename);
592 dbg(0,"Loading SDL datafiles from %s\n",filename);
594 rp->setResourceGroupDirectory("schemes", g_strdup_printf("%s/schemes/",filename));
595 rp->setResourceGroupDirectory("imagesets", g_strdup_printf("%s/imagesets/",filename));
596 rp->setResourceGroupDirectory("fonts", g_strdup_printf("%s/fonts/",filename));
597 rp->setResourceGroupDirectory("layouts", g_strdup_printf("%s/layouts/",filename));
598 rp->setResourceGroupDirectory("looknfeels", g_strdup_printf("%s/looknfeel/",filename));
599 rp->setResourceGroupDirectory("lua_scripts", g_strdup_printf("%s/lua_scripts/",filename));
603 CEGUI::Imageset::setDefaultResourceGroup("imagesets");
604 CEGUI::Font::setDefaultResourceGroup("fonts");
605 CEGUI::Scheme::setDefaultResourceGroup("schemes");
606 CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeels");
607 CEGUI::WindowManager::setDefaultResourceGroup("layouts");
608 CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");
611 sprintf (buffer, "%s.scheme", skin_layout);
612 dbg(1,"Loading scheme : %s\n",buffer);
614 CEGUI::SchemeManager::getSingleton().loadScheme(buffer);
616 CEGUI::FontManager::getSingleton().createFont("DejaVuSans-10.font");
617 CEGUI::FontManager::getSingleton().createFont("DejaVuSans-12.font");
618 CEGUI::FontManager::getSingleton().createFont("DejaVuSans-14.font");
620 CEGUI::System::getSingleton().setDefaultFont("DejaVuSans-10");
622 CEGUI::WindowManager& wmgr = CEGUI::WindowManager::getSingleton();
624 dbg(1,"Loading layout : %s\n",buffer);
626 sprintf (buffer, "%s.layout", skin_layout);
628 myRoot = CEGUI::WindowManager::getSingleton().loadWindowLayout(buffer);
630 CEGUI::System::getSingleton().setGUISheet(myRoot);
634 CEGUI::WindowManager::getSingleton().getWindow("OSD/Quit")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(ButtonQuit));
635 // CEGUI::WindowManager::getSingleton().getWindow("OSD/Quit")->setText(_("Quit"));
637 CEGUI::WindowManager::getSingleton().getWindow("ZoomInButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(ZoomIn));
638 // CEGUI::WindowManager::getSingleton().getWindow("ZoomInButton")->setText(_("ZoomIn"));
640 CEGUI::WindowManager::getSingleton().getWindow("ZoomOutButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(ZoomOut));
641 // CEGUI::WindowManager::getSingleton().getWindow("ZoomOutButton")->setText(_("ZoomOut"));
643 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/CountryEditbox")->subscribeEvent(Window::EventKeyUp, Event::Subscriber(DestinationEntryChange));
644 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/CountryEditbox")->subscribeEvent(Window::EventMouseButtonDown, Event::Subscriber(handleMouseEnters));
645 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/TownEditbox")->subscribeEvent(Window::EventKeyUp, Event::Subscriber(DestinationEntryChange));
646 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/TownEditbox")->subscribeEvent(Window::EventMouseButtonDown, Event::Subscriber(handleMouseEnters));
647 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/StreetEditbox")->subscribeEvent(Window::EventKeyUp, Event::Subscriber(DestinationEntryChange));
648 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/StreetEditbox")->subscribeEvent(Window::EventMouseButtonDown, Event::Subscriber(handleMouseEnters));
650 CEGUI::WindowManager::getSingleton().getWindow("DestinationButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(DestinationWindowSwitch));
651 CEGUI::WindowManager::getSingleton().getWindow("DestinationWindow/Address")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(AddressSearchSwitch));
652 CEGUI::WindowManager::getSingleton().getWindow("DestinationWindow/Bookmark")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(BookmarkSelectionSwitch));
653 CEGUI::WindowManager::getSingleton().getWindow("DestinationWindow/FormerDest")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(FormerDestSelectionSwitch));
656 CEGUI::WindowManager::getSingleton().getWindow("OSD/ViewMode")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(ToggleView));
658 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/GO")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(ButtonGo));
659 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/KB")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(ShowKeyboard));
661 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/Listbox")->subscribeEvent(MultiColumnList::EventSelectionChanged, Event::Subscriber(ItemSelect));
662 CEGUI::WindowManager::getSingleton().getWindow("Bookmarks/Listbox")->subscribeEvent(MultiColumnList::EventSelectionChanged, Event::Subscriber(BookmarkSelect));
663 CEGUI::WindowManager::getSingleton().getWindow("FormerDests/Listbox")->subscribeEvent(MultiColumnList::EventSelectionChanged, Event::Subscriber(FormerDestSelect));
666 // Translation for StaticTexts (labels)
667 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/Country")->setText(_("Country"));
668 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/Town")->setText(_("City"));
669 CEGUI::WindowManager::getSingleton().getWindow("AdressSearch/Street")->setText(_("Street"));
672 MultiColumnList* mcl = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("AdressSearch/Listbox"));
674 mcl->setSelectionMode(MultiColumnList::RowSingle) ;
675 mcl->addColumn("Value", 0, cegui_absdim(200.0));
676 mcl->addColumn("ID", 1, cegui_absdim(70.0));
677 mcl->addColumn("Assoc", 2, cegui_absdim(70.0));
678 mcl->addColumn("x", 3, cegui_absdim(70.0));
679 mcl->addColumn("y", 4, cegui_absdim(70.0));
681 MultiColumnList* mcl2 = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Roadbook"));
683 mcl2->setSelectionMode(MultiColumnList::RowSingle) ;
684 mcl2->addColumn("Instructions", 0, cegui_absdim(700.0));
686 MultiColumnList* mcl3 = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("Bookmarks/Listbox"));
688 mcl3->setSelectionMode(MultiColumnList::RowSingle) ;
689 mcl3->addColumn("Name", 0, cegui_absdim(700.0));
691 MultiColumnList* mcl4 = static_cast<MultiColumnList*>(WindowManager::getSingleton().getWindow("FormerDests/Listbox"));
693 mcl4->setSelectionMode(MultiColumnList::RowSingle) ;
694 mcl4->addColumn("Name", 0, cegui_absdim(700.0));
698 CEGUI::WindowManager::getSingleton().getWindow("OSD/Scrollbar1")->subscribeEvent(Scrollbar::EventScrollPositionChanged, Event::Subscriber(MoveCamera));
700 // FIXME : char (conf) -> int (init) -> char (property) = bad
702 sprintf (buffer,"%i",tilt);
703 CEGUI::WindowManager::getSingleton().getWindow("OSD/Scrollbar1")->setProperty("ScrollPosition",buffer);
706 CEGUI::WindowManager::getSingleton().getWindow("OSD/RoadbookButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(RoadBookSwitch));
707 CEGUI::WindowManager::getSingleton().getWindow("OSD/RoadbookButton")->setText(_("RoadBook"));
709 CEGUI::WindowManager::getSingleton().getWindow("OSD/nGhostButton")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(Switch_to_nGhost));
710 // this one is maybe not needed anymore
711 CEGUI::WindowManager::getSingleton().getWindow("OSD/RoadbookButton2")->subscribeEvent(PushButton::EventClicked, Event::Subscriber(RoadBookSwitch));
714 catch (CEGUI::Exception& e)
716 fprintf(stderr,"CEGUI Exception occured: \n%s\n", e.getMessage().c_str());
717 printf("Missing control!...\n");
721 catch (CEGUI::Exception& e)
723 fprintf(stderr,"CEGUI Exception occured: \n%s\n", e.getMessage().c_str());
724 printf("quiting...\n");
728 // Force centering view on cursor
729 // navit_toggle_cursor(gui->nav);
730 // Force refresh on gps update
731 // navit_toggle_tracking(gui->nav);
735 static void vehicle_callback_handler( struct navit *nav, struct vehicle *v){
738 int sats=0, sats_used=0;
740 if (vehicle_position_attr_get(v, attr_position_speed, &attr))
741 sprintf (buffer, "%02.02f km/h", *attr.u.numd);
743 strcpy (buffer, "N/A");
744 CEGUI::WindowManager::getSingleton().getWindow("OSD/SpeedoMeter")->setText(buffer);
746 if (vehicle_position_attr_get(v, attr_position_height, &attr))
747 sprintf (buffer, "%.f m", *attr.u.numd);
749 strcpy (buffer, "N/A");
750 CEGUI::WindowManager::getSingleton().getWindow("OSD/Altimeter")->setText(buffer);
752 if (vehicle_position_attr_get(v, attr_position_sats, &attr))
754 if (vehicle_position_attr_get(v, attr_position_sats_used, &attr))
755 sats_used=attr.u.num;
756 // printf(" sats : %i, used %i: \n",sats,sats_used);
757 // Sat image hardcoded for now. may break the TaharezSkin
758 // setProperty("Image", CEGUI::PropertyHelper::imageToString( yourImageSet->getImage( "yourImageName" ) ) );
762 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar1")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOn");
764 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar1")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOff");
768 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar2")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOn");
770 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar2")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOff");
774 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar3")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOn");
776 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar3")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOff");
780 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar4")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOn");
782 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar4")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOff");
786 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar5")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOn");
788 CEGUI::WindowManager::getSingleton().getWindow("SateliteStrenghBar5")->setProperty("Image","set:Mineque-Black image:SateliteStrenghBarOff");
791 catch (CEGUI::Exception& e)
793 dbg(1,"Warning : you skin doesn't have the satellitebars. You should use Mineque's skin.\n");
798 static struct gui_priv *
799 gui_sdl_new(struct navit *nav, struct gui_methods *meth, struct attr **attrs)
801 dbg(1,"Begin SDL init\n");
802 struct gui_priv *this_;
806 dbg(1,"VALID navit instance in gui\n");
808 dbg(1,"Invalid navit instance in gui\n");
811 dbg(1,"VALID source navit instance in gui\n");
813 dbg(1,"Invalid source navit instance in gui\n");
816 *meth=gui_sdl_methods;
818 this_=g_new0(struct gui_priv, 1);
821 struct attr *fullscreen_setting=attr_search(attrs, NULL, attr_fullscreen);
822 //FIXME currently, we only check if fullscreen is declared, but not its value
823 if(fullscreen_setting){
825 printf("fullscreen\n");
828 printf("Normal screen\n");
832 struct attr *tilt_setting=attr_search(attrs, NULL, attr_tilt);
834 if(sscanf(tilt_setting->u.str,"%i",&tilt)){
835 dbg(0,"tilt set to %i\n",tilt);
837 dbg(0,"title was not recognized : %s\n",tilt_setting->u.str);
840 dbg(0,"tilt is not set\n");
843 struct attr *view_mode_setting=attr_search(attrs, NULL, attr_view_mode);
844 if(view_mode_setting){
845 if(!strcmp(view_mode_setting->u.str,"2D")){
846 dbg(0,"View mode is 2D\n");
849 dbg(0,"view mode is something else : %s\n",view_mode_setting->u.str);
853 dbg(0,"view_mode is not set\n");
856 struct attr *media_cmd_setting=attr_search(attrs, NULL, attr_media_cmd);
857 if(media_cmd_setting){
858 dbg(0,"setting media_cmd to %s\n",media_cmd_setting->u.str);
859 strcpy(media_cmd,media_cmd_setting->u.str);
861 // strcpy(media_cmd_setting->u.str,media_window_title);
864 struct attr *media_window_title_setting=attr_search(attrs, NULL, attr_media_window_title);
865 if(media_window_title_setting){
866 strcpy(media_window_title,media_window_title_setting->u.str);
868 // strcpy(media_cmd_setting->u.str,media_window_title);
871 struct attr *skin_setting=attr_search(attrs, NULL, attr_skin);
873 init_sdlgui(skin_setting->u.str,fullscreen,tilt);
875 g_warning("Warning, no skin set for <sdl> in navit.xml. Using default one");
876 init_sdlgui("TaharezLook",fullscreen,tilt);
880 dbg(1,"End SDL init\n");
882 //gui_sdl_window.cpp:710: error: invalid conversion from 'void (*)(vehicle*)' to 'void (*)()'
883 struct callback *cb=callback_new_0(callback_cast(vehicle_callback_handler));
885 navit_add_vehicle_cb(nav,cb);
894 dbg(1,"registering sdl plugin\n");
895 plugin_register_gui_type("sdl", gui_sdl_new);