1 /* 2 Copyright (C) 1997-2014 Sam Lantinga <slouken (at) libsdl.org> 3 4 This software is provided 'as-is', without any express or implied 5 warranty. In no event will the authors be held liable for any damages 6 arising from the use of this software. 7 8 Permission is granted to anyone to use this software for any purpose, 9 including commercial applications, and to alter it and redistribute it 10 freely. 11 */ 12 13 /* Simple program: Loop, watching keystrokes 14 Note that you need to call SDL_PollEvent() or SDL_WaitEvent() to 15 pump the event loop and catch keystrokes. 16 */ 17 18 #include <stdio.h> 19 #include <stdlib.h> 20 #include <string.h> 21 22 #include "SDL.h" 23 24 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ 25 static void 26 quit(int rc) 27 { 28 SDL_Quit(); 29 exit(rc); 30 } 31 32 static void 33 print_string(char **text, size_t *maxlen, const char *fmt, ...) 34 { 35 int len; 36 va_list ap; 37 38 va_start(ap, fmt); 39 len = SDL_vsnprintf(*text, *maxlen, fmt, ap); 40 if (len > 0) { 41 *text += len; 42 if ( ((size_t) len) < *maxlen ) { 43 *maxlen -= (size_t) len; 44 } else { 45 *maxlen = 0; 46 } 47 } 48 va_end(ap); 49 } 50 51 static void 52 print_modifiers(char **text, size_t *maxlen) 53 { 54 int mod; 55 print_string(text, maxlen, " modifiers:"); 56 mod = SDL_GetModState(); 57 if (!mod) { 58 print_string(text, maxlen, " (none)"); 59 return; 60 } 61 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 char message[512]; 89 char *spot; 90 size_t left; 91 92 spot = message; 93 left = sizeof(message); 94 95 /* Print the keycode, name and state */ 96 if (sym->sym) { 97 print_string(&spot, &left, 98 "Key %s: scancode %d = %s, keycode 0x%08X = %s ", 99 pressed ? "pressed " : "released", 100 sym->scancode, 101 SDL_GetScancodeName(sym->scancode), 102 sym->sym, SDL_GetKeyName(sym->sym)); 103 } else { 104 print_string(&spot, &left, 105 "Unknown Key (scancode %d = %s) %s ", 106 sym->scancode, 107 SDL_GetScancodeName(sym->scancode), 108 pressed ? "pressed " : "released"); 109 } 110 print_modifiers(&spot, &left); 111 if (repeat) { 112 print_string(&spot, &left, " (repeat)"); 113 } 114 SDL_Log("%s\n", message); 115 } 116 117 static void 118 PrintText(char *text) 119 { 120 char *spot, expanded[1024]; 121 122 expanded[0] = '\0'; 123 for ( spot = text; *spot; ++spot ) 124 { 125 size_t length = SDL_strlen(expanded); 126 SDL_snprintf(expanded + length, sizeof(expanded) - length, "\\x%.2x", (unsigned char)*spot); 127 } 128 SDL_Log("Text (%s): \"%s%s\"\n", expanded, *text == '"' ? "\\" : "", text); 129 } 130 131 int 132 main(int argc, char *argv[]) 133 { 134 SDL_Window *window; 135 SDL_Event event; 136 int done; 137 138 /* Enable standard application logging */ 139 SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO); 140 141 /* Initialize SDL */ 142 if (SDL_Init(SDL_INIT_VIDEO) < 0) { 143 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError()); 144 return (1); 145 } 146 147 /* Set 640x480 video mode */ 148 window = SDL_CreateWindow("CheckKeys Test", 149 SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 150 640, 480, 0); 151 if (!window) { 152 SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create 640x480 window: %s\n", 153 SDL_GetError()); 154 quit(2); 155 } 156 157 #if __IPHONEOS__ 158 /* Creating the context creates the view, which we need to show keyboard */ 159 SDL_GL_CreateContext(window); 160 #endif 161 162 SDL_StartTextInput(); 163 164 /* Watch keystrokes */ 165 done = 0; 166 while (!done) { 167 /* Check for events */ 168 SDL_WaitEvent(&event); 169 switch (event.type) { 170 case SDL_KEYDOWN: 171 case SDL_KEYUP: 172 PrintKey(&event.key.keysym, (event.key.state == SDL_PRESSED) ? SDL_TRUE : SDL_FALSE, (event.key.repeat) ? SDL_TRUE : SDL_FALSE); 173 break; 174 case SDL_TEXTINPUT: 175 PrintText(event.text.text); 176 break; 177 case SDL_MOUSEBUTTONDOWN: 178 /* Any button press quits the app... */ 179 case SDL_QUIT: 180 done = 1; 181 break; 182 default: 183 break; 184 } 185 } 186 187 SDL_Quit(); 188 return (0); 189 } 190 191 /* vi: set ts=4 sw=4 expandtab: */ 192