nuclear@0: #include nuclear@0: #include "fbee.h" nuclear@0: #include "fbeeimpl.h" nuclear@0: nuclear@0: static int quit, dirty; nuclear@0: static SDL_Surface *fbsurf; nuclear@0: nuclear@0: int fbee_sys_init(void) nuclear@0: { nuclear@0: SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER); nuclear@0: quit = 0; nuclear@0: dirty = 1; nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: int fbee_sys_set_video(int width, int height, int bpp, unsigned int flags) nuclear@0: { nuclear@0: unsigned int sdl_flags = SDL_HWSURFACE; nuclear@0: if(!(fbsurf = SDL_SetVideoMode(width, height, bpp, sdl_flags))) { nuclear@0: fprintf(stderr, "failed to set video mode\n"); nuclear@0: return -1; nuclear@0: } nuclear@0: SDL_WM_SetCaption("fbee", "fbee"); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: int fbee_sys_get_video(int *width, int *height, int *bpp) nuclear@0: { nuclear@0: if(fbsurf) { nuclear@0: *width = fbsurf->w; nuclear@0: *height = fbsurf->h; nuclear@0: *bpp = fbsurf->format->BitsPerPixel; nuclear@0: return 0; nuclear@0: } nuclear@0: return -1; nuclear@0: } nuclear@0: nuclear@0: void fbee_sys_destroy(void) nuclear@0: { nuclear@0: SDL_Quit(); nuclear@0: } nuclear@0: nuclear@0: int fbee_sys_process_events(void) nuclear@0: { nuclear@0: SDL_Event ev; nuclear@0: nuclear@0: if(dirty) { nuclear@0: struct closure *cb = fbee_get_callback(FBEE_EV_DRAW); nuclear@0: if(cb) { nuclear@0: cb->func(cb->cls); nuclear@0: dirty = 0; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: if(!fbee_get_callback(FBEE_EV_IDLE)) { nuclear@0: if(SDL_WaitEvent(&ev)) { nuclear@0: SDL_PushEvent(&ev); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: while(SDL_PollEvent(&ev)) { nuclear@0: struct closure *cb; nuclear@0: nuclear@0: switch(ev.type) { nuclear@0: case SDL_KEYDOWN: nuclear@0: case SDL_KEYUP: nuclear@0: if((cb = fbee_get_callback(FBEE_EV_KEY))) { nuclear@0: int pressed = ev.key.state == SDL_PRESSED ? 1 : 0; nuclear@0: cb->func(ev.key.keysym.sym, pressed, cb->cls); nuclear@0: } nuclear@0: break; nuclear@0: nuclear@0: case SDL_MOUSEBUTTONDOWN: nuclear@0: case SDL_MOUSEBUTTONUP: nuclear@0: if((cb = fbee_get_callback(FBEE_EV_BUTTON))) { nuclear@0: int pressed = ev.button.state == SDL_PRESSED ? 1 : 0; nuclear@0: int idx = ev.button.button - SDL_BUTTON_LEFT; nuclear@0: cb->func(idx, pressed, cb->cls); nuclear@0: } nuclear@0: break; nuclear@0: nuclear@0: case SDL_MOUSEMOTION: nuclear@0: if((cb = fbee_get_callback(FBEE_EV_MOTION))) { nuclear@0: cb->func(ev.motion.x, ev.motion.y, cb->cls); nuclear@0: } nuclear@0: break; nuclear@0: nuclear@0: case SDL_QUIT: nuclear@0: quit = 1; nuclear@0: return 0; nuclear@0: nuclear@0: default: nuclear@0: break; nuclear@0: } nuclear@0: } nuclear@0: return 1; nuclear@0: } nuclear@0: nuclear@0: void fbee_sys_evloop(void) nuclear@0: { nuclear@0: while(!quit && fbee_sys_process_events()) { nuclear@0: struct closure *cb = fbee_get_callback(FBEE_EV_IDLE); nuclear@0: if(cb) { nuclear@0: cb->func(cb->cls); nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: void fbee_redisplay(void) nuclear@0: { nuclear@0: dirty = 1; nuclear@0: } nuclear@0: nuclear@0: void *fbee_sys_framebuffer(void) nuclear@0: { nuclear@0: return fbsurf->pixels; nuclear@0: } nuclear@0: nuclear@0: void fbee_sys_update(void *img) nuclear@0: { nuclear@0: if(img && img != fbsurf->pixels) { nuclear@0: if(SDL_MUSTLOCK(fbsurf)) { nuclear@0: SDL_LockSurface(fbsurf); nuclear@0: } nuclear@0: nuclear@0: memcpy(fbsurf->pixels, img, fbsurf->pitch * fbsurf->h); nuclear@0: nuclear@0: if(SDL_MUSTLOCK(fbsurf)) { nuclear@0: SDL_UnlockSurface(fbsurf); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: SDL_UpdateRect(fbsurf, 0, 0, 0, 0); nuclear@0: }