1555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/*
2555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
3555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
4555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  This software is provided 'as-is', without any express or implied
5555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  warranty.  In no event will the authors be held liable for any damages
6555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  arising from the use of this software.
7555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
8555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  Permission is granted to anyone to use this software for any purpose,
9555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  including commercial applications, and to alter it and redistribute it
10555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot  freely.
11555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot*/
12555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
13555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* Simple program:  Loop, watching keystrokes
14555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   Note that you need to call SDL_PollEvent() or SDL_WaitEvent() to
15555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot   pump the event loop and catch keystrokes.
16555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot*/
17555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
18555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <stdio.h>
19555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <stdlib.h>
20555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <string.h>
21555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
22555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include "SDL.h"
23555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
24555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
25555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic void
26555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotquit(int rc)
27555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
28555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Quit();
29555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    exit(rc);
30555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
31555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
32555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic void
33555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotprint_string(char **text, size_t *maxlen, const char *fmt, ...)
34555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
35555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int len;
36555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    va_list ap;
37555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
38555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    va_start(ap, fmt);
39555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    len = SDL_vsnprintf(*text, *maxlen, fmt, ap);
40555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (len > 0) {
41555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        *text += len;
42555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        if ( ((size_t) len) < *maxlen ) {
43555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            *maxlen -= (size_t) len;
44555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        } else {
45555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            *maxlen = 0;
46555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
47555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
48555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    va_end(ap);
49555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
50555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
51555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic void
52555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotprint_modifiers(char **text, size_t *maxlen)
53555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
54555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int mod;
55555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    print_string(text, maxlen, " modifiers:");
56555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    mod = SDL_GetModState();
57555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (!mod) {
58555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(text, maxlen, " (none)");
59555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return;
60555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
61555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (mod & KMOD_LSHIFT)
62555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(text, maxlen, " LSHIFT");
63555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (mod & KMOD_RSHIFT)
64555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(text, maxlen, " RSHIFT");
65555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (mod & KMOD_LCTRL)
66555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(text, maxlen, " LCTRL");
67555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (mod & KMOD_RCTRL)
68555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(text, maxlen, " RCTRL");
69555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (mod & KMOD_LALT)
70555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(text, maxlen, " LALT");
71555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (mod & KMOD_RALT)
72555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(text, maxlen, " RALT");
73555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (mod & KMOD_LGUI)
74555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(text, maxlen, " LGUI");
75555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (mod & KMOD_RGUI)
76555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(text, maxlen, " RGUI");
77555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (mod & KMOD_NUM)
78555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(text, maxlen, " NUM");
79555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (mod & KMOD_CAPS)
80555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(text, maxlen, " CAPS");
81555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (mod & KMOD_MODE)
82555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(text, maxlen, " MODE");
83555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
84555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
85555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic void
86555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotPrintKey(SDL_Keysym * sym, SDL_bool pressed, SDL_bool repeat)
87555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
88555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    char message[512];
89555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    char *spot;
90555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    size_t left;
91555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
92555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    spot = message;
93555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    left = sizeof(message);
94555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
95555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Print the keycode, name and state */
96555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (sym->sym) {
97555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(&spot, &left,
98555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                "Key %s:  scancode %d = %s, keycode 0x%08X = %s ",
99555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                pressed ? "pressed " : "released",
100555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                sym->scancode,
101555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                SDL_GetScancodeName(sym->scancode),
102555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                sym->sym, SDL_GetKeyName(sym->sym));
103555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    } else {
104555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(&spot, &left,
105555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                "Unknown Key (scancode %d = %s) %s ",
106555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                sym->scancode,
107555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                SDL_GetScancodeName(sym->scancode),
108555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                pressed ? "pressed " : "released");
109555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
110555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    print_modifiers(&spot, &left);
111555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (repeat) {
112555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        print_string(&spot, &left, " (repeat)");
113555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
114555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Log("%s\n", message);
115555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
116555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
117555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotstatic void
118555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team RobotPrintText(char *text)
119555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
120555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    char *spot, expanded[1024];
121555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
122555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    expanded[0] = '\0';
123555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    for ( spot = text; *spot; ++spot )
124555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    {
125555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        size_t length = SDL_strlen(expanded);
126555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_snprintf(expanded + length, sizeof(expanded) - length, "\\x%.2x", (unsigned char)*spot);
127555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
128555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Log("Text (%s): \"%s%s\"\n", expanded, *text == '"' ? "\\" : "", text);
129555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
130555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
131555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotint
132555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotmain(int argc, char *argv[])
133555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot{
134555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Window *window;
135555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Event event;
136555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    int done;
137555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
138555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot	/* Enable standard application logging */
139555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot	SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
140555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
141555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Initialize SDL */
142555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
143555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot		SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
144555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        return (1);
145555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
146555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
147555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Set 640x480 video mode */
148555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    window = SDL_CreateWindow("CheckKeys Test",
149555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                              SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
150555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                              640, 480, 0);
151555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    if (!window) {
152555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create 640x480 window: %s\n",
153555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot                SDL_GetError());
154555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        quit(2);
155555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
156555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
157555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#if __IPHONEOS__
158555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Creating the context creates the view, which we need to show keyboard */
159555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_GL_CreateContext(window);
160555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif
161555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
162555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_StartTextInput();
163555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
164555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    /* Watch keystrokes */
165555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    done = 0;
166555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    while (!done) {
167555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        /* Check for events */
168555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        SDL_WaitEvent(&event);
169555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        switch (event.type) {
170555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        case SDL_KEYDOWN:
171555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        case SDL_KEYUP:
172555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot			PrintKey(&event.key.keysym, (event.key.state == SDL_PRESSED) ? SDL_TRUE : SDL_FALSE, (event.key.repeat) ? SDL_TRUE : SDL_FALSE);
173555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            break;
174555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        case SDL_TEXTINPUT:
175555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            PrintText(event.text.text);
176555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            break;
177555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        case SDL_MOUSEBUTTONDOWN:
178555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            /* Any button press quits the app... */
179555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        case SDL_QUIT:
180555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            done = 1;
181555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            break;
182555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        default:
183555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot            break;
184555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot        }
185555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    }
186555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
187555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    SDL_Quit();
188555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot    return (0);
189555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}
190555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot
191555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot/* vi: set ts=4 sw=4 expandtab: */
192