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

流媒体/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_gemevents.c,v 1.1 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. /*
  23.  * GEM SDL video driver implementation
  24.  * inspired from the Dummy SDL driver
  25.  * 
  26.  * Patrice Mandin
  27.  * and work from
  28.  * Olivier Landemarre, Johan Klockars, Xavier Joubert, Claude Attard
  29.  */
  30. #include <string.h>
  31. #include <gem.h>
  32. #include "SDL.h"
  33. #include "SDL_sysevents.h"
  34. #include "SDL_events_c.h"
  35. #include "SDL_gemvideo.h"
  36. #include "SDL_gemevents_c.h"
  37. #include "SDL_atarikeys.h" /* for keyboard scancodes */
  38. #include "SDL_xbiosinterrupt_s.h"
  39. /* Defines */
  40. #define ATARIBIOS_MAXKEYS 128
  41. /* Variables */
  42. static unsigned char gem_currentkeyboard[ATARIBIOS_MAXKEYS];
  43. static unsigned char gem_previouskeyboard[ATARIBIOS_MAXKEYS];
  44. static unsigned char gem_currentascii[ATARIBIOS_MAXKEYS];
  45. /* The translation tables from a console scancode to a SDL keysym */
  46. static SDLKey keymap[ATARIBIOS_MAXKEYS];
  47. /* Functions prototypes */
  48. static SDL_keysym *TranslateKey(int scancode, int asciicode, SDL_keysym *keysym);
  49. static int do_messages(_THIS, short *message);
  50. static void do_keyboard(short kc, short ks);
  51. static void do_mouse(_THIS, short mx, short my, short mb, short ks);
  52. /* Functions */
  53. static SDL_keysym *TranslateKey(int scancode, int asciicode, SDL_keysym *keysym)
  54. {
  55. /* Set the keysym information */
  56. keysym->scancode = scancode;
  57. if (asciicode)
  58. keysym->sym = asciicode;
  59. else
  60. keysym->sym = keymap[scancode];
  61. keysym->mod = KMOD_NONE;
  62. keysym->unicode = 0;
  63. return(keysym);
  64. }
  65. void GEM_InitOSKeymap(_THIS)
  66. {
  67. int i;
  68. memset(gem_currentkeyboard, 0, sizeof(gem_currentkeyboard));
  69. memset(gem_previouskeyboard, 0, sizeof(gem_previouskeyboard));
  70. memset(gem_currentascii, 0, sizeof(gem_currentascii));
  71. /* Initialize keymap */
  72. for ( i=0; i<sizeof(keymap); i++ )
  73. keymap[i] = SDLK_UNKNOWN;
  74. /* Functions keys */
  75. for ( i = 0; i<10; i++ )
  76. keymap[SCANCODE_F1 + i] = SDLK_F1+i;
  77. /* Cursor keypad */
  78. keymap[SCANCODE_HELP] = SDLK_HELP;
  79. keymap[SCANCODE_UNDO] = SDLK_UNDO;
  80. keymap[SCANCODE_INSERT] = SDLK_INSERT;
  81. keymap[SCANCODE_CLRHOME] = SDLK_HOME;
  82. keymap[SCANCODE_UP] = SDLK_UP;
  83. keymap[SCANCODE_DOWN] = SDLK_DOWN;
  84. keymap[SCANCODE_RIGHT] = SDLK_RIGHT;
  85. keymap[SCANCODE_LEFT] = SDLK_LEFT;
  86. /* Special keys */
  87. keymap[SCANCODE_ESCAPE] = SDLK_ESCAPE;
  88. keymap[SCANCODE_BACKSPACE] = SDLK_BACKSPACE;
  89. keymap[SCANCODE_TAB] = SDLK_TAB;
  90. keymap[SCANCODE_ENTER] = SDLK_RETURN;
  91. keymap[SCANCODE_DELETE] = SDLK_DELETE;
  92. keymap[SCANCODE_LEFTCONTROL] = SDLK_LCTRL;
  93. keymap[SCANCODE_LEFTSHIFT] = SDLK_LSHIFT;
  94. keymap[SCANCODE_RIGHTSHIFT] = SDLK_RSHIFT;
  95. keymap[SCANCODE_LEFTALT] = SDLK_LALT;
  96. keymap[SCANCODE_CAPSLOCK] = SDLK_CAPSLOCK;
  97. /* Mouse init */
  98. GEM_mouse_relative = SDL_FALSE;
  99. }
  100. void GEM_PumpEvents(_THIS)
  101. {
  102. short mousex, mousey, mouseb, dummy;
  103. short kstate, prevkc, prevks;
  104. int i;
  105. SDL_keysym keysym;
  106. memset(gem_currentkeyboard,0,sizeof(gem_currentkeyboard));
  107. prevkc = prevks = 0;
  108. for (;;)
  109. {
  110. int quit, resultat;
  111. short buffer[8], kc;
  112. quit = 0;
  113. resultat = evnt_multi(
  114. MU_MESAG|MU_TIMER|MU_KEYBD,
  115. 0,0,0,
  116. 0,0,0,0,0,
  117. 0,0,0,0,0,
  118. buffer,
  119. 10,
  120. &dummy,&dummy,&dummy,&kstate,&kc,&dummy
  121. );
  122. /* Message event ? */
  123. if (resultat & MU_MESAG)
  124. quit = do_messages(this, buffer);
  125. /* Keyboard event ? */
  126. if (resultat & MU_KEYBD) {
  127. if ((prevkc != kc) || (prevks != kstate)) {
  128. do_keyboard(kc,kstate);
  129. } else {
  130. /* Avoid looping, if repeating same key */
  131. break;
  132. }
  133. }
  134. /* Timer event ? */
  135. if ((resultat & MU_TIMER) || quit)
  136. break;
  137. }
  138. /* Update mouse */
  139. graf_mkstate(&mousex, &mousey, &mouseb, &kstate);
  140. do_mouse(this, mousex, mousey, mouseb, kstate);
  141. /* Now generate keyboard events */
  142. for (i=0; i<ATARIBIOS_MAXKEYS; i++) {
  143. /* Key pressed ? */
  144. if (gem_currentkeyboard[i] && !gem_previouskeyboard[i])
  145. SDL_PrivateKeyboard(SDL_PRESSED, TranslateKey(i, gem_currentascii[i], &keysym));
  146. /* Key unpressed ? */
  147. if (gem_previouskeyboard[i] && !gem_currentkeyboard[i])
  148. SDL_PrivateKeyboard(SDL_RELEASED, TranslateKey(i, gem_currentascii[i], &keysym));
  149. }
  150. memcpy(gem_previouskeyboard,gem_currentkeyboard,sizeof(gem_previouskeyboard));
  151. }
  152. static int do_messages(_THIS, short *message)
  153. {
  154. int quit, posted;
  155. quit=0;
  156. switch (message[0]) {
  157. case WM_CLOSED:
  158. case AP_TERM:    
  159. posted = SDL_PrivateQuit();
  160. quit=1;
  161. break;
  162. case WM_MOVED:
  163. wind_set(message[3],WF_CURRXYWH,message[4],message[5],message[6],message[7]);
  164. break;
  165. case WM_TOPPED:
  166. wind_set(message[3],WF_TOP,message[4],0,0,0);
  167. SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS);
  168. break;
  169. case WM_REDRAW:
  170. GEM_wind_redraw(this, message[3],&message[4]);
  171. break;
  172. case WM_ICONIFY:
  173. case WM_ALLICONIFY:
  174. wind_set(message[3],WF_ICONIFY,message[4],message[5],message[6],message[7]);
  175. /* If we're active, make ourselves inactive */
  176. if ( SDL_GetAppState() & SDL_APPACTIVE ) {
  177. /* Send an internal deactivate event */
  178. SDL_PrivateAppActive(0, SDL_APPACTIVE|SDL_APPINPUTFOCUS);
  179. }
  180. break;
  181. case WM_UNICONIFY:
  182. wind_set(message[3],WF_UNICONIFY,message[4],message[5],message[6],message[7]);
  183. /* If we're not active, make ourselves active */
  184. if ( !(SDL_GetAppState() & SDL_APPACTIVE) ) {
  185. /* Send an internal activate event */
  186. SDL_PrivateAppActive(1, SDL_APPACTIVE);
  187. }
  188. break;
  189. case WM_SIZED:
  190. wind_set (message[3], WF_CURRXYWH, message[4], message[5], message[6], message[7]);
  191. GEM_win_fulled = SDL_FALSE; /* Cancel maximized flag */
  192. SDL_PrivateResize(message[6], message[7]);
  193. break;
  194. case WM_FULLED:
  195. {
  196. short x,y,w,h;
  197. if (GEM_win_fulled) {
  198. wind_get (message[3], WF_PREVXYWH, &x, &y, &w, &h);
  199. GEM_win_fulled = SDL_FALSE;
  200. } else {
  201. x = GEM_desk_x;
  202. y = GEM_desk_y;
  203. w = GEM_desk_w;
  204. h = GEM_desk_h;
  205. GEM_win_fulled = SDL_TRUE;
  206. }
  207. wind_set (message[3], WF_CURRXYWH, x, y, w, h);
  208. SDL_PrivateResize(w, h);
  209. }
  210. break;
  211. case WM_BOTTOMED:
  212. case WM_UNTOPPED:
  213. SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS);
  214. break;
  215. }
  216. return quit;
  217. }
  218. static void do_keyboard(short kc, short ks)
  219. {
  220. int scancode, asciicode;
  221. if (kc) {
  222. scancode=(kc>>8) & 127;
  223. asciicode=kc & 255;
  224. gem_currentkeyboard[scancode]=0xFF;
  225. gem_currentascii[scancode]=asciicode;
  226. }
  227. /* Read special keys */
  228. if (ks & K_RSHIFT)
  229. gem_currentkeyboard[SCANCODE_RIGHTSHIFT]=0xFF;
  230. if (ks & K_LSHIFT)
  231. gem_currentkeyboard[SCANCODE_LEFTSHIFT]=0xFF;
  232. if (ks & K_CTRL)
  233. gem_currentkeyboard[SCANCODE_LEFTCONTROL]=0xFF;
  234. if (ks & K_ALT)
  235. gem_currentkeyboard[SCANCODE_LEFTALT]=0xFF;
  236. }
  237. static void do_mouse(_THIS, short mx, short my, short mb, short ks)
  238. {
  239. static short prevmousex=0, prevmousey=0, prevmouseb=0;
  240. /* Mouse motion ? */
  241. if ((prevmousex!=mx) || (prevmousey!=my)) {
  242. if (GEM_mouse_relative) {
  243. SDL_PrivateMouseMotion(0, 1, SDL_AtariXbios_mousex, SDL_AtariXbios_mousey);
  244. SDL_AtariXbios_mousex = SDL_AtariXbios_mousey = 0;
  245. } else {
  246. SDL_PrivateMouseMotion(0, 1, mx, my);
  247. }
  248. prevmousex = mx;
  249. prevmousey = my;
  250. }
  251. /* Mouse button ? */
  252. if (prevmouseb!=mb) {
  253. int i;
  254. for (i=0;i<2;i++) {
  255. int curbutton, prevbutton;
  256. curbutton = mb & (1<<i);
  257. prevbutton = prevmouseb & (1<<i);
  258. if (curbutton && !prevbutton) {
  259. SDL_PrivateMouseButton(SDL_PRESSED, i+1, 0, 0);
  260. }
  261. if (!curbutton && prevbutton) {
  262. SDL_PrivateMouseButton(SDL_RELEASED, i+1, 0, 0);
  263. }
  264. }
  265. prevmouseb = mb;
  266. }
  267. /* Read special keys */
  268. if (ks & K_RSHIFT)
  269. gem_currentkeyboard[SCANCODE_RIGHTSHIFT]=0xFF;
  270. if (ks & K_LSHIFT)
  271. gem_currentkeyboard[SCANCODE_LEFTSHIFT]=0xFF;
  272. if (ks & K_CTRL)
  273. gem_currentkeyboard[SCANCODE_LEFTCONTROL]=0xFF;
  274. if (ks & K_ALT)
  275. gem_currentkeyboard[SCANCODE_LEFTALT]=0xFF;
  276. }