This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
checkkeys.c
202 lines (179 loc) · 5.17 KB
1
2
3
4
5
6
7
8
9
10
11
/*
Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely.
*/
12
13
14
15
16
17
18
19
20
21
22
23
/* Simple program: Loop, watching keystrokes
Note that you need to call SDL_PollEvent() or SDL_WaitEvent() to
pump the event loop and catch keystrokes.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SDL.h"
24
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
25
26
static void
quit(int rc)
27
{
28
29
SDL_Quit();
exit(rc);
30
31
}
32
static void
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
print_string(char **text, size_t *maxlen, const char *fmt, ...)
{
int len;
va_list ap;
va_start(ap, fmt);
len = SDL_vsnprintf(*text, *maxlen, fmt, ap);
if (len > 0) {
*text += len;
if (len < *maxlen) {
*maxlen -= len;
} else {
*maxlen = 0;
}
}
va_end(ap);
}
static void
print_modifiers(char **text, size_t *maxlen)
53
{
54
int mod;
55
print_string(text, maxlen, " modifiers:");
56
57
mod = SDL_GetModState();
if (!mod) {
58
print_string(text, maxlen, " (none)");
59
60
61
return;
}
if (mod & KMOD_LSHIFT)
62
print_string(text, maxlen, " LSHIFT");
63
if (mod & KMOD_RSHIFT)
64
print_string(text, maxlen, " RSHIFT");
65
if (mod & KMOD_LCTRL)
66
print_string(text, maxlen, " LCTRL");
67
if (mod & KMOD_RCTRL)
68
print_string(text, maxlen, " RCTRL");
69
if (mod & KMOD_LALT)
70
print_string(text, maxlen, " LALT");
71
if (mod & KMOD_RALT)
72
print_string(text, maxlen, " RALT");
73
if (mod & KMOD_LGUI)
74
print_string(text, maxlen, " LGUI");
75
if (mod & KMOD_RGUI)
76
print_string(text, maxlen, " RGUI");
77
if (mod & KMOD_NUM)
78
print_string(text, maxlen, " NUM");
79
if (mod & KMOD_CAPS)
80
print_string(text, maxlen, " CAPS");
81
if (mod & KMOD_MODE)
82
print_string(text, maxlen, " MODE");
83
84
}
85
static void
86
PrintKey(SDL_Keysym * sym, SDL_bool pressed, SDL_bool repeat)
87
{
88
89
90
91
92
93
94
char message[512];
char *spot;
size_t left;
spot = message;
left = sizeof(message);
95
96
/* Print the keycode, name and state */
if (sym->sym) {
97
98
99
100
101
102
print_string(&spot, &left,
"Key %s: scancode %d = %s, keycode 0x%08X = %s ",
pressed ? "pressed " : "released",
sym->scancode,
SDL_GetScancodeName(sym->scancode),
sym->sym, SDL_GetKeyName(sym->sym));
103
} else {
104
105
106
107
108
print_string(&spot, &left,
"Unknown Key (scancode %d = %s) %s ",
sym->scancode,
SDL_GetScancodeName(sym->scancode),
pressed ? "pressed" : "released");
109
}
110
111
112
113
114
/* Print the translated character, if one exists */
if (sym->unicode) {
/* Is it a control-character? */
if (sym->unicode < ' ') {
115
print_string(&spot, &left, " (^%c)", sym->unicode + '@');
116
} else {
117
#ifdef UNICODE
118
print_string(&spot, &left, " (%c)", sym->unicode);
119
#else
120
121
/* This is a Latin-1 program, so only show 8-bits */
if (!(sym->unicode & 0xFF00))
122
print_string(&spot, &left, " (%c)", sym->unicode);
123
else
124
print_string(&spot, &left, " (0x%X)", sym->unicode);
125
#endif
126
127
}
}
128
print_modifiers(&spot, &left);
129
if (repeat) {
130
print_string(&spot, &left, " (repeat)");
131
}
132
SDL_Log("%s", message);
133
134
}
135
136
137
static void
PrintText(char *text)
{
138
SDL_Log("Text: %s", text);
139
140
}
141
142
143
144
#if __IPHONEOS__
extern DECLSPEC int SDLCALL SDL_iPhoneKeyboardShow(SDL_Window * window);
#endif
145
146
int
main(int argc, char *argv[])
147
{
148
SDL_Window *window;
149
150
SDL_Event event;
int done;
151
152
153
154
155
156
/* Initialize SDL */
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
return (1);
}
157
158
/* Set 640x480 video mode */
159
160
161
162
163
window = SDL_CreateWindow("CheckKeys Test",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
640, 480, 0);
if (!window) {
fprintf(stderr, "Couldn't create 640x480 window: %s\n",
164
165
166
SDL_GetError());
quit(2);
}
167
168
169
170
171
172
173
174
#if __IPHONEOS__
/* Creating the context creates the view, which we need to show keyboard */
SDL_GL_CreateContext(window);
SDL_iPhoneKeyboardShow(window);
#endif
175
176
177
178
179
180
181
182
/* Watch keystrokes */
done = 0;
while (!done) {
/* Check for events */
SDL_WaitEvent(&event);
switch (event.type) {
case SDL_KEYDOWN:
case SDL_KEYUP:
183
PrintKey(&event.key.keysym, event.key.state, event.key.repeat);
184
break;
185
186
187
case SDL_TEXTINPUT:
PrintText(event.text.text);
break;
188
189
190
191
192
193
194
195
196
case SDL_MOUSEBUTTONDOWN:
/* Any button press quits the app... */
case SDL_QUIT:
done = 1;
break;
default:
break;
}
}
197
198
199
SDL_Quit();
return (0);
200
}
201
202
/* vi: set ts=4 sw=4 expandtab: */