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

流媒体/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_gemdosevents.c,v 1.1 2002/04/22 21:38:04 wmay Exp $";
  21. #endif
  22. /*
  23.  * Atari keyboard events manager, using Gemdos
  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_xbiosevents_c.h"
  35. /* To save state of keyboard */
  36. #define ATARIBIOS_MAXKEYS 128
  37. static unsigned char gemdos_currentkeyboard[ATARIBIOS_MAXKEYS];
  38. static unsigned char gemdos_previouskeyboard[ATARIBIOS_MAXKEYS];
  39. static unsigned char gemdos_currentascii[ATARIBIOS_MAXKEYS];
  40. /* Special keys state */
  41. enum {
  42. K_RSHIFT=0,
  43. K_LSHIFT,
  44. K_CTRL,
  45. K_ALT,
  46. K_CAPSLOCK,
  47. K_CLRHOME,
  48. K_INSERT
  49. };
  50. enum {
  51. DEV_BUSY=0,
  52. DEV_READY
  53. };
  54. /* The translation tables from a console scancode to a SDL keysym */
  55. static SDLKey keymap[ATARIBIOS_MAXKEYS];
  56. static SDL_keysym *TranslateKey(int scancode, int asciicode, SDL_keysym *keysym);
  57. static void UpdateSpecialKeys(int special_keys_state);
  58. void AtariGemdos_InitOSKeymap(_THIS)
  59. {
  60. int i;
  61. memset(gemdos_currentkeyboard, 0, sizeof(gemdos_currentkeyboard));
  62. memset(gemdos_previouskeyboard, 0, sizeof(gemdos_previouskeyboard));
  63. /* Initialize keymap */
  64. for ( i=0; i<sizeof(keymap); i++ )
  65. keymap[i] = SDLK_UNKNOWN;
  66. /* Functions keys */
  67. for ( i = 0; i<10; i++ )
  68. keymap[SCANCODE_F1 + i] = SDLK_F1+i;
  69. /* Cursor keypad */
  70. keymap[SCANCODE_HELP] = SDLK_HELP;
  71. keymap[SCANCODE_UNDO] = SDLK_UNDO;
  72. keymap[SCANCODE_INSERT] = SDLK_INSERT;
  73. keymap[SCANCODE_CLRHOME] = SDLK_HOME;
  74. keymap[SCANCODE_UP] = SDLK_UP;
  75. keymap[SCANCODE_DOWN] = SDLK_DOWN;
  76. keymap[SCANCODE_RIGHT] = SDLK_RIGHT;
  77. keymap[SCANCODE_LEFT] = SDLK_LEFT;
  78. /* Special keys */
  79. keymap[SCANCODE_ESCAPE] = SDLK_ESCAPE;
  80. keymap[SCANCODE_BACKSPACE] = SDLK_BACKSPACE;
  81. keymap[SCANCODE_TAB] = SDLK_TAB;
  82. keymap[SCANCODE_ENTER] = SDLK_RETURN;
  83. keymap[SCANCODE_DELETE] = SDLK_DELETE;
  84. keymap[SCANCODE_LEFTCONTROL] = SDLK_LCTRL;
  85. keymap[SCANCODE_LEFTSHIFT] = SDLK_LSHIFT;
  86. keymap[SCANCODE_RIGHTSHIFT] = SDLK_RSHIFT;
  87. keymap[SCANCODE_LEFTALT] = SDLK_LALT;
  88. keymap[SCANCODE_CAPSLOCK] = SDLK_CAPSLOCK;
  89. SDL_AtariXbios_InstallVectors(ATARI_XBIOS_MOUSEEVENTS|ATARI_XBIOS_JOYSTICKEVENTS);
  90. }
  91. void AtariGemdos_PumpEvents(_THIS)
  92. {
  93. int i;
  94. SDL_keysym keysym;
  95. /* Update pressed keys */
  96. memset(gemdos_currentkeyboard, 0, ATARIBIOS_MAXKEYS);
  97. while (Cconis()!=DEV_BUSY) {
  98. unsigned long key_pressed;
  99. unsigned char scancode, asciicode;
  100. key_pressed=Cnecin();
  101. asciicode = key_pressed;
  102. scancode = key_pressed >> 16;
  103. gemdos_currentkeyboard[scancode]=0xFF;
  104. gemdos_currentascii[scancode]=asciicode;
  105. }
  106. /* Read special keys */
  107. UpdateSpecialKeys(Kbshift(-1));
  108. /* Now generate events */
  109. for (i=0; i<ATARIBIOS_MAXKEYS; i++) {
  110. /* Key pressed ? */
  111. if (gemdos_currentkeyboard[i] && !gemdos_previouskeyboard[i])
  112. SDL_PrivateKeyboard(SDL_PRESSED, TranslateKey(i, gemdos_currentascii[i], &keysym));
  113. /* Key unpressed ? */
  114. if (gemdos_previouskeyboard[i] && !gemdos_currentkeyboard[i])
  115. SDL_PrivateKeyboard(SDL_RELEASED, TranslateKey(i, gemdos_currentascii[i], &keysym));
  116. }
  117. SDL_AtariXbios_PostMouseEvents(this);
  118. /* Will be previous table */
  119. memcpy(gemdos_previouskeyboard, gemdos_currentkeyboard, ATARIBIOS_MAXKEYS);
  120. }
  121. static void UpdateSpecialKeys(int special_keys_state)
  122. {
  123. #define UPDATE_SPECIAL_KEYS(numbit,scancode) 
  124. {
  125. if (special_keys_state & (1<<(numbit))) { 
  126. gemdos_currentkeyboard[scancode]=0xFF; 
  127. gemdos_currentascii[scancode]=0; 
  128. }
  129. }
  130. UPDATE_SPECIAL_KEYS(K_RSHIFT, SCANCODE_RIGHTSHIFT);
  131. UPDATE_SPECIAL_KEYS(K_LSHIFT, SCANCODE_LEFTSHIFT);
  132. UPDATE_SPECIAL_KEYS(K_CTRL, SCANCODE_LEFTCONTROL);
  133. UPDATE_SPECIAL_KEYS(K_ALT, SCANCODE_LEFTALT);
  134. UPDATE_SPECIAL_KEYS(K_CAPSLOCK, SCANCODE_CAPSLOCK);
  135. }
  136. static SDL_keysym *TranslateKey(int scancode, int asciicode, SDL_keysym *keysym)
  137. {
  138. /* Set the keysym information */
  139. keysym->scancode = scancode;
  140. if (asciicode)
  141. keysym->sym = asciicode;
  142. else
  143. keysym->sym = keymap[scancode];
  144. keysym->mod = KMOD_NONE;
  145. keysym->unicode = 0;
  146. return(keysym);
  147. }
  148. void AtariGemdos_ShutdownEvents(void)
  149. {
  150. SDL_AtariXbios_RestoreVectors();
  151. }