summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle K <kylek389@gmail.com>2011-07-19 10:27:16 -0500
committerKamil Kaminski <kamilkss@gmail.com>2011-07-19 10:27:16 -0500
commit43674e2b8fe819213b67d6381c5caa8772d5233f (patch)
tree4a726c39dfc9a8b898d5ef44f28f25e5ef5d8255
parent1944ec48d1c7870403fb6c4f25cf885dd591a8ab (diff)
downloadGLPyramid-43674e2b8fe819213b67d6381c5caa8772d5233f.tar.gz
GLPyramid-43674e2b8fe819213b67d6381c5caa8772d5233f.tar.bz2
GLPyramid-43674e2b8fe819213b67d6381c5caa8772d5233f.zip
sdl: reworked event handler a bit, still thinking about C++
-rw-r--r--sdl/event.c83
-rw-r--r--sdl/event.h13
2 files changed, 53 insertions, 43 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);
diff --git a/sdl/event.h b/sdl/event.h
index 0608fa7..b6a1084 100644
--- a/sdl/event.h
+++ b/sdl/event.h
@@ -6,14 +6,23 @@ struct platform;
/* a table holding function pointers to functions that handle events */
struct event_vtbl
{
- void (*keydown)(SDL_keysym *, const unsigned int *, const int);
+ void (*keydown)(SDL_keysym *);
void (*windowresize)(int, int);
};
+struct event_handler
+{
+ struct event_vtbl funcs; /* table of event function handlers */
+ 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 */
+};
+
/* function prototypes */
int event_handler_init(struct platform *, struct event_vtbl *);
void sdl_process_events(void);
-void event_keydown(SDL_keysym *, const unsigned int *, const int);
+void event_keydown(SDL_keysym *);
#endif