1 /* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997-2012 Sam Lantinga 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with this library; if not, write to the Free Software 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 Sam Lantinga 20 slouken (at) libsdl.org 21 */ 22 #include "SDL_config.h" 23 24 /* Handle the event stream, converting AA events into SDL events */ 25 26 #include <stdio.h> 27 28 #include <aalib.h> 29 30 #include "SDL.h" 31 #include "../../events/SDL_sysevents.h" 32 #include "../../events/SDL_events_c.h" 33 #include "SDL_aavideo.h" 34 #include "SDL_aaevents_c.h" 35 36 /* The translation tables from a console scancode to a SDL keysym */ 37 static SDLKey keymap[401]; 38 39 static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym); 40 41 42 void AA_PumpEvents(_THIS) 43 { 44 int posted = 0; 45 int mouse_button, mouse_x, mouse_y; 46 int evt; 47 SDL_keysym keysym; 48 49 static int prev_button = -1, prev_x = -1, prev_y = -1; 50 51 if( ! this->screen ) /* Wait till we got the screen initialized */ 52 return; 53 54 do { 55 posted = 0; 56 /* Gather events */ 57 58 /* Get mouse status */ 59 SDL_mutexP(AA_mutex); 60 aa_getmouse (AA_context, &mouse_x, &mouse_y, &mouse_button); 61 SDL_mutexV(AA_mutex); 62 mouse_x = mouse_x * this->screen->w / aa_scrwidth (AA_context); 63 mouse_y = mouse_y * this->screen->h / aa_scrheight (AA_context); 64 65 /* Compare against previous state and generate events */ 66 if( prev_button != mouse_button ) { 67 if( mouse_button & AA_BUTTON1 ) { 68 if ( ! (prev_button & AA_BUTTON1) ) { 69 posted += SDL_PrivateMouseButton(SDL_PRESSED, 1, 0, 0); 70 } 71 } else { 72 if ( prev_button & AA_BUTTON1 ) { 73 posted += SDL_PrivateMouseButton(SDL_RELEASED, 1, 0, 0); 74 } 75 } 76 if( mouse_button & AA_BUTTON2 ) { 77 if ( ! (prev_button & AA_BUTTON2) ) { 78 posted += SDL_PrivateMouseButton(SDL_PRESSED, 2, 0, 0); 79 } 80 } else { 81 if ( prev_button & AA_BUTTON2 ) { 82 posted += SDL_PrivateMouseButton(SDL_RELEASED, 2, 0, 0); 83 } 84 } 85 if( mouse_button & AA_BUTTON3 ) { 86 if ( ! (prev_button & AA_BUTTON3) ) { 87 posted += SDL_PrivateMouseButton(SDL_PRESSED, 3, 0, 0); 88 } 89 } else { 90 if ( prev_button & AA_BUTTON3 ) { 91 posted += SDL_PrivateMouseButton(SDL_RELEASED, 3, 0, 0); 92 } 93 } 94 } 95 if ( prev_x != mouse_x || prev_y != mouse_y ) { 96 posted += SDL_PrivateMouseMotion(0, 0, mouse_x, mouse_y); 97 } 98 99 prev_button = mouse_button; 100 prev_x = mouse_x; prev_y = mouse_y; 101 102 /* Get keyboard event */ 103 SDL_mutexP(AA_mutex); 104 evt = aa_getevent(AA_context, 0); 105 SDL_mutexV(AA_mutex); 106 if ( (evt > AA_NONE) && (evt < AA_RELEASE) && (evt != AA_MOUSE) && (evt != AA_RESIZE) ) { 107 /* Key pressed */ 108 /* printf("Key pressed: %d (%c)\n", evt, evt); */ 109 posted += SDL_PrivateKeyboard(SDL_PRESSED, TranslateKey(evt, &keysym)); 110 } else if ( evt >= AA_RELEASE ) { 111 /* Key released */ 112 evt &= ~AA_RELEASE; 113 /* printf("Key released: %d (%c)\n", evt, evt); */ 114 posted += SDL_PrivateKeyboard(SDL_RELEASED, TranslateKey(evt, &keysym)); 115 } 116 } while ( posted ); 117 } 118 119 void AA_InitOSKeymap(_THIS) 120 { 121 int i; 122 static const char *std_keys = " 01234567890&#'()_-|$*+-=/\\:;.,!?<>{}[]@~%^\x9"; 123 const char *std; 124 125 /* Initialize the AAlib key translation table */ 126 for ( i=0; i<SDL_arraysize(keymap); ++i ) 127 keymap[i] = SDLK_UNKNOWN; 128 129 /* Alphabet keys */ 130 for ( i = 0; i<26; ++i ){ 131 keymap['a' + i] = SDLK_a+i; 132 keymap['A' + i] = SDLK_a+i; 133 } 134 /* Function keys */ 135 for ( i = 0; i<12; ++i ){ 136 keymap[334 + i] = SDLK_F1+i; 137 } 138 /* Keys that have the same symbols and don't have to be translated */ 139 for( std = std_keys; *std; std ++ ) { 140 keymap[*std] = *std; 141 } 142 143 keymap[13] = SDLK_RETURN; 144 keymap[AA_BACKSPACE] = SDLK_BACKSPACE; 145 146 keymap[369] = SDLK_LSHIFT; 147 keymap[370] = SDLK_RSHIFT; 148 keymap[371] = SDLK_LCTRL; 149 keymap[372] = SDLK_RCTRL; 150 keymap[377] = SDLK_LALT; 151 keymap[270] = SDLK_RALT; 152 keymap[271] = SDLK_NUMLOCK; 153 keymap[373] = SDLK_CAPSLOCK; 154 keymap[164] = SDLK_SCROLLOCK; 155 156 keymap[243] = SDLK_INSERT; 157 keymap[304] = SDLK_DELETE; 158 keymap[224] = SDLK_HOME; 159 keymap[231] = SDLK_END; 160 keymap[229] = SDLK_PAGEUP; 161 keymap[230] = SDLK_PAGEDOWN; 162 163 keymap[241] = SDLK_PRINT; 164 keymap[163] = SDLK_BREAK; 165 166 keymap[302] = SDLK_KP0; 167 keymap[300] = SDLK_KP1; 168 keymap[297] = SDLK_KP2; 169 keymap[299] = SDLK_KP3; 170 keymap[294] = SDLK_KP4; 171 keymap[301] = SDLK_KP5; 172 keymap[296] = SDLK_KP6; 173 keymap[293] = SDLK_KP7; 174 keymap[295] = SDLK_KP8; 175 keymap[298] = SDLK_KP9; 176 177 keymap[AA_ESC] = SDLK_ESCAPE; 178 keymap[AA_UP] = SDLK_UP; 179 keymap[AA_DOWN] = SDLK_DOWN; 180 keymap[AA_LEFT] = SDLK_LEFT; 181 keymap[AA_RIGHT] = SDLK_RIGHT; 182 } 183 184 static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym) 185 { 186 /* Sanity check */ 187 if ( scancode >= SDL_arraysize(keymap) ) 188 scancode = AA_UNKNOWN; 189 190 /* Set the keysym information */ 191 keysym->scancode = scancode; 192 keysym->sym = keymap[scancode]; 193 keysym->mod = KMOD_NONE; 194 195 /* If UNICODE is on, get the UNICODE value for the key */ 196 keysym->unicode = 0; 197 if ( SDL_TranslateUNICODE ) { 198 /* Populate the unicode field with the ASCII value */ 199 keysym->unicode = scancode; 200 } 201 return(keysym); 202 } 203