bool CGUI::Go() { bool Fullscreen; /* restrict display */ CDisplay *Disp = (CDisplay *)PPool->GetWellDefinedComponent(COMPONENT_DISPLAY); SDL_Surface *Front; /* map resources, installing palette, etc */ /* get screen dimensions, generate two intermediate buffers */ int ScrW, ScrH; Disp->IOCtl(DISPIOCTL_GETDBUF, this, 0); Front = Disp->GetFrontBuffer(); ScrW = Front->w; ScrH = Front->h; Fullscreen = (Front->flags&SDL_FULLSCREEN) ? true : false; Disp->ReleaseFrontBuffer(); StaticBuffer = OptimalSurface(ScrW, ScrH); MapResources(); // prepare display SDL_Rect WholeDisplay; WholeDisplay.x = WholeDisplay.y = 0; WholeDisplay.w = ScrW; WholeDisplay.h = ScrH; GUIObject = new CGUIMainDlg(*this, StaticBuffer, WholeDisplay); MessagesPending = 0; MessageQueue = new CGUIMessage[16]; int MouseX, MouseY, BState; BState = SDL_GetMouseState(&MouseX, &MouseY); QMessage = false; Quit = false; bool HaveMouse = true; while(!Quit) { // refresh buffer bwith all static elements Front = Disp->GetFrontBuffer(); SDL_BlitSurface(StaticBuffer, NULL, Front, NULL); // get mouse state int NewMouseX, NewMouseY, NewBState; NewBState = SDL_GetMouseState(&NewMouseX, &NewMouseY); // draw display CGUIMessage DrawMessage; DrawMessage.Type = CGUIMessage::DRAW; DrawMessage.PositionX = 0; DrawMessage.PositionY = 0; DrawMessage.Data.Draw.Target = Front; GUIObject->Message(&DrawMessage); // add cursor if necessary if( (SDL_ShowCursor(SDL_QUERY) != SDL_ENABLE) && ((SDL_GetAppState()&SDL_APPMOUSEFOCUS) || Fullscreen)) AddGraphic(Front, GFX_CURSOR, NewMouseX, NewMouseY); // communicate mouse movements CGUIMessage MouseMessage; MouseMessage.PositionX = NewMouseX; MouseMessage.PositionY = NewMouseY; MouseMessage.Buttons = NewBState; MouseMessage.Data.Mouse.DeltaX = NewMouseX - MouseX; MouseMessage.Data.Mouse.DeltaY = NewMouseY - MouseY; MouseMessage.Type = CGUIMessage::MOUSEOVER; GUIObject->Message(&MouseMessage); MouseX = NewMouseX; MouseY = NewMouseY; // communicate button changes NewBState ^= BState; BState ^= NewBState; if(NewBState) { MouseMessage.Type = CGUIMessage::BUTTONS; MouseMessage.Data.Button.Changes = NewBState; GUIObject->Message(&MouseMessage); } // blit display, check it hasn't changed // SDL_BlitSurface(DisplayBuffer, NULL, Front, NULL); SDL_UpdateRect(Front, 0, 0, 0,0); Disp->ReleaseFrontBuffer(); Disp->IOCtl(DISPIOCTL_FLIP, NULL, 0); // pump events SDL_PumpEvents(); // post any pending messages while(MessagesPending--) GUIObject->Message(&MessageQueue[MessagesPending]); MessagesPending = 0; // get latest interesting keys, etc ((CULA *)(PPool->GetWellDefinedComponent(COMPONENT_ULA)))->UpdateKeyTable(); SDL_Event ev; while(SDL_PollEvent(&ev)) switch(ev.type) { case SDL_QUIT: Quit = QMessage = true; break; // this is the conduit through which information is passed back here from the // emulation thread case SDL_USEREVENT: switch(ev.user.code) { case PPDEBUG_USERQUIT: QMessage = true; case PPDEBUG_GUI: Quit = true; break; } break; case SDL_APPMOUSEFOCUS: HaveMouse = ev.active.gain ? true : false; break; } } Disp->IOCtl(DISPIOCTL_GETDBUF, NULL, 0); delete GUIObject; delete[] MessageQueue; FreeResources(); // SDL_FreeSurface(DisplayBuffer); SDL_FreeSurface(StaticBuffer); return QMessage; }
void Scene::receive(const entityx::ComponentAddedEvent<GraphicComponent>& ev) { AddGraphic(ev.component->graphic.Get()); }