mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-25 22:03:45 -06:00
231 lines
5.9 KiB
C++
231 lines
5.9 KiB
C++
#include "SDLFbLocal.h"
|
|
|
|
NAMESPACE_UPP
|
|
|
|
dword fbKEYtoK(dword chr);
|
|
|
|
SDL_Surface * screen = NULL;
|
|
bool fbEndSession = false;
|
|
int videoflags = 0;
|
|
int height = 0;
|
|
int width = 0;
|
|
int bpp = 0;
|
|
|
|
SDL_Surface *CreateScreen(int w, int h, int bpp, int flags)
|
|
{
|
|
SDL_Surface * screen = SDL_SetVideoMode(w, h, bpp, flags);
|
|
if(!screen)
|
|
{
|
|
Cout() << Format("Couldn't set display mode: %s\n", SDL_GetError());
|
|
return NULL;
|
|
}
|
|
Cout() << Format("Screen is in %s mode\n", (screen->flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed");
|
|
return screen;
|
|
}
|
|
|
|
bool FBEndSession()
|
|
{
|
|
return fbEndSession;
|
|
}
|
|
|
|
bool FBIsWaitingEvent()
|
|
{
|
|
SDL_PumpEvents();
|
|
SDL_Event events;
|
|
int tc = SDL_PeepEvents(&events, 1, SDL_PEEKEVENT, SDL_EVENTMASK(SDL_ALLEVENTS));
|
|
return (tc>0);
|
|
}
|
|
|
|
bool FBProcessEvent(bool *quit)
|
|
{
|
|
SDL_Event event;
|
|
if(SDL_PollEvent(&event)) {
|
|
switch(event.type) {
|
|
case SDL_ACTIVEEVENT: //SDL_ActiveEvent
|
|
break;
|
|
case SDL_KEYDOWN:
|
|
case SDL_KEYUP: //SDL_KeyboardEvent
|
|
{
|
|
String msgdump;
|
|
switch(event.type)
|
|
{
|
|
case SDL_KEYDOWN: msgdump << "SDL_KEYDOWN"; break;
|
|
case SDL_KEYUP: msgdump << "SDL_KEYUP"; break;
|
|
}
|
|
// msgdump << " wParam = 0x" << FormatIntHex(wParam, 8)
|
|
// << ", lParam = 0x" << FormatIntHex(lParam, 8);
|
|
msgdump << (int)event.key.keysym.sym;
|
|
RLOG(msgdump);
|
|
|
|
bool b = false;
|
|
dword keycode = 0;
|
|
if(event.type == SDL_KEYDOWN) {
|
|
keycode = fbKEYtoK((dword)event.key.keysym.sym);
|
|
if(keycode != K_SPACE) //dont send space on keydown
|
|
b = Ctrl::DoKeyFB(keycode, 1);
|
|
|
|
//send respective keyup things as char events as well
|
|
keycode = (dword)event.key.keysym.unicode;
|
|
if((keycode != 127 && keycode > 32 && keycode < 255)
|
|
|| (keycode == 32 && fbKEYtoK(SDLK_SPACE) == K_SPACE))
|
|
b = Ctrl::DoKeyFB(keycode, 1);
|
|
|
|
}
|
|
else
|
|
if(event.type == SDL_KEYUP)
|
|
{
|
|
keycode = fbKEYtoK((dword)event.key.keysym.sym) | K_KEYUP;
|
|
b = Ctrl::DoKeyFB(keycode, 1);
|
|
}
|
|
}
|
|
break;
|
|
case SDL_MOUSEMOTION: //SDL_MouseMotionEvent
|
|
Ctrl::DoMouseFB(Ctrl::MOUSEMOVE, Point(event.motion.x, event.motion.y));
|
|
break;
|
|
case SDL_MOUSEBUTTONDOWN: //SDL_MouseButtonEvent, FIXME DoubleClick
|
|
{
|
|
Point p(event.button.x, event.button.y);
|
|
switch(event.button.button)
|
|
{
|
|
case SDL_BUTTON_LEFT: Ctrl::DoMouseFB(Ctrl::LEFTDOWN, p); break;
|
|
case SDL_BUTTON_RIGHT: Ctrl::DoMouseFB(Ctrl::RIGHTDOWN, p); break;
|
|
case SDL_BUTTON_MIDDLE: Ctrl::DoMouseFB(Ctrl::MIDDLEDOWN, p); break;
|
|
case SDL_BUTTON_WHEELUP: Ctrl::DoMouseFB(Ctrl::MOUSEWHEEL, p, +120); break;
|
|
case SDL_BUTTON_WHEELDOWN: Ctrl::DoMouseFB(Ctrl::MOUSEWHEEL, p, -120); break;
|
|
}
|
|
}
|
|
break;
|
|
case SDL_MOUSEBUTTONUP:
|
|
{
|
|
Point p(event.button.x, event.button.y);
|
|
switch(event.button.button)
|
|
{
|
|
case SDL_BUTTON_LEFT: Ctrl::DoMouseFB(Ctrl::LEFTUP, p); break;
|
|
case SDL_BUTTON_RIGHT: Ctrl::DoMouseFB(Ctrl::RIGHTUP, p); break;
|
|
case SDL_BUTTON_MIDDLE: Ctrl::DoMouseFB(Ctrl::MIDDLEUP, p); break;
|
|
case SDL_BUTTON_WHEELUP: Ctrl::DoMouseFB(Ctrl::MOUSEWHEEL, p, +120); break;
|
|
case SDL_BUTTON_WHEELDOWN: Ctrl::DoMouseFB(Ctrl::MOUSEWHEEL, p, -120); break;
|
|
}
|
|
}
|
|
break;
|
|
case SDL_JOYAXISMOTION: //SDL_JoyAxisEvent
|
|
break;
|
|
case SDL_JOYBALLMOTION: //SDL_JoyBallEvent
|
|
break;
|
|
case SDL_JOYHATMOTION: //SDL_JoyHatEvent
|
|
break;
|
|
case SDL_JOYBUTTONDOWN:
|
|
case SDL_JOYBUTTONUP: //SDL_JoyButtonEvent
|
|
break;
|
|
case SDL_VIDEORESIZE: //SDL_ResizeEvent
|
|
{
|
|
width = event.resize.w;
|
|
height = event.resize.h;
|
|
|
|
SDL_FreeSurface(screen);
|
|
screen = CreateScreen(width, height, bpp, videoflags);
|
|
ASSERT(screen);
|
|
Ctrl::SetFramebufferSize(Size(width, height));
|
|
}
|
|
break;
|
|
case SDL_VIDEOEXPOSE: //SDL_ExposeEvent
|
|
break;
|
|
case SDL_QUIT: //SDL_QuitEvent
|
|
if(quit) *quit = true;
|
|
break;
|
|
case SDL_USEREVENT: //SDL_UserEvent
|
|
HandleUserEvents(&event);
|
|
break;
|
|
case SDL_SYSWMEVENT: //SDL_SysWMEvent
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
} // End switch
|
|
return true;
|
|
} // End while
|
|
return false;
|
|
}
|
|
|
|
void FBSleep(int ms)
|
|
{
|
|
Sleep(ms); //sleep should be wakeable with input
|
|
}
|
|
|
|
void FBUpdate(const Rect& inv)
|
|
{
|
|
//The invalidated areas accumulate in the update region until the region is processed when the next WM_PAINT message occurs
|
|
SDL_LockSurface(screen);
|
|
const ImageBuffer& framebuffer = Ctrl::GetFrameBuffer();
|
|
|
|
#if 1
|
|
memcpy(screen->pixels, ~framebuffer, framebuffer.GetLength() * sizeof(RGBA));
|
|
#endif
|
|
|
|
#if 1
|
|
ASSERT(Size(screen->w,screen->h) == framebuffer.GetSize());
|
|
|
|
Size ssz = inv.GetSize();
|
|
Size dsz = framebuffer.GetSize();
|
|
|
|
ASSERT(Rect(dsz).Contains(inv));
|
|
|
|
for(int i = inv.top; i < inv.bottom; i++)
|
|
{
|
|
uint32 o = i * dsz.cx + inv.left;
|
|
memcpy(((RGBA*)screen->pixels) + o, (~framebuffer) + o, ssz.cx * sizeof(RGBA));
|
|
}
|
|
#endif
|
|
|
|
SDL_UnlockSurface(screen);
|
|
SDL_Flip(screen);
|
|
}
|
|
|
|
void FBFlush()
|
|
{
|
|
// ::UpdateWindow(fbHWND);
|
|
// GdiFlush();
|
|
}
|
|
|
|
void FBInit()
|
|
{
|
|
GuiLock __;
|
|
|
|
Ctrl::InitFB();
|
|
|
|
if(SDL_Init(SDL_INIT_VIDEO) < 0)
|
|
{
|
|
Cout() << Format("Couldn't initialize SDL: %s\n", SDL_GetError());
|
|
return;
|
|
}
|
|
|
|
SDL_EnableUNICODE(1);
|
|
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL/2);
|
|
|
|
const SDL_VideoInfo* vi = SDL_GetVideoInfo();
|
|
//ASSERT(vi->hw_available);
|
|
|
|
width = vi->current_w;
|
|
height = vi->current_h;
|
|
//width = 600;
|
|
//height = 400;
|
|
bpp = vi->vfmt->BitsPerPixel;
|
|
ASSERT(bpp == 32);
|
|
|
|
//FIXME adjustable
|
|
videoflags = SDL_HWSURFACE | SDL_HWACCEL | SDL_DOUBLEBUF | SDL_RESIZABLE;// | SDL_NOFRAME | SDL_FULLSCREEN;
|
|
|
|
screen = CreateScreen(width, height, bpp, videoflags);
|
|
ASSERT(screen);
|
|
Ctrl::SetFramebufferSize(Size(width, height));
|
|
|
|
// Csizeinit();
|
|
}
|
|
|
|
void FBDeInit()
|
|
{
|
|
SDL_FreeSurface(screen);
|
|
SDL_Quit();
|
|
}
|
|
|
|
END_UPP_NAMESPACE
|