SDL_ikbdevents.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_ikbdevents.c,v 1.1 2002/04/22 21:38:04 wmay Exp $";
  21. #endif
  22. /*
  23.  * Atari keyboard events manager, using hardware IKBD
  24.  *
  25.  * Patrice Mandin
  26.  */
  27. #include <string.h>
  28. /* Mint includes */
  29. #include <mint/osbind.h>
  30. #include "SDL.h"
  31. #include "SDL_sysevents.h"
  32. #include "SDL_events_c.h"
  33. #include "SDL_atarikeys.h"
  34. #include "SDL_ikbdinterrupt_s.h"
  35. /* Special keys state */
  36. enum {
  37. K_RSHIFT=0,
  38. K_LSHIFT,
  39. K_CTRL,
  40. K_ALT,
  41. K_CAPSLOCK,
  42. K_CLRHOME,
  43. K_INSERT
  44. };
  45. /* To save state of keyboard */
  46. #define ATARIBIOS_MAXKEYS 128
  47. static unsigned char ikbd_previouskeyboard[ATARIBIOS_MAXKEYS];
  48. static Uint16 atari_prevmouseb; /* buttons */
  49. /* The translation tables from a console scancode to a SDL keysym */
  50. #define KT_NOCHANGE -1
  51. enum {
  52. KT_UNSHIFT=0,
  53. KT_SHIFT=1,
  54. KT_CAPS=2
  55. };
  56. static int caps_state;
  57. _KEYTAB *curtables;
  58. static unsigned char *tab_unshift, *tab_shift, *tab_caps;
  59. static SDLKey keymap[ATARIBIOS_MAXKEYS];
  60. static SDL_keysym *TranslateKey(int scancode, int numkeytable, SDL_keysym *keysym);
  61. void AtariIkbd_InitOSKeymap(_THIS)
  62. {
  63. int i;
  64. memset(SDL_AtariIkbd_keyboard, 0, ATARIBIOS_MAXKEYS);
  65. memset(ikbd_previouskeyboard, 0, ATARIBIOS_MAXKEYS);
  66. /* Initialize keymap */
  67. for ( i=0; i<sizeof(keymap); i++ )
  68. keymap[i] = SDLK_UNKNOWN;
  69. /* Functions keys */
  70. for ( i = 0; i<10; i++ )
  71. keymap[SCANCODE_F1 + i] = SDLK_F1+i;
  72. /* Cursor keypad */
  73. keymap[SCANCODE_HELP] = SDLK_HELP;
  74. keymap[SCANCODE_UNDO] = SDLK_UNDO;
  75. keymap[SCANCODE_INSERT] = SDLK_INSERT;
  76. keymap[SCANCODE_CLRHOME] = SDLK_HOME;
  77. keymap[SCANCODE_UP] = SDLK_UP;
  78. keymap[SCANCODE_DOWN] = SDLK_DOWN;
  79. keymap[SCANCODE_RIGHT] = SDLK_RIGHT;
  80. keymap[SCANCODE_LEFT] = SDLK_LEFT;
  81. /* Special keys */
  82. keymap[SCANCODE_ESCAPE] = SDLK_ESCAPE;
  83. keymap[SCANCODE_BACKSPACE] = SDLK_BACKSPACE;
  84. keymap[SCANCODE_TAB] = SDLK_TAB;
  85. keymap[SCANCODE_ENTER] = SDLK_RETURN;
  86. keymap[SCANCODE_DELETE] = SDLK_DELETE;
  87. keymap[SCANCODE_LEFTCONTROL] = SDLK_LCTRL;
  88. keymap[SCANCODE_LEFTSHIFT] = SDLK_LSHIFT;
  89. keymap[SCANCODE_RIGHTSHIFT] = SDLK_RSHIFT;
  90. keymap[SCANCODE_LEFTALT] = SDLK_LALT;
  91. keymap[SCANCODE_CAPSLOCK] = SDLK_CAPSLOCK;
  92. /* Read XBIOS tables for scancode -> ascii translation */
  93. curtables=Keytbl(KT_NOCHANGE, KT_NOCHANGE, KT_NOCHANGE);
  94. tab_unshift=curtables->unshift;
  95. tab_shift=curtables->shift;
  96. tab_caps=curtables->caps;
  97. /* Set Caps lock initial state */
  98. caps_state=(Kbshift(-1) & (1<<K_CAPSLOCK));
  99. /* Now install our handler */
  100. SDL_AtariIkbd_mouseb = SDL_AtariIkbd_mousex = SDL_AtariIkbd_mousey = 0;
  101. atari_prevmouseb = 0;
  102. Supexec(SDL_AtariIkbdInstall);
  103. }
  104. static int atari_GetButton(int button)
  105. {
  106. switch(button)
  107. {
  108. case 0:
  109. return SDL_BUTTON_RIGHT;
  110. break;
  111. case 1:
  112. default:
  113. return SDL_BUTTON_LEFT;
  114. break;
  115. }
  116. }
  117. void AtariIkbd_PumpEvents(_THIS)
  118. {
  119. int i;
  120. SDL_keysym keysym;
  121. int specialkeys;
  122. /*--- Send keyboard events ---*/
  123. /* Update caps lock state */
  124. if (SDL_AtariIkbd_keyboard[SCANCODE_CAPSLOCK] && !ikbd_previouskeyboard[SCANCODE_CAPSLOCK])
  125. caps_state ^= 1;
  126. /* Choose the translation table */
  127. specialkeys=KT_UNSHIFT;
  128. if (SDL_AtariIkbd_keyboard[SCANCODE_LEFTSHIFT] || SDL_AtariIkbd_keyboard[SCANCODE_RIGHTSHIFT])
  129. specialkeys = KT_SHIFT;
  130. if (caps_state)
  131. specialkeys = KT_CAPS;
  132. /* Now generate events */
  133. for (i=0; i<ATARIBIOS_MAXKEYS; i++) {
  134. /* Key pressed ? */
  135. if (SDL_AtariIkbd_keyboard[i] && !ikbd_previouskeyboard[i])
  136. SDL_PrivateKeyboard(SDL_PRESSED, TranslateKey(i, specialkeys, &keysym));
  137. /* Key unpressed ? */
  138. if (ikbd_previouskeyboard[i] && !SDL_AtariIkbd_keyboard[i])
  139. SDL_PrivateKeyboard(SDL_RELEASED, TranslateKey(i, specialkeys, &keysym));
  140. }
  141. /* Will be previous table */
  142. memcpy(ikbd_previouskeyboard, SDL_AtariIkbd_keyboard, ATARIBIOS_MAXKEYS);
  143. /*--- Send mouse events ---*/
  144. /* Mouse motion ? */
  145. if (SDL_AtariIkbd_mousex || SDL_AtariIkbd_mousey) {
  146. SDL_PrivateMouseMotion(0, 1, SDL_AtariIkbd_mousex, SDL_AtariIkbd_mousey);
  147. SDL_AtariIkbd_mousex = SDL_AtariIkbd_mousey = 0;
  148. }
  149. /* Mouse button ? */
  150. if (SDL_AtariIkbd_mouseb != atari_prevmouseb) {
  151. for (i=0;i<2;i++) {
  152. int curbutton, prevbutton;
  153. curbutton = SDL_AtariIkbd_mouseb & (1<<i);
  154. prevbutton = atari_prevmouseb & (1<<i);
  155. if (curbutton && !prevbutton) {
  156. SDL_PrivateMouseButton(SDL_PRESSED, atari_GetButton(i), 0, 0);
  157. }
  158. if (!curbutton && prevbutton) {
  159. SDL_PrivateMouseButton(SDL_RELEASED, atari_GetButton(i), 0, 0);
  160. }
  161. }
  162. atari_prevmouseb = SDL_AtariIkbd_mouseb;
  163. }
  164. }
  165. static SDL_keysym *TranslateKey(int scancode, int numkeytable, SDL_keysym *keysym)
  166. {
  167. unsigned char asciicode;
  168. /* Set the keysym information */
  169. keysym->scancode = scancode;
  170. asciicode=0;
  171. switch(numkeytable) {
  172. case KT_UNSHIFT:
  173. asciicode=tab_unshift[scancode];
  174. break;
  175. case KT_SHIFT:
  176. asciicode=tab_shift[scancode];
  177. break;
  178. case KT_CAPS:
  179. asciicode=tab_caps[scancode];
  180. break;
  181. }
  182. if (asciicode)
  183. keysym->sym = asciicode;
  184. else
  185. keysym->sym = keymap[scancode];
  186. keysym->mod = KMOD_NONE;
  187. keysym->unicode = 0;
  188. return(keysym);
  189. }
  190. void AtariIkbd_ShutdownEvents(void)
  191. {
  192. Supexec(SDL_AtariIkbdUninstall);
  193. }