#include #include #include #include #include #include #include #include "osc_graphics.h" #include "osc_server.h" #include "layer.h" #include "layer_box.h" #include "layer_image.h" #include "layer_video.h" /* * Default values */ #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define FRAMERATE 20 /* Hz */ #define PORT "7770" /* * Declarations */ SDL_Surface *screen; OSCServer osc_server(PORT); LayerList layers; int config_dump_osc = 0; static inline void sdl_process_events(void) { SDL_Event event; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_F11: if (!SDL_WM_ToggleFullScreen(screen)) { SDL_ERROR("SDL_WM_ToggleFullScreen"); exit(EXIT_FAILURE); } break; case SDLK_F10: SDL_ShowCursor(!SDL_ShowCursor(SDL_QUERY)); break; case SDLK_F9: config_dump_osc ^= 1; break; case SDLK_ESCAPE: exit(EXIT_SUCCESS); default: break; } break; case SDL_QUIT: exit(EXIT_SUCCESS); default: break; } } } #define REGISTER_LAYER(CLASS) \ osc_server.register_layer(CLASS::ctor_info.name, \ CLASS::ctor_info.types, \ CLASS::ctor_osc) int main(int argc, char **argv) { FPSmanager fpsm; if (SDL_Init(SDL_INIT_VIDEO)) { SDL_ERROR("SDL_Init"); return EXIT_FAILURE; } atexit(SDL_Quit); SDL_WM_SetCaption("OSC Graphics", NULL); screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); if (screen == NULL) { SDL_ERROR("SDL_SetVideoMode"); return EXIT_FAILURE; } REGISTER_LAYER(LayerImage); REGISTER_LAYER(LayerVideo); REGISTER_LAYER(LayerBox); osc_server.start(); SDL_initFramerate(&fpsm); SDL_setFramerate(&fpsm, FRAMERATE); for (;;) { sdl_process_events(); layers.render(screen); SDL_Flip(screen); SDL_framerateDelay(&fpsm); } /* never reached */ return EXIT_FAILURE; }