test/checkkeys.c
author Sam Lantinga <slouken@libsdl.org>
Mon, 21 Sep 2009 07:32:26 +0000
branchSDL-1.2
changeset 4209 62e86ab81e3c
parent 1253 7c7ddaf195bf
child 1662 782fd950bd46
child 1895 c121d94672cb
permissions -rw-r--r--
Fixed bug #570

SDL_SemWaitTimeout in src/thread/generic/SDL_syssem.c line 179 (SVN trunk):

--sem->count;

should be

if (retval == 0) {
--sem->count;
}

Without this, sem->count will underflow on timeout effectively breaking the
semaphore. It appears that the implementation has been wrong since the initial
revision.
     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 }