summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle K <kylek389@gmail.com>2011-07-19 11:46:17 -0500
committerKamil Kaminski <kamilkss@gmail.com>2011-07-19 11:46:17 -0500
commitf7d6c6be3413438afef1c3319db3df5c184ead12 (patch)
treea8ff17290a5aafa0028008aeb81d8be24dac8d64
parent43674e2b8fe819213b67d6381c5caa8772d5233f (diff)
downloadGLPyramid-f7d6c6be3413438afef1c3319db3df5c184ead12.tar.gz
GLPyramid-f7d6c6be3413438afef1c3319db3df5c184ead12.tar.bz2
GLPyramid-f7d6c6be3413438afef1c3319db3df5c184ead12.zip
sdl: event handler, handle a case where user doesn't define vtbl
-rw-r--r--sdl/config.lua4
-rw-r--r--sdl/event.c72
-rw-r--r--sdl/event.h6
-rw-r--r--sdl/platform.c5
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);