|
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 } |