diff options
-rw-r--r-- | sdl/event.c | 26 | ||||
-rw-r--r-- | sdl/event.h | 8 | ||||
-rw-r--r-- | sdl/platform.c | 12 |
3 files changed, 43 insertions, 3 deletions
diff --git a/sdl/event.c b/sdl/event.c index e6c4c00..c3120af 100644 --- a/sdl/event.c +++ b/sdl/event.c @@ -2,7 +2,7 @@ * * Event Handler * - * notes: I would be useful to create a following function + * notes: It would be useful to create a following function * register_signal(SDL_HOLDDOWN, EVENT_ACTION_INCR, float *p, float val) * * struct platform is still passed globally @@ -20,6 +20,23 @@ extern struct platform p; extern int program_running; +/* our function table */ +static struct event_vtbl event_tbl; + +int event_handler_init(struct event_vtbl *tbl) +{ + if (!tbl) + return -1; + + event_tbl = *tbl; + + /* predefined handlers that are automatically provided */ + if (!event_tbl.windowresize) + event_tbl.windowresize = window_resize; + + return 0; +} + /* process SDL events */ void sdl_process_events(void) { @@ -46,12 +63,14 @@ void sdl_process_events(void) case SDL_KEYDOWN: { keys_held[sym] = 1; - event_keydown(&event.key.keysym, keys_held, flag); + if (event_tbl.keydown) + event_tbl.keydown(&event.key.keysym, keys_held, flag); break; } case SDL_VIDEORESIZE: { - window_resize(event.resize.w, event.resize.h); + if (event_tbl.windowresize) + event_tbl.windowresize(event.resize.w, event.resize.h); break; } case SDL_QUIT: @@ -76,6 +95,7 @@ void sdl_process_events(void) flag = !flag; } +/* here are the event handler functions */ void event_keydown(SDL_keysym *keysym, const unsigned int *keys_held, const int flag) { if (!flag) diff --git a/sdl/event.h b/sdl/event.h index 8b4d81b..468087b 100644 --- a/sdl/event.h +++ b/sdl/event.h @@ -1,7 +1,15 @@ #ifndef _EVENT_H_ #define _EVENT_H_ +/* a table holding function pointers to function that handle events */ +struct event_vtbl +{ + void (*keydown)(SDL_keysym *, const unsigned int *, const int); + void (*windowresize)(int, int); +}; + /* function prototypes */ +int event_handler_init(struct event_vtbl *); void sdl_process_events(void); void event_keydown(SDL_keysym *, const unsigned int *, const int); diff --git a/sdl/platform.c b/sdl/platform.c index ea9dce6..138596a 100644 --- a/sdl/platform.c +++ b/sdl/platform.c @@ -12,11 +12,13 @@ #include <SDL/SDL_image.h> #include <GL/glew.h> #include <string.h> +#include "event.h" #include "gldraw.h" #include "gltools.h" #include "luatools.h" #include "platform.h" #include "sdltools.h" +#include "window.h" /* few light arrays */ const GLfloat fNoLight[] = { 0.0f, 0.0f, 0.0f, 1.0f }; @@ -40,6 +42,8 @@ extern unsigned int maxfps_w; void platform_init(struct platform *p) { + int ret; + /* Lua */ /* create new lua state */ p->L = luaL_newstate(); @@ -63,6 +67,14 @@ void platform_init(struct platform *p) /* set the camera to <0,0,0> */ glframe_reset(&p->camera); + /* setup and init the event handler */ + struct event_vtbl event_tbl; + memset(&event_tbl, 0, sizeof(event_tbl)); + event_tbl.keydown = event_keydown; + ret = event_handler_init(&event_tbl); + if (ret == -1) + fprintf(stderr, "platform: warning, failed to init event handler\n"); + /* init client */ p->client_init(p->c); } |