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