• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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. */
quit(int rc)14 static void quit(int rc)
15 {
16 	SDL_Quit();
17 	exit(rc);
18 }
19 
print_modifiers(void)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 
PrintKey(SDL_keysym * sym,int pressed)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 
main(int argc,char * argv[])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