diff options
-rw-r--r-- | sdl/config.lua | 4 | ||||
-rw-r--r-- | sdl/event.c | 72 | ||||
-rw-r--r-- | sdl/event.h | 6 | ||||
-rw-r--r-- | sdl/platform.c | 5 |
4 files changed, 64 insertions, 23 deletions
diff --git a/sdl/config.lua b/sdl/config.lua index 34a7920..0917809 100644 --- a/sdl/config.lua +++ b/sdl/config.lua @@ -2,8 +2,8 @@ platform = { name = "Textured Pyramid", icon = "tux.png", - xres = 640, - yres = 480, + xres = 320, + yres = 240, bpp = 32, af = 8, fovy = 40.0, diff --git a/sdl/event.c b/sdl/event.c index 905a35f..a760635 100644 --- a/sdl/event.c +++ b/sdl/event.c @@ -2,15 +2,12 @@ * * Event Handler * - * 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 * */ #include <SDL/SDL.h> #include <SDL/SDL_image.h> +#include <assert.h> #include "client.h" #include "glframe.h" #include "platform.h" @@ -22,17 +19,31 @@ extern int program_running; /* an event handler struct that contains a table with function pointers */ static struct event_handler event_handler; +/* when user inputs NULL for tbl, generic functions get stubbed */ int event_handler_init(struct platform *plat, struct event_vtbl *tbl) { - if (!tbl || !plat) + if (!plat) return -1; - event_handler.funcs = *tbl; event_handler.p = plat; - /* predefined handlers that are automatically provided */ + if (tbl) + event_handler.funcs = *tbl; + else + { + memset(&event_handler.funcs, 0, sizeof(event_handler.funcs)); + fprintf(stdout, "event: generic event handler will be provided\n"); + } + + /* predefined generic handlers that are automatically provided */ + if (!event_handler.funcs.keydown) + event_handler.funcs.keydown = &event_keydown_gen; + if (!event_handler.funcs.windowresize) - event_handler.funcs.windowresize = window_resize; + event_handler.funcs.windowresize = &window_resize; + + if (!event_handler.funcs.quit) + event_handler.funcs.quit = &event_quit_gen; return 0; } @@ -44,7 +55,7 @@ void sdl_process_events(void) SDLKey sym; unsigned int *keys_held = event_handler.keys_held; - event_handler.flag = 0; + event_handler.key_held = 0; while (SDL_PollEvent(&event)) { @@ -68,13 +79,14 @@ void sdl_process_events(void) } case SDL_VIDEORESIZE: { - if (event_handler.funcs.windowresize) - event_handler.funcs.windowresize(event.resize.w, event.resize.h); + assert(event_handler.funcs.windowresize); + event_handler.funcs.windowresize(event.resize.w, event.resize.h); break; } case SDL_QUIT: { - program_running = 0; + assert(event_handler.funcs.quit); + event_handler.funcs.quit(); break; } default: @@ -83,24 +95,46 @@ void sdl_process_events(void) } /* below code has to be placed here, check for keys that are being constantly held */ - if (keys_held[SDLK_w] || keys_held[SDLK_s] || keys_held[SDLK_a] || - keys_held[SDLK_d] || keys_held[SDLK_UP] || keys_held[SDLK_DOWN] || - keys_held[SDLK_LEFT] || keys_held[SDLK_RIGHT] || keys_held[SDLK_n] || + if (keys_held[SDLK_w] || keys_held[SDLK_s] || keys_held[SDLK_a] || + keys_held[SDLK_d] || keys_held[SDLK_UP] || keys_held[SDLK_DOWN] || + keys_held[SDLK_LEFT] || keys_held[SDLK_RIGHT] || keys_held[SDLK_n] || keys_held[SDLK_m]) { - event_handler.flag = !event_handler.flag; - event_keydown(NULL); + event_handler.key_held = !event_handler.key_held; + event_handler.funcs.keydown(NULL); + } +} + +/* generic handler function, an exception is window_resize, it is declared + * in window.c */ +void event_keydown_gen(SDL_keysym *keysym) +{ + if (!keysym) + return; + + switch (keysym->sym) + { + case SDLK_ESCAPE: + event_handler.funcs.quit(); + break; + default: + break; } } -/* here are the event handler functions */ +void event_quit_gen(void) +{ + program_running = 0; +} + +/* here are the client event handler functions */ void event_keydown(SDL_keysym *keysym) { const unsigned int *keys_held = event_handler.keys_held; struct platform *p = event_handler.p; /* a flag is toggled on if the we are interested in keys that are being held */ - if (event_handler.flag) + if (event_handler.key_held) { if (keys_held[SDLK_w]) p->c->xrot -= 5.0f; diff --git a/sdl/event.h b/sdl/event.h index b6a1084..30669de 100644 --- a/sdl/event.h +++ b/sdl/event.h @@ -8,6 +8,7 @@ struct event_vtbl { void (*keydown)(SDL_keysym *); void (*windowresize)(int, int); + void (*quit)(void); }; struct event_handler @@ -16,7 +17,7 @@ struct event_handler unsigned int keys_held[323]; /* keep track of the keys that were held */ struct platform *p; /* reference to the host platform */ - int flag; /* helper flag */ + int key_held; /* helper flag */ }; /* function prototypes */ @@ -24,5 +25,8 @@ int event_handler_init(struct platform *, struct event_vtbl *); void sdl_process_events(void); void event_keydown(SDL_keysym *); +void event_keydown_gen(SDL_keysym *); +void event_quit_gen(void); + #endif diff --git a/sdl/platform.c b/sdl/platform.c index 7c7bcdd..1fd9129 100644 --- a/sdl/platform.c +++ b/sdl/platform.c @@ -73,7 +73,10 @@ void platform_init(struct platform *p) event_tbl.keydown = event_keydown; ret = event_handler_init(p, &event_tbl); if (ret == -1) - fprintf(stderr, "platform: warning, failed to init event handler\n"); + { + fprintf(stderr, "platform: failed to init event handler\n"); + exit(-1); + } /* init client */ p->client_init(p->c); |