static int handle_sball_event(sball_event *ev);
static void recalc_sball_matrix(float *xform);
+static int sdlkey_to_demokey(int sdlkey, unsigned int mod);
+
static int quit;
static SDL_Surface *fbsurf;
fprintf(stderr, "failed to allocate virtual framebuffer\n");
return 1;
}
- vmem_front = vmem_back = fb_pixels;
+ vmem = fb_pixels;
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_NOPARACHUTE);
if(!(fbsurf = SDL_SetVideoMode(xsz, ysz, fb_bpp, sdl_flags))) {
time_msec = get_msec();
demo_draw();
- drawFps(fb_pixels);
if(SDL_MUSTLOCK(fbsurf)) {
SDL_LockSurface(fbsurf);
void swap_buffers(void *pixels)
{
+ demo_post_draw(pixels ? pixels : fb_pixels);
+
/* do nothing, all pointers point to the same buffer */
if(opt.vsync) {
wait_vsync();
static void handle_event(SDL_Event *ev)
{
+ int key;
+
switch(ev->type) {
case SDL_QUIT:
quit = 1;
toggle_fullscreen();
break;
}
- demo_keyboard(ev->key.keysym.sym, ev->key.state == SDL_PRESSED ? 1 : 0);
+ key = sdlkey_to_demokey(ev->key.keysym.sym, ev->key.keysym.mod);
+ demo_keyboard(key, ev->key.state == SDL_PRESSED ? 1 : 0);
break;
case SDL_MOUSEMOTION:
return 0;
}
-void recalc_sball_matrix(float *xform)
+static void recalc_sball_matrix(float *xform)
{
quat_to_mat(xform, rot);
xform[12] = pos.x;
xform[13] = pos.y;
xform[14] = pos.z;
}
+
+#define SSORG '\''
+#define SSEND '`'
+static char symshift[] = {
+ '"', 0, 0, 0, 0, '<', '_', '>', '?',
+ ')', '!', '@', '#', '$', '%', '^', '&', '*', '(',
+ 0, ':', 0, '+', 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ '{', '|', '}', 0, 0, '~'
+};
+
+
+static int sdlkey_to_demokey(int sdlkey, unsigned int mod)
+{
+ if(sdlkey < 128) {
+ if(mod & (KMOD_SHIFT)) {
+ if(sdlkey >= 'a' && sdlkey <= 'z') {
+ sdlkey = toupper(sdlkey);
+ } else if(sdlkey >= SSORG && sdlkey <= SSEND) {
+ sdlkey = symshift[sdlkey - SSORG];
+ }
+ }
+ return sdlkey;
+ }
+ if(sdlkey < 256) return 0;
+ return sdlkey - 128;
+}