Home | History | Annotate | Download | only in test
      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. */
     14 static void quit(int rc)
     15 {
     16 	SDL_Quit();
     17 	exit(rc);
     18 }
     19 
     20 static 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 
     53 static 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 
     85 int 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