/* Simple program: Loop, watching keystrokes Note that you need to call SDL_PollEvent() or SDL_WaitEvent() to pump the event loop and catch keystrokes. */ #include #include #include #include "SDL.h" /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ static void quit (int rc) { SDL_Quit (); exit (rc); } static void print_modifiers (void) { int mod; printf (" modifiers:"); mod = SDL_GetModState (); if (!mod) { printf (" (none)"); return; } if (mod & KMOD_LSHIFT) printf (" LSHIFT"); if (mod & KMOD_RSHIFT) printf (" RSHIFT"); if (mod & KMOD_LCTRL) printf (" LCTRL"); if (mod & KMOD_RCTRL) printf (" RCTRL"); if (mod & KMOD_LALT) printf (" LALT"); if (mod & KMOD_RALT) printf (" RALT"); if (mod & KMOD_LMETA) printf (" LMETA"); if (mod & KMOD_RMETA) printf (" RMETA"); if (mod & KMOD_NUM) printf (" NUM"); if (mod & KMOD_CAPS) printf (" CAPS"); if (mod & KMOD_MODE) printf (" MODE"); } static void PrintKey (SDL_keysym * sym, int pressed) { /* Print the keycode, name and state */ if (sym->sym) { printf ("Key %s: %d-%s ", pressed ? "pressed" : "released", sym->sym, SDL_GetKeyName (sym->sym)); } else { printf ("Unknown Key (scancode = %d) %s ", sym->scancode, pressed ? "pressed" : "released"); } /* Print the translated character, if one exists */ if (sym->unicode) { /* Is it a control-character? */ if (sym->unicode < ' ') { printf (" (^%c)", sym->unicode + '@'); } else { #ifdef UNICODE printf (" (%c)", sym->unicode); #else /* This is a Latin-1 program, so only show 8-bits */ if (!(sym->unicode & 0xFF00)) printf (" (%c)", sym->unicode); else printf (" (0x%X)", sym->unicode); #endif } } print_modifiers (); printf ("\n"); } int main (int argc, char *argv[]) { SDL_Event event; int done; Uint32 videoflags; /* Initialize SDL */ if (SDL_Init (SDL_INIT_VIDEO) < 0) { fprintf (stderr, "Couldn't initialize SDL: %s\n", SDL_GetError ()); return (1); } videoflags = SDL_SWSURFACE; while (argc > 1) { --argc; if (argv[argc] && !strcmp (argv[argc], "-fullscreen")) { videoflags |= SDL_FULLSCREEN; } else { fprintf (stderr, "Usage: %s [-fullscreen]\n", argv[0]); quit (1); } } /* Set 640x480 video mode */ if (SDL_SetVideoMode (640, 480, 0, videoflags) == NULL) { fprintf (stderr, "Couldn't set 640x480 video mode: %s\n", SDL_GetError ()); quit (2); } /* Enable UNICODE translation for keyboard input */ SDL_EnableUNICODE (1); /* Enable auto repeat for keyboard input */ SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); /* Watch keystrokes */ done = 0; while (!done) { /* Check for events */ SDL_WaitEvent (&event); switch (event.type) { case SDL_KEYDOWN: PrintKey (&event.key.keysym, 1); break; case SDL_KEYUP: PrintKey (&event.key.keysym, 0); break; case SDL_MOUSEBUTTONDOWN: /* Any button press quits the app... */ case SDL_QUIT: done = 1; break; default: break; } } SDL_Quit (); return (0); }