glue.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. #include "SDL.h"
  2. #include "SDL_events.h"
  3. #include "SDL_keyboard.h"
  4. #include <brl.mod/blitz.mod/blitz.h>
  5. #include <brl.mod/event.mod/event.h> //event enums
  6. #include <brl.mod/keycodes.mod/keycodes.h> //keycode enums
  7. /* System stuff */
  8. int brl_event_EmitEvent( BBObject *event );
  9. BBObject *brl_event_CreateEvent( int id,BBObject *source,int data,int mods,int x,int y,BBObject *extra );
  10. void bbSDLSystemEmitEvent( int id,BBObject *source,int data,int mods,int x,int y,BBObject *extra ){
  11. BBObject *event=brl_event_CreateEvent( id,source,data,mods,x,y,extra );
  12. brl_event_EmitEvent( event );
  13. }
  14. int mapkey(SDL_Scancode scancode);
  15. int mapmods(int keymods);
  16. int bmx_SDL_GetDisplayWidth(int display) {
  17. SDL_DisplayMode mode;
  18. SDL_GetCurrentDisplayMode(display, &mode);
  19. return mode.w;
  20. }
  21. int bmx_SDL_GetDisplayHeight(int display) {
  22. SDL_DisplayMode mode;
  23. SDL_GetCurrentDisplayMode(display, &mode);
  24. return mode.h;
  25. }
  26. int bmx_SDL_GetDisplayDepth(int display) {
  27. SDL_DisplayMode mode;
  28. SDL_GetCurrentDisplayMode(display, &mode);
  29. return mode.format; // TODO - make this a proper bit depth number
  30. }
  31. int bmx_SDL_GetDisplayhertz(int display) {
  32. SDL_DisplayMode mode;
  33. SDL_GetCurrentDisplayMode(display, &mode);
  34. return mode.refresh_rate;
  35. }
  36. void bmx_SDL_EmitSDLEvent( SDL_Event *event, BBObject *source ) {
  37. int data;
  38. int mods;
  39. int i;
  40. BBString * s;
  41. SDL_DisplayMode mode;
  42. switch (event->type) {
  43. case SDL_QUIT:
  44. bbSDLSystemEmitEvent(BBEVENT_APPTERMINATE, source, 0, 0, 0, 0, &bbNullObject);
  45. return;
  46. case SDL_KEYDOWN:
  47. i = 0;
  48. // some keys are not raised as text input events..
  49. // so we will push them ourselves.
  50. switch (event->key.keysym.sym) {
  51. case SDLK_BACKSPACE:
  52. i = 0x08;
  53. break;
  54. case SDLK_DELETE:
  55. i = 0x7f;
  56. break;
  57. case SDLK_RETURN:
  58. case SDLK_RETURN2:
  59. case SDLK_KP_ENTER:
  60. i = 0x0d;
  61. break;
  62. case SDLK_ESCAPE:
  63. i = 0x1b;
  64. break;
  65. }
  66. // intentional fall-through...
  67. case SDL_KEYUP:
  68. data = mapkey(event->key.keysym.scancode);
  69. mods = mapmods(event->key.keysym.mod);
  70. if (event->key.repeat) {
  71. bbSDLSystemEmitEvent( BBEVENT_KEYREPEAT,source,data,mods,0,0,&bbNullObject );
  72. if (i) {
  73. bbSDLSystemEmitEvent( BBEVENT_KEYCHAR,source,i,0,0,0,&bbNullObject );
  74. }
  75. return;
  76. }
  77. bbSDLSystemEmitEvent( (event->type == SDL_KEYDOWN) ? BBEVENT_KEYDOWN : BBEVENT_KEYUP,source,data,mods,0,0,&bbNullObject );
  78. if (i) {
  79. bbSDLSystemEmitEvent( BBEVENT_KEYCHAR,source,i,0,0,0,&bbNullObject );
  80. }
  81. return;
  82. break;
  83. case SDL_TEXTINPUT:
  84. i = 0;
  85. s = bbStringFromUTF8String(event->text.text);
  86. while (i < s->length) {
  87. bbSDLSystemEmitEvent( BBEVENT_KEYCHAR,source,s->buf[i],0,0,0,&bbNullObject );
  88. i++;
  89. }
  90. return;
  91. case SDL_MOUSEMOTION:
  92. bbSDLSystemEmitEvent( BBEVENT_MOUSEMOVE,source,0,0,event->motion.x,event->motion.y,&bbNullObject );
  93. return;
  94. case SDL_MOUSEBUTTONDOWN:
  95. case SDL_MOUSEBUTTONUP:
  96. bbSDLSystemEmitEvent( (event->type == SDL_MOUSEBUTTONDOWN) ? BBEVENT_MOUSEDOWN : BBEVENT_MOUSEUP,source,event->button.button,0,event->button.x,event->button.y,&bbNullObject );
  97. return;
  98. case SDL_MOUSEWHEEL:
  99. bbSDLSystemEmitEvent( BBEVENT_MOUSEWHEEL,source,(event->wheel.y < 0) ? -1 : 1,0,0,0,&bbNullObject );
  100. return;
  101. case SDL_USEREVENT:
  102. switch (event->user.code) {
  103. case BBEVENT_TIMERTICK:
  104. bbSDLSystemEmitEvent( BBEVENT_TIMERTICK,event->user.data1,(int)event->user.data2,0,0,0,&bbNullObject );
  105. return;
  106. case 0x802:
  107. brl_event_EmitEvent( event->user.data1 );
  108. return;
  109. }
  110. case SDL_FINGERMOTION:
  111. SDL_GetWindowDisplayMode(SDL_GL_GetCurrentWindow(), &mode);
  112. bbSDLSystemEmitEvent( BBEVENT_TOUCHMOVE, source, event->tfinger.fingerId, 0, event->tfinger.x * mode.w, event->tfinger.y * mode.h, &bbNullObject);
  113. return;
  114. case SDL_FINGERDOWN:
  115. case SDL_FINGERUP:
  116. SDL_GetWindowDisplayMode(SDL_GL_GetCurrentWindow(), &mode);
  117. bbSDLSystemEmitEvent( (event->type == SDL_FINGERDOWN) ? BBEVENT_TOUCHDOWN : BBEVENT_TOUCHUP, source, event->tfinger.fingerId, 0, event->tfinger.x * mode.w, event->tfinger.y * mode.h, &bbNullObject );
  118. return;
  119. }
  120. }
  121. void bmx_SDL_Poll() {
  122. SDL_Event event;
  123. while (SDL_PollEvent(&event)) {
  124. bmx_SDL_EmitSDLEvent(&event, &bbNullObject);
  125. }
  126. }
  127. void bmx_SDL_WaitEvent() {
  128. SDL_Event event;
  129. if (SDL_WaitEvent(&event)) {
  130. bmx_SDL_EmitSDLEvent(&event, &bbNullObject);
  131. }
  132. }
  133. int mapkey(SDL_Scancode scancode) {
  134. switch(scancode) {
  135. case SDL_SCANCODE_BACKSPACE:
  136. return KEY_BACKSPACE;
  137. case SDL_SCANCODE_TAB:
  138. return KEY_TAB;
  139. case SDL_SCANCODE_RETURN:
  140. return KEY_ENTER;
  141. case SDL_SCANCODE_ESCAPE:
  142. return KEY_ESC;
  143. case SDL_SCANCODE_SPACE:
  144. return KEY_SPACE;
  145. case SDL_SCANCODE_PAGEUP:
  146. return KEY_PAGEUP;
  147. case SDL_SCANCODE_PAGEDOWN:
  148. return KEY_PAGEDOWN;
  149. case SDL_SCANCODE_END:
  150. return KEY_END;
  151. case SDL_SCANCODE_HOME:
  152. return KEY_HOME;
  153. case SDL_SCANCODE_LEFT:
  154. return KEY_LEFT;
  155. case SDL_SCANCODE_UP:
  156. return KEY_UP;
  157. case SDL_SCANCODE_RIGHT:
  158. return KEY_RIGHT;
  159. case SDL_SCANCODE_DOWN:
  160. return KEY_DOWN;
  161. case SDL_SCANCODE_INSERT:
  162. return KEY_INSERT;
  163. case SDL_SCANCODE_DELETE:
  164. return KEY_DELETE;
  165. case SDL_SCANCODE_0:
  166. return KEY_0;
  167. case SDL_SCANCODE_1:
  168. return KEY_1;
  169. case SDL_SCANCODE_2:
  170. return KEY_2;
  171. case SDL_SCANCODE_3:
  172. return KEY_3;
  173. case SDL_SCANCODE_4:
  174. return KEY_4;
  175. case SDL_SCANCODE_5:
  176. return KEY_5;
  177. case SDL_SCANCODE_6:
  178. return KEY_6;
  179. case SDL_SCANCODE_7:
  180. return KEY_7;
  181. case SDL_SCANCODE_8:
  182. return KEY_8;
  183. case SDL_SCANCODE_9:
  184. return KEY_9;
  185. case SDL_SCANCODE_A:
  186. return KEY_A;
  187. case SDL_SCANCODE_B:
  188. return KEY_B;
  189. case SDL_SCANCODE_C:
  190. return KEY_C;
  191. case SDL_SCANCODE_D:
  192. return KEY_D;
  193. case SDL_SCANCODE_E:
  194. return KEY_E;
  195. case SDL_SCANCODE_F:
  196. return KEY_F;
  197. case SDL_SCANCODE_G:
  198. return KEY_G;
  199. case SDL_SCANCODE_H:
  200. return KEY_H;
  201. case SDL_SCANCODE_I:
  202. return KEY_I;
  203. case SDL_SCANCODE_J:
  204. return KEY_J;
  205. case SDL_SCANCODE_K:
  206. return KEY_K;
  207. case SDL_SCANCODE_L:
  208. return KEY_L;
  209. case SDL_SCANCODE_M:
  210. return KEY_M;
  211. case SDL_SCANCODE_N:
  212. return KEY_N;
  213. case SDL_SCANCODE_O:
  214. return KEY_O;
  215. case SDL_SCANCODE_P:
  216. return KEY_P;
  217. case SDL_SCANCODE_Q:
  218. return KEY_Q;
  219. case SDL_SCANCODE_R:
  220. return KEY_R;
  221. case SDL_SCANCODE_S:
  222. return KEY_S;
  223. case SDL_SCANCODE_T:
  224. return KEY_T;
  225. case SDL_SCANCODE_U:
  226. return KEY_U;
  227. case SDL_SCANCODE_V:
  228. return KEY_V;
  229. case SDL_SCANCODE_W:
  230. return KEY_W;
  231. case SDL_SCANCODE_X:
  232. return KEY_X;
  233. case SDL_SCANCODE_Y:
  234. return KEY_Y;
  235. case SDL_SCANCODE_Z:
  236. return KEY_Z;
  237. case SDL_SCANCODE_LGUI:
  238. return KEY_LSYS;
  239. case SDL_SCANCODE_RGUI:
  240. return KEY_RSYS;
  241. case SDL_SCANCODE_KP_0:
  242. return KEY_NUM0;
  243. case SDL_SCANCODE_KP_1:
  244. return KEY_NUM1;
  245. case SDL_SCANCODE_KP_2:
  246. return KEY_NUM2;
  247. case SDL_SCANCODE_KP_3:
  248. return KEY_NUM3;
  249. case SDL_SCANCODE_KP_4:
  250. return KEY_NUM4;
  251. case SDL_SCANCODE_KP_5:
  252. return KEY_NUM5;
  253. case SDL_SCANCODE_KP_6:
  254. return KEY_NUM6;
  255. case SDL_SCANCODE_KP_7:
  256. return KEY_NUM7;
  257. case SDL_SCANCODE_KP_8:
  258. return KEY_NUM8;
  259. case SDL_SCANCODE_KP_9:
  260. return KEY_NUM9;
  261. case SDL_SCANCODE_KP_MULTIPLY:
  262. return KEY_NUMMULTIPLY;
  263. case SDL_SCANCODE_KP_PLUS:
  264. return KEY_NUMADD;
  265. case SDL_SCANCODE_KP_EQUALS:
  266. return KEY_NUMSLASH;
  267. case SDL_SCANCODE_KP_MINUS:
  268. return KEY_NUMSUBTRACT;
  269. case SDL_SCANCODE_KP_PERIOD:
  270. return KEY_NUMDECIMAL;
  271. case SDL_SCANCODE_KP_DIVIDE:
  272. return KEY_NUMDIVIDE;
  273. case SDL_SCANCODE_F1:
  274. return KEY_F1;
  275. case SDL_SCANCODE_F2:
  276. return KEY_F2;
  277. case SDL_SCANCODE_F3:
  278. return KEY_F3;
  279. case SDL_SCANCODE_F4:
  280. return KEY_F4;
  281. case SDL_SCANCODE_F5:
  282. return KEY_F5;
  283. case SDL_SCANCODE_F6:
  284. return KEY_F6;
  285. case SDL_SCANCODE_F7:
  286. return KEY_F7;
  287. case SDL_SCANCODE_F8:
  288. return KEY_F8;
  289. case SDL_SCANCODE_F9:
  290. return KEY_F9;
  291. case SDL_SCANCODE_F10:
  292. return KEY_F10;
  293. case SDL_SCANCODE_F11:
  294. return KEY_F11;
  295. case SDL_SCANCODE_F12:
  296. return KEY_F12;
  297. case SDL_SCANCODE_LSHIFT:
  298. return KEY_LSHIFT;
  299. case SDL_SCANCODE_RSHIFT:
  300. return KEY_RSHIFT;
  301. case SDL_SCANCODE_LCTRL:
  302. return KEY_LCONTROL;
  303. case SDL_SCANCODE_RCTRL:
  304. return KEY_RCONTROL;
  305. case SDL_SCANCODE_LALT:
  306. return KEY_LALT;
  307. case SDL_SCANCODE_RALT:
  308. return KEY_RALT;
  309. case SDL_SCANCODE_AC_BACK:
  310. return KEY_BROWSER_BACK;
  311. case SDL_SCANCODE_AC_FORWARD:
  312. return KEY_BROWSER_FORWARD;
  313. case SDL_SCANCODE_AC_HOME:
  314. return KEY_BROWSER_HOME;
  315. case SDL_SCANCODE_AC_REFRESH:
  316. return KEY_BROWSER_REFRESH;
  317. case SDL_SCANCODE_AC_SEARCH:
  318. return KEY_BROWSER_SEARCH;
  319. case SDL_SCANCODE_AC_STOP:
  320. return KEY_BROWSER_STOP;
  321. case SDL_SCANCODE_GRAVE:
  322. return KEY_TILDE;
  323. case SDL_SCANCODE_MINUS:
  324. return KEY_MINUS;
  325. case SDL_SCANCODE_EQUALS:
  326. return KEY_EQUALS;
  327. case SDL_SCANCODE_LEFTBRACKET:
  328. return KEY_OPENBRACKET;
  329. case SDL_SCANCODE_RIGHTBRACKET:
  330. return KEY_CLOSEBRACKET;
  331. case SDL_SCANCODE_BACKSLASH:
  332. return KEY_BACKSLASH;
  333. case SDL_SCANCODE_SEMICOLON:
  334. return KEY_SEMICOLON;
  335. case SDL_SCANCODE_APOSTROPHE:
  336. return KEY_QUOTES;
  337. case SDL_SCANCODE_COMMA:
  338. return KEY_COMMA;
  339. case SDL_SCANCODE_PERIOD:
  340. return KEY_PERIOD;
  341. case SDL_SCANCODE_SLASH:
  342. return KEY_SLASH;
  343. }
  344. return scancode;
  345. }
  346. int mapmods(int keymods) {
  347. int mod = 0;
  348. if (keymods & KMOD_SHIFT) {
  349. mod |= MODIFIER_SHIFT;
  350. }
  351. if (keymods & KMOD_CTRL) {
  352. mod |= MODIFIER_CONTROL;
  353. }
  354. if (keymods & KMOD_ALT) {
  355. mod |= MODIFIER_OPTION;
  356. }
  357. if (keymods & KMOD_GUI) {
  358. mod |= MODIFIER_SYSTEM;
  359. }
  360. return mod;
  361. }
  362. int bmx_SDL_ShowSimpleMessageBox(BBString * text, BBString * appTitle, int serious) {
  363. int flags = (serious) ? SDL_MESSAGEBOX_WARNING : SDL_MESSAGEBOX_INFORMATION;
  364. char * t = bbStringToUTF8String(appTitle);
  365. char * s = bbStringToUTF8String(text);
  366. int ret = SDL_ShowSimpleMessageBox(flags, t, s, NULL);
  367. bbMemFree(s);
  368. bbMemFree(t);
  369. return ret;
  370. }
  371. int bmx_SDL_ShowMessageBox_confirm(BBString * text, BBString * appTitle, int serious) {
  372. char * t = bbStringToUTF8String(appTitle);
  373. char * s = bbStringToUTF8String(text);
  374. SDL_MessageBoxButtonData buttons[] = {
  375. { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, 0, "no" },
  376. { SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, 1, "yes" }
  377. };
  378. SDL_MessageBoxData messageboxdata = {
  379. (serious) ? SDL_MESSAGEBOX_WARNING : SDL_MESSAGEBOX_INFORMATION,
  380. NULL, t, s, SDL_arraysize(buttons), buttons, NULL
  381. };
  382. bbMemFree(s);
  383. bbMemFree(t);
  384. int buttonid;
  385. SDL_ShowMessageBox(&messageboxdata, &buttonid);
  386. if (buttonid == 1) {
  387. return 1;
  388. } else {
  389. return 0;
  390. }
  391. }
  392. int bmx_SDL_ShowMessageBox_proceed(BBString * text, BBString * appTitle, int serious) {
  393. char * t = bbStringToUTF8String(appTitle);
  394. char * s = bbStringToUTF8String(text);
  395. SDL_MessageBoxButtonData buttons[] = {
  396. { 0, 0, "no" },
  397. { SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, 1, "yes" },
  398. { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, 2, "cancel" }
  399. };
  400. SDL_MessageBoxData messageboxdata = {
  401. (serious) ? SDL_MESSAGEBOX_WARNING : SDL_MESSAGEBOX_INFORMATION,
  402. NULL, t, s, SDL_arraysize(buttons), buttons, NULL
  403. };
  404. bbMemFree(s);
  405. bbMemFree(t);
  406. int buttonid;
  407. SDL_ShowMessageBox(&messageboxdata, &buttonid);
  408. switch (buttonid) {
  409. case 0: return 0;
  410. case 1: return 1;
  411. }
  412. return -1;
  413. }
  414. int bmx_SDL_EventFilter(void * userdata, SDL_Event * event) {
  415. switch (event->type) {
  416. case SDL_APP_TERMINATING:
  417. case SDL_APP_LOWMEMORY:
  418. case SDL_APP_WILLENTERBACKGROUND:
  419. case SDL_APP_DIDENTERBACKGROUND:
  420. case SDL_APP_WILLENTERFOREGROUND:
  421. case SDL_APP_DIDENTERFOREGROUND:
  422. return sdl_sdlsystem_TSDLSystemDriver__eventFilter(userdata, event->type);
  423. }
  424. return 1;
  425. }
  426. void bmx_SDL_SetEventFilter(BBObject * obj) {
  427. SDL_SetEventFilter(bmx_SDL_EventFilter, obj);
  428. }