1 2/* Simple program: Loop, watching keystrokes 3 Note that you need to call SDL_PollEvent() or SDL_WaitEvent() to 4 pump the event loop and catch keystrokes. 5*/ 6 7#include <stdio.h> 8#include <stdlib.h> 9#include <string.h> 10 11#include "SDL.h" 12 13/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ 14static void quit(int rc) 15{ 16 SDL_Quit(); 17 exit(rc); 18} 19 20static void print_modifiers(void) 21{ 22 int mod; 23 printf(" modifiers:"); 24 mod = SDL_GetModState(); 25 if(!mod) { 26 printf(" (none)"); 27 return; 28 } 29 if(mod & KMOD_LSHIFT) 30 printf(" LSHIFT"); 31 if(mod & KMOD_RSHIFT) 32 printf(" RSHIFT"); 33 if(mod & KMOD_LCTRL) 34 printf(" LCTRL"); 35 if(mod & KMOD_RCTRL) 36 printf(" RCTRL"); 37 if(mod & KMOD_LALT) 38 printf(" LALT"); 39 if(mod & KMOD_RALT) 40 printf(" RALT"); 41 if(mod & KMOD_LMETA) 42 printf(" LMETA"); 43 if(mod & KMOD_RMETA) 44 printf(" RMETA"); 45 if(mod & KMOD_NUM) 46 printf(" NUM"); 47 if(mod & KMOD_CAPS) 48 printf(" CAPS"); 49 if(mod & KMOD_MODE) 50 printf(" MODE"); 51} 52 53static void PrintKey(SDL_keysym *sym, int pressed) 54{ 55 /* Print the keycode, name and state */ 56 if ( sym->sym ) { 57 printf("Key %s: %d-%s ", pressed ? "pressed" : "released", 58 sym->sym, SDL_GetKeyName(sym->sym)); 59 } else { 60 printf("Unknown Key (scancode = %d) %s ", sym->scancode, 61 pressed ? "pressed" : "released"); 62 } 63 64 /* Print the translated character, if one exists */ 65 if ( sym->unicode ) { 66 /* Is it a control-character? */ 67 if ( sym->unicode < ' ' ) { 68 printf(" (^%c)", sym->unicode+'@'); 69 } else { 70#ifdef UNICODE 71 printf(" (%c)", sym->unicode); 72#else 73 /* This is a Latin-1 program, so only show 8-bits */ 74 if ( !(sym->unicode & 0xFF00) ) 75 printf(" (%c)", sym->unicode); 76 else 77 printf(" (0x%X)", sym->unicode); 78#endif 79 } 80 } 81 print_modifiers(); 82 printf("\n"); 83} 84 85int main(int argc, char *argv[]) 86{ 87 SDL_Event event; 88 int done; 89 Uint32 videoflags; 90 91 /* Initialize SDL */ 92 if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { 93 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); 94 return(1); 95 } 96 97 videoflags = SDL_SWSURFACE; 98 while( argc > 1 ) { 99 --argc; 100 if ( argv[argc] && !strcmp(argv[argc], "-fullscreen") ) { 101 videoflags |= SDL_FULLSCREEN; 102 } else { 103 fprintf(stderr, "Usage: %s [-fullscreen]\n", argv[0]); 104 quit(1); 105 } 106 } 107 108 /* Set 640x480 video mode */ 109 if ( SDL_SetVideoMode(640, 480, 0, videoflags) == NULL ) { 110 fprintf(stderr, "Couldn't set 640x480 video mode: %s\n", 111 SDL_GetError()); 112 quit(2); 113 } 114 115 /* Enable UNICODE translation for keyboard input */ 116 SDL_EnableUNICODE(1); 117 118 /* Enable auto repeat for keyboard input */ 119 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, 120 SDL_DEFAULT_REPEAT_INTERVAL); 121 122 /* Watch keystrokes */ 123 done = 0; 124 while ( !done ) { 125 /* Check for events */ 126 SDL_WaitEvent(&event); 127 switch (event.type) { 128 case SDL_KEYDOWN: 129 PrintKey(&event.key.keysym, 1); 130 break; 131 case SDL_KEYUP: 132 PrintKey(&event.key.keysym, 0); 133 break; 134 case SDL_MOUSEBUTTONDOWN: 135 /* Any button press quits the app... */ 136 case SDL_QUIT: 137 done = 1; 138 break; 139 default: 140 break; 141 } 142 } 143 144 SDL_Quit(); 145 return(0); 146} 147