glue.c 13 KB

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