diff options
Diffstat (limited to 'sdl/event.c')
-rw-r--r-- | sdl/event.c | 83 |
1 files changed, 42 insertions, 41 deletions
diff --git a/sdl/event.c b/sdl/event.c index 16e5f00..905a35f 100644 --- a/sdl/event.c +++ b/sdl/event.c @@ -18,22 +18,21 @@ #include "event.h" extern int program_running; -static struct platform *p; -/* our function table */ -static struct event_vtbl event_tbl; +/* an event handler struct that contains a table with function pointers */ +static struct event_handler event_handler; int event_handler_init(struct platform *plat, struct event_vtbl *tbl) { if (!tbl || !plat) return -1; - p = plat; - event_tbl = *tbl; + event_handler.funcs = *tbl; + event_handler.p = plat; /* predefined handlers that are automatically provided */ - if (!event_tbl.windowresize) - event_tbl.windowresize = window_resize; + if (!event_handler.funcs.windowresize) + event_handler.funcs.windowresize = window_resize; return 0; } @@ -43,10 +42,9 @@ void sdl_process_events(void) { SDL_Event event; SDLKey sym; - static unsigned int keys_held[323]; + unsigned int *keys_held = event_handler.keys_held; - /* helper flag for event_keydown() */ - int flag = 0; + event_handler.flag = 0; while (SDL_PollEvent(&event)) { @@ -64,14 +62,14 @@ void sdl_process_events(void) case SDL_KEYDOWN: { keys_held[sym] = 1; - if (event_tbl.keydown) - event_tbl.keydown(&event.key.keysym, keys_held, flag); + if (event_handler.funcs.keydown) + event_handler.funcs.keydown(&event.key.keysym); break; } case SDL_VIDEORESIZE: { - if (event_tbl.windowresize) - event_tbl.windowresize(event.resize.w, event.resize.h); + if (event_handler.funcs.windowresize) + event_handler.funcs.windowresize(event.resize.w, event.resize.h); break; } case SDL_QUIT: @@ -85,39 +83,24 @@ 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] || keys_held[SDLK_m]) + 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]) { - flag = !flag; - event_keydown(NULL, keys_held, flag); + event_handler.flag = !event_handler.flag; + event_keydown(NULL); } - else - flag = !flag; } /* here are the event handler functions */ -void event_keydown(SDL_keysym *keysym, const unsigned int *keys_held, const int flag) +void event_keydown(SDL_keysym *keysym) { - if (!flag) - { - switch (keysym->sym) - { - case SDLK_ESCAPE: program_running = 0; break; - case SDLK_w: p->c->xrot -= 5.0f; break; - case SDLK_s: p->c->xrot += 5.0f; break; - case SDLK_a: p->c->yrot -= 5.0f; break; - case SDLK_d: p->c->yrot += 5.0f; break; - case SDLK_UP: glframe_move_forward(&p->camera, 0.5f); break; - case SDLK_DOWN: glframe_move_forward(&p->camera, -0.5f); break; - case SDLK_LEFT: glframe_rotate_local_y(&p->camera, 0.1f); break; - case SDLK_RIGHT: glframe_rotate_local_y(&p->camera, -0.1f); break; - case SDLK_n: glframe_rotate_local_x(&p->camera, 0.1f); break; - case SDLK_m: glframe_rotate_local_x(&p->camera, -0.1f); break; - default: break; - } - } - else + 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 (keys_held[SDLK_w]) p->c->xrot -= 5.0f; @@ -142,6 +125,24 @@ void event_keydown(SDL_keysym *keysym, const unsigned int *keys_held, const int if (keys_held[SDLK_m]) glframe_rotate_local_x(&p->camera, -0.02f); } + else + { + switch (keysym->sym) + { + case SDLK_ESCAPE: program_running = 0; break; + case SDLK_w: p->c->xrot -= 5.0f; break; + case SDLK_s: p->c->xrot += 5.0f; break; + case SDLK_a: p->c->yrot -= 5.0f; break; + case SDLK_d: p->c->yrot += 5.0f; break; + case SDLK_UP: glframe_move_forward(&p->camera, 0.5f); break; + case SDLK_DOWN: glframe_move_forward(&p->camera, -0.5f); break; + case SDLK_LEFT: glframe_rotate_local_y(&p->camera, 0.1f); break; + case SDLK_RIGHT: glframe_rotate_local_y(&p->camera, -0.1f); break; + case SDLK_n: glframe_rotate_local_x(&p->camera, 0.1f); break; + case SDLK_m: glframe_rotate_local_x(&p->camera, -0.1f); break; + default: break; + } + } p->c->xrot = (GLfloat) ((const int) p->c->xrot % 360); p->c->yrot = (GLfloat) ((const int) p->c->yrot % 360); |