summaryrefslogtreecommitdiff
path: root/src/client/screen.c~
diff options
context:
space:
mode:
authorTomas Chvatal (scarabeus) <tomas.chvatal@gmail.com>2008-10-22 22:50:54 +0200
committerTomas Chvatal (scarabeus) <tomas.chvatal@gmail.com>2008-10-22 22:50:54 +0200
commite12753d2ec9db83ec08bb9db63902a82fb245cdd (patch)
tree6e4a63b790d6335f969f88b797a927e0fb25f37a /src/client/screen.c~
parent0b4d9821c7333b8c4bdf7e0eeb750aef502a1137 (diff)
X
Diffstat (limited to 'src/client/screen.c~')
-rw-r--r--src/client/screen.c~193
1 files changed, 193 insertions, 0 deletions
diff --git a/src/client/screen.c~ b/src/client/screen.c~
new file mode 100644
index 0000000..db08260
--- /dev/null
+++ b/src/client/screen.c~
@@ -0,0 +1,193 @@
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include "main.h"
+#include "list.h"
+
+#include "interface.h"
+#include "screen.h"
+#include "layer.h"
+#include "myTimer.h"
+
+//#define DEBUG_TIME_DRAW
+
+static screen_t *currentScreen;
+static screen_t *futureScreen;
+
+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 );
+#ifdef DEBUG
+ printf(_("Registering screen: \"%s\"\n"), p->name);
+#endif
+ addList(listScreen, p);
+}
+
+void initScreen()
+{
+ listScreen = newList();
+
+ currentScreen = NULL;
+ futureScreen = NULL;
+
+ isScreenInit = TRUE;
+}
+
+static screen_t* findScreen(char *name)
+{
+ screen_t *this;
+ int i;
+
+ for( i = 0 ; i < listScreen->count ; i++ )
+ {
+ this = (screen_t *) (listScreen->list[i]);
+ assert( this != NULL );
+
+ if( strcmp(name, this->name) == 0 )
+ {
+ return this;
+ }
+ }
+
+ return NULL;
+}
+
+void setScreen(char *name)
+{
+ futureScreen = findScreen(name);
+ assert( futureScreen != NULL );
+}
+
+void switchScreen()
+{
+ if( futureScreen == NULL )
+ {
+ return;
+ }
+
+ flushLayer();
+
+ if( currentScreen != NULL )
+ {
+#ifdef DEBUG
+ printf(_("Stopping screen:\" %s\"\n"), currentScreen->name);
+#endif
+ currentScreen->fce_stop();
+ }
+
+ currentScreen = futureScreen;
+ futureScreen = NULL;
+
+ //printf("switch screen %s..\n", currentScreen->name);
+#ifdef DEBUG
+ printf(_("Starting screen: \"%s\"\n"), currentScreen->name);
+#endif
+ currentScreen->fce_start();
+}
+
+void startScreen(char *name)
+{
+ setScreen(name);
+ switchScreen();
+}
+
+char* getScreen()
+{
+ assert( currentScreen != NULL );
+ return currentScreen->name;
+}
+
+void drawScreen()
+{
+ static int count = 0;
+
+ count++;
+
+ if( count == 1 )
+ {
+ count = 0;
+
+ assert( currentScreen != NULL );
+
+ #ifdef DEBUG_TIME_DRAW
+ my_time_t prev;
+
+ prev = getMyTimeMicro();
+ #endif
+
+ currentScreen->fce_draw();
+
+ interfaceRefresh();
+
+ #ifdef DEBUG_TIME_DRAW
+ printf("c draw time = %d\n", getMyTimeMicro() - prev );
+ #endif
+ }
+}
+
+
+void eventScreen()
+{
+ assert( currentScreen != NULL );
+
+#ifdef DEBUG_TIME_EVENT
+ my_time_t prev;
+
+ prev = getMyTimeMicro();
+#endif
+
+ currentScreen->fce_event();
+
+#ifdef DEBUG_TIME_EVENT
+ printf("c event time = %d\n", getMyTimeMicro() - prev );
+#endif
+}
+
+void quitScreen()
+{
+ assert( listScreen != NULL );
+
+ destroyListItem(listScreen, destroyScreen);
+ isScreenInit = FALSE;
+}
+