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

流媒体/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_svgaevents.c,v 1.4 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. /* Handle the event stream, converting X11 events into SDL events */
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <vga.h>
  26. #include <vgamouse.h>
  27. #include <vgakeyboard.h>
  28. #if defined(linux)
  29. #include <linux/kd.h>
  30. #include <linux/keyboard.h>
  31. #elif defined(__FreeBSD__)
  32. #include <sys/kbio.h>
  33. #else
  34. #error You must choose your operating system here
  35. #endif
  36. #include "SDL.h"
  37. #include "SDL_sysevents.h"
  38. #include "SDL_events_c.h"
  39. #include "SDL_svgavideo.h"
  40. #include "SDL_svgaevents_c.h"
  41. /* The translation tables from a console scancode to a SDL keysym */
  42. #if defined(linux)
  43. #define NUM_VGAKEYMAPS (1<<KG_CAPSSHIFT)
  44. static Uint16 vga_keymap[NUM_VGAKEYMAPS][NR_KEYS];
  45. #elif defined(__FreeBSD__)
  46. /* FIXME: Free the keymap when we shut down the video mode */
  47. static keymap_t *vga_keymap = NULL;
  48. #else
  49. #error You must choose your operating system here
  50. #endif
  51. static SDLKey keymap[128];
  52. static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym);
  53. /* Ugh, we have to duplicate the kernel's keysym mapping code...
  54.    Oh, it's not so bad. :-)
  55.    FIXME: Add keyboard LED handling code
  56.  */
  57. #if defined(linux)
  58. int SVGA_initkeymaps(int fd)
  59. {
  60. struct kbentry entry;
  61. int map, i;
  62. /* Load all the keysym mappings */
  63. for ( map=0; map<NUM_VGAKEYMAPS; ++map ) {
  64. memset(vga_keymap[map], 0, NR_KEYS*sizeof(Uint16));
  65. for ( i=0; i<NR_KEYS; ++i ) {
  66. entry.kb_table = map;
  67. entry.kb_index = i;
  68. if ( ioctl(fd, KDGKBENT, &entry) == 0 ) {
  69. /* The "Enter" key is a special case */
  70. if ( entry.kb_value == K_ENTER ) {
  71. entry.kb_value = K(KT_ASCII,13);
  72. }
  73. /* Handle numpad specially as well */
  74. if ( KTYP(entry.kb_value) == KT_PAD ) {
  75.     switch ( entry.kb_value ) {
  76. case K_P0:
  77. case K_P1:
  78. case K_P2:
  79. case K_P3:
  80. case K_P4:
  81. case K_P5:
  82. case K_P6:
  83. case K_P7:
  84. case K_P8:
  85. case K_P9:
  86.     vga_keymap[map][i]=entry.kb_value;
  87.     vga_keymap[map][i]+= '0';
  88.     break;
  89.                                         case K_PPLUS:
  90.     vga_keymap[map][i]=K(KT_ASCII,'+');
  91.     break;
  92.                                         case K_PMINUS:
  93.     vga_keymap[map][i]=K(KT_ASCII,'-');
  94.     break;
  95.                                         case K_PSTAR:
  96.     vga_keymap[map][i]=K(KT_ASCII,'*');
  97.     break;
  98.                                         case K_PSLASH:
  99.     vga_keymap[map][i]=K(KT_ASCII,'/');
  100.     break;
  101.                                         case K_PENTER:
  102.     vga_keymap[map][i]=K(KT_ASCII,'r');
  103.     break;
  104.                                         case K_PCOMMA:
  105.     vga_keymap[map][i]=K(KT_ASCII,',');
  106.     break;
  107.                                         case K_PDOT:
  108.     vga_keymap[map][i]=K(KT_ASCII,'.');
  109.     break;
  110. default:
  111.     break;
  112.     }
  113. }
  114. /* Do the normal key translation */
  115. if ( (KTYP(entry.kb_value) == KT_LATIN) ||
  116.      (KTYP(entry.kb_value) == KT_ASCII) ||
  117.      (KTYP(entry.kb_value) == KT_LETTER) ) {
  118. vga_keymap[map][i] = entry.kb_value;
  119. }
  120. }
  121. }
  122. }
  123. return(0);
  124. }
  125. #elif defined(__FreeBSD__)
  126. int SVGA_initkeymaps(int fd)
  127. {
  128. vga_keymap = malloc(sizeof(keymap_t));
  129. if ( ! vga_keymap ) {
  130. SDL_OutOfMemory();
  131. return(-1);
  132. }
  133. if (ioctl(fd, GIO_KEYMAP, vga_keymap) == -1) {
  134. free(vga_keymap);
  135. vga_keymap = NULL;
  136. SDL_SetError("Unable to get keyboard map");
  137. return(-1);
  138. }
  139. return(0);
  140. }
  141. #else
  142. #error You must choose your operating system here
  143. #endif
  144. int posted = 0;
  145. void SVGA_mousecallback(int button, int dx, int dy,
  146.                           int u1,int u2,int u3, int u4)
  147. {
  148. if ( dx || dy ) {
  149. posted += SDL_PrivateMouseMotion(0, 1, dx, dy);
  150. }
  151. if ( button & MOUSE_LEFTBUTTON ) {
  152. if ( !(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(1)) ) {
  153. posted += SDL_PrivateMouseButton(SDL_PRESSED, 1, 0, 0);
  154. }
  155. } else {
  156. if ( (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(1)) ) {
  157. posted += SDL_PrivateMouseButton(SDL_RELEASED, 1, 0, 0);
  158. }
  159. }
  160. if ( button & MOUSE_MIDDLEBUTTON ) {
  161. if ( !(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(2)) ) {
  162. posted += SDL_PrivateMouseButton(SDL_PRESSED, 2, 0, 0);
  163. }
  164. } else {
  165. if ( (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(2)) ) {
  166. posted += SDL_PrivateMouseButton(SDL_RELEASED, 2, 0, 0);
  167. }
  168. }
  169. if ( button & MOUSE_RIGHTBUTTON ) {
  170. if ( !(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(3)) ) {
  171. posted += SDL_PrivateMouseButton(SDL_PRESSED, 3, 0, 0);
  172. }
  173. } else {
  174. if ( (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(3)) ) {
  175. posted += SDL_PrivateMouseButton(SDL_RELEASED, 3, 0, 0);
  176. }
  177. }
  178. }
  179. void SVGA_keyboardcallback(int scancode, int pressed)
  180. {
  181. SDL_keysym keysym;
  182. if ( pressed ) {
  183. posted += SDL_PrivateKeyboard(SDL_PRESSED,
  184.     TranslateKey(scancode, &keysym));
  185. } else {
  186. posted += SDL_PrivateKeyboard(SDL_RELEASED,
  187.     TranslateKey(scancode, &keysym));
  188. }
  189. }
  190. void SVGA_PumpEvents(_THIS)
  191. {
  192. do {
  193. posted = 0;
  194. mouse_update();
  195. keyboard_update();
  196. } while ( posted );
  197. }
  198. void SVGA_InitOSKeymap(_THIS)
  199. {
  200. int i;
  201. /* Initialize the BeOS key translation table */
  202. for ( i=0; i<SDL_TABLESIZE(keymap); ++i )
  203. keymap[i] = SDLK_UNKNOWN;
  204. keymap[SCANCODE_ESCAPE] = SDLK_ESCAPE;
  205. keymap[SCANCODE_1] = SDLK_1;
  206. keymap[SCANCODE_2] = SDLK_2;
  207. keymap[SCANCODE_3] = SDLK_3;
  208. keymap[SCANCODE_4] = SDLK_4;
  209. keymap[SCANCODE_5] = SDLK_5;
  210. keymap[SCANCODE_6] = SDLK_6;
  211. keymap[SCANCODE_7] = SDLK_7;
  212. keymap[SCANCODE_8] = SDLK_8;
  213. keymap[SCANCODE_9] = SDLK_9;
  214. keymap[SCANCODE_0] = SDLK_0;
  215. keymap[SCANCODE_MINUS] = SDLK_MINUS;
  216. keymap[SCANCODE_EQUAL] = SDLK_EQUALS;
  217. keymap[SCANCODE_BACKSPACE] = SDLK_BACKSPACE;
  218. keymap[SCANCODE_TAB] = SDLK_TAB;
  219. keymap[SCANCODE_Q] = SDLK_q;
  220. keymap[SCANCODE_W] = SDLK_w;
  221. keymap[SCANCODE_E] = SDLK_e;
  222. keymap[SCANCODE_R] = SDLK_r;
  223. keymap[SCANCODE_T] = SDLK_t;
  224. keymap[SCANCODE_Y] = SDLK_y;
  225. keymap[SCANCODE_U] = SDLK_u;
  226. keymap[SCANCODE_I] = SDLK_i;
  227. keymap[SCANCODE_O] = SDLK_o;
  228. keymap[SCANCODE_P] = SDLK_p;
  229. keymap[SCANCODE_BRACKET_LEFT] = SDLK_LEFTBRACKET;
  230. keymap[SCANCODE_BRACKET_RIGHT] = SDLK_RIGHTBRACKET;
  231. keymap[SCANCODE_ENTER] = SDLK_RETURN;
  232. keymap[SCANCODE_LEFTCONTROL] = SDLK_LCTRL;
  233. keymap[SCANCODE_A] = SDLK_a;
  234. keymap[SCANCODE_S] = SDLK_s;
  235. keymap[SCANCODE_D] = SDLK_d;
  236. keymap[SCANCODE_F] = SDLK_f;
  237. keymap[SCANCODE_G] = SDLK_g;
  238. keymap[SCANCODE_H] = SDLK_h;
  239. keymap[SCANCODE_J] = SDLK_j;
  240. keymap[SCANCODE_K] = SDLK_k;
  241. keymap[SCANCODE_L] = SDLK_l;
  242. keymap[SCANCODE_SEMICOLON] = SDLK_SEMICOLON;
  243. keymap[SCANCODE_APOSTROPHE] = SDLK_QUOTE;
  244. keymap[SCANCODE_GRAVE] = SDLK_BACKQUOTE;
  245. keymap[SCANCODE_LEFTSHIFT] = SDLK_LSHIFT;
  246. keymap[SCANCODE_BACKSLASH] = SDLK_BACKSLASH;
  247. keymap[SCANCODE_Z] = SDLK_z;
  248. keymap[SCANCODE_X] = SDLK_x;
  249. keymap[SCANCODE_C] = SDLK_c;
  250. keymap[SCANCODE_V] = SDLK_v;
  251. keymap[SCANCODE_B] = SDLK_b;
  252. keymap[SCANCODE_N] = SDLK_n;
  253. keymap[SCANCODE_M] = SDLK_m;
  254. keymap[SCANCODE_COMMA] = SDLK_COMMA;
  255. keymap[SCANCODE_PERIOD] = SDLK_PERIOD;
  256. keymap[SCANCODE_SLASH] = SDLK_SLASH;
  257. keymap[SCANCODE_RIGHTSHIFT] = SDLK_RSHIFT;
  258. keymap[SCANCODE_KEYPADMULTIPLY] = SDLK_KP_MULTIPLY;
  259. keymap[SCANCODE_LEFTALT] = SDLK_LALT;
  260. keymap[SCANCODE_SPACE] = SDLK_SPACE;
  261. keymap[SCANCODE_CAPSLOCK] = SDLK_CAPSLOCK;
  262. keymap[SCANCODE_F1] = SDLK_F1;
  263. keymap[SCANCODE_F2] = SDLK_F2;
  264. keymap[SCANCODE_F3] = SDLK_F3;
  265. keymap[SCANCODE_F4] = SDLK_F4;
  266. keymap[SCANCODE_F5] = SDLK_F5;
  267. keymap[SCANCODE_F6] = SDLK_F6;
  268. keymap[SCANCODE_F7] = SDLK_F7;
  269. keymap[SCANCODE_F8] = SDLK_F8;
  270. keymap[SCANCODE_F9] = SDLK_F9;
  271. keymap[SCANCODE_F10] = SDLK_F10;
  272. keymap[SCANCODE_NUMLOCK] = SDLK_NUMLOCK;
  273. keymap[SCANCODE_SCROLLLOCK] = SDLK_SCROLLOCK;
  274. keymap[SCANCODE_KEYPAD7] = SDLK_KP7;
  275. keymap[SCANCODE_CURSORUPLEFT] = SDLK_KP7;
  276. keymap[SCANCODE_KEYPAD8] = SDLK_KP8;
  277. keymap[SCANCODE_CURSORUP] = SDLK_KP8;
  278. keymap[SCANCODE_KEYPAD9] = SDLK_KP9;
  279. keymap[SCANCODE_CURSORUPRIGHT] = SDLK_KP9;
  280. keymap[SCANCODE_KEYPADMINUS] = SDLK_KP_MINUS;
  281. keymap[SCANCODE_KEYPAD4] = SDLK_KP4;
  282. keymap[SCANCODE_CURSORLEFT] = SDLK_KP4;
  283. keymap[SCANCODE_KEYPAD5] = SDLK_KP5;
  284. keymap[SCANCODE_KEYPAD6] = SDLK_KP6;
  285. keymap[SCANCODE_CURSORRIGHT] = SDLK_KP6;
  286. keymap[SCANCODE_KEYPADPLUS] = SDLK_KP_PLUS;
  287. keymap[SCANCODE_KEYPAD1] = SDLK_KP1;
  288. keymap[SCANCODE_CURSORDOWNLEFT] = SDLK_KP1;
  289. keymap[SCANCODE_KEYPAD2] = SDLK_KP2;
  290. keymap[SCANCODE_CURSORDOWN] = SDLK_KP2;
  291. keymap[SCANCODE_KEYPAD3] = SDLK_KP3;
  292. keymap[SCANCODE_CURSORDOWNRIGHT] = SDLK_KP3;
  293. keymap[SCANCODE_KEYPAD0] = SDLK_KP0;
  294. keymap[SCANCODE_KEYPADPERIOD] = SDLK_KP_PERIOD;
  295. keymap[SCANCODE_LESS] = SDLK_LESS;
  296. keymap[SCANCODE_F11] = SDLK_F11;
  297. keymap[SCANCODE_F12] = SDLK_F12;
  298. keymap[SCANCODE_KEYPADENTER] = SDLK_KP_ENTER;
  299. keymap[SCANCODE_RIGHTCONTROL] = SDLK_RCTRL;
  300. keymap[SCANCODE_CONTROL] = SDLK_RCTRL;
  301. keymap[SCANCODE_KEYPADDIVIDE] = SDLK_KP_DIVIDE;
  302. keymap[SCANCODE_PRINTSCREEN] = SDLK_PRINT;
  303. keymap[SCANCODE_RIGHTALT] = SDLK_RALT;
  304. keymap[SCANCODE_BREAK] = SDLK_BREAK;
  305. keymap[SCANCODE_BREAK_ALTERNATIVE] = SDLK_UNKNOWN;
  306. keymap[SCANCODE_HOME] = SDLK_HOME;
  307. keymap[SCANCODE_CURSORBLOCKUP] = SDLK_UP;
  308. keymap[SCANCODE_PAGEUP] = SDLK_PAGEUP;
  309. keymap[SCANCODE_CURSORBLOCKLEFT] = SDLK_LEFT;
  310. keymap[SCANCODE_CURSORBLOCKRIGHT] = SDLK_RIGHT;
  311. keymap[SCANCODE_END] = SDLK_END;
  312. keymap[SCANCODE_CURSORBLOCKDOWN] = SDLK_DOWN;
  313. keymap[SCANCODE_PAGEDOWN] = SDLK_PAGEDOWN;
  314. keymap[SCANCODE_INSERT] = SDLK_INSERT;
  315. keymap[SCANCODE_REMOVE] = SDLK_DELETE;
  316. keymap[119] = SDLK_PAUSE;
  317. keymap[SCANCODE_RIGHTWIN] = SDLK_RSUPER;
  318. keymap[SCANCODE_LEFTWIN] = SDLK_LSUPER;
  319. keymap[127] = SDLK_MENU;
  320. }
  321. #if defined(linux)
  322. static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym)
  323. {
  324. /* Set the keysym information */
  325. keysym->scancode = scancode;
  326. keysym->sym = keymap[scancode];
  327. keysym->mod = KMOD_NONE;
  328. /* If UNICODE is on, get the UNICODE value for the key */
  329. keysym->unicode = 0;
  330. if ( SDL_TranslateUNICODE ) {
  331. int map;
  332. SDLMod modstate;
  333. modstate = SDL_GetModState();
  334. map = 0;
  335. if ( modstate & KMOD_SHIFT ) {
  336. map |= (1<<KG_SHIFT);
  337. }
  338. if ( modstate & KMOD_CTRL ) {
  339. map |= (1<<KG_CTRL);
  340. }
  341. if ( modstate & KMOD_ALT ) {
  342. map |= (1<<KG_ALT);
  343. }
  344. if ( modstate & KMOD_MODE ) {
  345. map |= (1<<KG_ALTGR);
  346. }
  347. if ( KTYP(vga_keymap[map][scancode]) == KT_LETTER ) {
  348. if ( modstate & KMOD_CAPS ) {
  349. map ^= (1<<KG_SHIFT);
  350. }
  351. }
  352. if ( KTYP(vga_keymap[map][scancode]) == KT_PAD ) {
  353. if ( modstate & KMOD_NUM ) {
  354. keysym->unicode=KVAL(vga_keymap[map][scancode]);
  355. }
  356. } else {
  357. keysym->unicode = KVAL(vga_keymap[map][scancode]);
  358. }
  359. }
  360. return(keysym);
  361. }
  362. #elif defined(__FreeBSD__)
  363. static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym)
  364. {
  365. /* Set the keysym information */
  366. keysym->scancode = scancode;
  367. keysym->sym = keymap[scancode];
  368. keysym->mod = KMOD_NONE;
  369. /* If UNICODE is on, get the UNICODE value for the key */
  370. keysym->unicode = 0;
  371. if ( SDL_TranslateUNICODE && vga_keymap ) {
  372. int map;
  373. SDLMod modstate;
  374. modstate = SDL_GetModState();
  375. map = 0;
  376. if ( modstate & KMOD_SHIFT ) {
  377. map += 1;
  378. }
  379. if ( modstate & KMOD_CTRL ) {
  380. map += 2;
  381. }
  382. if ( modstate & KMOD_ALT ) {
  383. map += 4;
  384. }
  385. if ( !(vga_keymap->key[scancode].spcl & (0x80 >> map)) ) {
  386. keysym->unicode = vga_keymap->key[scancode].map[map];
  387. }
  388. }
  389. return(keysym);
  390. }
  391. #else
  392. #error You must choose your operating system here
  393. #endif