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

流媒体/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_dibevents.c,v 1.4 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <windows.h>
  25. #include "SDL_events.h"
  26. #include "SDL_error.h"
  27. #include "SDL_syswm.h"
  28. #include "SDL_sysevents.h"
  29. #include "SDL_events_c.h"
  30. #include "SDL_lowvideo.h"
  31. #include "SDL_dibvideo.h"
  32. #include "SDL_vkeys.h"
  33. #ifndef WM_APP
  34. #define WM_APP 0x8000
  35. #endif
  36. #ifdef _WIN32_WCE
  37. #define NO_GETKEYBOARDSTATE
  38. #endif
  39. /* The translation table from a Microsoft VK keysym to a SDL keysym */
  40. static SDLKey VK_keymap[SDLK_LAST];
  41. static SDL_keysym *TranslateKey(UINT vkey, UINT scancode, SDL_keysym *keysym, int pressed);
  42. /* Masks for processing the windows KEYDOWN and KEYUP messages */
  43. #define REPEATED_KEYMASK (1<<30)
  44. #define EXTENDED_KEYMASK (1<<24)
  45. /* DJM: If the user setup the window for us, we want to save his window proc,
  46.    and give him a chance to handle some messages. */
  47. static WNDPROC userWindowProc = NULL;
  48. /* The main Win32 event handler */
  49. LONG
  50.  DIB_HandleMessage(_THIS, HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  51. {
  52. extern int posted;
  53. switch (msg) {
  54. case WM_SYSKEYDOWN:
  55. case WM_KEYDOWN: {
  56. SDL_keysym keysym;
  57. /* Ignore repeated keys */
  58. if ( lParam&REPEATED_KEYMASK ) {
  59. return(0);
  60. }
  61. switch (wParam) {
  62. case VK_CONTROL:
  63. if ( lParam&EXTENDED_KEYMASK )
  64. wParam = VK_RCONTROL;
  65. else
  66. wParam = VK_LCONTROL;
  67. break;
  68. case VK_SHIFT:
  69. /* EXTENDED trick doesn't work here */
  70. wParam = VK_LSHIFT;
  71. break;
  72. case VK_MENU:
  73. if ( lParam&EXTENDED_KEYMASK )
  74. wParam = VK_RMENU;
  75. else
  76. wParam = VK_LMENU;
  77. break;
  78. }
  79. #ifdef NO_GETKEYBOARDSTATE
  80. /* this is the workaround for the missing ToAscii() and ToUnicode() in CE (not necessary at KEYUP!) */
  81. if ( SDL_TranslateUNICODE ) {
  82. MSG m;
  83. m.hwnd = hwnd;
  84. m.message = msg;
  85. m.wParam = wParam;
  86. m.lParam = lParam;
  87. m.time = 0;
  88. if ( TranslateMessage(&m) && PeekMessage(&m, hwnd, 0, WM_USER, PM_NOREMOVE) && (m.message == WM_CHAR) ) {
  89. GetMessage(&m, hwnd, 0, WM_USER);
  90.      wParam = m.wParam;
  91. } else {
  92. wParam = 0;
  93. }
  94. } else {
  95. wParam = 0;
  96. }
  97. #endif /* NO_GETKEYBOARDSTATE */
  98. posted = SDL_PrivateKeyboard(SDL_PRESSED,
  99. TranslateKey(wParam,HIWORD(lParam),&keysym,1));
  100. }
  101. return(0);
  102. case WM_SYSKEYUP:
  103. case WM_KEYUP: {
  104. SDL_keysym keysym;
  105. switch (wParam) {
  106. case VK_CONTROL:
  107. if ( lParam&EXTENDED_KEYMASK )
  108. wParam = VK_RCONTROL;
  109. else
  110. wParam = VK_LCONTROL;
  111. break;
  112. case VK_SHIFT:
  113. /* EXTENDED trick doesn't work here */
  114. wParam = VK_LSHIFT;
  115. break;
  116. case VK_MENU:
  117. if ( lParam&EXTENDED_KEYMASK )
  118. wParam = VK_RMENU;
  119. else
  120. wParam = VK_LMENU;
  121. break;
  122. }
  123. posted = SDL_PrivateKeyboard(SDL_RELEASED,
  124. TranslateKey(wParam,HIWORD(lParam),&keysym,0));
  125. }
  126. return(0);
  127. default: {
  128. /* Only post the event if we're watching for it */
  129. if ( SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE ) {
  130.         SDL_SysWMmsg wmmsg;
  131. SDL_VERSION(&wmmsg.version);
  132. wmmsg.hwnd = hwnd;
  133. wmmsg.msg = msg;
  134. wmmsg.wParam = wParam;
  135. wmmsg.lParam = lParam;
  136. posted = SDL_PrivateSysWMEvent(&wmmsg);
  137. /* DJM: If the user isn't watching for private
  138. messages in her SDL event loop, then pass it
  139. along to any win32 specific window proc.
  140.  */
  141. } else if (userWindowProc) {
  142. return userWindowProc(hwnd, msg, wParam, lParam);
  143. }
  144. }
  145. break;
  146. }
  147. return(DefWindowProc(hwnd, msg, wParam, lParam));
  148. }
  149. void DIB_PumpEvents(_THIS)
  150. {
  151. MSG msg;
  152. while ( PeekMessage(&msg, NULL, 0, (WM_APP-1), PM_NOREMOVE) ) {
  153. if ( GetMessage(&msg, NULL, 0, (WM_APP-1)) > 0 ) {
  154. DispatchMessage(&msg);
  155. }
  156. }
  157. }
  158. void DIB_InitOSKeymap(_THIS)
  159. {
  160. int i;
  161. /* Map the VK keysyms */
  162. for ( i=0; i<SDL_TABLESIZE(VK_keymap); ++i )
  163. VK_keymap[i] = SDLK_UNKNOWN;
  164. VK_keymap[VK_BACK] = SDLK_BACKSPACE;
  165. VK_keymap[VK_TAB] = SDLK_TAB;
  166. VK_keymap[VK_CLEAR] = SDLK_CLEAR;
  167. VK_keymap[VK_RETURN] = SDLK_RETURN;
  168. VK_keymap[VK_PAUSE] = SDLK_PAUSE;
  169. VK_keymap[VK_ESCAPE] = SDLK_ESCAPE;
  170. VK_keymap[VK_SPACE] = SDLK_SPACE;
  171. VK_keymap[VK_APOSTROPHE] = SDLK_QUOTE;
  172. VK_keymap[VK_COMMA] = SDLK_COMMA;
  173. VK_keymap[VK_MINUS] = SDLK_MINUS;
  174. VK_keymap[VK_PERIOD] = SDLK_PERIOD;
  175. VK_keymap[VK_SLASH] = SDLK_SLASH;
  176. VK_keymap[VK_0] = SDLK_0;
  177. VK_keymap[VK_1] = SDLK_1;
  178. VK_keymap[VK_2] = SDLK_2;
  179. VK_keymap[VK_3] = SDLK_3;
  180. VK_keymap[VK_4] = SDLK_4;
  181. VK_keymap[VK_5] = SDLK_5;
  182. VK_keymap[VK_6] = SDLK_6;
  183. VK_keymap[VK_7] = SDLK_7;
  184. VK_keymap[VK_8] = SDLK_8;
  185. VK_keymap[VK_9] = SDLK_9;
  186. VK_keymap[VK_SEMICOLON] = SDLK_SEMICOLON;
  187. VK_keymap[VK_EQUALS] = SDLK_EQUALS;
  188. VK_keymap[VK_LBRACKET] = SDLK_LEFTBRACKET;
  189. VK_keymap[VK_BACKSLASH] = SDLK_BACKSLASH;
  190. VK_keymap[VK_RBRACKET] = SDLK_RIGHTBRACKET;
  191. VK_keymap[VK_GRAVE] = SDLK_BACKQUOTE;
  192. VK_keymap[VK_BACKTICK] = SDLK_BACKQUOTE;
  193. VK_keymap[VK_A] = SDLK_a;
  194. VK_keymap[VK_B] = SDLK_b;
  195. VK_keymap[VK_C] = SDLK_c;
  196. VK_keymap[VK_D] = SDLK_d;
  197. VK_keymap[VK_E] = SDLK_e;
  198. VK_keymap[VK_F] = SDLK_f;
  199. VK_keymap[VK_G] = SDLK_g;
  200. VK_keymap[VK_H] = SDLK_h;
  201. VK_keymap[VK_I] = SDLK_i;
  202. VK_keymap[VK_J] = SDLK_j;
  203. VK_keymap[VK_K] = SDLK_k;
  204. VK_keymap[VK_L] = SDLK_l;
  205. VK_keymap[VK_M] = SDLK_m;
  206. VK_keymap[VK_N] = SDLK_n;
  207. VK_keymap[VK_O] = SDLK_o;
  208. VK_keymap[VK_P] = SDLK_p;
  209. VK_keymap[VK_Q] = SDLK_q;
  210. VK_keymap[VK_R] = SDLK_r;
  211. VK_keymap[VK_S] = SDLK_s;
  212. VK_keymap[VK_T] = SDLK_t;
  213. VK_keymap[VK_U] = SDLK_u;
  214. VK_keymap[VK_V] = SDLK_v;
  215. VK_keymap[VK_W] = SDLK_w;
  216. VK_keymap[VK_X] = SDLK_x;
  217. VK_keymap[VK_Y] = SDLK_y;
  218. VK_keymap[VK_Z] = SDLK_z;
  219. VK_keymap[VK_DELETE] = SDLK_DELETE;
  220. VK_keymap[VK_NUMPAD0] = SDLK_KP0;
  221. VK_keymap[VK_NUMPAD1] = SDLK_KP1;
  222. VK_keymap[VK_NUMPAD2] = SDLK_KP2;
  223. VK_keymap[VK_NUMPAD3] = SDLK_KP3;
  224. VK_keymap[VK_NUMPAD4] = SDLK_KP4;
  225. VK_keymap[VK_NUMPAD5] = SDLK_KP5;
  226. VK_keymap[VK_NUMPAD6] = SDLK_KP6;
  227. VK_keymap[VK_NUMPAD7] = SDLK_KP7;
  228. VK_keymap[VK_NUMPAD8] = SDLK_KP8;
  229. VK_keymap[VK_NUMPAD9] = SDLK_KP9;
  230. VK_keymap[VK_DECIMAL] = SDLK_KP_PERIOD;
  231. VK_keymap[VK_DIVIDE] = SDLK_KP_DIVIDE;
  232. VK_keymap[VK_MULTIPLY] = SDLK_KP_MULTIPLY;
  233. VK_keymap[VK_SUBTRACT] = SDLK_KP_MINUS;
  234. VK_keymap[VK_ADD] = SDLK_KP_PLUS;
  235. VK_keymap[VK_UP] = SDLK_UP;
  236. VK_keymap[VK_DOWN] = SDLK_DOWN;
  237. VK_keymap[VK_RIGHT] = SDLK_RIGHT;
  238. VK_keymap[VK_LEFT] = SDLK_LEFT;
  239. VK_keymap[VK_INSERT] = SDLK_INSERT;
  240. VK_keymap[VK_HOME] = SDLK_HOME;
  241. VK_keymap[VK_END] = SDLK_END;
  242. VK_keymap[VK_PRIOR] = SDLK_PAGEUP;
  243. VK_keymap[VK_NEXT] = SDLK_PAGEDOWN;
  244. VK_keymap[VK_F1] = SDLK_F1;
  245. VK_keymap[VK_F2] = SDLK_F2;
  246. VK_keymap[VK_F3] = SDLK_F3;
  247. VK_keymap[VK_F4] = SDLK_F4;
  248. VK_keymap[VK_F5] = SDLK_F5;
  249. VK_keymap[VK_F6] = SDLK_F6;
  250. VK_keymap[VK_F7] = SDLK_F7;
  251. VK_keymap[VK_F8] = SDLK_F8;
  252. VK_keymap[VK_F9] = SDLK_F9;
  253. VK_keymap[VK_F10] = SDLK_F10;
  254. VK_keymap[VK_F11] = SDLK_F11;
  255. VK_keymap[VK_F12] = SDLK_F12;
  256. VK_keymap[VK_F13] = SDLK_F13;
  257. VK_keymap[VK_F14] = SDLK_F14;
  258. VK_keymap[VK_F15] = SDLK_F15;
  259. VK_keymap[VK_NUMLOCK] = SDLK_NUMLOCK;
  260. VK_keymap[VK_CAPITAL] = SDLK_CAPSLOCK;
  261. VK_keymap[VK_SCROLL] = SDLK_SCROLLOCK;
  262. VK_keymap[VK_RSHIFT] = SDLK_RSHIFT;
  263. VK_keymap[VK_LSHIFT] = SDLK_LSHIFT;
  264. VK_keymap[VK_RCONTROL] = SDLK_RCTRL;
  265. VK_keymap[VK_LCONTROL] = SDLK_LCTRL;
  266. VK_keymap[VK_RMENU] = SDLK_RALT;
  267. VK_keymap[VK_LMENU] = SDLK_LALT;
  268. VK_keymap[VK_RWIN] = SDLK_RSUPER;
  269. VK_keymap[VK_LWIN] = SDLK_LSUPER;
  270. VK_keymap[VK_HELP] = SDLK_HELP;
  271. #ifdef VK_PRINT
  272. VK_keymap[VK_PRINT] = SDLK_PRINT;
  273. #endif
  274. VK_keymap[VK_SNAPSHOT] = SDLK_PRINT;
  275. VK_keymap[VK_CANCEL] = SDLK_BREAK;
  276. VK_keymap[VK_APPS] = SDLK_MENU;
  277. }
  278. static SDL_keysym *TranslateKey(UINT vkey, UINT scancode, SDL_keysym *keysym, int pressed)
  279. {
  280. /* Set the keysym information */
  281. keysym->scancode = (unsigned char) scancode;
  282. keysym->sym = VK_keymap[vkey];
  283. keysym->mod = KMOD_NONE;
  284. keysym->unicode = 0;
  285. if ( pressed && SDL_TranslateUNICODE ) { /* Someday use ToUnicode() */
  286. #ifdef NO_GETKEYBOARDSTATE
  287. /* Uh oh, better hope the vkey is close enough.. */
  288. keysym->unicode = vkey;
  289. #else
  290. BYTE keystate[256];
  291. BYTE chars[2];
  292. GetKeyboardState(keystate);
  293. if ( ToAscii(vkey,scancode,keystate,(WORD *)chars,0) == 1 ) {
  294. keysym->unicode = chars[0];
  295. }
  296. #endif /* NO_GETKEYBOARDSTATE */
  297. }
  298. return(keysym);
  299. }
  300. int DIB_CreateWindow(_THIS)
  301. {
  302. #ifdef _WIN32_WCE
  303. /* WinCE uses the UNICODE version */
  304. int nLen = strlen(SDL_Appname)+1;
  305. LPWSTR lpszW = alloca(nLen*2);
  306. MultiByteToWideChar(CP_ACP, 0, SDL_Appname, -1, lpszW, nLen);
  307. SDL_RegisterApp("SDL_app", 0, 0);
  308. SDL_Window = CreateWindow(lpszW, lpszW, WS_VISIBLE,
  309.                                   0, 0, 0, 0, NULL, NULL, SDL_Instance, NULL);
  310. if ( SDL_Window == NULL ) {
  311. SDL_SetError("Couldn't create window");
  312. return(-1);
  313. }
  314. ShowWindow(SDL_Window, SW_HIDE);
  315. #else
  316. SDL_RegisterApp("SDL_app", CS_BYTEALIGNCLIENT, 0);
  317. if ( SDL_windowid ) {
  318. SDL_Window = (HWND)strtol(SDL_windowid, NULL, 0);
  319.       /* DJM: we want all event's for the user specified
  320.          window to be handled by SDL.
  321.        */
  322.       if (SDL_Window) {
  323.          userWindowProc = (WNDPROC)GetWindowLong(SDL_Window, GWL_WNDPROC);
  324.          SetWindowLong(SDL_Window, GWL_WNDPROC, (LONG)WinMessage);
  325.       }
  326. } else {
  327. SDL_Window = CreateWindow(SDL_Appname, SDL_Appname,
  328.                         (WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX),
  329.                                  0, 0, 0, 0, NULL, NULL, SDL_Instance, NULL);
  330. if ( SDL_Window == NULL ) {
  331. SDL_SetError("Couldn't create window");
  332. return(-1);
  333. }
  334. ShowWindow(SDL_Window, SW_HIDE);
  335. }
  336. #endif /* _WIN32_WCE */
  337. return(0);
  338. }
  339. void DIB_DestroyWindow(_THIS)
  340. {
  341. if ( SDL_windowid == NULL ) {
  342. DestroyWindow(SDL_Window);
  343. }
  344. }