diff options
Diffstat (limited to 'src/screen.c')
| -rw-r--r-- | src/screen.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/screen.c b/src/screen.c new file mode 100644 index 0000000..c0c6885 --- /dev/null +++ b/src/screen.c @@ -0,0 +1,135 @@ + +#include <assert.h> + +#include "main.h" +#include "interface.h" +#include "screen.h" +#include "list.h" + +static screen_t *currentScreen; +static list_t *listScreen; + +static bool_t isScreenInit = FALSE; + +bool_t isScreenInicialized() +{ + return isScreenInit; +} + +screen_t* newScreen(char *name, + void (*fce_start)(), void (*fce_event)(), + void (*fce_draw)(), void (*fce_stop)()) +{ + screen_t *new; + + assert( name != NULL ); + assert( fce_start != NULL ); + assert( fce_event != NULL ); + assert( fce_draw != NULL ); + assert( fce_stop != NULL ); + + new = malloc( sizeof(screen_t) ); + new->name = strdup(name); + new->fce_start = fce_start; + new->fce_event = fce_event; + new->fce_draw = fce_draw; + new->fce_stop = fce_stop; + + return new; +} + +void destroyScreen(screen_t *p) +{ + assert( p != NULL ); + + free(p->name); + free(p); +} + +void registerScreen(screen_t *p) +{ + assert( p != NULL ); + + printf("register screen %s..\n", p->name); + addList(listScreen, p); +} + +void initScreen() +{ + listScreen = newList(); + currentScreen = NULL; + isScreenInit = TRUE; +} + +void setScreen(char *name) +{ + int i; + screen_t *this; + + assert( name != NULL ); + + if( currentScreen != NULL && + strcmp(currentScreen->name, name) == 0 ) + { + return; + } + + printf("switch screen %s..\n", name); + + for( i = 0 ; i < listScreen->count ; i++ ) + { + this = (screen_t *) (listScreen->list[i]); + assert( this != NULL ); + + if( strcmp(name, this->name) == 0 ) + { + if( currentScreen != NULL ) + { + printf("stop screen %s..\n", currentScreen->name); + currentScreen->fce_stop(); + } + + currentScreen = this; + printf("start screen %s..\n", currentScreen->name); + currentScreen->fce_start(); + + return; + } + } + + assert( ! "screen sa nenasiel !" ); +} + +char* getScreen() +{ + assert( currentScreen != NULL ); + return currentScreen->name; +} + +void drawScreen() +{ + static SDL_Surface *p_screen = NULL; + + if( p_screen == NULL ) p_screen = getSDL_Screen(); + + assert( currentScreen != NULL ); + currentScreen->fce_draw(); + + SDL_Flip(p_screen); +} + +void eventScreen() +{ + assert( currentScreen != NULL ); + + currentScreen->fce_event(); +} + +void quitScreen() +{ + assert( listScreen != NULL ); + + destroyListItem(listScreen, destroyScreen); + isScreenInit = FALSE; +} + |