Example #1
0
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;
}
Example #2
0
void Scene::receive(const entityx::ComponentAddedEvent<GraphicComponent>& ev)
{
	AddGraphic(ev.component->graphic.Get());
}