SDL_aaevents.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:6k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

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