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