X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=bigscreen%2Fccbs_bigscreen.cpp;h=05b32b89cec2b341630eeada909ee718bc0cd149;hb=cad5aff5a3a21bb8c95d8a265e93687234f46a43;hp=e9a30110c5eb449ed67ca0a067f2d6dac4e4eb68;hpb=250bedbb9992af9f72996b0f790e8c585c3fe4e0;p=ccbs diff --git a/bigscreen/ccbs_bigscreen.cpp b/bigscreen/ccbs_bigscreen.cpp index e9a3011..05b32b8 100644 --- a/bigscreen/ccbs_bigscreen.cpp +++ b/bigscreen/ccbs_bigscreen.cpp @@ -13,6 +13,7 @@ #include "fetch_group.h" #include "fetch_auxilliary_screens.h" #include "fonts.h" +#include "theme.h" #include "groupscreen.h" #include "top10scorescreen.h" #include "top5chosenscreen.h" @@ -26,6 +27,7 @@ std::vector active_groups; std::vector screens; GenericScreen *mainscreen = NULL; unsigned char framebuf[SCREEN_WIDTH * SCREEN_HEIGHT * 4], screenbuf[SCREEN_WIDTH * SCREEN_HEIGHT * 4]; +bool quit_requested = false; void init(pqxx::connection &conn) { @@ -39,8 +41,6 @@ void init(pqxx::connection &conn) } screens.erase(screens.begin(), screens.end()); - bool show_only_main_screen = (USE_SPLITSCREEN && screens.size() == 1); - #if !USE_SPLITSCREEN RotateScreen *rs = new RotateScreen(); mainscreen = rs; @@ -69,6 +69,8 @@ void init(pqxx::connection &conn) } } + bool show_only_main_screen = (USE_SPLITSCREEN && screens.size() == 1); + /* * Show auxilliary screens except if we have too many already, * or if we're in the special split-screen end-tournament mode, @@ -144,14 +146,20 @@ void main_loop(pqxx::connection &conn) } if (mainscreen && mainscreen->check_invalidated()) { - mainscreen->draw(framebuf, SCREEN_WIDTH, SCREEN_HEIGHT); - SDL_LockSurface(screen); - for (unsigned y = 0; y < SCREEN_HEIGHT; ++y) { - unsigned char *sptr = framebuf + y * SCREEN_WIDTH * 4; - unsigned char *dptr = (unsigned char *)screen->pixels + y * screen->pitch; - memcpy(dptr, sptr, SCREEN_WIDTH * 4); + if (screen->pitch == SCREEN_WIDTH * 4) { + SDL_LockSurface(screen); + mainscreen->draw((unsigned char *)screen->pixels, SCREEN_WIDTH, SCREEN_HEIGHT); + SDL_UnlockSurface(screen); + } else { + mainscreen->draw(framebuf, SCREEN_WIDTH, SCREEN_HEIGHT); + SDL_LockSurface(screen); + for (unsigned y = 0; y < SCREEN_HEIGHT; ++y) { + unsigned char *sptr = framebuf + y * SCREEN_WIDTH * 4; + unsigned char *dptr = (unsigned char *)screen->pixels + y * screen->pitch; + memcpy(dptr, sptr, SCREEN_WIDTH * 4); + } + SDL_UnlockSurface(screen); } - SDL_UnlockSurface(screen); SDL_Flip(screen); conn.await_notification(0, 10000); } else { @@ -160,6 +168,19 @@ void main_loop(pqxx::connection &conn) } } +void handle_events() +{ + SDL_Event event; + while (SDL_PollEvent(&event)) { + if (event.type == SDL_QUIT) { + quit_requested = true; + } + if (event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_ESCAPE) { + quit_requested = true; + } + } +} + int main(int argc, char **argv) { SDL_Init(SDL_INIT_VIDEO); @@ -175,6 +196,7 @@ int main(int argc, char **argv) } try { + init_theme(); init_freetype(); pqxx::connection conn("dbname=ccbs host=www.positivegaming.com user=ccbs password=GeT|>>B_"); FlagTrigger tournament_changed(conn, "active_tournament"); @@ -182,15 +204,21 @@ int main(int argc, char **argv) // when active_tournament or active_rounds is changed, we destroy everything and start from scratch // (at least currently) - for ( ;; ) { + while (!quit_requested) { tournament_changed.reset_flag(); rounds_changed.reset_flag(); init(conn); do { main_loop(conn); conn.get_notifs(); - } while (!tournament_changed.get_flag() && !rounds_changed.get_flag()); - std::fprintf(stderr, "active_tournament or active_groups changed, resetting...\n"); + handle_events(); + } while (!tournament_changed.get_flag() && !rounds_changed.get_flag() && !quit_requested); + + if (quit_requested) { + fprintf(stderr, "Quitting...\n"); + } else { + fprintf(stderr, "active_tournament or active_groups changed, resetting...\n"); + } } } catch (const std::exception &e) { std::fprintf(stderr, "Exception: %s\n", e.what());